Перейти к содержанию

Навигация

Rule Examples/en: различия между версиями

Обновление для соответствия новой версии исходной страницы.
(Обновление для соответствия новой версии исходной страницы.)
 
(не показано 12 промежуточных версий 1 участника)
Строка 1: Строка 1:
{{DISPLAYTITLE: Примеры правил}}
<languages/>
<languages/>
{{DISPLAYTITLE: Rule Examples}}
=== Control tracking ===
=== Control tracking ===


Строка 53: Строка 54:
The lighting is connected via a built-in relay corresponding to the <code>wb-gpio/Relay_1</code> channel.
The lighting is connected via a built-in relay corresponding to the <code>wb-gpio/Relay_1</code> channel.


<div class="mw-translate-fuzzy">
The rule works like this:
The rule works like this:
* when movement appears, the light turns on. If a thirty-second "off" timer was previously started, this timer is disabled;
* when movement appears, the light turns on. If a thirty-second «off» timer was previously started, this timer is disabled;
* when motion is lost, a thirty second "off" timer is started. If he manages to reach the end, the light turns off.
* when motion is lost, a thirty second «off» timer is started. If he manages to reach the end, the light turns off.
</div>


<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">
Строка 63: Строка 62:
var motion_timer_1_id = null;
var motion_timer_1_id = null;


<div class="mw-translate-fuzzy">
defineRule("motion_detector_1", {
defineRule("motion_detector_1", {
     whenChanged: "wb-gpio/D2_IN",
     whenChanged: "wb-gpio/D2_IN",
     then: function (newValue, devName, cellName) {
     then: function (newValue, devName, cellName) {
         if (newValue) {
         if (newValue) {
             dev["wb-gpio"]["Relay_1"] = true;
             dev["wb-gpio/Relay_1"] = true;
             if (motion_timer_1_id) {
             if (motion_timer_1_id) {
                 clearTimeout(motion_timer_1_id);
                 clearTimeout(motion_timer_1_id);
             }
             }
             motion_timer_1_id = setTimeout(function () {
             motion_timer_1_id = setTimeout(function () {
                 dev["wb-gpio"]["Relay_1"] = false;
                 dev["wb-gpio/Relay_1"] = false;
                 motion_timer_1_id = null;
                 motion_timer_1_id = null;
             }, motion_timer_1_timeout_ms);
             }, motion_timer_1_timeout_ms);
Строка 80: Строка 78:
});
});
</syntaxhighlight>
</syntaxhighlight>
</div>


=== Creating similar rules ===
=== Creating similar rules ===
Строка 86: Строка 83:
If you need several such motion detectors, then in order not to copy the code, you can wrap the creation of the rule and variables in a function:
If you need several such motion detectors, then in order not to copy the code, you can wrap the creation of the rule and variables in a function:


<div class="mw-translate-fuzzy">
<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">
  function makeMotionDetector(name, timeout_ms, detector_control, relay_control) {
  function makeMotionDetector(name, timeout_ms, detector_control, relay_control) {
Строка 94: Строка 90:
       then: function(newValue, devName, cellName) {
       then: function(newValue, devName, cellName) {
           if (!newValue) {
           if (!newValue) {
               dev["wb-gpio"][relay_control] = true;
               dev["wb-gpio/relay_control"] = true;
               if (motion_timer_id) {
               if (motion_timer_id) {
                   clearTimeout(motion_timer_id);
                   clearTimeout(motion_timer_id);
               }
               }
</div>


               <div class="mw-translate-fuzzy">
               motion_timer_id = setTimeout(function() {
motion_timer_id = setTimeout(function() {
                   dev["wb-gpio/relay_control"] = false;
                   dev["wb-gpio"][relay_control] = false;
                   motion_timer_id = null;
                   motion_timer_id = null;
               }, timeout_ms);
               }, timeout_ms);
Строка 109: Строка 103:
   });
   });
}
}
</div>


makeMotionDetector("motion_detector_1", 20000, "EXT1_DR1", "EXT2_R3A1");
makeMotionDetector("motion_detector_1", 20000, "EXT1_DR1", "EXT2_R3A1");
Строка 135: Строка 128:
     date_start.setMinutes(30);
     date_start.setMinutes(30);


     <div class="mw-translate-fuzzy">
     // time point marking the end of the interval
// time point marking the end of the interval
     var date_end = new Date(date);
     var date_end = new Date(date);
     date_end.setHours(17);
     date_end.setHours(17);
Строка 144: Строка 136:
     if ((date > date_start) && (date < date_end)) {
     if ((date > date_start) && (date < date_end)) {
       if (newValue) {
       if (newValue) {
           dev["wb-gpio"]["EXT1_R3A1"] = 1;
           dev["wb-gpio/EXT1_R3A1"] = 1;
    
    
           if (motion_timer_1_id) {
           if (motion_timer_1_id) {
Строка 151: Строка 143:
    
    
           motion_timer_1_id = setTimeout(function () {
           motion_timer_1_id = setTimeout(function () {
             dev["wb-gpio"]["EXT1_R3A1"] = 0;             
             dev["wb-gpio/EXT1_R3A1"] = 0;             
             motion_timer_1_id = null;
             motion_timer_1_id = null;
           }, motion_timer_1_timeout_ms);               
           }, motion_timer_1_timeout_ms);               
Строка 159: Строка 151:
});
});
</syntaxhighlight>
</syntaxhighlight>
</div>


=== Rolling shutters ===
=== Rolling shutters ===
Строка 179: Строка 170:
   var relay_down_control = "Relay 2";
   var relay_down_control = "Relay 2";


   <div class="mw-translate-fuzzy">
   var timeout_s = 15;
var timeout_s = 15;
    
    
   // End of settings
   // End of settings
Строка 190: Строка 180:
   defineRule( "roller_shutter_up_on" + suffix, {
   defineRule( "roller_shutter_up_on" + suffix, {
   asSoonAs: function() {
   asSoonAs: function() {
     return dev[relay_up_device][relay_up_control];
     return dev["relay_up_device/relay_up_control"];
   },
   },
     then: function () {
     then: function () {
Строка 196: Строка 186:
         relay_up_timer_id = clearTimeout(relay_up_timer_id);  
         relay_up_timer_id = clearTimeout(relay_up_timer_id);  
       };
       };
</div>


       <div class="mw-translate-fuzzy">
       relay_up_timer_id = setTimeout(function() {
relay_up_timer_id = setTimeout(function() {
         return dev["relay_up_device/relay_up_control"] = 0;
         return dev[relay_up_device][relay_up_control] = 0;
       }, timeout_s * 1000);
       }, timeout_s * 1000);
     }
     }
   });
   });
</div>


   <div class="mw-translate-fuzzy">
   defineRule("roller_shutter_down_on" + suffix, {
defineRule("roller_shutter_down_on" + suffix, {
     asSoonAs: function() {
     asSoonAs: function() {
       return dev[relay_down_device][relay_down_control];
       return dev[relay_down_device][relay_down_control];
Строка 217: Строка 203:
        
        
       relay_down_timer_id = setTimeout(function() {
       relay_down_timer_id = setTimeout(function() {
         dev[relay_down_device][relay_down_control] = 0;
         dev["relay_down_device/relay_down_control"] = 0;
       }, timeout_s * 1000);
       }, timeout_s * 1000);
     }
     }
   });
   });
</div>


   <div class="mw-translate-fuzzy">
   defineRule("roller_shutter_both_on" + suffix, {
defineRule("roller_shutter_both_on" + suffix, {
     asSoonAs: function() {
     asSoonAs: function() {
       return dev[relay_up_device][relay_up_control] && dev[relay_down_device][relay_down_control];
       return dev[relay_up_device][relay_up_control] && dev["relay_down_device/relay_down_control"];
     },
     },
     then: function () {
     then: function () {
Строка 232: Строка 216:
         relay_up_timer_id = clearTimeout(relay_up_timer_id);  
         relay_up_timer_id = clearTimeout(relay_up_timer_id);  
       };
       };
</div>


       if (relay_down_timer_id) {
       if (relay_down_timer_id) {
Строка 239: Строка 222:


        
        
       <div class="mw-translate-fuzzy">
       dev[relay_up_device][relay_up_control] = 0;
dev[relay_up_device][relay_up_control] = 0;
       dev["relay_down_device/relay_down_control"] = 0;
       dev[relay_down_device][relay_down_control] = 0;
       log("Both roller shutter relays on, switching them off");
       log("Both roller shutter relays on, switching them off");
     }
     }
Строка 247: Строка 229:
})();
})();
</syntaxhighlight>
</syntaxhighlight>
</div>


An older version of the same script demonstrates the use of aliases:
An older version of the same script demonstrates the use of aliases:
Строка 312: Строка 293:
});
});


