Tips: Att hindra schemalagda events att utföras

Moderators: hekj, Telldus

Post Reply
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Tips: Att hindra schemalagda events att utföras

Post by hekj »

Den som kör med testversionen av NexaHome kan med hjälp av kod i bsh scripts förhindra att schemalagda events utförs, detta görs med hjälp av speciella bsh filer som exekveras innan schemalagda kommandon skickas till fjärrmottagarna.

Scriptfiler vars namn är device id samt ett minustecken kan returnera en "cancel" flagga.
5-.bsh
Nedanstående exempel visar hur man med logik kan hindra ett schemalagt event från att utföras, i konsolfönstret nedan visas vad som händer om det finns två schemalagda events för device 5 'Sovrum (fönster)' samt att device 15 'Sovrum (sängbord)' styrs manuellt.

Schemalagda events:
18:32 :ON: device 5 'Sovrum (fönster)'
18:34 :ON: device 5 'Sovrum (fönster)'
Manuellt utförda kommandon:
18:31:04 :OFF: device 15 'Sovrum (sängbord)'
18:33:38 :ON: device 15 'Sovrum (sängbord)'
5-.bsh

Code: Select all

if (cmdIsOn()) {
  if (!deviceIsOn("15")) {
    echo("Scheduled command (ON) is canceled!");
    cancelEvent();
//    hideOutput();
  }
} else {
//  echo("Okay to turn off device!");
}
Console
2011-11-02 18:31:04 :OFF: Turning off device: 15 Sovrum (sängbord) - ok
2011-11-02 18:32:06 Script executed (5-.bsh), result: [[echo, Scheduled command (ON) is canceled!], [CANCEL EVENT]]
2011-11-02 18:33:38 :ON: (30%) Turning on device: 15 Sovrum (sängbord) - ok
2011-11-02 18:34:07 :ON: Turning on device: 5 Sovrum (fönster) - ok
Ett schemalagt event som i normala fall skulle ha tänt device 5 'Sovrum (fönster)' 18:32 hindrades från att utföras pga logiken i bsh filen krävde att en annan lampa i sovrumet måste vara tänd.
Vinterhem
Posts: 26
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att hindra schemalagda events att utföras

Post by Vinterhem »

Betyder det att man kan använda någonting i stil med:

"if ((getSensorValue(sensor1) - getSensorValue(sensor2)) >4) {
cancelEvent();
}"

Tex för att se till att inte någon cirkulationsfläkt pumpar kall luft åt fel håll?
/Peter (Som inte har testat ovanstående, men gärna blir av med något dussin andra script om det skulle kunna funka)
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att hindra schemalagda events att utföras

Post by hekj »

Vinterhem wrote:Betyder det att man kan använda någonting i stil med:

"if ((getSensorValue(sensor1) - getSensorValue(sensor2)) >4) {
cancelEvent();
}"

Tex för att se till att inte någon cirkulationsfläkt pumpar kall luft åt fel håll?
Ja, men du måste först konvertera sensorvärden från text till decimaltal.

Code: Select all

sensor1 = "inne";
sensor2 = "ute";
if (cmdIsOn()) {
   String s1 = getSensorValue(sensor1);
   String s2 = getSensorValue(sensor2);
   if (s1 != null && s2 != null) {
      try {
         if (Float.parseFloat(s1) - Float.parseFloat(s2) > 4.0) {
            cancelEvent();
//            hideOutput();
         }
      } catch (NumberFormatException nfe) {
         echo("NumberFormatException: " + sensor1 + "='" + s1 + "', " + sensor2 + "='" + s2 + "'");
         echo("Okay to turn on device!");
      }
   } else {
      echo("Unable to get sensor values: " + sensor1 + "='" + s1 + "', " + sensor2 + "='" + s2 + "'");
      echo("Okay to turn on device!");
   }
} else {
//   echo("Okay to turn off device!");
}
Vinterhem
Posts: 26
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att hindra schemalagda events att utföras

Post by Vinterhem »

