Настоящая обратная связь
Добавлено: Пт май 11, 2018 9:03 pm
Всем привет.
Предыстория. можно пропустить)
Мtня сегодня кофеварка обломала)) Еду домой, через телегу прошу Алису сделать кофе. Алиса говорит через 7 минут можно кофе пить. Приезжаю - и нифига, из розетки кофеварка вынута. Облом. Облом, так как скрипт проверяет статус исполнительного устройства, и если статус=1 только тогда отвечает, что кофе готовится. Но, как оказалось - статус 1 ровным счетом ничего не значит. Мажор его тупо установил, модуль mqtt скинул его брокеру, а дошло оно или нет систему не волнует.
Решено было таки сделать нормальную, предсказуемую обратную связь - управляющий и статусный каналы отдельно - благо все мои устройства могут в обратную связь, и все живут на mqtt. командный топик cmnd, статусный stat.
У класса устройств добавил поле cmnd - сюда будем писать команды, и привяжем в модуле mqtt к топику cmnd. Своство статус оставим как было, но писать в него теперь из скриптов ничего нельзя, оно будет устанавливаться только устройством, и всегда отображать его реальное состояние.
Перепишем методы turnOn и turnOff чтобы код простых устройств не портил статус. switch можно оставить как есть, он вызывает вышеуказанные исправленные методы.
На первый взгляд все просто, хорошо и чудесно! Минимальными изменениями удалось добиться настоящей обратной связи. Отправляем команду в cmnd, устройство в ответ устанавливает status.
Но, как всегда, грабли появились оттуда, откуда никто не ждал. А именно - в меню управления, если у выключателя привязать статус к статусу устройства, а в связанный метод поставить switch - что правильно и логично - нифига не работает!!
После 3 кружек кофе и часа тупой отладки выяснилось, что при дергании выключателя он не только вызывает связанный метод, но и какого-то лешего пишет в статус. Причем в статус он пишет раньше, чем вызывает метод. Такого западла я не ожидал. Получатеся жмешь выключатель - он сразу пишет в статус 1, потом вызывает свитч - а свитч видит, что статус =1 и меняет его в 0.
Нифига не включается. И не избыть этого никак.
Если отвязать свойство - то выключатель будет показывать погоду на марсе; если отвязать switch и городить огород с onStatusUpdate - не понять, выключатель его обновил или устройство, да и противоречит это логике, выключатель никак не может знать статуса устройства.
Пришлось колупать commands.class.php и отучить его лазить в статус.
Что характерно - контролы на сцене такой хренью не страдают, все заработало сразу как надо.
Теперь Алиска знает, и говорит, если не удалось включить запрошенное устройство. Больше я с кофе не обломаюсь.
Посему огромная просьба к Сергею - хотя бы в альфе не разрешать больше выключателю писать в статус. там всего то 1 строчку удалить)) или хотя бы поменять местами вызов метода и запись в свойство.
Предыстория. можно пропустить)
Мtня сегодня кофеварка обломала)) Еду домой, через телегу прошу Алису сделать кофе. Алиса говорит через 7 минут можно кофе пить. Приезжаю - и нифига, из розетки кофеварка вынута. Облом. Облом, так как скрипт проверяет статус исполнительного устройства, и если статус=1 только тогда отвечает, что кофе готовится. Но, как оказалось - статус 1 ровным счетом ничего не значит. Мажор его тупо установил, модуль mqtt скинул его брокеру, а дошло оно или нет систему не волнует.
Решено было таки сделать нормальную, предсказуемую обратную связь - управляющий и статусный каналы отдельно - благо все мои устройства могут в обратную связь, и все живут на mqtt. командный топик cmnd, статусный stat.
У класса устройств добавил поле cmnd - сюда будем писать команды, и привяжем в модуле mqtt к топику cmnd. Своство статус оставим как было, но писать в него теперь из скриптов ничего нельзя, оно будет устанавливаться только устройством, и всегда отображать его реальное состояние.
Перепишем методы turnOn и turnOff чтобы код простых устройств не портил статус. switch можно оставить как есть, он вызывает вышеуказанные исправленные методы.
На первый взгляд все просто, хорошо и чудесно! Минимальными изменениями удалось добиться настоящей обратной связи. Отправляем команду в cmnd, устройство в ответ устанавливает status.
Но, как всегда, грабли появились оттуда, откуда никто не ждал. А именно - в меню управления, если у выключателя привязать статус к статусу устройства, а в связанный метод поставить switch - что правильно и логично - нифига не работает!!
После 3 кружек кофе и часа тупой отладки выяснилось, что при дергании выключателя он не только вызывает связанный метод, но и какого-то лешего пишет в статус. Причем в статус он пишет раньше, чем вызывает метод. Такого западла я не ожидал. Получатеся жмешь выключатель - он сразу пишет в статус 1, потом вызывает свитч - а свитч видит, что статус =1 и меняет его в 0.
Нифига не включается. И не избыть этого никак.
Если отвязать свойство - то выключатель будет показывать погоду на марсе; если отвязать switch и городить огород с onStatusUpdate - не понять, выключатель его обновил или устройство, да и противоречит это логике, выключатель никак не может знать статуса устройства.
Пришлось колупать commands.class.php и отучить его лазить в статус.
Что характерно - контролы на сцене такой хренью не страдают, все заработало сразу как надо.
Теперь Алиска знает, и говорит, если не удалось включить запрошенное устройство. Больше я с кофе не обломаюсь.
Посему огромная просьба к Сергею - хотя бы в альфе не разрешать больше выключателю писать в статус. там всего то 1 строчку удалить)) или хотя бы поменять местами вызов метода и запись в свойство.