Новая версия движка правил

Как правильно откатиться? Не нашел, наверно нужно в топе указать как оперативно восстановить после случайного апдейта полуфабриката.

Выполнил:

apt update
apt install wb-rules-system=1.6.3

После обратил внимание что девайс Buzzzer имеет определенные не активные поля. Switch можно включить, но вот выключить уже не удается. Сколько таких подснежников остается только гадать.
изображение

Какая версия у меня все таки стоит? ниже лог. Жирным выделил две команды которые нашел в разных частях ветки.

root@wirenboard-A3PW5UD7:~# dpkg -s wb-rules
Package: wb-rules
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 15280
Maintainer: Nikita webconn Maslov n.maslov@contactless.ru
Architecture: armhf
Version: 2.2.2
Depends: libc6 (>= 2.13)
Breaks: wb-mqtt-confed (<< 1.0.2), wb-rules-system (<< 1.6.3)
Conffiles:
/etc/init.d/wb-rules 1579ece52285107cde1482052f47615d
/etc/wb-configs.d/13wb-rules 1236e2e4343d949e0a21de865706c00b
/etc/wb-rules/alarms.conf 2051dd214a6232c5e778c50e52d5fb6a
/etc/wb-rules/rules.js 926c30d0fd63e272f6f9ad370dffb1b0
Description: Wiren Board Rule Engine
root@wirenboard-A3PW5UD7:~# apt policy wb-rules-system
wb-rules-system:
Installed: 1.6.3
Candidate: 1.6.3
Version table:
*** 1.6.3 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
100 /var/lib/dpkg/status
1.6.2 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.6 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.5 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.4.3 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.4.2 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.4.1 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
1.4 990
990 http://releases.contactless.ru/stable/stretch stretch/main armhf Packages
990 http://releases.contactless.ru/stable/stretch stretch/main all Packages
root@wirenboard-A3PW5UD7:~#

Вышла новая версия движка правил: wb-rules 2.3.0.

В ней исправлены проблемы, про которые писали выше:

  • Поведение switch, в том числе пищалки
  • Путаница с meta/writable и meta/readable: чтобы сделать редактируемый виртуальный контрол, надо просто написать readonly: false
  • ошибка с установкой значения для RGB каналов

Обновление:
apt update && apt install wb-rules

Вернулись ошибки:
daemon.info wb-rules[1542]: ERROR: control vrd_485_5/Red1 SetValue() error: This control is not writable