Henrik, Applåder!
-Det här är en viktig funktion.. Visst, att tända och släcka lampor är coolt, men att nu kunna styra mindre synliga husfunktioner som temperaturer, friskluft, cirkulationspumpar och ventilationssystem samt göra dem beroende av inte bara varandra utan åxå av väder och vind, Det är Mycket mera än bara Coolt!

För att möjligtvis minska skriptmängden, kan man från bsh-script i nexahome åkalla ett annat bsh-script och skicka med värden, för att sedan få värden tillbaka behandlade? (I min lite äldre programmeringsvärld kallade vi det subrutiner.. Man skriver dem bara en gång, men man gör dem riktigt bra och återanvänder dem).
Det jag tänkt mej är en rutin som återger skillnaden emellan flera sensorer samt en som ger tillbaka "sant eller falskt", så man slipper koda för varje pryttel.

/Peter
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att hindra schemalagda events att utföras

Post by hekj »

Vinterhem wrote:-Det här är en viktig funktion.. Visst, att tända och släcka lampor är coolt, men att nu kunna styra mindre synliga husfunktioner som temperaturer, friskluft, cirkulationspumpar och ventilationssystem samt göra dem beroende av inte bara varandra utan åxå av väder och vind, Det är Mycket mera än bara Coolt!

För att möjligtvis minska skriptmängden, kan man från bsh-script i nexahome åkalla ett annat bsh-script och skicka med värden, för att sedan få värden tillbaka behandlade? (I min lite äldre programmeringsvärld kallade vi det subrutiner.. Man skriver dem bara en gång, men man gör dem riktigt bra och återanvänder dem).
Det jag tänkt mej är en rutin som återger skillnaden emellan flera sensorer samt en som ger tillbaka "sant eller falskt", så man slipper koda för varje pryttel.
En fram till nu odokumenterad finess är att du redan idag från ett bsh script kan anropa andra bsh scripts. :o

Jag hade inte tänkt på att jag borde ta hand om cancelEvent() metodens kommandosträng i dom rekursiva bsh script exekveringarna, så för att kunna göra cancel på ett event i en "subrutin" måste du hämta version 2.4.10!

Känner att det är lite svårt att med ord förklara hur man kan göra i sina bsh script, här kommer ytterligare ett exempel.

5-.bsh

Code: Select all

if (cmdIsOn()) {
  if (!deviceIsOn("15")) {
    execFile("do_something.bsh");
    execParam("cancel_event");
    execParam("turn_on_3");
//    hideOutput();
  }
} else {
//  echo("Okay to turn off device!");
}
do_something.bsh

Code: Select all

params = getData("do_something.params_");
echo(params);
var len = Integer.parseInt(params);
for (int ndx = 1; ndx <= len; ndx++) {
   param = getData("do_something.param" + ndx + "_");
   echo(param);
   if (param.equals("cancel_event")) {
      echo("Scheduled command is canceled!");
      cancelEvent();
   } else if (param.equals("turn_on_3")) {
      deviceOn("3");
   }
}
Hoppas att du klarar dig med ovanstående "subrutiner" utan egendefinierade returvärden!
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att hindra schemalagda events att utföras

Post by hekj »

Man kan få bsh script att "returnera" värden genom att sätta en eller flera globala variabler, men tänk på att dessa variabler inte kan nyttjas i det script som beordrade exekveringen.

Följande exempel visar hur man gör för att spara undan data för att senare använda dessa i ett annat script.

a.bsh

Code: Select all

execFile("b.bsh");
execFile("c.bsh");
b.bsh

Code: Select all

echo("Comparing some data!");
setData("result_from_script_b", "less_than");
c.bsh

Code: Select all

result_b = getData("result_from_script_b");
echo(result_b);
2011-11-12 20:26:32 Script executed (a.bsh), result: [[exec, b.bsh], [exec, c.bsh]]
2011-11-12 20:26:32 Exec (b.bsh)
2011-11-12 20:26:32 Script executed (b.bsh), result: [[echo, Comparing some data!]]
2011-11-12 20:26:32 Exec (c.bsh)
2011-11-12 20:26:32 Script executed (c.bsh), result: [[echo, less_than]]
Post Reply