Ankündigung

Einklappen
Keine Ankündigung bisher.

Regel - Temp-Unterschiede berechnen lassen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Regel - Temp-Unterschiede berechnen lassen

    Hallo,
    da die Steuerung meiner Wärmepumpe in manchen Belangen etwas limitiert ist, möchte ich dem mit einer Rule in Openhab etwas entgegenwirken.

    Die Heizungssteuerung berechnet die VL-Temp für die FBH nach der Durchschnittstemperatur der letzten Stunde. Aufgrund der Trägheit einer FBH und dem sehr guten Dämmstandard meines Hauses kombiniert mit dessen großen Speichermasse, ist das natürlich suboptimal. Besser wäre, die 24h-Durchschnittstemperatur heranzuziehen.

    Tagsüber mit viel Sonne heizt sich das Haus auf, nachts hingegen bei großen Temp-Unterschieden zum Tag kühlt das Haus aber nur wenig aus. Folglich heizt die Wärmepumpe in der Nacht ständig hoch, obwohl die Wärme dann erst morgens zu spüren ist, wenn es draussen eh wieder wärmer wird...



    Ich möchte also in der Regel die Differenz der 1h-Temp zur 24h-Temp berechnen und wenn diese zu groß wird, die VL-Temp entsprechend regeln.


    Also als Beispiel:
    *** 24h-Temp liegt bei 0°C, nachts wirds aber kurzzeitig -10°C kalt ---> Differenz -10 K ---> VL-Temp der Heizung um 1 oder 2 K absenken.
    *** morgens 1h-Temp wieder bei 0°C ---> 0 K Differenz --> VL-Temp wieder auf normalen berechneten Wert der Steuerung setzen


    Hier mal grob, wie ich mir das vorstelle, wobei ich nicht weiß, wie ich in einer Rule die Differenz aus zwei items berechnen kann:
    Code:
    rule "Soll-Temp-Heizung dämpfen - wenn Unterschied 1h und 24h Aussentemp zu groß"
        when Item HeatPump_Temperature_4 changed
        then
            if (HeatPump_Temperature_4.state as DecimalType) - (HeatPump_Temperature_5.state as DecimalType) > 10
            set (HeatPump_adapt_heating, -1)
    end

    Wie gesagt, das soll mal das Grundgerüst sein, auf dem ich aufbauen will, mit der genauen Schreibweise und der Berechnung hapert es aber noch...

    Wie muss das genau geschrieben werden?

    #2
    So sieht das erstmal gut aus, es fehlen eigentlich nur die Klammern für das if, also:
    if (bedingung) wobei bedingung der ganze Term ist. Die Klammern um die einzelnen states mit Typdeklarierung sollten allerdings nicht nötig sein, vollständig sollte also das hier funktionieren:
    Code:
     if (HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType > 10)
    Ich gehe mal davon aus, dass HeatPump_adapt_heating ein Item ist, dann lautet der korrekte Befehl sendCommand(HeatPump_adapt_heating, -1) oder auch HeatPump_adapt_heating.sendCommand(-1), ganz nach Geschmack.

    Kommentar


      #3
      Werde ich gleich ausprobieren.

      Wie müsste die Zeile denn aussehen, wenn ich z.B. >10 und gleichzeitig <=15 als Bedingung haben möchte?

      Muss man da alls nochmal schreiben oder kann man einfach " && <=15" zum Schluß anhängen?

      Kommentar


        #4
        Da wirst Du alles nochmal hinschreiben müssen (alternativ kannst Du natürlich vorher die Berechnung in einer Variablen speichern und diese zum Vergleich heranziehen)

        Kommentar


          #5
          Heute ist mir aufgefallen, dass die Regel doch nicht ganz so funktioniert, wie gewünscht.

          Sobald der Temp-Unterschied größer als 3 K (bzw. die Differenz der beiden Werte tiefer als -3°C) ist, greift die 2. if-Abfrage und dann kommt es zur folgenden Fehlermeldung:

          Code:
          [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Soll-Temp-Heizung d?mpfen - wenn Unterschied 1h und 24h Aussentemp zu gro?': Could not invoke method: org.eclipse.xtext.xbase.lib.BooleanExtensions.operator_and(boolean,boolean) on instance: null

          Kann es sein, dass mit dem && was nicht stimmt oder gehören da rigendwo noch Klammern rum?


          Hier die Rule:
          Code:
          rule "Soll-Temp-Heizung dämpfen - wenn Unterschied 1h und 24h Aussentemp zu groß"
              when
                  Item HeatPump_Temperature_4 received update
              then
                  if (HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType > -2.5) {
                      if (HeatPump_adapt_heating.state as DecimalType != 0) {
                          sendCommand(HeatPump_adapt_heating, 0)
                      }
                  }
                  if (HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType <= -3 && HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType < -5.8) {
                      if (HeatPump_adapt_heating.state as DecimalType != -0.5) {
                          sendCommand(HeatPump_adapt_heating, -0.5)
                      }
                  }
                  if (HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType <= -6 && HeatPump_Temperature_4.state as DecimalType - HeatPump_Temperature_5.state as DecimalType < -8.8) {
                      if (HeatPump_adapt_heating.state as DecimalType != -1.0) {
                          sendCommand(HeatPump_adapt_heating, -1.0)
                      }
                  }
          end

          Kommentar


            #6
            Versuch mal, die einzelnen Blöcke zu klammern also if((erste Bedingung) && (zweite Bedingung)), falls das nicht reicht, auch noch Klammern um die einzelnen item.state as DecimalType Blöcke.

            Kommentar


              #7
              Werd ich versuchen. Der erste if-Block wird ja anstandslos abgearbeitet, der trifft ja eigentlich immer zu. Der zweite und dritte Block erfüllt die Bedingung nur ganz selten.

              Kommentar

              Lädt...
              X