[Модуль] Tuya

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

rust-val
Сообщения: 3
Зарегистрирован: Пт янв 15, 2021 5:47 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: [Модуль] Tuya

Сообщение rust-val » Сб фев 15, 2025 7:54 pm

Всем привет. Благодарю за модуль. Как-то покупал года 2 назад китайскую ноунеим wi-fi розетку, типа такой:
СпойлерПоказать
1.PNG
1.PNG (32.76 КБ) 2819 просмотров
Проблема, что нужно частое обновление параметров с нее, а обновлялась она примерно раз в час, или если заити в приложение. Посылка доп пакета здесь в модуле ничего не меняла. В итоге забил на нее.
Сейчас руки дошли разобраться с ней. Наткнулся на проект tuyapi на js, там тоже есть возможность отправлять dp-refresh пакет для обновления статуса, и вот через него моя розетка отлично обновляется. Поэтому все таки захотелось ее нормально прикрутить к мажордому. Хоть и не программист, полез в код здесь в модуле попробовать разобраться что ей не нравится.
Что поменял в cycle_local_tuya.php:
Строка 128Показать
128.PNG
128.PNG (14.83 КБ) 2819 просмотров
Здесь в 128 строке сравнивается не с тем значением поэтому ложная ошибка отправки, но не влияет на работоспособность, только на лог. В 129 строке тоже исправить на strlen($payload_12).
Строка 133Показать
133.PNG
133.PNG (15.41 КБ) 2819 просмотров
Здесь я не знаю, может это особенность только моей розетки, но если срезать 20 символов в начале, ответ на доп пакет не декодируется и 12 answer пустое, при 35 все отлично. Но этот ответ дальше нигде не используется, поэтому опять-таки влияет только на лог.

Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены. Если подряд послать доп пакет 12 и запрос статуса, на доп пакет розетка отвечает нормально, а на запрос статуса всегда ответ "000055aa00000000000000120000000c000000009ec477af0000aa55".
Как я понял, нужно посылать альтернативный запрос статуса. Но в цикле у меня в эту часть кода не переходит, тк $result в итоге пустое значение, а не 'json obj data unvalid'.
Строка 175Показать
175.PNG
175.PNG (23.91 КБ) 2819 просмотров
Не знаю на сколько корректно, но я изменил по-простому 175 строку.
Строка 220Показать
220.PNG
220.PNG (17.99 КБ) 2819 просмотров
И ответ на альтернативный статус у меня тоже не декодировался и был пустым пока я не поменял срез с 35 на 20.
В итоге, сейчас все работает как надо. Не знаю на сколько актуально другим или это только особенность моей розетки.
stellhawk
Сообщения: 268
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 11 раз
Поблагодарили: 83 раза

Re: [Модуль] Tuya

Сообщение stellhawk » Вс фев 16, 2025 1:34 pm

rust-val писал(а):
Сб фев 15, 2025 7:54 pm
Всем привет. Благодарю за модуль. Как-то покупал года 2 назад китайскую ноунеим wi-fi розетку, типа такой:
СпойлерПоказать
1.PNG
Проблема, что нужно частое обновление параметров с нее, а обновлялась она примерно раз в час, или если заити в приложение. Посылка доп пакета здесь в модуле ничего не меняла. В итоге забил на нее.
Сейчас руки дошли разобраться с ней. Наткнулся на проект tuyapi на js, там тоже есть возможность отправлять dp-refresh пакет для обновления статуса, и вот через него моя розетка отлично обновляется. Поэтому все таки захотелось ее нормально прикрутить к мажордому. Хоть и не программист, полез в код здесь в модуле попробовать разобраться что ей не нравится.
Что поменял в cycle_local_tuya.php:
Строка 128Показать
128.PNG
Здесь в 128 строке сравнивается не с тем значением поэтому ложная ошибка отправки, но не влияет на работоспособность, только на лог. В 129 строке тоже исправить на strlen($payload_12).
Строка 133Показать
133.PNG
Здесь я не знаю, может это особенность только моей розетки, но если срезать 20 символов в начале, ответ на доп пакет не декодируется и 12 answer пустое, при 35 все отлично. Но этот ответ дальше нигде не используется, поэтому опять-таки влияет только на лог.

Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены. Если подряд послать доп пакет 12 и запрос статуса, на доп пакет розетка отвечает нормально, а на запрос статуса всегда ответ "000055aa00000000000000120000000c000000009ec477af0000aa55".
Как я понял, нужно посылать альтернативный запрос статуса. Но в цикле у меня в эту часть кода не переходит, тк $result в итоге пустое значение, а не 'json obj data unvalid'.
Строка 175Показать
175.PNG
Не знаю на сколько корректно, но я изменил по-простому 175 строку.
Строка 220Показать
220.PNG
И ответ на альтернативный статус у меня тоже не декодировался и был пустым пока я не поменял срез с 35 на 20.
В итоге, сейчас все работает как надо. Не знаю на сколько актуально другим или это только особенность моей розетки.
спасибо -познавательно. но судя по описанию речь о протоколе 3.3.в 3.4- всё по другому
https://github.com/codetheweb/tuyapi/bl ... ex.js#L150

