[Модуль] Tuya

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

Модератор: immortal

fandaymon
Сообщения: 1567
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Ср май 06, 2020 9:33 pm

mihas писал(а):
Ср май 06, 2020 9:06 pm
Ну в конкретном случае не к state а к 27, но я и там и там пробовал. Само св-во меняется при нажатии в mjdm, до обновления статусов, но на устройство это никак не влияет, т.е. такое впечатление, что односторонняя связь только.
Я бы всё-таки попробовал к state привязать. С этими цветными шутками ни в чём нельзя быть уверенным - возможно там ещё и яркость надо регулировать, чтобы подсветка загоралась и цвет выставить. С основным функционалом розетки проще всё
mihas писал(а):
Ср май 06, 2020 9:06 pm
Ок. Сделано. Правда в облаке оно есть, через приложение то все работает. Его модуль только не видит.
Ну в HA облаке нету, раз модуль не видит
mihas
Сообщения: 60
Зарегистрирован: Пт окт 04, 2019 11:20 am
Благодарил (а): 29 раз
Поблагодарили: 5 раз

Re: [Модуль] Tuya

Сообщение mihas » Ср май 06, 2020 11:54 pm

fandaymon писал(а):
Ср май 06, 2020 9:33 pm

Я бы всё-таки попробовал к state привязать. С этими цветными шутками ни в чём нельзя быть уверенным - возможно там ещё и яркость надо регулировать, чтобы подсветка загоралась и цвет выставить. С основным функционалом розетки проще всё
Да. Это ничего не меняет
fandaymon писал(а):
Ср май 06, 2020 9:33 pm
Ну в HA облаке нету, раз модуль не видит
Хм.. по запросу из модуля он действительно только одно устройство выдает.. странно, не знаешь почему оно в приложении есть, а в облаке его нет? Может его удалить и еще раз создать надо? Раньше он был точно.
А еще вот такие ошибки валятся
Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer in /var/www/html/modules/tuya/tuya.class.php on line 484

Warning: socket_send(): unable to write to socket [32]: Broken pipe in /var/www/html/modules/tuya/tuya.class.php on line 480

Warning: socket_send(): unable to write to socket [32]: Broken pipe in /var/www/html/modules/tuya/tuya.class.php on line 480
И в лог пишет что пытался к этому устройству подключиться.
fandaymon
Сообщения: 1567
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Чт май 07, 2020 12:17 am

mihas писал(а):
Ср май 06, 2020 11:54 pm
fandaymon писал(а):
Ср май 06, 2020 9:33 pm

Я бы всё-таки попробовал к state привязать. С этими цветными шутками ни в чём нельзя быть уверенным - возможно там ещё и яркость надо регулировать, чтобы подсветка загоралась и цвет выставить. С основным функционалом розетки проще всё
Да. Это ничего не меняет
fandaymon писал(а):
Ср май 06, 2020 9:33 pm
Ну в HA облаке нету, раз модуль не видит
Хм.. по запросу из модуля он действительно только одно устройство выдает.. странно, не знаешь почему оно в приложении есть, а в облаке его нет? Может его удалить и еще раз создать надо? Раньше он был точно.
А еще вот такие ошибки валятся
Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer in /var/www/html/modules/tuya/tuya.class.php on line 484

Warning: socket_send(): unable to write to socket [32]: Broken pipe in /var/www/html/modules/tuya/tuya.class.php on line 480

Warning: socket_send(): unable to write to socket [32]: Broken pipe in /var/www/html/modules/tuya/tuya.class.php on line 480
И в лог пишет что пытался к этому устройству подключиться.
Вот чего не знаю, того не знаю - это специальное облако для Home Assitanta и про него практически никакой информации нету - только непонятно откуда взявшиеся питоновские библиотеки... Удалить/создать - думаю не помешает

Скорее всего и управлять не получается из-за того что модуль достучаться не может... Можно попробовать поставить 30 секунд период опроса и перезапустить цикл.
Я очень хотел уйти от очереди команд, чтобы не было пауз перед включением/выключением, возможно это была плохая идея. Будет время - попробую переделать цикл для работы с очередью
Ну и в принципе - у устройств, где есть управление цветом, получаются очень длинные пакеты - возможно из-за этого всё как-то не так работает
mihas
Сообщения: 60
Зарегистрирован: Пт окт 04, 2019 11:20 am
Благодарил (а): 29 раз
Поблагодарили: 5 раз

