Restore on Startup rrd / influx geht nur ab und zu

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hi !

Ok.... noch ne andere Frage zum Startup.... ich habe noch ne Rule für die Feuermelder, da bekomme ich bei jedem neustart die Meldung dass der Feueralarm aus ist... das sollte ja auch nicht sein.

Code: Alles auswählen

rule "send fire alarm off  message"
when
   Member of gRM changed to "OFF"
then
    sendBroadcastNotification("Feueralarm ist aus  - " + triggeringItem.label.toString)
end
Gruss Gerd

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Du musst die Regel schon korrekt triggern lassen :)
Abgesehen davon ist die Regel ungenau.

Also Punkt 1, die Meldung beim Start... wenn openHAB startet, haben alle Items den Zustand NULL. Mithin triggert Deine Rule - völlig zurecht - für jeden Member der Gruppe gRM, der erstmalig nach Start OFF meldet. Stattdessen sollte die Rule auf

Code: Alles auswählen

Member of gRM changed from ON to OFF
triggern. Beachte bitte auch, dass ich keine Anführungszeichen gesetzt habe. Es handelt sich ja bei den Items wohl nicht um String Items, sondern um Switch Items. Der Text "ON" ist etwas anderes als der Status ON. openHAB ist schlau genug, sich dennoch korrekt zu verhalten :)

Punkt 2: Eine Meldung "Feueralarm ist aus", ist sinnvoller, wenn KEINER der Melder Zustand ON liefert. Besser wäre die Rule also so:

Code: Alles auswählen

rule "send fire alarm off  message"
when
   Member of gRM changed from ON to OFF
then
    if(gRM.members.filter[m|m.state != OFF].size > 0) return;
    sendBroadcastNotification("Letzter Melder Feueralarm beendet: {}", triggeringItem.label)
end
Falls mindestens einer der Member der Gruppe nicht den Zustand OFF hat, wird die Rule abgebrochen, bevor die Meldung ausgegeben wird.
Da durch den Trigger gewährleistet ist, dass zuvor mindestens einer der Member den Zustand ON hatte, ist so alles abgedeckt.
Falls Du dennoch lieber für jeden einzelnen Melder die Aus-Meldung haben möchtest, wäre es vermutlich sinnvoll, auszugeben, wie viele (und welche) Melder welchen Zustand haben:

Code: Alles auswählen

rule "send fire alarm message"
when
    Member of gRM changed from ON to OFF or                               // Melder beendet Alarm
    Member of gRM changed from OFF to ON                                  // Melder beginnt Alarm
then
    val nAnzahl = gRM.members.size                                        // Anzahl Melder gesamt
    val nAlarm  = gRM.members.filter[m|m.state == ON].size                // Anzahl Alarmzustand
    val nOK     = gRM.members.filter[m|m.state == OFF].size               // Anzahl Ruhezustand
    val nUnklar = nAnzahl - nOK - nAlarm                                  // Anzahl unklar
    val Stringbuilder strMessage = new Stringbuilder                      // Meldetext
    if(nAnzahl == nOK) {                                                  // Alle Melder OK
        strMessage.append("Alle Melder im Ruhezustand. Alarm beendet.")
    }
    if(nAlarm > 0) {                                                      // Mindestens ein Melder Alarm
        strMessage.append("FEUERALARM! Von ")
        strMessage.append(nAnzahl.toString)
        strMessage.append(" Meldern sind ")
        strMessage.append(nAlarm.toString)
        strMessage.append(" im Alarmzustand!")
    }
    if(nUnklar > 0) {                                                     // Mindestens ein Melder unklar
        if(strMessage.toString.length > 0)                                // falls schon Text vorhanden
            strMessage.append(" ")                                        // Leerzeichen ergänzen.
        strMessage.append("Von ")
        strMessage.append(nAnzahl.toString)
        strMessage.append(" Meldern sind ")
        strMessage.append(nUnklar.toString)
        strMessage.append(" ohne Zustandsmeldung.")
    }
    if(nAnzahl - nOK > 0) {                                               // Mindestens ein Melder nicht OK
        if(strMessage.toString.length > 0)
            strMessage.append(" Melderzustand Alarm: ")
        gRM.members.filter[m|m.state == ON].forEach[i,a|                  // für alle Melder im Alarmzustand
            strMessage.append(i.label)
            if(a < nAlarm - 1)                                            // falls mehr als 2, mit Komma trenenn
                strMessage.append(", ")
            else if(a == nAlarm - 1)                                      // bis auf den letzten...
                strMessage.append(" und ")
            else
                strMessage.append("; ")
        ]
            strMessage.append(" Melderzustand OK: ")
        gRM.members.filter[m|m.state == OFF].forEach[i,a|                 // für alle Melder um Ruhezustand
            strMessage.append(i.label)
            if(a < nOK - 1)
                strMessage.append(", ")
            else if(a == nOK - 1)
                strMessage.append(" und ")
            else
                strMessage.append("; ")
        ]
            strMessage.append(" Melderzustand unklar: ")
        gRM.members.filter[m|m.state != OFF && m.state != ON ].forEach[i,a| // für den Rest
            strMessage.append(i.label)
            if(a < nUnklar - 1)
                strMessage.append(", ")
            else if(a == nUnklar - 1)
                strMessage.append(" und ")
            else
                strMessage.append(".")
        ]
    }
    sendBroadcastNotification(strMessage.toString)                        // Meldung senden
