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