Re: [Модуль] Tuya

Сообщение mihas » Чт май 07, 2020 1:07 am

fandaymon писал(а):
Чт май 07, 2020 12:17 am

Вот чего не знаю, того не знаю - это специальное облако для Home Assitanta и про него практически никакой информации нету - только непонятно откуда взявшиеся питоновские библиотеки... Удалить/создать - думаю не помешает

Скорее всего и управлять не получается из-за того что модуль достучаться не может... Можно попробовать поставить 30 секунд период опроса и перезапустить цикл.
Я очень хотел уйти от очереди команд, чтобы не было пауз перед включением/выключением, возможно это была плохая идея. Будет время - попробую переделать цикл для работы с очередью
Ну и в принципе - у устройств, где есть управление цветом, получаются очень длинные пакеты - возможно из-за этого всё как-то не так работает
Разобрался. Модуль локально ничего и не посылает. Проблема была в условии if метода propertySetHandle

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

...
     if ($properties[0]['LOCAL_KEY']==NULL or $properties[0]['DEV_IP']==NULL or $properties[0]['REMOTE_CONTROL']==1) {

      if ($dps_name=='state') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'turnOnOff');
      } else  if ($dps_name=='brightness') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'brightnessSet');
      } else  if ($dps_name=='color_temp') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'colorTemperatureSet');
      } else  if ($dps_name=='color_mode') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'colorModeSet');
      }
      else  if ($dps_name=='temperature') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'temperatureSet');
      }
	     
     } else {
...
Немного переписал, вкл/выкл заработал.
Поправь пожалуйста, если не сложно.

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

    /**
     * @param string $object
     * @param string $property
     * @param int $value
     */
    function propertySetHandle($object, $property, $value)
    {

        $query = sprintf("
            SELECT  tucommands.*, 
                    tudevices.DEV_ID, 
                    tudevices.LOCAL_KEY, 
                    tudevices.DEV_IP, 
                    tudevices.TYPE 
            FROM tucommands 
            LEFT JOIN tudevices ON tudevices.ID=tucommands.DEVICE_ID 
            WHERE tucommands.LINKED_OBJECT LIKE '%s' 
                AND tucommands.LINKED_PROPERTY LIKE '%s'
        ", DBSafe($object), DBSafe($property));

        $properties = SQLSelect($query);

        $total = count($properties);

        if ($total) {
            $dpsName = $properties[0]['TITLE'];
            if ($properties[0]['LOCAL_KEY']
                && $properties[0]['DEV_IP']
                && (int)$properties[0]['REMOTE_CONTROL'] !== 1) {

                $mdev = strpos($properties[0]['DEV_ID'], '_');
                if ($mdev > 0) {
                    $devId = substr($properties[0]['DEV_ID'], 0, $mdev);
                    if ($properties[0]['TITLE'] == 'state') {
                        $dpsName = substr($properties[0]['DEV_ID'], $mdev + 1);
                    }
                } else {
                    if ($properties[0]['TITLE'] == 'state') {
                        $dpsName = '1';
                    }
                    $devId = $properties[0]['DEV_ID'];
                }

                if ($properties[0]['TYPE'] == 'cover') {
                    $dps = '{"' . $dpsName . '":' . $value . '}';
                } else {
                    $dps = '{"' . $dpsName . '":' . (($value == 1) ? 'true' : 'false') . '}';
                }
                SQLExec("UPDATE tudevices SET BUSY=1 WHERE ID=" . $properties[0]['DEVICE_ID']);
                $this->TuyaLocalMsg('SET', $devId, $properties[0]['LOCAL_KEY'], $properties[0]['DEV_IP'], $dps);
                SQLExec("UPDATE tudevices SET BUSY=0 WHERE ID=" . $properties[0]['DEVICE_ID']);
            } else {
                switch ($dpsName) {
                    case 'state':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'turnOnOff');
                        break;
                    case 'brightness':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'brightnessSet');
                        break;
                    case 'color_temp':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'colorTemperatureSet');
                        break;
                    case 'color_mode':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'colorModeSet');
                        break;
                    case 'temperature':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'temperatureSet');
                        break;
                }
            }

            $rec = SQLSelectOne("select * from tucommands where ID=" . $properties[0]['ID']);
            $rec['value'] = $value;
            SQLUpdate('tucommands', $rec);
        }
    }