<div class="mw-translate-fuzzy">
defineRule("water_meter_1", {
defineRule("water_meter_1", {
     whenChanged: "wb-mcm8_29/Input 1 counter",
     whenChanged: "wb-mcm8_29/Input 1 counter",
     then: function(newValue, devName, cellName) {
     then: function(newValue, devName, cellName) {
       if(newValue){
       if(newValue){
       dev["water_meters"]["water_meter_1"] = ((parseInt(newValue) - counterCorrection) * inpulseValue) + meterCorrection; // We multiply the value of the counter by the number of liters / pulse and add the correction value.
       dev["water_meters/water_meter_1"] = ((parseInt(newValue) - counterCorrection) * inpulseValue) + meterCorrection; // We multiply the value of the counter by the number of liters / pulse and add the correction value.
       }
       }
     }
     }
});
});
</syntaxhighlight>
</syntaxhighlight>
</div>


== Handling click counters ==
== Handling click counters ==
Строка 450: Строка 429:
         var co2_bad = newValue > 1001;
         var co2_bad = newValue > 1001;


         <div class="mw-translate-fuzzy">
         if (co2_good) {
if (co2_good) {
             dev["devName/Green LED"] = true;
             dev[devName]["Green LED"] = true;
             dev["devName/Red LED"] = false;
             dev[devName]["Red LED"] = false;
             dev["devName/LED Period (s)"] = 10;
             dev[devName]["LED Period (s)"] = 10;
         }
         }
         if (co2_middle) {
         if (co2_middle) {
             dev[devName]["Green LED"] = true;
             dev["devName/Green LED"] = true;
             dev[devName]["Red LED"] = true;
             dev["devName/Red LED"] = true;
             dev[devName]["LED Period (s)"] = 5;
             dev["devName/LED Period (s)"] = 5;
         }
         }
         if (co2_bad) {
         if (co2_bad) {
             dev[devName]["Green LED"] = false;
             dev["devName/Green LED"] = false;
             dev[devName]["Red LED"] = true;
             dev["devName/Red LED"] = true;
             dev[devName]["LED Period (s)"] = 1;
             dev["devName/LED Period (s)"] = 1;
         }
         }
     }
     }
Строка 472: Строка 450:
=== Max Motion ===
=== Max Motion ===
"Max Motion" - the maximum value of the motion sensor for N time. Time from 1 to 60 seconds can be set in register 282. The default is 10 seconds. When the Max Motion value reaches 50, we check whether the room is sufficiently lit, if not, turn on the light. As soon as the Max Motion value drops below 50, turn off the light.
"Max Motion" - the maximum value of the motion sensor for N time. Time from 1 to 60 seconds can be set in register 282. The default is 10 seconds. When the Max Motion value reaches 50, we check whether the room is sufficiently lit, if not, turn on the light. As soon as the Max Motion value drops below 50, turn off the light.
</div>


