Pool Wärmepumpensteuerung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
RR727
Beiträge: 9
Registriert: 28. Nov 2023 16:37
Answers: 0

Pool Wärmepumpensteuerung

Beitrag von RR727 »

Hallo zusammen,
Hallo Udo!

Bitte um dein/euer Feedback zu folgender Regel.
Kurz beschrieben wollte ich alle Funktionen in eine Regel packen und die Wärmepumpe nach festen Zeiten ein und aus schalten.
Zudem über einen zusätzlichen Shelly per potenzialfreien Kontakt, die Wärmepumpe je nach anliegen von PV-Leistung freigeben.

Separat als eigene Regeln hat das bereits funktioniert. Ich wollte aber die Anzahl meiner Regeln reduzieren und den Ablauf in eine Regel packen. Leider funktioniert das nicht. Ich bitte um Hilfe dazu! Warum geht das nicht?

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      time: 08:52
    type: timer.TimeOfDayTrigger
  - id: "2"
    configuration:
      time: 18:30
    type: timer.TimeOfDayTrigger
  - id: "3"
    configuration:
      cronExpression: 0 0/10 9-18 * * ? *
    type: timer.GenericCronTrigger
conditions: []
actions:
  - inputs: {}
    id: "4"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >
        import java.time.LocalTime  val currentTime = now.toLocalTime()

        logInfo("regel", "Aktuelle Zeit: {}", currentTime)  logInfo("regel",
        "Zustand ShellyWP_Betrieb: {}", ShellyWP_Betrieb.state)

        // Regel 1: Einschalten der Wärmepumpe um 08:52  if
        (currentTime.isAfter(LocalTime.parse("08:51")) &&
            currentTime.isBefore(LocalTime.parse("08:53")) && 
            ShellyWP_Betrieb.state == OFF) {
          logInfo("regel", "Einschalten der Wärmepumpe um 08:52 Uhr")
          sendCommand(ShellyWP_Betrieb, ON)
          sendBroadcastNotification("Wärmepumpe um 08:52 Uhr eingeschaltet")
        }

        // Regel 2: Ausschalten der Wärmepumpe um 18:30  if
        (currentTime.isAfter(LocalTime.parse("18:29")) &&
            currentTime.isBefore(LocalTime.parse("18:31")) && 
            ShellyWP_Betrieb.state == ON) {
          logInfo("regel", "Ausschalten der Wärmepumpe um 18:30 Uhr")
          sendCommand(ShellyWP_Betrieb, OFF)
          sendBroadcastNotification("Wärmepumpe um 18:30 Uhr ausgeschaltet")
        }

        // Regel 3: Freigabe der Wärmepumpe basierend auf dem PVMittelwert alle
        10 Minuten zwischen 09:00 und 18:00  if
        (currentTime.isAfter(LocalTime.parse("09:00")) &&
            currentTime.isBefore(LocalTime.parse("19:00"))) {
          val pvMittelwert = (PVMittelwert.state as QuantityType<Power>).toUnit("kW").toBigDecimal
          logInfo("regel", "PVMittelwert: {}", pvMittelwert)

          if (pvMittelwert > 3 && Shelly_WP_Freigabe_Betrieb.state != ON) {
            logInfo("regel", "Freigabe der Wärmepumpe, da PV-Leistung > 3kW")
            sendCommand(Shelly_WP_Freigabe_Betrieb, ON)
            sendBroadcastNotification("Wärmepumpe freigegeben, da PV-Leistung > 3kW")
          } else if (pvMittelwert < 1 && Shelly_WP_Freigabe_Betrieb.state != OFF) {
            logInfo("regel", "Freigabe der Wärmepumpe aufgehoben, da PV-Leistung < 1kW")
            sendCommand(Shelly_WP_Freigabe_Betrieb, OFF)
            sendBroadcastNotification("Wärmepumpe nicht freigegeben, da PV-Leistung < 1kW")
          } else {
            logInfo("regel", "Keine Änderung an der Freigabe der Wärmepumpe erforderlich")
          }
        }
    type: script.ScriptAction

Vorab vielen Dank!
LG Rene

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

Re: Pool Wärmepumpensteuerung

Beitrag von udo1toni »

Vermutlich sind die diversen fehlerhaften Umbrüche das Problem. Oder sieht der Code im Code Editor da anders aus, als in der Code Ansicht der gesamten Rule? // innerhalb einer Zeile erklärt den Rest der Zeile zum Kommentar.

Abgesehen davon wäre meine Empfehlung, hier lieber drei einzelne Rules zu nutzen, die dann dafür extrem einfach sein können. Du gewinnst durch die Zusammenlegung nichts, die Rule wird aber wesentlich komplexer als die drei getrennten Rules.

Ein weiterer Tipp: Es ist besser, auf eine Abweichung vom Sollwert zu testen, als auf einen konkreten vom Sollwert abweichenden Wert:

Schlecht:

Code: Alles auswählen

if(ShellyWP_Betrieb.state == OFF)
  ShellyWP_Betrieb.sendCommand(ON)
Gut:

Code: Alles auswählen

if(ShellyWP_Betrieb.state != ON)
  ShellyWP_Betrieb.sendCommand(ON)
Der Unterschied: ShellyWP_Betrieb.state kann durchaus noch den Wert NULL oder UNDEF annehmen, womit die Rule dann im ersten Fall nichts tut. Im zweiten Fall schaltet sie trotzdem auf den Sollwert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten