Seite 1 von 1

Regel zur Steuerung einer Luftwäremepumpe nach Außentemperatur

Verfasst: 18. Nov 2019 09:50
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

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

Verfasst: 18. Nov 2019 11:11
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)
 ])

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

Verfasst: 18. Nov 2019 15:26
von Maggi
Hat geklappt so nehme ich das rein. Danke.

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

Verfasst: 18. Nov 2019 22:48
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

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

Verfasst: 19. Nov 2019 09:34
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.

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

Verfasst: 19. Nov 2019 11:34
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.

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

Verfasst: 19. Nov 2019 17:58
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 :)