Seite 2 von 2
Re: Rule zum "blinken" eines Relais
Verfasst: 19. Mai 2024 19:00
von mad-mike
Moin, eigentlich funktioniert es super, wenn nicht eine neue Situation eingetreten wäre.
Kann man in deine rule oben noch eine zusätzliche abschalt Funktion mit einbringen, wenn puffer-t2 unter 55 Grad fällt.
Oben mit dem Abschalten der rule über die Fritz Leistung, klappt hervorragend. Nur habe ich nicht berücksichtigt, das die rule startet, und während der Laufzeit der Wert von 55 unterschritten werden könnte.
Danke und Gruß
Re: Rule zum "blinken" eines Relais
Verfasst: 19. Mai 2024 19:54
von udo1toni
Zeig doch bitte mal Deine vollständige Rule, so wie sie jetzt ist.
Re: Rule zum "blinken" eines Relais
Verfasst: 19. Mai 2024 19:58
von mad-mike
Code: Alles auswählen
var Timer tEndlos = null // Variable für Timer
var Integer iCountBlink = 0 // Zähler für Blinken
val iOnTime = 10 // Einschaltdauer
val iOffTime = 20 // Ausschaltdauer
val Integer iMinTemp = 55 // Einschalttemperatur
val Integer iMaxPower = 50 // Ausschaltleistung
rule "10 Minuten Blinken"
when
Item Puffer_T2 changed or // Temperatur überschritten?
Item FRITZDECT_210_Leistung changed // Leistung unterschritten?
// Item dhw1_actualTemp changed
then
val fTemp = if(Puffer_T2.state instanceof Number) // lokale Konstante mit Wert füllen
(Puffer_T2.state as Number).floatValue // falls gültige Zahl, Wert aus Item
else // ansonsten
54 // Wert, der nicht triggert
val fPower = if(FRITZDECT_210_Leistung.state instanceof Number) // enbenso für das zweite Item
(FRITZDECT_210_Leistung.state as Number).floatValue
else
51
// val fDHW = if(dhw1_actualTemp.state instanceof Number) // lokale Konstante mit Wert füllen
// (dhw1_actualTemp.state as Number).floatValue // falls gültige Zahl, Wert aus Item
// else // ansonsten
// 50
if(tEndlos === null && fTemp > iMinTemp && fPower > iMaxPower) { // Timer läuft nicht und Temperatur überschritten
tEndlos = createTimer(now, [| // Timer anlegen und sofort ausführen
val iCountBorder = 2 * 10 * 60 / (iOffTime + iOnTime) // Periodenanzahl berechnen
iCountBlink += 1 // Schritt zählen
if(iCountBlink > iCountBorder) { // Falls Periodenanzahl überschritten
HTTPURLThing_km3.sendCommand(ON) // Licht einschalten
return; // und nix weiter machen
}
var iTime = if(HTTPURLThing_km3.state != ON) iOnTime else iOffTime // Falls Relais nicht ON, ONzeit setzen, ansonsten OFFzeit
HTTPURLThing_km3.sendCommand(if(HTTPURLThing_km3.state != ON) ON else OFF) // Relais toggeln
tEndlos.reschedule(now.plusSeconds(iTime)) // Timer erneut planen
])
} else if(tEndlos !== null && fPower < iMaxPower ) { // Timer existiert und Leistung unterschritten //|| fTemp < fDHW
HTTPURLThing_km3.sendCommand(OFF) // Ausschalten
tEndlos.cancel // Timer abbrechen
tEndlos = null // Zeiger auf null
}
end
Wie du siehst, hatte selber etwas versucht, habs dann aber ausgeklammert...
diese DHW Temperatur bedarf es keiner Beachtung. Weil das war ein falscher Ansatz. Einfach Puffer_T2 unter Temperatur 55° soll Rule stoppen.
Re: Rule zum "blinken" eines Relais
Verfasst: 19. Mai 2024 22:47
von udo1toni
Ich gehe mal davon aus, dass es so passen sollte:
Code: Alles auswählen
var Timer tEndlos = null // Variable für Timer
var Integer iCountBlink = 0 // Zähler für Blinken
val iOnTime = 10 // Einschaltdauer
val iOffTime = 20 // Ausschaltdauer
val Integer iMinTemp = 55 // Einschalttemperatur
val Integer iMaxPower = 50 // Ausschaltleistung
rule "10 Minuten Blinken"
when
Item Puffer_T2 changed or // Temperatur überschritten?
Item FRITZDECT_210_Leistung changed // Leistung unterschritten?
Item dhw1_actualTemp changed
then
val fTemp = if(Puffer_T2.state instanceof Number) // lokale Konstante mit Wert füllen
(Puffer_T2.state as Number).floatValue // falls gültige Zahl, Wert aus Item
else // ansonsten
54 // Wert, der nicht triggert
val fPower = if(FRITZDECT_210_Leistung.state instanceof Number) // ebenso für das zweite Item
(FRITZDECT_210_Leistung.state as Number).floatValue
else
51
if(tEndlos === null && fTemp > iMinTemp && fPower > iMaxPower) { // Timer läuft nicht und Temperatur überschritten
iCountBlink = 0 // Beim Timerstart Zähler auf 0!
tEndlos = createTimer(now, [| // Timer anlegen und sofort ausführen
val iCountBorder = 2 * 10 * 60 / (iOffTime + iOnTime) // Periodenanzahl berechnen
iCountBlink += 1 // Schritt zählen
if(iCountBlink > iCountBorder) { // Falls Periodenanzahl überschritten
HTTPURLThing_km3.sendCommand(ON) // Licht einschalten
return; // und nix weiter machen
}
var iTime = if(HTTPURLThing_km3.state != ON) iOnTime else iOffTime // Falls Relais nicht ON, ONzeit setzen, ansonsten OFFzeit
HTTPURLThing_km3.sendCommand(if(HTTPURLThing_km3.state != ON) ON else OFF) // Relais toggeln
tEndlos.reschedule(now.plusSeconds(iTime)) // Timer erneut planen
])
} else if(tEndlos !== null && (fPower < iMaxPower || fTemp < iMinTemp)) { // Timer existiert und Leistung oder Temperatur unterschritten
HTTPURLThing_km3.sendCommand(OFF) // Ausschalten
tEndlos.cancel // Timer abbrechen
tEndlos = null // Zeiger auf null
}
end
Beachte bitte auch die Zuweisung von 0 unmittelbar bevor der Timer initialisiert wird, habe ich oben wohl vergessen... Ohne die Zuweisung funktioniert das Ganze genau einmal (also das 10 Minuten Blinken) und dann nicht mehr, weil der Zähler nicht zurückgesetzt wird. Im Testfall lädst Du die Rule Datei, womit die globalen Variablen wieder neu initialisiert werden.
Re: Rule zum "blinken" eines Relais
Verfasst: 20. Mai 2024 13:49
von mad-mike
Moin, danke dir.
Im ersten Test, (mit falscher Angabe von Temperaturen), konnte ich erstmal kein Fehlverhalten feststellen. Auch wurde die Rule korrekterweise bei unterschreiten, beendet. Also alles Perfekt würde ich sagen.
Danke nochmals.