{
“device_type”: “VRD-485”,
“device”: {
“name”: “VRD-485”,
“id”: “vrd_485”,
“channels”: [
{
“name”: “Red1”,
“reg_type”: “holding_multi”,
“address”: 4,
“poll_interval”: 1000,
“type”: “value”
},…

воспроизвёл, будем исправлять. К сожалению, это очень редкий сценарий использования - пропустили при тестировании.

Обходной пусть: вручную отправить meta/readonly:

mosquitto_pub -t '/devices/VRD-485/controls/Red1/meta/readonly' -r -m '0'

При этом wb-mqtt-serial и остальное ПО скоро будет ставить meta/readonly во всех случаях.

исправлено в 2.3.1

А при использовании оператора IF теперь в условиях вместо 1 или 0 нужно писать true или false? И работать условия не будут если написано числами?

Всем привет.

Поставил (случайно обновился) 2.3.1 сегодня и получил следующий баг:

При нажатии кнопки, запускаю setTimeout :
Lights[relay_name + relay_control][“timer_id”] = setTimeout(function () {
if (debugLog) log(“Start Dimmer”);
Lights[relay_name + relay_control][“dim_direction”] = 0;
Lights[relay_name + relay_control][“dimming”] = 1;
dimLight(relay_name, relay_control);
}, shortClickTimeoutMS + 100);

соответсвенно запускается процедура dimLight, по окончании которой wb-rules бесследно умирает.
Помогает только через shell: service wb-rules restart

Сейчас пробую откатиться на предыдущие версии и выяснить где еще работает.

UPD: Пришлось откатиться аж до 1.7.1, только там заработало все как было раньше.
Могу предоставить код и конфигурацию системы для анализа.

P.S. Для того чтобы проверить список доступных версий пакета в терминале выполняем:
apt-get update
apt-cache policy wb-rules

Покажет все вресии пакета, выбираем нужную и командой apt install wb-rules=[нужная версия пакета] (например apt install wb-rules=2.2.0) устанавливаем пакет.

А в логах ничего нет? Содержимое функции покажите тоже пожалуйста

в Messages пусто.

Вот процедура:

function dimLight(relay_name, relay_control) {
  //Функция диммирования света, работает по таймеру
  // direction = 1 - добавляем, 0 - убавляем
  var myTimeout = dimmerStepTimeout; // = 20

	if (Lights[relay_name + relay_control]["dimming"] == 1) {
		if (Lights[relay_name + relay_control]["timer_id"] != null) {
			clearTimeout(Lights[relay_name + relay_control]["timer_id"]);
		}
		if (debugLog) log("Begin dimming");
	}
	  if (Lights[relay_name + relay_control]["dim_direction"] == 1) {
  		if (Lights[relay_name + relay_control]["value"] + Lights[relay_name + relay_control]["dimmerStep"] < Lights[relay_name + relay_control]["top"]) {
		    	//Еще не достигли верха
      			Lights[relay_name + relay_control]["value"] = Lights[relay_name + relay_control]["value"] + Lights[relay_name + relay_control]["dimmerStep"];
	  	} else {
    			//Достигли верха
			if (debugLog) log("Going down");
      			Lights[relay_name + relay_control]["dim_direction"] = 0;
	      		myTimeout = shortClickTimeoutMS / 2;
      			Lights[relay_name + relay_control]["value"] = Lights[relay_name + relay_control]["realTop"];
	  	}
	  } else {
  		if (Lights[relay_name + relay_control]["value"] - Lights[relay_name + relay_control]["dimmerStep"] > Lights[relay_name + relay_control]["bottom"]) {
	    		//Еще не достигли низа
      			Lights[relay_name + relay_control]["value"] = Lights[relay_name + relay_control]["value"] - Lights[relay_name + relay_control]["dimmerStep"];
	  	} else {
		    	//Достигли низа
			if (debugLog) log("Going up");
		      	Lights[relay_name + relay_control]["dim_direction"] = 1;
		      	myTimeout = shortClickTimeoutMS / 2;
		      	Lights[relay_name + relay_control]["value"] = Lights[relay_name + relay_control]["realBottom"];
		}
	  }

	var dimVal = Lights[relay_name + relay_control]["value"];
	if (dimVal < Lights[relay_name + relay_control]["realBottom"]) { dimVal = Lights[relay_name + relay_control]["realBottom"]; }
	if (dimVal > dimmerRealTop) { dimVal = Lights[relay_name + relay_control]["realTop"]; }

	dev[relay_name][relay_control] = dimVal;

	if (Lights[relay_name + relay_control]["dimming"] == 1) {
		Lights[relay_name + relay_control]["dimming"] = 2;

		Lights[relay_name + relay_control]["timer_id"] = setInterval(function () {
			dimLight(relay_name, relay_control);   
    		}, myTimeout);
	}

log("End dimming");
}

Пробовал отключать последний setInterval - безрезультатно, как только процедура завершилась, лог выодится и wb-rules сразу падает.

обновился на новую версию 20200217 - перестали работать все скрипты((
dpkg -s wb-rules Version: 2.3.1, какой был - не знаю.
в логе пусто, ошибок нет.
пример скрипта:

// Включение / выключение правила выключателем на панели Devices
// Создаём виртуальное устройство - выключатель
defineVirtualDevice("upravl_obogrev", {
  title: "Upravl obogrev",
  cells: {
    enabled: {
      type: "switch",
      value: false
    },
  }
});

defineRule("heater_control", { //название правила - "контроль обогревателя"
  whenChanged: "wb-msw-v3_21/Temperature", //при изменении состояния датчика wb-msw-v3_21
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev.upravl_obogrev.enabled) { // если вируальн. устр-во simple_test  в положении enabled    
      if ( newValue < 18) { //если температура датчика меньше xx градусов
      dev["wb-mr3_15"]["K1"] = 1; //установи K1 модуля wb-mr3 с адресом 15 в состояние "включено"
       } else { // иначе
       if ( newValue > 19) { //если температура датчика больше xx градусов
      dev["wb-mr3_15"]["K1"] = 0; //установи K1 модуля wb-mr3 с адресом 15 в состояние "выключено"
       }
      }
    }
  }
});

https://wirenboard.com/wiki/index.php?title=Совместимость_скриптов_при_обновлении_wb-rules

думаю дело в

dev["wb-mr3_15"]["K1"] = 1;

но в логах это должно быть, посмотрите пожалуйста ещё раз

спасибо, подправил, всё заработало. В логах пусто все равно.

Причину нашел.

Если внутри функции, вызываемой по setInterval сделать clearInterval с ее айдишником - то wb-rules упадет.

Спасибо за репорт бага. Фикс подготовлен, в ближайшее время будет релиз с исправлением этой проблемы.

Испрвалено в 2.3.2, в стабильном репозитории.

11 сообщений были перенесены в новую тему: Странные значения в топиках вирутального устройства

Обновились до версии 2.3.3. Устройства на шине не срабатывали, т.е., например, правило указывает включить реле, правило работает, реле не включается.
Глубоко не разбирались.
Откат до версии 1.7.1 исправил положение.

Итак, продолжаем BugHunting:

Движок 2.3.3:

Если обратится к массиву глобальных значений, к ключу который еще не был проинициализирован, то wb-rules упадет, пример кода:

var globalLights = new PersistentStorage("lights_storage", {global: true}); // Глобальное хранилище значений диммеров в ПЗУ

   if (globalLights["123"] === undefined) { 
       log("Этот комментарий не появится, а wb-rules упадет, пока ключ 123 Не будет проинициализирован");
   }
1 лайк

@borg спасибо! Будем исправлять.