Универсальный виртуальный счетчик

Итак, сегодня в рубрике “сову на глобус” представляю свой таймер. Вдруг кому пригодится. Как минимум зажигать свет по движению и продлевать горение, если кто-то все еще бродит, упрощает.

var TmrCnt = 0;

function makeVirtualTimer(deviceName, seconds) {
   defineVirtualDevice(deviceName, {
      title: {en: "Virtuall Timer " + deviceName + " " + seconds + " sec", ru: "Виртуальный таймер " + deviceName + " " + seconds + " сек" } ,
      cells: {
          enabled: {
            title: {'en': 'Enabled', 'ru': 'Запущен'},
            type: "switch",
            value: false,
          },
          reset: {
            title: {'en': 'Reset', 'ru': 'Сброс'},
            type: "switch",
            value: false,
          },
          state: {
            title: {'en': 'Current count', 'ru': 'Текущее значение'},
            type: "value",
            value: seconds,
          },
          tmrValue: {
            title: {'en': 'Timer Value', 'ru': 'Размер таймера'},
            type: "value",
            value: seconds,
          },
      },
  });


defineRule(deviceName + "_timer_rule", 
           {
             when: cron('@every 1s'),
             then: function () 
             {
               if(dev[deviceName + "/enabled"] == true)
               {
                 dev[deviceName + "/state"] -= 1;
                 if(dev[deviceName + "/reset"] == true)
                 {
                   dev[deviceName + "/reset"] = false;
                   dev[deviceName + "/state"] = dev[deviceName + "/tmrValue"];
                 }
                 if(dev[deviceName + "/state"] < 0)
                 {
                   dev[deviceName + "/enabled"] = false;
                   dev[deviceName + "/state"] = dev[deviceName + "/tmrValue"];
                 }
               }
             }
           }
          );
}

makeVirtualTimer("timer1", 10);
makeVirtualTimer("timerGoodByeAmerica", 30);
makeVirtualTimer("timerKladovka", 30);

Практическое применение c MSW:

//имя датчика
var motionDevName = "klad-msw"; 
//чувствительность датчика
var motionThreshold = 60; 
//имя девайса, который надо зажигать
var LampVirtDevName1 = "bedroom_kladovka_light"; 

defineRule("motion_detector_kladovka_on", {
    whenChanged: motionDevName + "/Current Motion",
    then: function (newValue, devName, cellName) {
        if (newValue > motionThreshold) {
            dev["timerKladovka/enabled"] = true;
            dev["timerKladovka/reset"] = true;
        }
    },
});

defineRule("motion_detector_kladovka_light_ctl", {
    whenChanged: "timerKladovka/enabled",
    then: function (newValue, devName, cellName) {
      dev[LampVirtDevName1+"/state"] = dev["timerKladovka/enabled"];
    },
});

4 Likes

Спасибо, что делитесь своими наработками!