Was stimmt mit der rule nicht.

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
mike69
Beiträge: 67
Registriert: 17. Nov 2020 22:38
Answers: 0

Was stimmt mit der rule nicht.

Beitrag von mike69 »

Moinsen.

Devices sollen nur zur einer bestimmten Tageszeit aktiviert werden. Hier eine Testrule:

Code: Alles auswählen

rule "test"
when
    Time cron " 0/5 * * 1/1 * ? * "
then
   var hour  = now.getHour

   logInfo("test", "Hour {}", hour)

   if(hour <= 10 && hour >= 18) {
     logInfo("test", "not the right time")
   }
end
Alle 5 Sekunden wird die Stunde angezeigt, soweit so gut.
Die andere Meldung erscheint nicht.

Nehme ich nur die Startstunde und tausche das

Code: Alles auswählen

   if(hour <= 10 && hour >= 18) {
   
gegen

Code: Alles auswählen

   if(hour <= 10) {
   
aus, kommt der Logeintrag.
Was übersehe ich.
openHAB 4.3.5 auf Debian 12 als VM unter Proxmox

nw378
Beiträge: 320
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Was stimmt mit der rule nicht.

Beitrag von nw378 »

Es kann ja nie gleichzeitig vor 10 Uhr und nach 18 Uhr sein.

Meinst Du evtl "oder"? Das wäre dann || statt &&.

Oder zwischen 10 und 18* Uhr? Dann musst du die Größer-/ Kleinerzeichen vertauschen.

* 19 Uhr - 18:59 ist auch noch <=18
openHAB 5.0.1 @ RPi 5 / M.2 SSD - InfluxDB2 und Grafana @ Synology Docker - KNX, Viessmann vcontrol, u.v.m.

mike69
Beiträge: 67
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Was stimmt mit der rule nicht.

Beitrag von mike69 »

nw378 hat geschrieben: 6. Aug 2025 10:15 Es kann ja nie gleichzeitig vor 10 Uhr und nach 18 Uhr sein.

Meinst Du evtl "oder"? Das wäre dann || statt &&.

Oder zwischen 10 und 18* Uhr? Dann musst du die Größer-/ Kleinerzeichen vertauschen.

* 19 Uhr - 18:59 ist auch noch <=18
Oke, Denkfehler von mir. 11 Uhr ist nicht <10 Uhr und >18 Uhr, also sollte die Aktion von 11-19 Uhr laufen.

Meinst du so was?

Code: Alles auswählen

(hour <= 10 || hour >= 18)
Genau das hat vorhin Fehlermeldungen verursacht. Jetzt funzt es. :D

Und wie gesagt, Testrule. nichts produkives.

Danke Dir erstmal :)
openHAB 4.3.5 auf Debian 12 als VM unter Proxmox

nw378
Beiträge: 320
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Was stimmt mit der rule nicht.

Beitrag von nw378 »

Ich bin mir immer noch nicht sicher, wann die Regel feuern soll.
Ich habe mal beide Möglichkeiten aufgeführt, beachte die Anordnung kleiner/größer und || bzw. &:

Zwischen 0 und 11 Uhr ODER 18 und 24 Uhr:

Code: Alles auswählen

if (hour <= 10 || hour >= 18)
Zwischen 10 und 19 Uhr:

Code: Alles auswählen

if(hour >= 10 && hour <= 18)
Ergänzung:
in dem Time Cron Ausdruck kannst Du das 1/1 durch * ersetzen.
1/1 an dieser Stelle bedeutet: "jede Stunde, ab 1 Uhr morgens"
openHAB 5.0.1 @ RPi 5 / M.2 SSD - InfluxDB2 und Grafana @ Synology Docker - KNX, Viessmann vcontrol, u.v.m.

mike69
Beiträge: 67
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Was stimmt mit der rule nicht.

Beitrag von mike69 »

nw378 hat geschrieben: 6. Aug 2025 10:45 Ich bin mir immer noch nicht sicher, wann die Regel feuern soll.
Es geht um die Steuerung eines Poolfilters, resultiert aus diesem Thread:
viewtopic.php?p=62309&hilit=x+minuten#p62309

Hintergrund ist ein hinzugekommender Stromspeicher, welcher bei Einspeisung lädt und bei Bezug gegensteuert.
Bei bewölktem Wetter, wie in den letzten Wochen, ist der Ertrag nicht so rosig, das kann es passieren, dass der Speicher durch seine trägheit der Regelung Überschuss generiert und der Poolfilter anspringt. Sowas passiert auch nachts, und um das zu vermeiden soll die Rule vom Poolfilter tagsüber laufen.

Wie gesagt, ein kleiner Denkfehler von mir und der Codeschnipsel hat Anfangs nicht fubktioniert. An die Laufzeit taste ich mich noch heran.

Hier die gesamte Rule:

Code: Alles auswählen

var Timer tPumpe     = null
var long  lPumpStart = 0

rule "Wartung Poolfilter"
when
    Item pumpswitch changed
then
    var strMessage = "Filter Betriebsbereit"
    if(newState == ON) {
       strMessage = "Filter Wartung"
//       if(Shelly04_switch1.state != OFF) Shelly04_switch1.sendCommand(OFF)
       if(gPool.state != OFF) gPool.sendCommand(OFF)
    }
    logInfo("pool", strMessage)
end

rule "Pool Pumpe"
when
    Item House_PowerOut changed					//Erfassung Überschuss
then
    var hour  = now.getHour							
    if(hour <= 9 || hour >= 17) {
       if(gPool.state != OFF) gPool.sendCommand(OFF)		// Filterlaufzeit 10-18 Uhr
       return;
    }
    var vpower  = V1_Power_AC.state					//Einspeisung des Speichers
    if(vpower >= 10) {								//Bei Einspeisung Speicher Filter aus
       if(gPool.state != OFF) gPool.sendCommand(OFF)
       return;
    }

    val iPower = if(newState instanceof Number) (newState as Number).intValue else 0
    if(tPumpe !== null) {
        logDebug("pool","Taktsperre, Abbruch")
        return;
    }
    if(pumpswitch.state == ON) {
        logDebug("pool","Wartung aktiv, Abbruch")
        return;
    }
    var temp = Soil_Temp_1.state								// Temperatur vom Pool
    var soll1  = Shelly04_switch1.state                    
    var soll2  = Shelly04_switch2.state

    if(iPower >= 800) soll1 = ON								// Poolfilter startet bei 800W Überschuss
    if(iPower >= 1000 && temp <= 25.9 && soll1 == ON) soll2 = ON 	//Startbedingungen Poolheizung 

    if(temp >=26) soll2 = OFF									// Temperatur erreicht, Heizung aus
    if(iPower <= 300) soll2 = OFF								// min Überschuss erreicht Heizung aus
    if(iPower <= 100) soll1 = OFF								// Poolfilter aus

    if(Shelly04_switch1.state != soll1) {
        logInfo("pool","Pool Pumpe {}",if(soll1 == ON) "an" else "aus")
        Shelly04_switch1.sendCommand(soll1.toString)
        tPumpe = createTimer(now.plusMinutes(2),[|tPumpe = null])
    }
    if(Shelly04_switch2.state != soll2) {
        logInfo("pool","Pool Heizung {}",if(soll2 == ON) "an" else "aus")
        Shelly04_switch2.sendCommand(soll2.toString)
    }
end

rule "Reset Laufzeit"
when
    Time cron "0 0 0 * * ?"
then
    Counter.postUpdate(0)
end

rule "Laufzeit"
when
    Item Shelly04_switch1 changed
then
    if(newState == OFF) {
        var iCounter = 0
        if(Counter.state instanceof Number)
            iCounter = (Counter.state as Number).intValue
        iCounter += (now.toEpochSecond - lPumpStart).intValue
        logInfo("pool", "Filter Laufzeit heute {} Sekunden", iCounter)
        Counter.postUpdate(iCounter)
   } else {
        lPumpStart = now.toEpochSecond
   }
end 
openHAB 4.3.5 auf Debian 12 als VM unter Proxmox

Antworten