Страница 1 из 1

Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 12:22 pm
strannik
Здравствуйте! В качестве выключателей освещения использую Sonoff, которые с другими устройствами заведены на Умный дом Яндекса, который связан с Majordomo через YaDevices. Всё отлично работает: светом можно управлять непосредственно через выключатель, голосом через яндекс-станцию, через выключатель на сцене Majordomo с отображением текущего статуса выключателя.
Задача: по датчику движения (подключен через MegaD) включить свет в ванной и через 2 минуту выключить. При этом если свет включен непосредственно через выключатель, то и выключаться свет должен только через выключатель.
Моё решение: в методе motionDetected датчика движения прописал код

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

if(gg('Lamp_Bath.status')==0) {
cm('Lamp_Bath.turnOn');
clearTimeOut("lightBathTimer");
SetTimeOut("lightBathTimer","callMethod('Lamp_Bath.turnOff');",60*2);
}
Проблема: если включить свет выключателем (свет включился) и зайти в ванную, то через некоторое время свет выключается.
Пока вижу причину в том, что при включении через выключатель у объекта Lamp_Bath свойство status не успевает измениться (нужно 2-3 сек) и когда заходишь в ванную (свет там уже горит), Majordomo считает, что свет выключен и по датчику движения включает свет и запускает таймер. Если включить свет и зайти в ванную через несколько секунд, то эта проблема не возникает.
Прошу опытных товарищей подсказать пути решения моей проблемы.

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 1:06 pm
Shuravi
sleep(X);

if(gg('Lamp_Bath.status')==0) {
cm('Lamp_Bath.turnOn');
clearTimeOut("lightBathTimer");
SetTimeOut("lightBathTimer","callMethod('Lamp_Bath.turnOff');",60*2);
}

Где X время в сек, когда свойство объекта изменится.

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 5:03 pm
xor
strannik писал(а):
Пн авг 14, 2023 12:22 pm
Здравствуйте!...
можно понять, кто включает лампу
у меня, например, при ручном вкл сразу устанавливается статус и в деталях я пишу, что это вручную
в выключении

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

  //регистрируем, что выключено через пульт
  sg($noosw.'.status',0,0,'manually');
  say('Объект '.$name.' выключен вручную');
тогда, при изменении статуса можно узнать источник
в методе изменения статуса пишем debmes($params);
и видим в логе
2023-08-14_16-59-31.png
2023-08-14_16-59-31.png (13.03 КБ) 1019 просмотров

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 6:15 pm
Logrus
Пока вижу причину в том, что при включении через выключатель у объекта Lamp_Bath свойство status не успевает измениться (нужно 2-3 сек
ну и разбирайтесь с этой проблемой, для всеобщего рассмотрения ее вы ничего не описали

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 10:03 pm
strannik
Shuravi писал(а):
Пн авг 14, 2023 1:06 pm
sleep(X);

if(gg('Lamp_Bath.status')==0) {
cm('Lamp_Bath.turnOn');
clearTimeOut("lightBathTimer");
SetTimeOut("lightBathTimer","callMethod('Lamp_Bath.turnOff');",60*2);
}

Где X время в сек, когда свойство объекта изменится.
Спасибо, была такая мысль, но, если я правильно понимаю, то в такой реализации и свет от датчика движения включится через Х секунд, что для находящихся в темноте будет не очень комфортно

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Пн авг 14, 2023 10:19 pm
strannik
xor писал(а):
Пн авг 14, 2023 5:03 pm
strannik писал(а):
Пн авг 14, 2023 12:22 pm
Здравствуйте!...
можно понять, кто включает лампу
у меня, например, при ручном вкл сразу устанавливается статус и в деталях я пишу, что это вручную
в выключении

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

  //регистрируем, что выключено через пульт
  sg($noosw.'.status',0,0,'manually');
  say('Объект '.$name.' выключен вручную');
тогда, при изменении статуса можно узнать источник
в методе изменения статуса пишем debmes($params);
и видим в логе
2023-08-14_16-59-31.png
Спасибо. Да, через debmes($params) вижу, что источники в случае включения через выключатель и по датчику движения разные. Но я не вижу среди свойств Lamp_Bath свойства Source. Подскажите, как к нему обратиться и что означают третий и четвёртый аргументы в sg($noosw.'.status',0,0,'manually');?

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Вт авг 15, 2023 7:55 pm
xor
strannik писал(а):
Пн авг 14, 2023 10:19 pm
xor писал(а):
Пн авг 14, 2023 5:03 pm
strannik писал(а):
Пн авг 14, 2023 12:22 pm
Здравствуйте!...

Спасибо. Да, через debmes($params) вижу, что источники в случае включения через выключатель и по датчику движения разные. Но я не вижу среди свойств Lamp_Bath свойства Source. Подскажите, как к нему обратиться и что означают третий и четвёртый аргументы в sg($noosw.'.status',0,0,'manually');?
свойств нет, это передается как массив именованных параметров при смене статуса в привязанный метод.
по параметрам смотреть тут:
2023-08-15_19-52-08.png
2023-08-15_19-52-08.png (16.47 КБ) 941 просмотр
нас интересует четвертый, туда можно пихать что хочешь)