вроде как вместо 10 команды шлется 16 команда. но я попробовать ответа нет.
rust-val
Сообщения: 3
Зарегистрирован: Пт янв 15, 2021 5:47 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: [Модуль] Tuya

Сообщение rust-val » Ср фев 19, 2025 10:48 pm

Да, это было для 3.3. На 3.4 тоже есть розетка, тоже те же проблемы с локальными обновлениями, только с облака раз в пол часа-час приходят через этот модуль. Через tuyapi же отлично работает и обновляется с dp-refresh, без dp-refresh данные приходят но не обновлённые, а тут в этом модуле вообще статус локально не получает. Но я не разобрался как можно переделать этот модуль, для 3.4 сложнее все. В итоге просто перешил эту розетку в OpenBK и забил.
fandaymon
Сообщения: 1565
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Чт фев 20, 2025 12:25 pm

rust-val писал(а):
Сб фев 15, 2025 7:54 pm
Всем привет. Благодарю за модуль. Как-то покупал года 2 назад китайскую ноунеим wi-fi розетку, типа такой:
СпойлерПоказать
1.PNG
Проблема, что нужно частое обновление параметров с нее, а обновлялась она примерно раз в час, или если заити в приложение. Посылка доп пакета здесь в модуле ничего не меняла. В итоге забил на нее.
Сейчас руки дошли разобраться с ней. Наткнулся на проект tuyapi на js, там тоже есть возможность отправлять dp-refresh пакет для обновления статуса, и вот через него моя розетка отлично обновляется. Поэтому все таки захотелось ее нормально прикрутить к мажордому. Хоть и не программист, полез в код здесь в модуле попробовать разобраться что ей не нравится.
Что поменял в cycle_local_tuya.php:
Строка 128Показать
128.PNG
Здесь в 128 строке сравнивается не с тем значением поэтому ложная ошибка отправки, но не влияет на работоспособность, только на лог. В 129 строке тоже исправить на strlen($payload_12).
Строка 133Показать
133.PNG
Здесь я не знаю, может это особенность только моей розетки, но если срезать 20 символов в начале, ответ на доп пакет не декодируется и 12 answer пустое, при 35 все отлично. Но этот ответ дальше нигде не используется, поэтому опять-таки влияет только на лог.

Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены. Если подряд послать доп пакет 12 и запрос статуса, на доп пакет розетка отвечает нормально, а на запрос статуса всегда ответ "000055aa00000000000000120000000c000000009ec477af0000aa55".
Как я понял, нужно посылать альтернативный запрос статуса. Но в цикле у меня в эту часть кода не переходит, тк $result в итоге пустое значение, а не 'json obj data unvalid'.
Строка 175Показать
175.PNG
Не знаю на сколько корректно, но я изменил по-простому 175 строку.
Строка 220Показать
220.PNG
И ответ на альтернативный статус у меня тоже не декодировался и был пустым пока я не поменял срез с 35 на 20.
В итоге, сейчас все работает как надо. Не знаю на сколько актуально другим или это только особенность моей розетки.
О! Спасибо за правки. В принципе могу после отправки доп пакета закрывать и открывать сокет заново

С протоколом 3.4 надо будет тоже добавить отправку доп пакета 12... Проблема в том, что у меня только одно устройство 3.4 и оно работает без доп пакетов - не на чем эксперементировать
rust-val
Сообщения: 3
Зарегистрирован: Пт янв 15, 2021 5:47 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: [Модуль] Tuya

Сообщение rust-val » Ср мар 05, 2025 7:07 pm

Разобрался с протоколами 3.3 и 3.4.
По 3.3:
rust-val писал(а):
Сб фев 15, 2025 7:54 pm
Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены.
Как я понял, проблема была, что сообщение принималось не полностью:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$reciv = socket_recv ( $socket , $buf , 2048 ,MSG_WAITALL); // строка 132 заменить
$result = substr($buf,63,-8); // Можно еще 133 заменить (влияет на лог)
MSG_WAITALL решает проблему, теперь все работает без закрытия сокета.

По 3.4 добавил посылку доп пакета:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$dps12 = $device['SEND12'] ? $device['FLAGS12'] : 0; // Добавить после строки 108 
$result = $tuya_module->TuyaLocalMsg34('STATUS', $dev_id, $local_key, $local_ip, $dps, $cid, $dps12); // 109 строку заменить 
tuya.class.phpПоказать

Код: Выделить всё

