[Модуль] Broadlink (dev_broadlink)
Модератор: immortal
- Nail
- Сообщения: 376
- Зарегистрирован: Пн мар 05, 2018 7:09 am
- Откуда: Самара
- Благодарил (а): 174 раза
- Поблагодарили: 28 раз
Re: [Модуль] Broadlink (dev_broadlink)
Подскажите , в новом приложение я не нашел как скачивать рез.копирования для получения из облака коды ИК пультов и Rf коды ?
Mini AMD A6 1450 Quad-core.Ubuntu Server 18.04 (64-bit). MegaD. Zigbee2mqtt+SLS DIN Mini. Broadlink.
- AE_
- Сообщения: 8
- Зарегистрирован: Чт окт 01, 2020 11:35 am
- Откуда: Msk
- Благодарил (а): 1 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: [Модуль] Broadlink (dev_broadlink)
Доброе время суток.
Наткнулся вот на такую "особенность":
при попытке установить значения нескольких properties, привязанных к Broadlink устройству, сохраняется только последнее.
Проблема возникает если изменять свойства, передаваемые в устройство за один вызов. Для примера - HYSEN.set_advanced(...), где помимо прочего устанавливается диапазон допустимых значений целевой температуры, svl..svh.
В результате, код
сохраняет только значение svl.
Происходит это, поскольку при повторном вызове set_advanced() ему передается еще старое, не измененное значение проперти .svh
Это можно обойти, добавив небольшую задержку между setGlobal. В принципе, у меня достаточно и 0.1 секунды, 0.05 уже не помогает:
Тем не менее, этот хак можно применить не везде. Например, если описать "простое устройcтво", у которого присутствуют svl/svh, то из стандартного конфигуратора MD будет возможно изменить только одно значение.
MD - актуальный master, платформа win10. Под debian пока проверить не могу - умерла железка, увы.
Извините, оно само...
И еще вопрос: а почему закомментирован set_time()? Не по той же причине случайно?
Полезная же функция.
Я тут для WiFi термостата "простое устройство" нарисовал, хотелось бы не просто показать что время неправильное а сразу его синхронизировать.
Наткнулся вот на такую "особенность":
при попытке установить значения нескольких properties, привязанных к Broadlink устройству, сохраняется только последнее.
Проблема возникает если изменять свойства, передаваемые в устройство за один вызов. Для примера - HYSEN.set_advanced(...), где помимо прочего устанавливается диапазон допустимых значений целевой температуры, svl..svh.
В результате, код
Код: Выделить всё
setGlobal('therm1.svh', 10);
setGlobal('therm1.svl', 30);
Происходит это, поскольку при повторном вызове set_advanced() ему передается еще старое, не измененное значение проперти .svh
Это можно обойти, добавив небольшую задержку между setGlobal. В принципе, у меня достаточно и 0.1 секунды, 0.05 уже не помогает:
Код: Выделить всё
setGlobal('therm1.svh', 10);
usleep(100000);
setGlobal('therm1.svl', 30);
MD - актуальный master, платформа win10. Под debian пока проверить не могу - умерла железка, увы.
Извините, оно само...
И еще вопрос: а почему закомментирован set_time()? Не по той же причине случайно?
Полезная же функция.
Я тут для WiFi термостата "простое устройство" нарисовал, хотелось бы не просто показать что время неправильное а сразу его синхронизировать.
- AE_
- Сообщения: 8
- Зарегистрирован: Чт окт 01, 2020 11:35 am
- Откуда: Msk
- Благодарил (а): 1 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: [Модуль] Broadlink (dev_broadlink)
Еще один багрепорт:
Время от времени термостат в ответ на запрос статуса присылает либо битый пакет, либо пакет другого формата.
Несмотря на то, что контроль целостности проходит - в payload содержатся неверные данные. Если при этом к свойтсву broadlink устройства привязано свойство класса MD - то оно получает неправильное значение. В результате срабатывает триггер на изменение значения свойства объекта, и это новое (уже не верное!) значение будет передано через Broadlink в термостат.
Как это выглядит:
И это совсем проблема, ибо на уровне MD такие глюки отфильтровать уже невозможно.
Фигня происходит несколько раз в сутки. Если через модуль привязывать SThermostats, то проблемы незаметно, ибо SThermostats плюет на текущие значения, каждый раз переустанавливая новое. А вот пользоваться термостатом как термостатом а не как реле системы обогрева при этом нельзя - температура сбрасывается на 1.5 градуса.
Workaround: в HYNSEN.get_status() хотя бы проверять не просто наличие данных, а наличие достаточного количества данных:
if(count($enc_payload) > 22){
Решением было бы проверять целостность пакета - если там вообще есть контрольная сумма.
Или хотя бы диапазон допустимых значений: (dayofweek>0) && (svh>svl) && (svl>0) и тд.
Время от времени термостат в ответ на запрос статуса присылает либо битый пакет, либо пакет другого формата.
Несмотря на то, что контроль целостности проходит - в 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
Фигня происходит несколько раз в сутки. Если через модуль привязывать SThermostats, то проблемы незаметно, ибо SThermostats плюет на текущие значения, каждый раз переустанавливая новое. А вот пользоваться термостатом как термостатом а не как реле системы обогрева при этом нельзя - температура сбрасывается на 1.5 градуса.
Workaround: в HYNSEN.get_status() хотя бы проверять не просто наличие данных, а наличие достаточного количества данных:
if(count($enc_payload) > 22){
Решением было бы проверять целостность пакета - если там вообще есть контрольная сумма.
Или хотя бы диапазон допустимых значений: (dayofweek>0) && (svh>svl) && (svl>0) и тд.
- Рейтинг: 1.16%
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: [Модуль] Broadlink (dev_broadlink)
К сожалению у меня нет такого термостата на руках...да и весь класс его писал не я...внесите доработки, какие считаете нужными, чтобы термостаты заработали корректно, и отправьте PR в гит.
- За это сообщение автора nick7zmail поблагодарил:
- AE_ (Вс окт 11, 2020 3:19 pm)
- Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".

>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
-
- Сообщения: 58
- Зарегистрирован: Чт сен 13, 2018 10:20 pm
- Благодарил (а): 30 раз
- Поблагодарили: 4 раза
Re: [Модуль] Broadlink (dev_broadlink)
Поделитесь ПУ, или может сразу в магазин дополнений его?)
Имею два таких термостата, очень актуально в свете приближающейся зимы.
- AE_
- Сообщения: 8
- Зарегистрирован: Чт окт 01, 2020 11:35 am
- Откуда: Msk
- Благодарил (а): 1 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: [Модуль] Broadlink (dev_broadlink)
Так всегда пожалуйста

Только минимально необходимая функциональность.
Если в свойствах targetTempNormal или targetTempEco указать температуру - она будет устанавливаться при переключении в соответствующий режим.
Обязательно прилинковать:
power => .status (вкл/выкл)
thermostat_temp => .targetTemp (оно самое)
auto_mode => .autoMode (для отключения режима работы по расписанию)
active => .active (состояние реле термостата)
min => .minutes (периодическое обновление статуса термостата)
Прилинковать желательно:
svh => .targetTempMax
svl => targetTempMin
А если прилинковать hour, или dayofweek, то будет видно, если на термостате неправильно выставлено время. Но просматривая исходники модуля я обнаружил что время на термостате в любом случае синхронизируется каждые сутки в 00:00

Необходимо обязательно обновить dev_broadlink - nick7zmail выложил обновленную версию. Без этого на термостате время от времени сбрасывается целевая температура.
2nick7zmail: спасибо за commit!

- Рейтинг: 1.16%
- AE_
- Сообщения: 8
- Зарегистрирован: Чт окт 01, 2020 11:35 am
- Откуда: Msk
- Благодарил (а): 1 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: [Модуль] Broadlink (dev_broadlink)
Для завязки разговора: я готов подготовить PR еще для одной проблемы но требуется обсуждениеnick7zmail писал(а): ↑Сб окт 10, 2020 2:20 pm...внесите доработки, какие считаете нужными, чтобы термостаты заработали корректно, и отправьте PR в гит.

Как справедливо указал мне на проблему deemjd, при недоступности нескольких отслеживаемых устройств время их опроса становится очень большим и MD считает модуль зависшим (и мы не будем его ругать за это, да

Причина в том, что модуль опрашивает все устройства подряд (dev_broadlink_check.inc.php#78), независимо от того, доступно ли в текущий момент устройство или нет. В результате опрос выключенного устройства занимает до 10 секунд (константа Broadlink->$timeout). Более того, некоторые устройства (тот же HYSEN) опрашиваются в несколько последовательных вызовов и время, соответственно, возрастает кратно.
Проблема более-менее эффективно решается если внутри цикла опроса сделать ping на устройство и проверить результаты (dev_broadlink_check.inc.php#84):
Код: Выделить всё
if(!is_null($rm) && $rm->ping() ) {
НО.
Метод ping() уже реализован в базовом классе. И в нем вроде бы все хорошо - за одним исключением: по умолчанию (кроме пары устройств) используется UDP ping, который не работает ни с одним из моих устройств. В отличие от ICMP, который (насколько я понимаю) в локальной сети должен работать практически всегда. Но поскольку у меня нет возможности проверить это на всем зоопарке поддерживаемых устройств а последствия неправильно работающей проверки будут фатальны - вопрос: насколько безопасно будет перевернуть логику, сделав ICMP ping основным, а UDP - на правах исключения для устройств где это действительно необходимо?
Еще есть вариант "и нашим и вашим": ICMP ping, если устройство недоступно то UDP. Но в моей конфигурации UDP ping отрабатывает до 4 секунд. Это, конечно, лучше 20с но все равно овердофига...
Ну и как уже написал: если получу одобрямс то готов оформить PR. Если нет - опубликую workaround здесь, пусть кому нужно хакают сами

nik7zmail, м?
- Рейтинг: 1.16%
- AE_
- Сообщения: 8
- Зарегистрирован: Чт окт 01, 2020 11:35 am
- Откуда: Msk
- Благодарил (а): 1 раз
- Поблагодарили: 4 раза
- Контактная информация:
Re: [Модуль] Broadlink (dev_broadlink)
Спасибо nik7zmail за обновление модуля!
- Время на термостате теперь автоматически синхронизируется (в случае если часы убежали больше чем на 30 секунд) при каждом опросе а не только в течение первой минуты после полуночи.
- Модуль теперь умеет не опрашивать выключенные устройства. Для этого в настройках необходимо поставить галочку "проверять доступность устройств перед опросом".
- Рейтинг: 1.16%