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

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Ответить
strannik
Сообщения: 4
Зарегистрирован: Вт июл 20, 2021 3:49 pm
Благодарил (а): 1 раз
Поблагодарили: 0

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

Сообщение strannik » Пн авг 14, 2023 12:22 pm

Здравствуйте! В качестве выключателей освещения использую 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 считает, что свет выключен и по датчику движения включает свет и запускает таймер. Если включить свет и зайти в ванную через несколько секунд, то эта проблема не возникает.
Прошу опытных товарищей подсказать пути решения моей проблемы.
Аватара пользователя
Shuravi
Сообщения: 25
Зарегистрирован: Вс апр 21, 2019 7:58 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 0

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

Сообщение 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 время в сек, когда свойство объекта изменится.
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение 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
2023-08-14_16-59-31.png (13.03 КБ) 793 просмотра
Logrus
Сообщения: 2084
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 457 раз

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

Сообщение Logrus » Пн авг 14, 2023 6:15 pm

Пока вижу причину в том, что при включении через выключатель у объекта Lamp_Bath свойство status не успевает измениться (нужно 2-3 сек
ну и разбирайтесь с этой проблемой, для всеобщего рассмотрения ее вы ничего не описали
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
strannik
Сообщения: 4
Зарегистрирован: Вт июл 20, 2021 3:49 pm
Благодарил (а): 1 раз
Поблагодарили: 0

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

Сообщение strannik » Пн авг 14, 2023 10:03 pm

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 время в сек, когда свойство объекта изменится.
Спасибо, была такая мысль, но, если я правильно понимаю, то в такой реализации и свет от датчика движения включится через Х секунд, что для находящихся в темноте будет не очень комфортно
strannik
Сообщения: 4
Зарегистрирован: Вт июл 20, 2021 3:49 pm
Благодарил (а): 1 раз
Поблагодарили: 0

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

Сообщение strannik » Пн авг 14, 2023 10:19 pm

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');?
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

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

Сообщение 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
2023-08-15_19-52-08.png (16.47 КБ) 715 просмотров
нас интересует четвертый, туда можно пихать что хочешь)
За это сообщение автора xor поблагодарил:
strannik (Чт авг 17, 2023 10:24 pm)
Рейтинг: 1.16%
strannik
Сообщения: 4
Зарегистрирован: Вт июл 20, 2021 3:49 pm
Благодарил (а): 1 раз
Поблагодарили: 0

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

Сообщение strannik » Чт авг 17, 2023 10:32 pm

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