function TuyaLocalMsg34($command, $dev_id, $local_key, $local_ip, $dps, $cid, $dps12=0) { // 814 строку заменить
 
//То что ниже добавить после строки 908
$sequenceN = 3; 
if ($dps12) {  
$payload_12 = $this->encode_message($dps12, $local_key, "12", $sequenceN);   
$send=socket_send($socket, $payload_12, strlen($payload_12), 0); 
$buf1 = '';
$reciv=socket_recv ( $socket , $buf1 , 2048 ,MSG_WAITALL); 
$sequenceN=4; 
} 

// Строку 919 заменить на
$payload = $this->encode_message($json, $local_key, $hexByte, $sequenceN);
Теперь у меня все обновляется хорошо и 3.3 и 3.4, кому нужно было пробуйте
За это сообщение автора rust-val поблагодарил:
fandaymon (Сб мар 08, 2025 10:37 pm)
Рейтинг: 1.16%
fandaymon
Сообщения: 1565
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Сб мар 08, 2025 10:38 pm

rust-val писал(а):
Ср мар 05, 2025 7:07 pm
Разобрался с протоколами 3.3 и 3.4.
По 3.3:
rust-val писал(а):
Сб фев 15, 2025 7:54 pm
Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены.
Как я понял, проблема была, что сообщение принималось не полностью:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$reciv = socket_recv ( $socket , $buf , 2048 ,MSG_WAITALL); // строка 132 заменить
$result = substr($buf,63,-8); // Можно еще 133 заменить (влияет на лог)
MSG_WAITALL решает проблему, теперь все работает без закрытия сокета.

По 3.4 добавил посылку доп пакета:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$dps12 = $device['SEND12'] ? $device['FLAGS12'] : 0; // Добавить после строки 108 
$result = $tuya_module->TuyaLocalMsg34('STATUS', $dev_id, $local_key, $local_ip, $dps, $cid, $dps12); // 109 строку заменить 
tuya.class.phpПоказать

Код: Выделить всё

function TuyaLocalMsg34($command, $dev_id, $local_key, $local_ip, $dps, $cid, $dps12=0) { // 814 строку заменить
 
//То что ниже добавить после строки 908
$sequenceN = 3; 
if ($dps12) {  
$payload_12 = $this->encode_message($dps12, $local_key, "12", $sequenceN);   
$send=socket_send($socket, $payload_12, strlen($payload_12), 0); 
$buf1 = '';
$reciv=socket_recv ( $socket , $buf1 , 2048 ,MSG_WAITALL); 
$sequenceN=4; 
} 

// Строку 919 заменить на
$payload = $this->encode_message($json, $local_key, $hexByte, $sequenceN);
Теперь у меня все обновляется хорошо и 3.3 и 3.4, кому нужно было пробуйте
Большое спасибо! Добавил исправления в модуль
89130000013
Сообщения: 7
Зарегистрирован: Сб апр 14, 2018 5:25 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: [Модуль] Tuya

Сообщение 89130000013 » Пн мар 10, 2025 9:01 pm

Подскажите . если пульт ик подключил через простые устройства. Вкл выкл работает.
На экране видно что включено или выключено.

Если обычным пультом от тв вкл выкл делаю - обратной связи нет? на экране не меняется)
stellhawk
Сообщения: 268
Зарегистрирован: Чт ноя 08, 2018 5:51 am
Благодарил (а): 11 раз
Поблагодарили: 83 раза

Re: [Модуль] Tuya

Сообщение stellhawk » Чт мар 13, 2025 6:13 am

fandaymon писал(а):
Сб мар 08, 2025 10:38 pm
rust-val писал(а):
Ср мар 05, 2025 7:07 pm
Разобрался с протоколами 3.3 и 3.4.
По 3.3:
rust-val писал(а):
Сб фев 15, 2025 7:54 pm
Дальше сымитировав работу в отдельном скрипте, что заметил по этой розетке: если сначала посылать доп пакет 12, затем закрывать сокет, заново открыть и послать пакет запроса статуса, то тогда все работает нормально и данные обновлены.
Как я понял, проблема была, что сообщение принималось не полностью:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$reciv = socket_recv ( $socket , $buf , 2048 ,MSG_WAITALL); // строка 132 заменить
$result = substr($buf,63,-8); // Можно еще 133 заменить (влияет на лог)
MSG_WAITALL решает проблему, теперь все работает без закрытия сокета.

По 3.4 добавил посылку доп пакета:
Отредактировать
cycle_local_tuya.phpПоказать

Код: Выделить всё

$dps12 = $device['SEND12'] ? $device['FLAGS12'] : 0; // Добавить после строки 108 
$result = $tuya_module->TuyaLocalMsg34('STATUS', $dev_id, $local_key, $local_ip, $dps, $cid, $dps12); // 109 строку заменить 
tuya.class.phpПоказать

Код: Выделить всё

function TuyaLocalMsg34($command, $dev_id, $local_key, $local_ip, $dps, $cid, $dps12=0) { // 814 строку заменить
 
//То что ниже добавить после строки 908
$sequenceN = 3; 
if ($dps12) {  
$payload_12 = $this->encode_message($dps12, $local_key, "12", $sequenceN);   
$send=socket_send($socket, $payload_12, strlen($payload_12), 0); 
$buf1 = '';
$reciv=socket_recv ( $socket , $buf1 , 2048 ,MSG_WAITALL); 
$sequenceN=4; 
} 

// Строку 919 заменить на
$payload = $this->encode_message($json, $local_key, $hexByte, $sequenceN);
Теперь у меня все обновляется хорошо и 3.3 и 3.4, кому нужно было пробуйте
Большое спасибо! Добавил исправления в модуль
спасибо за обновление. протокол 3.4 принимает dpids -по графику сразу видно что данные стали обновляться
Ответить