Seite 1 von 1

Benötige Hilfe bei Optimieren von Rules

Verfasst: 1. Feb 2020 19:03
von Darkwin101
So mal als Vorwort mein Openhab System läuft nun so wie es soll mit seinen Grundfunktion
Ich bin grundsätzlich Lernbereit, leider Stosse ich allerdings oftmals an meine Grenzen was das Verständnis der Openhab Regeln und deren Syntaxen angeht, da ich die Programmiersprache nicht kann.
So nun zu einem Problem/Frage ich habe mittlerweile gelernt das Thread:sleep böse ist, ich benutze das leider sehr häufig und möchte das nun ändern.
hier eine Beispiel Rule:

Code: Alles auswählen

rule "Gruppiere Partymodus ohne Feierabendmodus"
   when
      Item Party changed from OFF to ON
   then
      if(Feierabend.state == OFF){
      sendCommand(Wake_Move, "ON") 
      sendCommand(SonosBuero_Control, "PLAY")
      Thread::sleep(5000)
      sendCommand(SonosBuero_Add, "Bad")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "Arbeitsplatte")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "Kueche")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "TV")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "Hoerspiel")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "Buero_2")
      Thread::sleep(10000)
      sendCommand(SonosBuero_Add, "FLur")
      }
end
 
Sinn des ganzen ist die entsprechenden Sonos Lautsprecher zu gruppieren allerdings musste ich feststellen das ich immer eine gewisse Zeit warten muss bis ich den Befehl erneut absetze damit das ganze zuverlässig funktioniert.
Ich habe gelernt das ich es nun mit Timern lösen kann, ist es nötig die ganzen Timer zu schachteln oder gibt es einen eleganteren weg ?
Mfg
Marcus

Re: Benötige Hilfe bei Optimieren von Rules

Verfasst: 2. Feb 2020 13:18
von udo1toni
Nicht unbedingt elegant, die einfache Variante:

Code: Alles auswählen

// globale Variablen zu Beginn der Datei definieren!

var Timer tParty = null                                        // Timervariable
var Integer iParty = 0                                         // Schrittzähler

rule "Gruppiere Partymodus ohne Feierabendmodus"
when
    Item Party changed from OFF to ON                          // Trigger
then
    if(Feierabend.state != OFF || tParty !== null) return;     // Rule abbrechen, falls Timer bereits läuft oder Feierabend nicht OFF
    iParty = 0                                                 // Zähler auf null
    tParty = createTimer(now.plusMillis(100), [|               // Timer definieren
        iParty += 1                                            // Zähler hochzählen (entspricht iParty = iParty + 1
        switch(iParty){                                        // Fallunterscheidung nach Zähler
            case 1: {                                          // 1. Schritt
                Wake_Move.sendCommand(ON) 
                SonosBuero_Control.sendCommand("PLAY")
            }
            case 2: SonosBuero_Add.sendCommand("Bad")          // 2. Schritt...
            case 3: SonosBuero_Add.sendCommand("Arbeitsplatte")
            case 4: SonosBuero_Add.sendCommand("Kueche")
            case 5: SonosBuero_Add.sendCommand("TV")
            case 6: SonosBuero_Add.sendCommand("Hoerspiel")
            case 7: SonosBuero_Add.sendCommand("Buero_2")
            case 8: SonosBuero_Add.sendCommand("Flur")
        }
        switch(iParty) {                                        // 2. Fallunterscheidung nach Zähler
            case 1 : tParty.reschedule(now.plusSeconds(5))      // 1. Wartezeit kürzer
            case 8 : tParty = null                              // beim letzten Durchgang Timervariable deinitialisieren
            default: tParty.reschedule(now.plusSeconds(10))     // ansonsten lange Wartezeit
        }
    ])
end
Die doppelte switch-case Anweisung spart ein paar Zeilen, man könnte natürlich auch in jedem Block (so wie im ersten switch case 1) den erneuten Timeraufruf einplanen, das wären allerdings 8 Zeilen statt 4 ;)

Ein eleganter Ansatz wäre, die Namen der Sonos in eine Hashmap zu packen und diese jeweils im Timer zu verwenden, allerdings dürfte die Rule dadurch nicht wesentlich kürzer werden ;)

Re: Benötige Hilfe bei Optimieren von Rules

Verfasst: 2. Feb 2020 14:17
von Darkwin101
Funktioniert perfekt, so bin ich schon einmal 50 Thread:Sleep los
Vielen Dank vor allem für die Kommentare so verstehe ich was du an den einzelnen stellen machst :D

mfG
Marcus

Re: Benötige Hilfe bei Optimieren von Rules

Verfasst: 2. Feb 2020 16:46
von udo1toni
Gerne. Hab ich das richtig verstanden, dass Du diese Rule zehn mal nutzt (mit unterschiedlichen Items, je nach Triggger)?
Das sollte im Zweifel besser gehen...

Re: Benötige Hilfe bei Optimieren von Rules

Verfasst: 2. Feb 2020 17:12
von Darkwin101
Ja je nach Zustand der Wohnung /Aufräumen/Arbeiten/Party/Feierabend werden die entsprechend benötigten Sonos Boxen gruppiert
und das ganze dann auch wieder Entgruppiert wenn der entsprechende Zustand aufgehoben wird oder halt Gute Nacht gesagt wird.
Entsprechend gibt es das ganze auch als Licht die entsprechende Lampen setzt.

MfG
Marcus