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

Предполагается, что значение по умолчанию поля writeable равно false (кроме типов switch, pushbutton и range - для них true). Но в любом случае для однозначности в своих скриптах лучше явно указывать это поле, чтобы избежать неопределённости.

Сейчас к релизу готовится версия 2.2.3 - в ней будет поправлено ещё некоторые неоднозначныые моменты в этом месте.

Было бы супер помещать где-либо информацию про обновления со списком новых возможностей и решенных проблем в релизе. Этого очень не хватает.

https://wirenboard.com/wiki/index.php?title=Движок_правил_wb-rules_2.0

https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules#.D0.A1.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D1.8C_.D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.BE.D0.B2_.D0.BF.D1.80.D0.B8_.D0.BE.D0.B1.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B8_wb-rules

  • Была 2.2.1. После апдейта до 2.2.2 сразу заработало, но вчера заметил что баг начал воспроизводится опять (перед этим выключал всю систему физически).
  • Оно перезаписывается из одного единственного правила, отрабатывает правильно и есть в логе значительно позже.
    Тоесть ошибка точно не в правилах или их логике. (работало стабильно до апдейта на 2.2)
    Что можно попробовать?

Сообщение было перенесено в новую тему: Выполнение правила при условии

Движок правил 2.2.2

Что не так делаю в скрипте, суть пытаюсь изменить цвет/диммировать в WB-MRGB-D. Не реагирует на подобные команды

            dev["A4-MRGBW-D"]["RGB"] = "133;133;133";
            dev["A4-MRGBW-D"]["RGB"] = '155;155;155';
            dev["A4-WB-MRGB-D/White"] = 0;
            dev["A4-MRGBW-D"]["White"] = (255).toString();
            dev["A4-MRGBW-D"]["RGB"] = ('155;155;155').toString();

Но если надо вывести в лог, то читает

log("mode_btn: A4-MRGBW-D/RGB = " + dev["A4-MRGBW-D/RGB"]);

Есть ли в джвижке 2.2.2 какая-то особенность, типа например switch понимает только true/false. Как правильно мне присвоить значение контролу и поменять значение канала и общего RGB?

Посмотрел логи:
Apr 16 14:28:02 wirenboard-A3PW5UD7 daemon.info wb-rules[2194]: ERROR: control A4-MRGBW-D/RGB SetValue() error: This control is not writable

Подскажите как правильно сделать, не перебором же искать причину.

это баг, исправление планируется. Пока рекомендую откатиться на версию 1.7.
P.S. тема явно выбрана неправильно. Лучше всего создавать новую тему. Перенёс в другое место.

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

Выполнил:

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;

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

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