Rule nach bestimmter Uhrzeit

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

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

Re: Rule nach bestimmter Uhrzeit

Beitrag von udo1toni »

Kein Ding, an dieser Stelle ist es halt wichtig, denn unter OH2 verwendest Du noch Joda Time, während unter OH JavaTime zum Einsatz kommt. Entsprechend gibt es einige Methoden, die etwas anders heißen (z.B. .getHourOfDay <-> .getHour)

Bezüglich Umstieg auf OH3 möchte ich Dir dringend ans Herz legen, das anzugehen. Wenn Du keine exotischen OH1 Bindings verwendest, sollte der Aufwand überschaubar sein. Mit OH4 kommen aber weitere Änderungen, und je weiter Du springen muss, umso schwieriger wird es. Umstieg OH3 -> OH4 ist vergleichsweise einfach, allenfalls wird man viele Dinge anpassen, die dann viel einfacher zu konfigurieren sind als zuvor. Zwischen OH2 und OH3 gibt es aber recht viele Fallstricke (unter anderem eben JavaTime vs. Joda Time).
Juni/Juli wird mutmaßlich OH4.0.0 stable werden, ab da wird es dann wahrscheinlich keinen regulären Zugriff auf OH3 mehr geben und die Chance auf einen allmählichen Umstieg ist vorbei.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 202
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule nach bestimmter Uhrzeit

Beitrag von Innocent »

Ok.
Mist... 🤣 😂 😅

Viel habe ich tatsächlich nicht in Openhab laufen, aber noch weniger Zeit...

Dann muss ich halt irgendwann nen großen Schritt machen. Aktuell sehe ich keine Chance das zu bewerkstelligen.

Andererseits, tut es mir erstmal nicht weh, dort zu bleiben.
Openhab 2 auf RaspberryPi 4

Innocent
Beiträge: 202
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule nach bestimmter Uhrzeit

Beitrag von Innocent »

Guten Morgen zusammen.

Ich habe folgende Rule:

Code: Alles auswählen

rule "Keller Offline"
when
    Thing "shelly:shellyplugs:6a6183" changed 
then 
    sendTelegram("Sascha","Steckdose Keller offline")
    sendTelegram("Jenny","Steckdose Keller offline")
    
end

An dieser Shelly hängt meine Gefriertruhe dran.
Wir hatten mehrfach das Problem, das diese Steckdose keinen Strom mehr hatte und die Gefriertruhe auftaute, da keiner was bemerkte.
Nun habe ich es seither so gelöst wie in der Rule.

Nun ist es so, das im Keller das Wlan ab und zu Verbindungsabbrüche hat.
Damit kommt dann jedes Mal die Meldung.

Gerne würde ich es so haben, das die Meldung erst kommt, wenn nach einer bestimmten Zeit diese Shelly nicht wieder online ist.
Ich hoffe ihr könnt mir helfen.

Danke im Voraus!!!
Openhab 2 auf RaspberryPi 4

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

Re: Rule nach bestimmter Uhrzeit

Beitrag von udo1toni »

Erst mal wichtig: Die Rule funktioniert nicht so, wie Du es erwartest... denn sie meldet das Gerät auch offline, wenn der Status von OFFLINE nach ONLINE gewechselt hat.
Dann eine Frage: Welche Version von openHAB nutzt Du? (openHAB wird sehr intensiv weiterentwickelt, entsprechend ist es wichtig, die Version zu kennen, um die unterschiedlich zur Verfügung stehenden Möglichkeiten nutzen zu können)

Nun zu Deiner Rule, bzw. der Verzögerung:

Als DSL Rule

Code: Alles auswählen

// Globale Variablen müssen vor der ersten Rule in der Datei definiert werden!
var Timer tFridgeAlarm = null                                                    // Timer für Alarm Stromausfall

rule "Status Shelly 6a6183"
when
    Thing "shelly:shellyplugs:6a6183" changed 
then
    logDebug("fridgealarm","Status der Steckdose geändert auf {}",newThingStatus)
    if(newThingStatus != "ONLINE" && tFridgeAlarm === null)                      // Status nicht ONLINE und Timer nicht gestartet
        logInfo("fridgealarm","Starte Timer für Alarm")                          // Meldung loggern und
        tFridgeAlarm = createTimer(now.plusMinutes(10), [|                       // Timer starten
            sendTelegram("Sascha","Steckdose Keller offline")
            sendTelegram("Jenny","Steckdose Keller offline")
            tFridgeAlarm = null
        ])
    else if(newThingStatus == "ONLINE") {                                        // Status ONLINE
        logInfo("fridgealarm","Steckdose wieder ONLINE, Timer abgebrochen")      // Meldung loggen und
        tFridgeAlarm?.cancel                                                     // Timer abbrechen, falls vorhanden
        tFridgeAlarm = null
    }
