протестировал. результат -- полная копия
и основная проблема не решена...
основная проблема модуля в том, что он опрашивает состояние модуля после отработки скрипта и ЛЮБОГО обращения к Меге и обращения Меги к серверу, как я понял.
если между ответом и опросом отправить
другую команду, как в примере ниже, то получится примерно следующее:
- нажата кнопка. начало работы
скрипта
-
другая команда
- опрос 2 (от
другой команды)
- ответ (от
скрипта )
- опрос 1 (от
скрипта )
в результате в опросе 1 система получает не те данные, что ожидаются, и всё ломается.
пример: в модуле обрабатывается ВМЕСТО команды по умолчанию скрипт (в котором Relay.status это выход меги):
Код: Выделить всё
if (!$params['VALUE']) return; // кнопка без фиксации
$status=getGlobal("Relay.status");
if($status){
setGlobal('Relay.status', 0);
.... тут что-то ещё
}else{
setGlobal('Relay.status', 1);
.... тут что-то ещё
}
вроде стандартный код функции switch(). всё должно работать... а не тут то было.
как это работает:
1. при первичном "включении света" свет включается (срабатывает switch()) и почти сразу гаснет (срабатывает запоздавшая
первая проверка)
2. далее переключается нормально
3. ...до тех пор, пока 'Relay.status' не поменяется откуда угодно ещё (например со сцены)
4. go to 1 =-)
UPD:
собственно, это моё видение проблемы, могу и ошибаться.
по идее, нужно не выполнять опрос меги при return ""; или галочке, поскольку в таком случае, опять же по идее, состояние Меги то не меняется.
возможно, это снимет ошибку
UPD 2:
а в идеале ... переделать модуль на примерно следующий алгоритм (сам не возьмусь, слишком слабое знание внутренней архитектуры MajorDoMo):
если приходит запрос от Меги, то отдавать ответ, как сейчас и реализовано. При этом если ответ значимый (команда), то проверять состояние меги после этого. в идеале, совсем в идеале, только если обработка скрипта занимала более полутора секунд.
если сервер сам отправляет команду Меге, то проверять ОТВЕТ Меги (Done).
и уже если ответа нет, или он не корректен, то проверить состояние Меги.
если отправляется собственная команда, не включенная в модуль, то не проверять ответ вообще. оставить на откуп пользователя все проверки.