Примеры скриптов

Есть ли добрые люди, готовые поделиться примерами скриптов из реальной жизни? Самое простое: реакция на кнопу, напряжение, сопротиление на wiki есть. Пока, как в скрипте “сделать” импульс, счетчик, как хранить какие-нибудь данные, для не программиста не очевидно.

Вот, к примеру, что у меня получилость для управления бистабильным реле:

defineVirtualDevice("water_state", {
  title: "Water state", //
  cells: {
    'Water' : {
        type : "text",
        value : ""
    }
  }
});

defineRule("water_on", {
        when: function () {
                return dev["wb-gpio"]["D2_IN"] == 1;
        },
        then: function () {
                startTimer("TimerA3", 1000);
                dev["wb-gpio"]["Relay_1"] = 1;
                dev["wb-gpio"]["A3_OUT"] = 1;
		        dev.water_state["Water"] = "ОТКРЫТА";
        }

});

defineRule("water_off", {
	when: function () {
		   	return dev["wb-gpio"]["D2_IN"] == 0;
	},
	then: function () {
        	startTimer("TimerA3", 1000);
        	dev["wb-gpio"]["Relay_1"] = 0;
        	dev["wb-gpio"]["A1_OUT"] = 1;
            dev.water_state["Water"] = "ЗАКРЫТА";
	}
});

defineRule("water_end_pulse", {
	when: function () {
		return	timers.TimerA3.firing;
	},
	then: function () {
		dev["wb-gpio"]["A1_OUT"] = 0;
        dev["wb-gpio"]["A3_OUT"] = 0;
       // timers.TimerA3.stop();
	}
});
1 лайк

работа с cron.

убедились, что cron работает
ps wax | grep cron

скрипт вкл/выкл реле + log (tail /var/log/messages) по времени

[quote]defineRule(“BoylerON”, {
when: cron(“0 29 6 * *”),
then: function () {
dev[“wb-gpio”][“Relay_2”] = 1;
log(“BoylerON_06:30”);
}
});
defineRule(“BoylerOFF”, {
when: cron(“0 45 7 * *”),
then: function () {
dev[“wb-gpio”][“Relay_2”] = 0;
log(“BoylerOFF_7:45:00”);
}
});

[/quote]

1 лайк

Может у кого есть скрипт для реализации подсчёта импульсов, покажите пример пожалуйста!

А с чего вы считать импульсы собираетесь? Если с входов контроллера, то это делается не скриптами, а настройками wb-homa-gpio.conf

грубо говоря считать количество нажатий на кнопку, и сухой контакт, и вывод контроллера (atmega) открытый коллектор

А к Wiren Board это как подключено? К каким портам?

Сейчас к D1-D4, но для меня не принципиально. Просто необходимо реализовать для заказчика подсчёт сессий работы станка, а как считать - не понимаю.
На атмеге элементарно, но с графиками тяжелее. На WB Ваши последние обновления как раз кстати, но как счётчик сделать?

Вам лучше всего настроить wb-homa-gpio через wb-homa-gpio.conf на этих входах в режим подсчёта импульсов. Это описано в документации https://github.com/contactless/wb-homa-drivers/blob/master/wb-homa-gpio/README.md
.

Там это сделано для счётчиков воды или электричества, но если вы поставите множитель 1, то увидите там прямо сырое число импульсов. Драйвер использует аппаратные прерывания, устранение дребезжания и т.п., в общем работает весьма умно. Это гораздо лучше и быстрее, чем реализовывать в системе правил.

Спасибо!

Реализовал на примере изменения состояния переключателя. Считаем до 3-х. Переменая нигде не описана, после перезагрузки а=0.

//
defineVirtualDevice("counter_state", {
  title: "CounterState", //
  cells: {
    'Count' : {
	type : "text",
	  value : ""
    }
  }
});
//var a = 0; //
defineRule("counter", {
    when: function () {
	        return dev["wb-gpio"]["D1_OUT"] == 1;
    },
    then: function() {
       a = a + 1;
      dev["counter_state"]["Count"] = a ;
      log(a);
      if (a == 3){
	  log("reset counter",a);
	    a = 0;
	}
    }
)};

в логах

1 лайк

В связи с блекаутами в Крыму появилась необходимость отключать WB по разряду АКБ

defineRule("power_low", {
    when: function () {
	       return dev["power_status"]["Vin"] <= 10.6;
    },
    then: function () {
      log("Voltage lower than 10.6V. System is shutdown.");
      runShellCommand("halt");      
    }
});
1 лайк

так заработал cron:

defineRule("BoylerON", {
  when: cron("0 29 6 * *"),
  then: function () {
   dev["wb-gpio"]["Relay_2"] = 1;
   log("BoylerON_06:30");
  }
});

defineRule("BoylerOFF", {
  when: cron("0 30 21 * *"),
  then: function () {
   dev["wb-gpio"]["Relay_2"] = 0;
   log("BoylerOFF_21:30");
  }
});

defineRule("BoylerON1", {
  when: cron("0 35 18 * *"),
  then: function () {
   dev["wb-gpio"]["Relay_2"] = 1;
   log("BoylerON1_18:35:00");
  }
});

defineRule("BoylerOFF1", {
  when: cron("0 05 8 * *"),
  then: function () {
   dev["wb-gpio"]["Relay_2"] = 0;
   log("BoylerOFF1_8:05:00");
  }
});
1 лайк

Добавили в примеры правило для управления роллетами. В правилах используются замыкания для изоляции названий переменных, таймеры, а также alias-ы.

http://contactless.ru/wiki/index.php/Движок_правил_wb-rules#.D0.A0.D0.BE.D0.BB.D0.BB.D0.B5.D1.82.D1.8B

Ткните пожалуйста пальцем, где это в правиле. Или может где почитать. Вообще, подумалость, было бы поучительно получить хотя-бы начальные понятия для облегчения написаний правил …или может не написаний, а как в skratch - кубики составлять

Речь про вот это: http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/

т.е. весь код целиком оборачивается в

(function(){{  
     вот тут весь код
})()

В правиле это превая и последняя строчка.

Нужно это для того, чтобы переменные не были видны в других скриптах.

Это не обязательно, если вы следите за названиями переменных.

Когда-нибудь мы сделаем изоляцию файлов друг от друга из коробки, но пока - так.

1 лайк

BTW: движок правил не зависит от системного cron, у него своя реализация, так что проверка сервиса cron здесь не обязательна.

Сообщение перенесено в новую тему: Вопрос по paho mqtt

Сообщение перенесено в тему Вопрос по paho mqtt

Скажите, а где спрашивать про написание скриптов?
Если здесь, то вопрос - как модифицировать пример скрипта - при возникновении флажка на сенсоре, начать
отсчет таймера, если флажок обнуляется, то таймер отключается. Если таймер истекает и флажк =1 , то выполнение действий. спасибо!

var motion_timer_1_timeout_ms = 50 * 1000;
var motion_timer_1_id = null;

defineRule("motion_detector_2", {
  whenChanged: "astra_1_sensor_2/Channel1",
    
  then: function (newValue, devName, cellName) {
    if (newValue) {
       //dev["wb-mr14_10"]["K12"]=1;
        	if (motion_timer_1_id) {
              clearTimeout(motion_timer_1_id);
       }
      
        motion_timer_1_id = setTimeout(function () {
   	//	   dev["wb-mr14_10"]["K12"]=0;
         motion_timer_1_id = null;   
      }, motion_timer_1_timeout_ms);           	
    }
   }
});