А ошибки возникают, видимо когда скрипт начинает слишком часто опрашивать устройство, оно банит. Нужно наверное пореже опрос делать.
За это сообщение автора mihas поблагодарил:
fandaymon (Чт май 07, 2020 1:55 am)
Рейтинг: 1.16%
fandaymon
Сообщения: 1567
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Чт май 07, 2020 1:53 am

mihas писал(а):
Чт май 07, 2020 1:07 am
fandaymon писал(а):
Чт май 07, 2020 12:17 am

Вот чего не знаю, того не знаю - это специальное облако для Home Assitanta и про него практически никакой информации нету - только непонятно откуда взявшиеся питоновские библиотеки... Удалить/создать - думаю не помешает

Скорее всего и управлять не получается из-за того что модуль достучаться не может... Можно попробовать поставить 30 секунд период опроса и перезапустить цикл.
Я очень хотел уйти от очереди команд, чтобы не было пауз перед включением/выключением, возможно это была плохая идея. Будет время - попробую переделать цикл для работы с очередью
Ну и в принципе - у устройств, где есть управление цветом, получаются очень длинные пакеты - возможно из-за этого всё как-то не так работает
Разобрался. Модуль локально ничего и не посылает. Проблема была в условии if метода propertySetHandle

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

...
     if ($properties[0]['LOCAL_KEY']==NULL or $properties[0]['DEV_IP']==NULL or $properties[0]['REMOTE_CONTROL']==1) {

      if ($dps_name=='state') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'turnOnOff');
      } else  if ($dps_name=='brightness') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'brightnessSet');
      } else  if ($dps_name=='color_temp') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'colorTemperatureSet');
      } else  if ($dps_name=='color_mode') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'colorModeSet');
      }
      else  if ($dps_name=='temperature') {
       $this->TuyaRemoteMsg($properties[0]['DEV_ID'],$value,'temperatureSet');
      }
	     
     } else {
...
Немного переписал, вкл/выкл заработал.
Поправь пожалуйста, если не сложно.

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

    /**
     * @param string $object
     * @param string $property
     * @param int $value
     */
    function propertySetHandle($object, $property, $value)
    {

        $query = sprintf("
            SELECT  tucommands.*, 
                    tudevices.DEV_ID, 
                    tudevices.LOCAL_KEY, 
                    tudevices.DEV_IP, 
                    tudevices.TYPE 
            FROM tucommands 
            LEFT JOIN tudevices ON tudevices.ID=tucommands.DEVICE_ID 
            WHERE tucommands.LINKED_OBJECT LIKE '%s' 
                AND tucommands.LINKED_PROPERTY LIKE '%s'
        ", DBSafe($object), DBSafe($property));

        $properties = SQLSelect($query);

        $total = count($properties);

        if ($total) {
            $dpsName = $properties[0]['TITLE'];
            if ($properties[0]['LOCAL_KEY']
                && $properties[0]['DEV_IP']
                && (int)$properties[0]['REMOTE_CONTROL'] !== 1) {

                $mdev = strpos($properties[0]['DEV_ID'], '_');
                if ($mdev > 0) {
                    $devId = substr($properties[0]['DEV_ID'], 0, $mdev);
                    if ($properties[0]['TITLE'] == 'state') {
                        $dpsName = substr($properties[0]['DEV_ID'], $mdev + 1);
                    }
                } else {
                    if ($properties[0]['TITLE'] == 'state') {
                        $dpsName = '1';
                    }
                    $devId = $properties[0]['DEV_ID'];
                }

                if ($properties[0]['TYPE'] == 'cover') {
                    $dps = '{"' . $dpsName . '":' . $value . '}';
                } else {
                    $dps = '{"' . $dpsName . '":' . (($value == 1) ? 'true' : 'false') . '}';
                }
                SQLExec("UPDATE tudevices SET BUSY=1 WHERE ID=" . $properties[0]['DEVICE_ID']);
                $this->TuyaLocalMsg('SET', $devId, $properties[0]['LOCAL_KEY'], $properties[0]['DEV_IP'], $dps);
                SQLExec("UPDATE tudevices SET BUSY=0 WHERE ID=" . $properties[0]['DEVICE_ID']);
            } else {
                switch ($dpsName) {
                    case 'state':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'turnOnOff');
                        break;
                    case 'brightness':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'brightnessSet');
                        break;
                    case 'color_temp':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'colorTemperatureSet');
                        break;
                    case 'color_mode':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'colorModeSet');
                        break;
                    case 'temperature':
                        $this->TuyaRemoteMsg($properties[0]['DEV_ID'], $value, 'temperatureSet');
                        break;
                }
            }

            $rec = SQLSelectOne("select * from tucommands where ID=" . $properties[0]['ID']);
            $rec['value'] = $value;
            SQLUpdate('tucommands', $rec);
        }
    }
