Настоящая обратная связь
Модератор: immortal
- nightwind
- Сообщения: 333
- Зарегистрирован: Вс июн 26, 2016 4:42 pm
- Откуда: Барановичи
- Благодарил (а): 28 раз
- Поблагодарили: 52 раза
- Контактная информация:
Настоящая обратная связь
Всем привет.
Предыстория. можно пропустить)
М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 строчку удалить)) или хотя бы поменять местами вызов метода и запись в свойство.
- Рейтинг: 2.33%
- nightwind
- Сообщения: 333
- Зарегистрирован: Вс июн 26, 2016 4:42 pm
- Откуда: Барановичи
- Благодарил (а): 28 раз
- Поблагодарили: 52 раза
- Контактная информация:
Re: Настоящая обратная связь
Кажись дописал) букофф много, чукча не писатель, чукча в основном читатель тут.
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1753 раза
- Контактная информация:
Re: Настоящая обратная связь
Я вот 4 года с МДМ и до сих пор не определился с оптимальной концепцией, как управлять - через запись в свойство или через вызов метода.
И в последнее время все же склоняюсь к свойствам и перевожу все на них для единообразия. Но вышеуказанный затык с обратной связью имеет место быть, аха. ))
И в последнее время все же склоняюсь к свойствам и перевожу все на них для единообразия. Но вышеуказанный затык с обратной связью имеет место быть, аха. ))
- Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
- nightwind
- Сообщения: 333
- Зарегистрирован: Вс июн 26, 2016 4:42 pm
- Откуда: Барановичи
- Благодарил (а): 28 раз
- Поблагодарили: 52 раза
- Контактная информация:
Re: Настоящая обратная связь
У меня как то раньше был затык еще смешнее - выключатель включаешь - статус 1 - а, устройство не может отработать как надо, и через некоторое время высылает в статус 0. потом у него получается, оно высылает статус 1. потом все эти онСтатусАпдэйт - и выключатель дергается как дурной туда сюда раз 10. Даже не помню, как я это победил тогда, но было смешно.
ИМХО даже название "статус" намекает на состояние устройства, а не на точку управления им.
ИМХО даже название "статус" намекает на состояние устройства, а не на точку управления им.
-
- Сообщения: 1462
- Зарегистрирован: Вс янв 10, 2016 11:05 am
- Благодарил (а): 260 раз
- Поблагодарили: 454 раза
Re: Настоящая обратная связь
Тут ведь самое главное, чтобы была физическая возможность обеспечить обратную связь. Т.е. наличие "средств объективного контроля" за фактическим состоянием прибора или возможность прибора "сказать" серверу свое фактическое состояние (если прибор "шибко умный").
Вот, например, реализация обратной связи "глупого" телевизора (по включению) с помощью датчика тока (https://www.ab-log.ru/forum/viewtopic.p ... 641#p30641).
ПС. А с простыми устройствами я так и побоялся связываться. Что-то там уж все слишком для меня (чайника) непрозрачно. Почесав за ухом и сбросив монету, решил, что все статусы (в т.ч. состояния) буду менять методами. Как-то так оно мне понятнее.
Вот, например, реализация обратной связи "глупого" телевизора (по включению) с помощью датчика тока (https://www.ab-log.ru/forum/viewtopic.p ... 641#p30641).
ПС. А с простыми устройствами я так и побоялся связываться. Что-то там уж все слишком для меня (чайника) непрозрачно. Почесав за ухом и сбросив монету, решил, что все статусы (в т.ч. состояния) буду менять методами. Как-то так оно мне понятнее.
-
- Сообщения: 529
- Зарегистрирован: Сб мар 12, 2016 6:33 pm
- Откуда: Ухта, Россия
- Благодарил (а): 3 раза
- Поблагодарили: 154 раза
Re: Настоящая обратная связь
Я уже в Телеге говорил, что в объектах нет флага обратной связи, посмотрите как сделано в том же iob. Это очень удобно, а сейчас реализовано через костыли и не понятно, что записано в свойство - запрос на изменение или значение получено через ОС.
Но у вас проблема в том, что кофеварка не дала обратную связь, это можно хотя бы через датчик тока сделать.
Но у вас проблема в том, что кофеварка не дала обратную связь, это можно хотя бы через датчик тока сделать.
- nightwind
- Сообщения: 333
- Зарегистрирован: Вс июн 26, 2016 4:42 pm
- Откуда: Барановичи
- Благодарил (а): 28 раз
- Поблагодарили: 52 раза
- Контактная информация:
Re: Настоящая обратная связь
nightwind писал(а): ↑Вс май 13, 2018 1:04 pmТа не, проблема именно в системе была. Сейчас так: Мажор послал команду на включение, и если пришел ответ, что включено - значит включено. В любом другом случае (даже если никакой ответ не пришел - значит она выключена физически и не может ответить) - считается за невключение. (Все исполнительные устройства вайфай, об изменении состояния сразу пишут в топик mqtt) Хочу еще LWT привязать, но лень)
И токовый датчик тут уже не нужен.
- nightwind
- Сообщения: 333
- Зарегистрирован: Вс июн 26, 2016 4:42 pm
- Откуда: Барановичи
- Благодарил (а): 28 раз
- Поблагодарили: 52 раза
- Контактная информация:
Re: Настоящая обратная связь
Это фактически осознанный отказ от обратной связи. Чем продиктовано такое решение, если не секрет?skysilver писал(а): ↑Пт май 11, 2018 9:55 pmЯ вот 4 года с МДМ и до сих пор не определился с оптимальной концепцией, как управлять - через запись в свойство или через вызов метода.
И в последнее время все же склоняюсь к свойствам и перевожу все на них для единообразия. Но вышеуказанный затык с обратной связью имеет место быть, аха. ))
ПС. Главадмин пулреквест откинул - чтобы не ломать текущую логику системы. Сча пытаюсь отучить только выключатель писать в статус, сделать ему настраиваемое поле status RO/RW, да сходу не получается. (для себя конечно оставил свою логику). Что характерно - кнопка на сцене работает правильно из коробки)
- xor
- Сообщения: 2039
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 286 раз
- Поблагодарили: 629 раз
Re: Настоящая обратная связь
Я у себя городил обратную связь в методе, допустим, включения добавляя к команде еще айди rnd*1000, одновременно запуская таймер на неск. секунд с именем айди, где откатывал включение и сообщал об ошибке. Если команда проходит, она возвращает айди и соотв. тайм-аут очищается, если команда не проходит, срабатывает тайм-аут, откатывает статус, сообщает об ошибке
Отправлено с моего Redmi 4X через Tapatalk
Отправлено с моего Redmi 4X через Tapatalk
- Рейтинг: 1.16%
win10 connect https://connect.smartliving.ru/profile/303