end
Der Knackpunkt ist, den aktuellen Status des Things innerhalb der Rule auszuwerten. Die implizite Variable newThingStatus ist allerdings noch nicht so wahnsinnig alt... ich bin mir nicht sicher, kann auch sein, dass die schon mit OH3.0 eingeführt wurde, kann aber auch genauso gut sein, dass sie erst gegen Ende OH3 eingeführt wurde (das ist halt die Frage nach der Version...)
Falls die implizite Variable bei Dir noch nicht zur Verfügung steht, musst Du mit zwei Rules arbeiten:

Code: Alles auswählen

// Globale Variablen müssen vor der ersten Rule in der Datei definiert werden!
var Timer tFridgeAlarm = null                                                    // Timer für Alarm Stromausfall

rule "Status Shelly 6a6183 not online"
when
    Thing "shelly:shellyplugs:6a6183" changed from ONLINE
then
    logInfo("fridgealarm","Steckdose nicht online, Starte Timer für Alarm")  // Meldung loggern und
    tFridgeAlarm = createTimer(now.plusMinutes(10), [|                       // Timer starten
        sendTelegram("Sascha","Steckdose Keller offline")
        sendTelegram("Jenny","Steckdose Keller offline")
        tFridgeAlarm = null
    ])
end

rule "Status Shelly 6a6183 online"
when
    Thing "shelly:shellyplugs:6a6183" changed to ONLINE
then
    logInfo("fridgealarm","Steckdose wieder ONLINE, Timer abgebrochen")      // Meldung loggen und
    tFridgeAlarm?.cancel                                                     // Timer abbrechen, falls vorhanden
    tFridgeAlarm = null
end
Die Abfrage des Zustands ist hier in den Trigger ausgelagert.
Die eine Rule triggert nur, wenn der Zustand von ONLINE kommend zu einem beliebigen anderen Zustand wechselt.
Die andere Rule triggert nur, wenn der Zustand von einem beliebigen Zustand kommend zu ONLINE wechselt.

Die Wartezeit ist beliebig, Wenn Du keine vollen Minuten haben willst, kannst Du auch mit plusSeconds() arbeiten, die anzugebenden Werte sind aber immer Integer (bzw. Long), also ganze Zahlen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 202
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule nach bestimmter Uhrzeit

Beitrag von Innocent »

Hallo.

Openhab 2

Das vergesse ich auch jedes Mal... 🤣

Vielen Dank, ich werde die zweite Variante gleich mal umsetzen.
Openhab 2 auf RaspberryPi 4

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

Re: Rule nach bestimmter Uhrzeit

Beitrag von udo1toni »

Innocent hat geschrieben: 15. Sep 2023 11:17Openhab 2
Oh, eine Antiquität... ;)
Innocent hat geschrieben: 15. Sep 2023 11:17 Das vergesse ich auch jedes Mal...
Jetzt hast Du es ja in der Signatur stehen (da muss ich nur noch dran denken, nachzuschauen...)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 202
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule nach bestimmter Uhrzeit

Beitrag von Innocent »

Ja, Du hattest mir das an anderer Stelle schon einmal empfohlen. Leider sehe ich mich dem Vorhaben aktuell noch nicht gewachsen.
Eventuell mache ich das, wenn die Kinder etwas größer sind.

Dazu werde ich einen zweiten Pi besorgen und parallel zum bestehendem dann neu aufbauen.
Da komme ich sicher noch einmal auf dich zu :D

Bindings sind überschaubar. ...

Darf ich Dich zu einer anderen Rule auch noch befragen ?
Hier oder PN ?
Openhab 2 auf RaspberryPi 4

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

Re: Rule nach bestimmter Uhrzeit

Beitrag von udo1toni »

Solange es um openHAB geht, sind alle Fragen willkommen :)
Und selbst wenn es nicht als "von allgemeinem Interesse" erscheint, so ist es meist doch auch für andere User interessant :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 202
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule nach bestimmter Uhrzeit

Beitrag von Innocent »

Ok.
Dann schiesse ich mal los:

Code: Alles auswählen


var Boolean bBatterieKZ = false
var Boolean bBatterieGWC = false
var Boolean bBatterieSZ = false


rule "Batterie Thermostat Kinderzimmer"
when
    Item BatteryLevelKZ changed
