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.