А ошибки возникают, видимо когда скрипт начинает слишком часто опрашивать устройство, оно банит. Нужно наверное пореже опрос делать.
Похоже проблемы была в том, что именно находится в пустом поле IP и LocalKey... В моей версии mariadb, почему-то были NULL, хотя по логике там должна была быть пустая строка. На всякий случай поменял сравнение с NULL на strlen. Вроде бы теперь должно работать у всех
Cпасибо за обнаружение ошибки!
За это сообщение автора fandaymon поблагодарил:
mihas (Чт май 07, 2020 9:55 am)
Рейтинг: 1.16%
mihas
Сообщения: 60
Зарегистрирован: Пт окт 04, 2019 11:20 am
Благодарил (а): 29 раз
Поблагодарили: 5 раз

Re: [Модуль] Tuya

Сообщение mihas » Чт май 07, 2020 11:43 am

fandaymon писал(а):
Чт май 07, 2020 1:53 am
Похоже проблемы была в том, что именно находится в пустом поле IP и LocalKey... В моей версии mariadb, почему-то были NULL, хотя по логике там должна была быть пустая строка. На всякий случай поменял сравнение с NULL на strlen. Вроде бы теперь должно работать у всех
Cпасибо за обнаружение ошибки!
Ага, там в таблице, если нет значения то по-дефолту пустая строка (not null):
create or replace table if not exists tudevices
(
ID int unsigned auto_increment
primary key,
TITLE varchar(100) default '' not null,
TYPE varchar(100) default '' not null,
DEV_ICON varchar(100) default '' not null,
DEV_ID varchar(255) default '' not null,
LOCAL_KEY varchar(255) default '' not null,
DEV_IP varchar(255) default '' not null,
BUSY tinyint(1) default 0 not null,
UPDATED datetime null
);
Я бы еще обернул бы переменную в trim() для надежности

Спасибо.
Niklays
Сообщения: 3
Зарегистрирован: Пт май 29, 2020 3:15 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Tuya

Сообщение Niklays » Пт май 29, 2020 9:04 am

Подскажите добавил умный выключатель , код такой как и на sonoff написал
turnOn- $this->setProperty("status",1)
turnOff- $this->setProperty("status",0)
и switch
$status=$this->getProperty("status");
if ($status) {
$this->callMetod('turnOff');
} else {
$this->callMetod('turnOn');
}
fandaymon
Сообщения: 1567
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 40 раз
Поблагодарили: 578 раз

Re: [Модуль] Tuya

Сообщение fandaymon » Пт май 29, 2020 12:48 pm

Niklays писал(а):
Пт май 29, 2020 9:04 am
Подскажите добавил умный выключатель , код такой как и на sonoff написал
turnOn- $this->setProperty("status",1)
turnOff- $this->setProperty("status",0)
и switch
$status=$this->getProperty("status");
if ($status) {
$this->callMetod('turnOff');
} else {
$this->callMetod('turnOn');
}
Что подсказать-то?
Niklays
Сообщения: 3
Зарегистрирован: Пт май 29, 2020 3:15 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Tuya

Сообщение Niklays » Пт май 29, 2020 1:54 pm

не работает выключатель , в итоге отвалился пришлось по новому подвязывать к программе
Niklays
Сообщения: 3
Зарегистрирован: Пт май 29, 2020 3:15 am
Благодарил (а): 0
Поблагодарили: 0

Re: [Модуль] Tuya

Сообщение Niklays » Пт май 29, 2020 4:11 pm

Ввел свой имейл , пароль, код страны 3(это Украина),выбрал тип программы Tyua и интервал обновлений 100.
Вытянул ключ с tuya версия 3.5.1 установил с 4pda packet capture версии 1.7, обязательное условие чтобы сертификат поставило перед соединением и ловите пакеты , потом запускаете tyua. И ждем мин 5 клацая ваше реле. Отключаем захват пакетов и ищем local key.
Потом заполнил все данные в majordomo и удалил tyua так как за 24 часа заманался лазить под потолок так как теряло приложение мой гаджет.
Ответить