<div class="mw-translate-fuzzy">
<div class="NavFrame">
<div class="NavFrame">
   <div class="NavContent">
   <div class="NavContent">
Строка 482: Строка 458:
     then: function(newValue, devName, cellName) {
     then: function(newValue, devName, cellName) {
         if (newValue > 50) {
         if (newValue > 50) {
             if (dev["wb-msw-v3_97"]["Illuminance"] < 50) {
             if (dev["wb-msw-v3_97/Illuminance"] < 50) {
                 dev["wb-mr3_11"]["K1"] = true;
                 dev["wb-mr3_11/K1"] = true;
             }
             }
         } else {
         } else {
             dev["wb-mr3_11"]["K1"] = false;
             dev["wb-mr3_11/K1"] = false;
         }
         }
     }
     }
});
});
</syntaxhighlight>
</syntaxhighlight>
</div>
</div>
</div>
</div>
</div>
Строка 604: Строка 579:




<div class="mw-translate-fuzzy">
defineRule("_system_track_vin", {
defineRule("_system_track_vin", {
     whenChanged: "wb-adc/Vin",
     whenChanged: "wb-adc/Vin",
     then: function() {
     then: function() {
         if (dev["wb-adc"]["Vin"] < dev["wb-adc"]["BAT"] ) {
         if (dev["wb-adc/Vin"] < dev["wb-adc/BAT"] ) {
             dev["power_status"]["Vin"] = 0;
             dev["power_status/Vin"] = 0;
         } else {
         } else {
             dev["power_status"]["Vin"] = dev["wb-adc"]["Vin"] ;
             dev["power_status/Vin"] = dev["wb-adc/Vin"] ;
         }
         }
     }
     }
});
});
</div>






<div class="mw-translate-fuzzy">
defineRule("_system_dc_on", {
defineRule("_system_dc_on", {
   asSoonAs: function () {
   asSoonAs: function () {
     return  dev["wb-adc"]["Vin"] > dev["wb-adc"]["BAT"];
     return  dev["wb-adc/Vin"] > dev["wb-adc/BAT"];
   },
   },
   then: function () {
   then: function () {
     dev["power_status"]["working on battery"] = false;
     dev["power_status/working on battery"] = false;
   }
   }
});
});
</div>


<div class="mw-translate-fuzzy">
defineRule("_system_dc_off", {
defineRule("_system_dc_off", {
   asSoonAs: function () {
   asSoonAs: function () {
     return  dev["wb-adc"]["Vin"] <= dev["wb-adc"]["BAT"];
     return  dev["wb-adc/Vin"] <= dev["wb-adc/BAT"];
   },
   },
   then: function () {
   then: function () {
     dev["power_status"]["working on battery"] = true;
     dev["power_status/working on battery"] = true;
   }
   }
});
});
</div>


</syntaxhighlight>
</syntaxhighlight>
Строка 962: Строка 931:
Not cron-rules are used for schedules, but  the libschedule. The libschedule enables and disables rules, which, unlike cron rules, are executed continuously when enabled.
Not cron-rules are used for schedules, but  the libschedule. The libschedule enables and disables rules, which, unlike cron rules, are executed continuously when enabled.


<div class="mw-translate-fuzzy">
For example, we want the lighting to be on from 10 to 17h. The libschedule will follow the «turn on the lights» rule once a minute from 10 am to 17 PM.
For example, we want the lighting to be on from 10 to 17h. The libschedule will follow the "turn on the lights" rule once a minute from 10 am to 17 PM.
</div>


This means that even if the controller is running intermittently and missed the transition time between schedules (10 am), the controller will still turn on the lights at the first opportunity.
This means that even if the controller is running intermittently and missed the transition time between schedules (10 am), the controller will still turn on the lights at the first opportunity.
wb_editors
14 355

правок