end
Die Rule kümmert sich um alle möglichen Zustände. Sollten alle Melder im Ruhezustand sein, so wird eine Abschlussmeldung ausgegeben.
Sollte mindestens ein Melder Alarm melden, so wird der Alarm gemeldet.
Sollte mindestens ein Melder nicht im Ruhezustand sein, wird der Zustand aller Melder ausgegeben, sortiert nach Zustand.

Da die Rule nur auslöst, wenn ein Melder zwischen ON und OFF wechselt, gibt es allerdings keine Meldung wenn ein Melderzustand nach NULL wechselt.

Die Rule ist ungetestet :) evtl. ist der Schleifenindex (a) nicht 0-basiert, dann müsste man eins dazu zählen (oder so ähnlich...) und bestimmt habe ich noch irgendwo was übersehen... ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hi !

Ja wie sahe das mit zum Beispiel this Moth oder this week aus ?

Gruss gerd

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Wie meinen? Worauf beziehst Du "this month"?
Der letzte Post vom 3. Januar (von mir) ist zwei Monate her und enthält drei komplette Lösungen für die Frage vom 3. Januar...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
udo1toni
Beiträge: 13986
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Du beziehst Dich offensichtlich auf das Posting vom Dezember... also diese Rule:

Code: Alles auswählen

rule "Save Rain Data"
when
    Item WS_COUNT_RAIN changed
then
    var nDiff = 0.0
    if(WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") instanceof Number)
        nDiff = WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") as Number

    RAIN_CHART.postUpdate(nDiff)
end
Erweiterung auf "diese Woche" und "dieser Monat":

Code: Alles auswählen

rule "Save Rain Data"
when
    Item WS_COUNT_RAIN changed
then
    var nDiffMonth  = 0.0 
    var nDiffWeek   = 0.0
    var nDiffDay    = 0.0

    val tMidnight   = now.with(LocalTime.MIDNIGHT)                          // heute, 00:00:00 Uhr
    val tStartWeek  = tMidnight.minusDays(tMidnight.dayOfWeek.getValue - 1) // Montag = 1, Sonntag = 7
    val tStartMonth = tMidnight.withDayOfMonth(1)                           // Monatsanfang
    
    if(WS_COUNT_RAIN.deltaSince(tMidnight,"rrd4j") instanceof Number)
        nDiffDay   = WS_COUNT_RAIN.deltaSince(tMidnight,"rrd4j")
    
    if(WS_COUNT_RAIN.deltaSince(tStartWeek,"rrd4j") instanceof Number)
        nDiffWeek  = WS_COUNT_RAIN.deltaSince(tStartWeek,"rrd4j")
    
    if(WS_COUNT_RAIN.deltaSince(tStartMonth,"rrd4j") instanceof Number)
        nDiffMonth = WS_COUNT_RAIN.deltaSince(tStartMonth,"rrd4j")

    RAIN_CHART_Day.postUpdate(nDiffDay)
    RAIN_CHART_Week.postUpdate(nDiffWeek)
    RAIN_CHART_Month.postUpdate(nDiffMonth)
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten