Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Maggi
Beiträge: 27
Registriert: 22. Okt 2019 20:09
Answers: 0
Wohnort: Hanau

Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von Maggi »

Hallo zusammen,

ich habe in Openhab eine Regel erstellt, welche bei aktiver Wärmepumpensteuerung in regelmäßigen Abständen prüft ob sich die Außentemperatur in einem bestimmten Bereich befindet z.B. zwischen (3° und 16°) und darunter oder darüber die Wärmepumpe abschaltet (Frostschutz bleibt aktiv ;) )

Meine Rule habe ich nach einem Beispiel von udo1toni aus einem anderen Beitrag gebastelt. und sieht so aus.

Code: Alles auswählen

val Number nHysterese = 0.2

rule "Heizung"
when
    Item wetter_temperatur changed or
	Item WP_REGELUNG changed
then
    Heizen.postUpdate(OFF)
    var Number ist = -100
    var Number wp_sollu = WP_TEMPU.state as DecimalType
    var Number wp_sollo = WP_TEMPO.state as DecimalType
    if(WP_REGELUNG.state == ON) {
        if(!(wetter_temperatur.state instanceof Number)) 
            logWarn("heizen","Isttemperatur Fehler!")
        else
            ist = wetter_temperatur.state as Number

        if(ist > 0 && wp_sollu > 0 && wp_sollo > 0 && ((WP_SCHALTER.state != ON && ist > wp_sollu + nHysterese && ist < wp_sollo - nHysterese) || (WP_SCHALTER.state == ON && ist < wp_sollo && ist > wp_sollu)))
            Heizen.postUpdate(ON)
    }
    if(WP_SCHALTER.state != Heizen.state.toString) WP_SCHALTER.sendCommand(Heizen.state.toString)
end

Problem daran ist mir aufgefallen, dass die Wärmepumpe trotz korrekt eingestelltem Temperaturbereich ab und zu Abschaltet. Grund dafür habe ich im Log von Openhab gefunden. Dort wird der virtuelle Schalter (Heizen) am Anfang der Rule auf Off geschaltet (was so auch sein soll), und der Status und die Schaltung des Schalter (WP_SCHALTER) weiter unten in der Regel wird ausgeführt bevor der virtuelle Schalter (Heizen) den Status ON wieder bekommt.

Ich habe hier eine kleine Verzögerung eingebaut bevor der WP_SCHALTER gesetzt wird. Da es sich im Millisekunden Bereich bewegt habe ich das durch Thread.sleep(500) hinter dem Heizen.postUpdate(ON) gelöst.

Würde das aber gerne mit einer Timer Funktion machen, bekomme dass allerdings, als Laie, nicht sauber in der Regel platziert.
Hat da jemand eine Idee?

Gruß Marco

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von peter-pan »

Probier's mal so:

Code: Alles auswählen

 createTimer(now.plusMillis(500), [ |
  if(WP_SCHALTER.state != Heizen.state.toString) WP_SCHALTER.sendCommand(Heizen.state.toString)
 ])
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Maggi
Beiträge: 27
Registriert: 22. Okt 2019 20:09
Answers: 0
Wohnort: Hanau

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von Maggi »

Hat geklappt so nehme ich das rein. Danke.

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

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von udo1toni »

Du nutzt ein Item, um einen Wert zu speichern.
Das Problem dabei ist, dass openHAB grundsätzlich asynchron arbeitet.
Alle Befehle wie postUpdate pder sendCommand werden also von einem eigenen Thread bearbeitet, es gibt keine InOrder Garantie. Das kann bei zeitkritischen Regeln zum Problem werden.
Da Du ohnehin feste Ausgangswerte verwendest, gibt es hier meines Erachtens keinen Grund, ein Item zu verwenden.
Mit einer Variablen tritt das Problem nicht auf.
Im Übrigen garantiert auch die Verzögerung nicht, dass das Problem nicht auftritt, es verringert lediglich die Wahrscheinlichkeit ;)

Besser wäre also folgender Code:

Code: Alles auswählen

val Number nHysterese = 0.2

rule "Heizung"
when
    Item wetter_temperatur changed or
	Item WP_REGELUNG changed
then
    var Boolean bSoll = false
    var Boolean bIst = if(WP_SCHALTER.state == ON) true else false
    var Number ist = -100
    var Number wp_sollu = if(WP_TEMPU.state instanceof Number) (WP_TEMPU.state as Number) else 0 
    var Number wp_sollo = if(WP_TEMPO.state instanceof Number) (WP_TEMPO.state as Number) else 0
    if(WP_REGELUNG.state == ON) {
        if(!(wetter_temperatur.state instanceof Number)) 
            logWarn("heizen","Isttemperatur Fehler!")
        else
            ist = wetter_temperatur.state as Number

        if(ist > 0 && wp_sollu > 0 && wp_sollo > 0 && ((!bIst && ist > wp_sollu + nHysterese && ist < wp_sollo - nHysterese) || (bIst && ist < wp_sollo && ist > wp_sollu)))
            bSoll = true
    }
    if(bIst != bSoll) WP_SCHALTER.sendCommand(if(bSoll) ON else OFF)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Maggi
Beiträge: 27
Registriert: 22. Okt 2019 20:09
Answers: 0
Wohnort: Hanau

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von Maggi »

Danke für die sachliche Erklärung. Das habe ich so nicht gewusst.
Du hast ja noch einiges an Überprüfungen in der Rule eingebaut. Habe es so mal getestet. Die 4. Zeile von unten ich denke dass sollte bSoll anstelle von sSoll heißen.
Super. Für zukünftigen Regeln habe ich jetzt einige Ideen dazu gewonnen.

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von peter-pan »

Hallo Udo, Danke auch von mir für deine Ausführungen. Das mit der asynchronen Verarbeitung hatte ich irgendwie ausgeblendet.
Ich bastele im Moment auch gerade an einer Regel, in der ich deinen Ansatz evtl. einbauen kann.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

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

Re: Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Beitrag von udo1toni »

Maggi hat geschrieben: 19. Nov 2019 09:34 Die 4. Zeile von unten ich denke dass sollte bSoll anstelle von sSoll heißen.
Stimmt. Tippfehler :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten