Ankündigung

Einklappen
Keine Ankündigung bisher.

Itemupdate ohne Ruletrigger

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Itemupdate ohne Ruletrigger

    Hi,
    mal schaun, ob ich das Problem richtig schildern kann.

    Anlässlich der anstehenden Weihnachtssaison hat mich meine Frau um einen Illuminationsautomatismus gebeten. Also gibt es jetzt 2 Rules, die zu den angefragten Zeiten die Beleuchtung ein bzw. aus-schalten. Damit das Ganze auch zu anderen Zeiten "per Hand" oder besser per "Handy" geht, sehen die Rules etwa so aus:

    Code:
    rule "Weihnachtsbeleuchtung_an"
    when
      Time cron "5 55 5 ? NOV-JAN MON-FRI" or
      Time cron "5 55 7 ? NOV-JAN SAT-SUN" or
      Item Xmax_Illumination_EinAus changed to ON
    then
       // so, hier sollte jetzt alles angehen, was zur Weihnachtsbeleuchtung gehört
       logInfo("LogIt","Xmas      - Einschalten")  
       if ( Xmas_Illumination_Terrasse.state == ON ) {
            sendCommand(KNX_E_sS_BalkonStkdose,ON)
       }
    ..... gekürzt ...
    
      postUpdate(Xmax_Illumination_EinAus, ON)
    
       logInfo("LogIt","Xmas      - Ende Einschalten")
    end
    Die "Aus" Version entsprechend mit ON durch OFF ersetzt.

    Soweit so gut. Funktioniert auch, außer das ohne den postUpdate der Schalter im UI nach dem Timerevent falsch stand und mit dem postUpdate die Rule jeweils zweimal aufgerufen wird.

    Und hier die Frage: kann ich den Doppelaufruf verhindern? Ich hatte postUpdate so verstanden, dass das zu einem Update führt, ohne eine Aktion auszuführen, aber dieses Verstehen ist offensichtlich falsch.

    Gruß
    Peter

    #2
    postUpdate ändert den Status des betreffenden Items, ohne dies an eventuell angekoppelte Bindings zu senden (oder anders: es ändert ausschließlich den in openHAB gespeicherten Status) während sendCommand die Änderung an angekoppelte Bindings sendet (und wenn autoupdate="false" gesetzt ist, nur dorthin)

    Vielleicht denkst Du zu kompliziert. Wenn es nur darum gehen soll, eine Gruppe von Lichtern sowohl manuell als auch automatisch zu schalten, schlage ich vor, eher zwei Rules zu bauen, eine, die nur zu den Automatik-Zeiten ein Item ein- oder ausschaltet, eine andere, die auf den Schaltvorgang triggert und die Lichter schaltet (ich nehme an, Du steuerst dynamisch, welche Lichtquellen geschaltet werden sollen).

    Eine weitere Möglichkeit wäre, die rule auf Item Xmax_Illumination_EinAus received command ON triggern zu lassen, dann wird sie nicht bei postUpdate ausgeführt.

    Anmerkung am Rande: Ich bin mir nicht sicher, wie der Stand der Dinge ist, aber es gab (zumindest bis vor kurzem) einen Issue, dass von mehreren Time cron Triggern einer Rule nur ein Teil korrekt ausgeführt wurde (meine Erfahrung dazu war gar, dass Time cron Trigger nur dann zuverlässig funktionieren, wenn sie an erster Stelle stehen.)
    Ich empfehle also, die Timer alle als einzelne Rule anzulegen (und damit bietet es sich an, nur das Item zu setzen und den eigentlichen Schaltvorgang in einer eigenen Rule abzuhandeln)

    Kommentar


      #3
      Zitat von udo1toni Beitrag anzeigen
      postUpdate ändert den Status des betreffenden Items, ohne dies an eventuell angekoppelte Bindings zu senden (oder anders: es ändert ausschließlich den in openHAB gespeicherten Status) während sendCommand die Änderung an angekoppelte Bindings sendet (und wenn autoupdate="false" gesetzt ist, nur dorthin)
      ...
      Eine weitere Möglichkeit wäre, die rule auf Item Xmax_Illumination_EinAus received command ON triggern zu lassen, dann wird sie nicht bei postUpdate ausgeführt.
      ...
      So einfach und kompakt erklärt habe ich das noch nirgendwo gelesen, besten Dank dafür

      Gruß, Sigi

      Kommentar


        #4
        Hallo udo1toni,

        ja, da kann ich mich Sigi nur anschließen, super erklärt und auch schon umgesetzt.

        Ich hätte da jetzt noch eine zusätzliche Frage:

        Die beiden Rules zum Ein- und Ausschalten unterscheiden sich eigendlich nur noch durch das ON und OFF im Sendcommand. Gibt es eine Möglichkeit, den neuen Status durch den aktuellen Status von
        Xmas_Illumination_EinAus zu ersetzten?

        Ich hatte erwartet, wenn ich ON durch Xmas_Illumination.state ersetze, das Ziel zu erreichen, geht aber nicht.

        Gruß
        Peter

        Kommentar


          #5
          Sicher geht das.
          Code:
          [FONT=courier new][FONT=arial]Xmas_Illumination.sendCommand(Xmas_Illumination_EinAus.state)[/FONT][/FONT]
          sollte funktionieren. Wenn Du auf der Action bestehst, müsste
          Code:
          [FONT=courier new][FONT=arial]sendCommand(Xmas_Illumination, Xmas_Illumination_EinAus.state.toString)[/FONT][/FONT]
          Dich zum Ziel führen. Die Action ist etwas empfindlich, was den erwarteten Datentyp betrifft. Allerdings ohne Gewähr, meine Installation ist schon etwas angestaubt.

          Kommentar

          Lädt...
          X