Ankündigung

Einklappen
Keine Ankündigung bisher.

OH2: Eine Regel für alle Rauchmelder

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

    OH2: Eine Regel für alle Rauchmelder

    Hallo,

    ich habe meine HomeMatic-Rauchmelder jetzt erfolgreich in openHAB angebunden und möchte nun etwas Logik in openHAB implementieren. Ich möchte wenn einer der Rauchmelder aktiviert wird eine Meldung auf mein SmartPhone schicken. Und das hätte ich gerne in einer Regel hinterlegt. Momentan müsste ich aber n-Regeln erstellen.

    Meine aktuelle Regel sieht so aus:

    rule "Funk-Rauchmelder - Alarm"
    when
    Item rm1 changed from OFF to ON or
    Item rm2 changed from OFF to ON or
    Item rm3 changed from OFF to ON
    then
    sendTelegram("bot", "ALARM")
    logInfo("ALARM","ALARM")
    end

    Hat jemand eine Idee, wie ich den auslösenden Event aus "when" unten im "then" verwenden kann, damit ich auch genau sehe welcher Rauchmelder ausgelöst hat?

    Oder muss ich wirklich für jedes "Item changed" Event eine eigene Regel schreiben? Ich denke das geht besser als ich es gemacht habe :-)

    Danke,
    Reinhard

    #2
    Einen Schritt weiter bin ich schon:

    rule "Rauchmelder - Alarm"
    when
    Item rm1 changed from OFF to ON or
    Item rm2 changed from OFF to ON or
    Item rm3 changed from OFF to ON
    then
    gAllSmokeDetectorsForAlarm?.members.forEach[t |
    if(t.state == ON) {
    var lMessageText = "Alarm des Rauchmelders wurde ausgelöst: " + t.name + " (Status: " + t.state + ")"
    sendTelegram("bot", lMessageText)
    logInfo("ALARM", lMessageText)
    }
    ]
    end

    Ich habe als GROUP gAllSmokeDetectorsForAlarm definiert und alle Rauchmelder in der Gruppe aufgenommen. Damit bekomme ich jetzt schon einmal die Nachricht auf das SmartPhone mit dem zugehörigen Rauchmelder.

    In der forEach-Schleife ist aber noch ein Problem drin. Wenn rm1 und rm2 auf ON sind, (das passiert weil ein Rauchmelder ON ist und die Rauchmeldergruppe ON ist) erhalte ich 4 Meldungen anstatt nur 2 (weil er ja jedes Item durchgeht und dann state == ON abgefragt wird.

    Wie würdet Ihr am einfachsten die doppelten Durchläufe verhindern?

    Danke,
    Reinhard

    Kommentar


      #3
      Du könntest die Gruppe persistieren und dann mit changedSince(now.minusMillis(x)) arbeiten. x wäre die Zeit, die openHAB benötigt vom Zeitpunkt des Triggers bis zu der Stelle in der Rule, an der die Abfrage erfolgt - eventuell muss x variabel sein, abhängig von der Anzahl der Melder, oder Du lebst damit, dass bei sehr kurzen Trigger Abständen doch Doppelmeldungen erfolgen. Alternativ könntest Du pro Melder einen Timer einbauen, der dann eine erneute Meldung eine bestimmte Zeit lang unterdrückt.

      Kommentar


        #4
        Ich hatte mir vorgestellt beim Senden der Nachricht ein "Array" zu füllen (mit dem Namen des aktuell in er Schleife befindlichen Rauchmelders). Dann hätte ich gerne beim nächsten Prüfen auf state = ON zusätzlich dieses "Array" geprüft. Das müsste eigentlich schon reichen. Ich scheitere aber gerade an der Syntax :-)

        Kommentar


          #5
          Ja, das geht. Allerdings müsstest Du natürlich auch dafür sorgen, dass das Array auch wieder geleert wird, wenn ein Rauchmelder "wieder OFF ist", sonst bekommst Du irgendwann gar keine Meldungen mehr...

          Da ich selbst Arrays nicht aktiv verwende, bin ich nicht textsicher aber schau mal im englischen Forum diesen Thread durch, vielleicht hilft Dir das (ansonsten suche direkt im Forum, da gibt es massig Beispiele, auch speziell für Deinen Anwendungsfall, bin jetzt nur etwas zu faul zum gezielten suchen...

          Kommentar


            #6
            Hallo,

            ich habe es jetzt wie folgt gelöst (so funktioniert es jetzt soweit bei mir).

            import java.util.List

            val List<String> lSmokeDetector = newArrayList()
            val List<String> lState = newArrayList()

            gAllSmokeDetectorsForAlarm?.members.forEach[t |
            if(t.state == ON) {
            lSmokeDetector.add(t.name)
            lState.add(t.state.toString())
            }
            ]

            for(var i = 0; i < lSmokeDetector.size(); i++) {
            var lMessageText = "Alarm des Rauchmelders wurde ausgelöst: " + lSmokeDetector.get(i) + " (Status: " + lState.get(i) + ")"
            logInfo("ALARM", lMessageText)
            }

            lSmokeDetector.clear()
            lState.clear()

            Danke für die Tipps,
            Reinhard

            Kommentar

            Lädt...
            X