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);
}
}
А ошибки возникают, видимо когда скрипт начинает слишком часто опрашивать устройство, оно банит. Нужно наверное пореже опрос делать.