Seite 1 von 1
Was stimmt mit der rule nicht.
Verfasst: 6. Aug 2025 09:52
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
gegen
aus, kommt der Logeintrag.
Was übersehe ich.
Re: Was stimmt mit der rule nicht.
Verfasst: 6. Aug 2025 10:15
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
Re: Was stimmt mit der rule nicht.
Verfasst: 6. Aug 2025 10:33
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?
Genau das hat vorhin Fehlermeldungen verursacht. Jetzt funzt es.
Und wie gesagt, Testrule. nichts produkives.
Danke Dir erstmal

Re: Was stimmt mit der rule nicht.
Verfasst: 6. Aug 2025 10:45
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:
Zwischen 10 und 19 Uhr:
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"
Re: Was stimmt mit der rule nicht.
Verfasst: 6. Aug 2025 11:54
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