Re: Задержка обновления статуса выключателя sonoff через YaDevices

Добавлено: Чт авг 17, 2023 10:32 pm
strannik
xor писал(а):
Вт авг 15, 2023 7:55 pm
strannik писал(а):
Пн авг 14, 2023 10:19 pm
xor писал(а):
Пн авг 14, 2023 5:03 pm
strannik писал(а):
Пн авг 14, 2023 12:22 pm
Здравствуйте!...

Спасибо. Да, через debmes($params) вижу, что источники в случае включения через выключатель и по датчику движения разные. Но я не вижу среди свойств Lamp_Bath свойства Source. Подскажите, как к нему обратиться и что означают третий и четвёртый аргументы в sg($noosw.'.status',0,0,'manually');?
свойств нет, это передается как массив именованных параметров при смене статуса в привязанный метод.
по параметрам смотреть тут:
2023-08-15_19-52-08.png

нас интересует четвертый, туда можно пихать что хочешь)
Спасибо за подсказку!
Добавил в метод StatusUpdate лампы следующий код:

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

if($params['SOURCE']=='yadevices.devices.capabilities.on_off' && $params['NEW_VALUE']=='1') 
$this->setProperty("SourceUpdateStatus","manuallyOn");
elseif ($params['SOURCE']=='yadevices.devices.capabilities.on_off' && $params['NEW_VALUE']=='0')
$this->setProperty("SourceUpdateStatus","manuallyOff");
elseif ($params['SOURCE']!='yadevices.devices.capabilities.on_off' && $params['NEW_VALUE']=='0')
$this->setProperty("SourceUpdateStatus","autoOff");
elseif ($params['SOURCE']!='yadevices.devices.capabilities.on_off' && $params['NEW_VALUE']=='1')
$this->setProperty("SourceUpdateStatus","autoOn");
а в метод motionDetected датчика движения:

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

//определим время, на которое будет видоизменяться элементы интерфейса «датчик движения» после срабатывания
sg('Motion_Bath.status', 1);
SetTimeOut("MSBathActTimer","sg('Motion_Bath.status', 0);",3);

//запишем время срабатывания датчика в формате «HH:MM»
setGlobal('Motion_Bath.updatedTimeHHMM', gg('ThisComputer.timeNow'));

//запустим таймер (2 мин), по истечении которого свет будет выключен
if(gg('Lamp_Bath.SourceUpdateStatus')!='manuallyOn') {
cm('Lamp_Bath.turnOn');
clearTimeOut("lightBathTimer");
SetTimeOut("lightBathTimer","callMethod('Lamp_Bath.turnOff');",60*2);
}
Вроде бы стало срабатывать как нужно, но иногда свет всё-таки выключается по таймеру. Буду разбираться дальше.