Если обратится к массиву глобальных значений, к ключу который еще не был проинициализирован, то wb-rules упадет, пример кода:
var globalLights = new PersistentStorage("lights_storage", {global: true}); // Глобальное хранилище значений диммеров в ПЗУ
if (globalLights["123"] === undefined) {
log("Этот комментарий не появится, а wb-rules упадет, пока ключ 123 Не будет проинициализирован");
}
Не получается воспроизвести проблему на 2.3.3 (в ветке 1.7 эта проблема действительно присутствует) - сообщение в логе появляется wb-rules не падает.
Могли бы вы предоставить дополнительную инфомацию:
вывод apt policy wb-rules
выполнить service wb-rules stop ; /usr/bin/wb-rules -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
добиться креша и прикрепить сюда вывод из терминала (желательно отдельным файлом)
если для воспроизведения в этих условиях потребуется изменить код скрипта - приложите его сюда в новом виде
Вот вы все будете удивлены, но у меня тоже все заработало. может помогла неоднократная перезагрузка устройства. Сорри за беспокойство.
Но есть еще один вопрос - по изменению состояний девайсов (диммеры) записываю их значения в:
var globalLights = new PersistentStorage(“lights_storage”, {global: true}); // Глобальное хранилище значений диммеров в ПЗУ
таким образом: globalLights[key] = value;
После перезагрузки скрипта, читаю эти значения и соответственно восстанавливаю состояния диммеров: if (debugLog) log("[Lights] " + relay_name + relay_control + " = " + globalLights[relay_name + relay_control]);
Так вот, при перезагрузке скрипта, все работает идеально - все что было сохранено, также и восстанавливается. Но стоит перезагрузить контроллер (через reboot now либо кнопкой) то значения восстанавливаются совершенно иные, нежели были записаны в последний раз.
Отчего такое может происходить?
P.S. причем в соседнем скрипте я также вытаскиваю данные при загрузке и там все ок, там правдо ключи более простые K1, K2 и т.д., в отличии от этого хранилища где ключи текстовые до 20 символов. Также в первом (работающем) хранилище есть только boolean значения, то в неработающем есть как boolean так и integer.
UPD: Попробовал заменить хранилище, создал с новым идентификатором - все ровно тоже самое.
mosquitto_sub -v -t “/devices/testControl/controls/”# | ts
May 31 18:48:28 /devices/testControl/controls/switch_control/on 1
May 31 18:48:28 /devices/testControl/controls/switch_control 1
May 31 18:48:28 /devices/testControl/controls/pers_text Test text
May 31 18:48:36 /devices/testControl/controls/switch_control/on 0
May 31 18:48:36 /devices/testControl/controls/switch_control 0
May 31 18:48:36 /devices/testControl/controls/pers_text (null)
May 31 18:48:41 /devices/testControl/controls/switch_control/on 1
May 31 18:48:41 /devices/testControl/controls/switch_control 1
May 31 18:48:41 /devices/testControl/controls/pers_text Test text
Лог при включении/выключении свича:
May 31 18:48:28 wirenboard-AHZ2TA3P daemon.info wb-rules[24319]: INFO: [rule info] text: null
May 31 18:48:36 wirenboard-AHZ2TA3P daemon.info wb-rules[24319]: INFO: [rule info] text: null
May 31 18:48:41 wirenboard-AHZ2TA3P daemon.info wb-rules[24319]: INFO: [rule info] text: null
То же самое при использовании dev[‘testControl’][‘pers_text’] в других правилах.
Ну во-первых я не согласен что мой случай описан по ссылке. Если бы это было так, правило не должно срабатывать вообще. (у меня куча правил ссылается или изменяет статус девайсов объявленных в других файлах. это же касается и реальных устройств, разве нет?)
Расскажите, пожалуйста, поподробнее.
А свитч будет отрабатывать (включая лог) как положено.
Надеюсь задаю вопрос в правильной ветке, но полагаю здесь это более уместно.
При загрузке системы (после включения), все правила которые привязаны на отработку изменений нажатия (например) кнопок - запускаются со значением False.
Приведу пример:
Вот такое правило:
defineRule(name, {
whenChanged: “wb-gpio/” + switch_control,
then: function(newValue, devName, cellName) {
}
});
Отработает при загрузке системы со значение newValue = false.
Для себя это вижу как проблему, т.к. в процессе загрузки стартуют правила, которые должны обрабатывать нажатия кнопок и соответственно если был факт перезагрузки контроллера (питание отключали надолго и не справились UPSы) то при загрузке может включится свет, вентиляторы и еще много чего.
Баг или фича?
P.S. Версия wb-rules 2.3.3
P.P.S. Пришлось сделать заплатку, а именно флаг boolean initialized = false и после 10 секунд от начала работы скрипта записывать в него true и все события уже отрабатывать как только initialized = true.
В версии 2.4.0 появился доступ к мета-информации каналов из правил. Теперь, например, можно написать правило, реагирующее на ошибку опроса какого-то канала.
В 2.5.0 появился интерфейс для просмотра и редактирования каналов устройств.
Теперь можно добавлять новые каналы в уже созданное виртуальное устройство.
Это может использоваться, например при реализации драйверов устройств и протоколов на wb-rules. В Wiren Board эту функциональность использует драйвер knx и zigbee.
Установка:
раскомментировать строчку в /etc/apt/sources.list.d/wb-unstable.list или добавить deb http://releases.contactless.ru/unstable/stretch stretch main