then
    val nLevel = (BatteryLevelKZ.state as Number).intValue
    if(!bBatterieKZ && nLevel >= 10) 
        bBatterieKZ = true 
    if(bBatterieKZ && nLevel < 10) {
        sendTelegram("Sascha","Thermostat Kinderzimmer Batterie 10%")
        bBatterieKZ = false
    }
end



rule "Batterie Thermostat Gäste WC"
when
    Item BatteryLevelGWC changed
then
    val nLevel = (BatteryLevelGWC.state as Number).intValue
    if(!bBatterieGWC && nLevel >= 10) 
        bBatterieGWC = true 
    if(bBatterieGWC && nLevel < 10) {
        sendTelegram("Sascha","Thermostat Gäste WC Batterie 10%")
        bBatterieGWC = false
    }
end



rule "Batterie Thermostat Schlafzimmer"
when
    Item BatteryLevelSZ changed
then
    val nLevel = (BatteryLevelSZ.state as Number).intValue
    if(!bBatterieKZ && nLevel >= 10) 
        bBatterieSZ = true 
    if(bBatterieSZ && nLevel < 10) {
        sendTelegram("Sascha","Thermostat Schlafzimmer Batterie 10%")
        bBatterieSZ = false
    }
end


Wird diese Rule so funktionieren ?


Auch finde ich meine crontab nicht wenn ich mich als openhabian anmelde.

Code: Alles auswählen

sudo -u openhabian crontab -e
no crontab for openhabian - using an empty one
No modification made
Es existiert aber definitiv eine von mir erweiterte. Meine termininierten Neustarts und Sicherungen funktionieren tadellos.
Openhab 2 auf RaspberryPi 4

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

Re: Rule nach bestimmter Uhrzeit

Beitrag von udo1toni »

Mir fiele jetzt spontan nichts auf, was dagegen spräche :)

Natürlich ließen sich die Rules eleganter gestalten (insbesondere wenn es noch mehr als "nur" diese drei zu überwachenden Items gibt).
Ich gehe davon aus, dass Du mit den Boolean Variablen verhindern willst, mehrfach alarmiert zu werden. Das scheint auch erst mal eine gute Idee zu sein, ich frage mich aber, ob Du dann auch zuverlässig innerhalb eines überschaubaren Zeitfensters die Batterien tauschst. Ansonsten böte es sich an, z.B. einmal am Tag eine entsprechende Meldung zu generieren. Nur als Beispiel:

Code: Alles auswählen

rule "Batterie Alarm"
when
    Member of gBatteryLevel changed
then
    if(!(newState instanceof Number)) {
        logWarn("batalarm","Sensor {} liefert ungültigen Wert ({})!",triggeringItem.name,newState)
        return;
    }
    if((newState as Number) >= 10)
        return;
    var myPrevState = 10
    if(myPrevState instanceof Number)
        myPrevState = myPrevState as Number

    if(myPrevState >= 10) {
        sendTelegram("Sascha","Thermostat " + triggeringItem.label + " Batterie unter 10%")
    }
end

rule "Batterie Alarm Erinnerung"
when
    Time cron "0 0  10 * * ?" // täglich um 10:00:00 Uhr
then
    val myList = gBatteryLevel.members.filter[i|i.state intanceof Number].filter[j|j.state as Number < 10]
    if(myList.size < 1)
        return;
    
    var String myText = "Batterielevel unter 10% bei: "
    myList.forEach[i,j|
        myText = myText + i.label 
        if(j < myList.size - 1)
            myText = myText + ", "
        else
            myText = myText + ". Bitte tauschen!"
    ]
    sendTelegram("Sascha",myText)
end
Du brauchst ein Group Item, in dem all BatteryLevel zusammengefasst sind. Die erste Rule triggert bei jeder Änderung eines der zugeordneten Items. Sinkt der gelieferte Wert unter 10, so wird für dieses Item Alarm ausgegeben (nur exakt beim Unterschreiten der 10%, der Wert muss kleiner 10 sein und vor der Änderung mindestens 10 gewesen sein)
Die zweite Rule erzeugt um 10 Uhr eine Liste aller Items, deren Wert unter 10 ist und sendet diese Liste.

Das Schöne: es ist egal, ob Du eine Batterie überwachst oder 1000 Batterien, Du braucht nicht eine zusätzliche Codezeile.
Wichtig ist lediglich, dass das Label einen Rückschluss auf das passende Gerät zulässt.
Natürlich ist das Label nur eine Möglichkeit, man könnte z.B. auch den Itemnamen nutzen (oder auch nur einen Teil des Namens oder des Labels, muss halt passend gestaltet sein).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten