Außendusche Frostsicher machen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Außendusche Frostsicher machen

Beitrag von Snatsch »

Hallo :) könnte mal wieder euer Fachwissen gebrauchen :)
Hatte mit Hilfe von udo1toni letztens eine Rule erstellt die mir meinen Pufferspeichersensur ausließt und meldet. Nun habe ich mir eine Außendusche für meine Sauna gebaut, :D um die ich eine Begleitheizung gemacht habe. Dazwischen ist ein Shelly 1PM verbaut. Jetzt würde ich gerne das sich die Heizung bei einer Temperatur von unter oder gleich 3 Grad anschaltet und wenn die Temperatur von meinen Heizungsfühler mehr als 5 Grad anzeigt wieder ausschaltet. Die Rule von udo1toni habe ich versucht umzuschreiben und komme aber mit den ganzen Zahlen nicht zurecht :( vielleicht könnte einer von euch mal darüber schauen :?:

Code: Alles auswählen

rule "Duschheizung einschalten"
when 
    Item Temperaturen_outdoor_t1 changed 
then
    logDebug("warmwasser", "Rule getriggert! Wert : {} ", Temperaturen_outdoor_t1.state )
    if(!(previousState instanceof Number))
       logWarn("Temperaturen_outdoor_t1", "kein gültiger Vergleichswert! Setze Wert unter 5.")
    val nPrev = if(previousState instanceof Number) (previousState as Number).floatValue else 2
    if(!(newState instanceof Number)) {
       logWarn("Temperatur outdoor", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (newState as Number).floatValue
    if(nNew > 3 && nPrev <= 3) {
       logInfo("Außentemperatur ist unter 3 Grad")
       Duschheizung_Betrieb.sendCommand(ON)

    }
    if(nNew > 5 && nPrev <= 5) {
       Duschheizung_Betrieb.sendCommand(OFF)
       
    }
end

wäre echt super
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Außendusche Frostsicher machen

Beitrag von udo1toni »

Zu kompliziert. :)

Die Rule sollte so ausreichen:

Code: Alles auswählen

rule "Duschheizung schalten"
when 
    Item Temperaturen_outdoor_t1 changed 
then
    if(!(newState instanceof Number)) {
       logWarn("Temperatur outdoor", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (newState as Number).floatValue
    if(nNew < 3 && Duschheizung_Betrieb.state != ON) {
       logInfo("Außentemperatur ist unter 3 Grad")
       Duschheizung_Betrieb.sendCommand(ON)
    }
    if(nNew > 5 && Duschheizung_Betrieb.state != OFF) {
       Duschheizung_Betrieb.sendCommand(OFF)
    }
end
Zunächst prüft die Rule, ob ein gültiger Messwert vorliegt. Ist das nicht der Fall, bricht die Rule mit einer Fehlermeldung ab.
Ist alles in Ordnung, prüft die Rule, ob der Messwert unter 3 liegt und die Heizung abgeschaltet ist. Trifft beides zu, so wird die Heizung eingeschaltet.
Anschließend prüft die Rule noch, ob der Messwert über 5 liegt und die Heizung eingeschaltet ist. Trifft beides zu, so wird die Heizung ausgeschaltet.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Außendusche Frostsicher machen

Beitrag von Snatsch »

He vielen Dank für deine Hilfe :) Versuche immer die Rules mit den von dir empfohlenen zusammen zu basteln :D
eine hab ich noch :lol:
da ich ja nicht merke ob die Heizung auch an ist bzw der Shelly online ist habe ich noch folgende die mich Benachrichtigen soll.

Code: Alles auswählen

rule "Duschheizung ist Offline"
when
    Thing "shelly:shelly1pm:349454719780" changed
then
    val thingStatusInfo = getThingStatusInfo("shelly:shelly1pm:349454719780")
    if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
        logInfo("ThingStatus", "The thing is online.")
    } else {
        Meldung.postUpdate ("Achtung die Duschheizung ist Offline !!!")
    }
end
die müsste so passen oder ?
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Außendusche Frostsicher machen

Beitrag von udo1toni »

Diese Zeile:

Code: Alles auswählen

if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
dürfte im Zweifel eine nullPointer Exception auslösen, wenn thingStatusInfo keinen gültigen Zeiger enthält (also null ist). Der Vergleich auf !== null führt nicht sofort zum Abbruch des restlichen Vergleichs.

Ansonsten ist aber auch der Vergleich unnötig kompliziert (jedenfalls wenn man eine einigermaßen aktuelle Version von openHAB einsetzt).
Es gibt nämlich seit OH3.3 eine implizite Variable, welche den neuen Status des triggernden Things enthält. Es reicht also so:

Code: Alles auswählen

rule "Duschheizung ist Offline"
when
    Thing "shelly:shelly1pm:349454719780" changed
then
    if ((newThingStatus.toString == "ONLINE")) {
        logInfo("ThingStatus", "The thing is online.")
    } else {
        Meldung.postUpdate ("Achtung die Duschheizung ist Offline !!!")
    }
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Außendusche Frostsicher machen

Beitrag von Snatsch »

Nutze noch 3.0.2.
aber eigentlich wäre es nicht besser wenn die Rule z.B. alle 10 Minuten schaut ob wenn die Temperatur unter 3 Grad ist, das die Duschheizung eingeschaltet ist ? Müsste doch auch gehen oder ? :?:
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Außendusche Frostsicher machen

Beitrag von udo1toni »

Es geht vieles. Wenn Du eine Überwachung des echten Zustands haben willst, wirst Du nicht drum herum kommen, auch zu prüfen, ob das Gerät online ist.
Dein Ansatz ist auch nicht grundlegend falsch, nur die erste Bedingung muss unbedingt separat abgefragt werden, also z.B. so:

Code: Alles auswählen

rule "Duschheizung ist Offline"
when
    Thing "shelly:shelly1pm:349454719780" changed
then
    val thingStatusInfo = getThingStatusInfo("shelly:shelly1pm:349454719780")
    if ((thingStatusInfo === null) {
        logWarn("ThingStatus", "Thing nicht gefunden!")
        return;
    }
    if(thingStatusInfo.getStatus().toString() == "ONLINE")) {
        logInfo("ThingStatus", "The thing is online.")
    } else {
        Meldung.postUpdate ("Achtung die Duschheizung ist Offline !!!")
    }
end
Mein Tipp wäre, von der hoffnungslos veralteten Version Abschied zu nehmen und upzudaten auf 3.3.0, das ist stable.
Es gibt bei Minor Updates eigentlich keinen Grund, auf einer Version stehen zu bleiben. Ich habe mein Produktivsystem z.B. immer noch auf 2.5.12, davor hatte ich mein Produktivsystem auf 1.8.irgendwas, das waren aber jeweils die letzten Versionen des Produkts.
Ich wäre auch schon lange auf OH3 umgeschwenkt, komme aber einfach nicht dazu, weil halt einige aufwändige Umbauten im Rule Code vorzunehmen sind - mein letzter Versuch ist gescheitert, mein großer Vorteil ist halt, dass sich dann einfach zurückrolle und die alte Version wieder laufen lasse.
Wäre ich aber schon auf OH3, dann würde ich die Updates regelmäßig einspielen, denn die Minor Updates bringen maximal kleine Änderungen, die auch immer gut dokumentiert sind (Breaking Changes). Hier auf einer alten Version zu bleiben, bringt keinerlei Vorteile, dafür wird der Berg an Arbeit, der irgendwann fällig wird, wenn doch ein Umstieg notwendig sein sollte von Version zu Version größer.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Außendusche Frostsicher machen

Beitrag von Snatsch »

He
habe die Rule von udo1toni ausprobiert und erhalte leider folgende Fehlermeldung

Code: Alles auswählen

Script execution of rule with UID 'Duschheizung_anschalten-1' failed: An error occurred during the script execution: index=1, size=1 in Duschheizung_anschalten
das ist die Rule

Code: Alles auswählen

rule "Duschheizung schalten"
when 
    Item Temperaturen_outdoor_t1 changed 
then
    if(!(newState instanceof Number)) {
       logWarn("Temperatur outdoor", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (newState as Number).floatValue
    if(nNew < 3 && Duschheizung_Betrieb.state != ON) {
       logInfo("Außentemperatur ist unter 3 Grad")
       Duschheizung_Betrieb.sendCommand(ON)
       Meldung.postUpdate ("Die Duschheizung ist jetzt eingeschaltet !!!")
    }
    if(nNew > 5 && Duschheizung_Betrieb.state != OFF) {
       Duschheizung_Betrieb.sendCommand(OFF)
       Meldung.postUpdate ("Die Duschheizung ist jetzt ausgeschaltet !!!")
    }
end
ich finde leider den Fehler nicht :(
Vieleicht einer von euch der mir helfen kann :)
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Außendusche Frostsicher machen

Beitrag von udo1toni »

Nein, das ist nicht die Rule.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Re: Außendusche Frostsicher machen

Beitrag von Snatsch »

he udo1toni ich bin dir wie immer sehr dankbar für deine Hilfe :)
Ich kopiere die Rules die ich von dir bekomme nicht einfach sondern versuche sie abzuschreiben um vielleicht zu verstehen wie sie funktionieren :?:
jetzt habe ich die Rule von dir einfach kopiert aber sie zeigt wenn sie auslöst trotzdem noch den Fehler. Ich habe von Version 3.0.2 auf die aktuelle Version upgegradet :) So habe ich sie jetzt

Code: Alles auswählen

rule "Duschheizung schalten"
when 
    Item Temperaturen_outdoor_t1 changed 
then
    if(!(newState instanceof Number)) {
       logWarn("Temperatur outdoor", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (newState as Number).floatValue
    if(nNew < 7.7 && Duschheizung_Betrieb.state != ON) {
       logInfo("Außentemperatur ist unter 3 Grad")
       Duschheizung_Betrieb.sendCommand(ON)
        Meldung.postUpdate ("Die Duschheizung ist jetzt eingeschaltet")
    }
    if(nNew > 10 && Duschheizung_Betrieb.state != OFF) {
       Duschheizung_Betrieb.sendCommand(OFF)
        Meldung.postUpdate("Die Duschheizung ist jetzt ausgeschaltet")
    }
end
die Temperaturen habe ich den jetzigen bei uns angepasst um die Rule zu testen ;)
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

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

Re: Außendusche Frostsicher machen

Beitrag von udo1toni »

Und jetzt ist die Frage, wie die Fehlermeldung nun lautet :)

Und nur so zur Sicherheit... Es handelt sich um eine ganz normale DSL Ruile, welche in einer Datei /etc/openhab/rules/irgendwas.rules liegt, wobei ich hier ein GNU/Linux System voraussetze (ansonsten wäre der Pfad evtl. ein anderer und unter Windows gäbe es \ statt / und vorne einen Laufwerksbuchstaben mit Doppelpunkt).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten