Ошибки и предложения

В этом разделе вы можете проголосовать за идеи по открытым проектам. Вы всегда можете предложить свою идею, перейдя на страницу проекта.

Спасибо!

Мы очень рады, что Вам нравится данный проект и вы проголосовали за его развитие.

Работа над задачами по проекту отнимает у его разработчика самое ценное — время, так что небольшая компенсация в виде материальной поддержки поднимет интерес к разработке и позволит сделать больше задач для общей пользы :)

Перейти к проекту Нет, спасибо

<<< Назад

Баг в HYNSEN.get_status();

Добавлено: 2020-10-10 12:50:11 AE / Статус: Новая / Проект: Модуль Broadlink

Время от времени термостат в ответ на запрос статуса присылает либо битый пакет, либо пакет другого формата.
Несмотря на то, что пакет проходит контроль целостности проходит - в payload содержатся неверные данные. Если при этом к свойству broadlink устройства привязано свойство класса MD - то оно получает неправильное значение. В результате срабатывает триггер на изменение значения свойства объекта, и это новое (уже неверное) значение будет передано через Broadlink в термостат.
Как это выглядит:
10:03:40 HYNSEN.get_status: temp=29.5, [5..35]: 1,3,44,0,0,59,59,0,0,0,0,35,5,0,0,1,0,0,0,3,40,42,6,6,0,8,0,11,30,12,30,17,0,22,0,8,0,23,0,40,30,30,30,44,33,44,30,171,195
10:03:40 HYNSEN.get_status: temp=1.5, [0..0]: 165,165,90,90,98,193,3,11,9,0,0,0,0,59,59,35,5
10:03:40 dev_broadlink: 'thermostat_temp' set '1.5'
10:03:40 therm01.targetTemp changed to '1.5'
10:03:40 dev_broadlink: set_temp({8,0,1,6,0,1,0,3,152,11})
10:03:40 HYNSEN.set_advanced({19,0,1,16,0,2,0,5,10,0,9,0,0,0,5,0,0,1,0,165,250})
10:03:40 HYNSEN.get_status: temp=1.5, [0..0]: 1,3,44,0,0,59,3,0,0,0,0,0,0,0,0,1,0,0,0,3,40,55,6,6,0,8,0,11,30,12,30,17,0,22,0,8,0,23,0,40,30,30,30,44,33,44,30,191,5

И это совсем проблема, ибо на уровне MD такие глюки отфильтровать уже невозможно.
Фигня происходит несколько раз в сутки. Если через модуль привязывать SThermostats, то проблемы незаметно, ибо SThermostats плюет на текущие значения, каждый раз переустанавливая новое. А вот пользоваться термостатом как термостатом а не как реле системы обогрева при этом нельзя - температура сбрасывается на 1.5 градуса.

Workaround: в HYNSEN.get_status() хотя бы проверять не просто наличие данных, а наличие достаточного количества данных:
if(count($enc_payload) > 22){

Решением было бы проверять целостность пакета - если там вообще есть контрольная сумма.
Или хотя бы диапазон допустимых значений: (dayofweek>0) && (svh>svl) && (svl>0) и тд.

+1
 
Обсуждение (0)