Rule zum "blinken" eines Relais

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

mad-mike
Beiträge: 417
Registriert: 6. Jan 2021 18:05
Answers: 2

Rule zum "blinken" eines Relais

Beitrag von mad-mike »

Moin zusammen.

Ich möchte ein Relais Schalten, wobei ON und OFF unterschiedliche Laufzeiten haben sollen. Ich sage mal 10 sek an, 20 sek aus. Die soll als ""Endlosschleife"" passieren, solange ein Item Switch auf ON steht...


(dieser Switch soll durch verschiedene Leistungsaufnahme und Temperaturen ""Differenzen"" meiner BWWP und 2ten Warmwasser speicher aktiv gesetzt werden).

Wie könnte ich dies ausführen?

Ich habe Leider keine wirkliche Idee.

vielleicht mit einer "while" schleife und Timern? :?:

Danke und Gruss
Gruss mad-mike

openHABian 4.1.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 14078
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule zum "blinken" eines Relais

Beitrag von udo1toni »

Einfach nur einen Timer nehmen :)
Vollständige Rule:

Code: Alles auswählen

var Timer tEndlos = null                                            // Variable für Timer
val iOnTime = 10                                                    // Einschaltdauer
val iOffTime = 20                                                   // Ausschaltdauer

rule "endlos Timer"
when
    Item TimerStart changed                                         // Schalter zum aktivieren/deaktivieren
then
    tEndlos?.cancel                                                 // timer anhalten, falls er läuft
    if(newState != ON) {                                            // falls Schalter nicht ON
        return;                                                     // fertig
                                                                    // ab hier war der Schalter auf ON
    tEndlos = createTimer(now,[|                                    // Timer anlegen und sofort ausführen
        var iTime = if(MyRelais.state != ON) iOnTime else iOffTime  // Falls Relais nicht ON, ONzeit setzen, ansonsten OFFzeit
        MyRelais.sendCommand(if(MyRelais.state != ON) ON else OFF)  // Relais toggeln
        tEndlos.reschedule(now.plusSeconds(iTime))                  // Timer erneut planen
    ])
end
Natürlich kann man den Code im Timer auch anders gestalten :)

Es ist noch zu erwähnen, dass gerade ein Relais nicht die beste Option für die Anwendung ist, gewöhnlich sind Relais nur für einige zehntausend Schaltspiele ausgelegt. Hier wäre also ein Triac mit Nulldurchgangserkennung vermutlich die bessere Wahl.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 417
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Rule zum "blinken" eines Relais

Beitrag von mad-mike »

Moin, danke, werde es gleich Mal ausprobieren.

Das ist ja viel einfacher, wie ich dachte. :)

Ich grübelte hin und her. :lol: anscheinend viel zu kompliziert.

Du dem triac. Kannst du da was empfehlen als Zwischenstecker oder Montage für den Zählerschrank (Hutschiene)?

Die Last sollen keine 20 Watt bei 230 Volt zu schalten sein.
Gruss mad-mike

openHABian 4.1.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 14078
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule zum "blinken" eines Relais

Beitrag von udo1toni »

Eine direkte Empfehlung habe ich nicht, typisch wäre ein Heizungsaktor. Allerdings weiß ich nicht, ob es die einzeln (also einkanalig) gibt. Dimmer wären hier ebenfalls möglich, wobei man da immer auch auf die Art der Last schauen muss. Den Dimmer nutzt man dann nicht, um die Phase an- oder abzuschneiden, sondern lediglich als elektronischen Schalter.
Ansonsten kannst Du auch nach dem Begriff "SolidStateRelay" suchen, wobei mir auf die Schnelle kein "fertiges" Produkt einfiele.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 417
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Rule zum "blinken" eines Relais

Beitrag von mad-mike »

Ich habe ja ein paar LCN Module hier. Diese haben ein Dimmer und können auch als Schalter verwendet werden. (Je nach Konfiguration)

In der Doku steht z.b.

Nullspannungsschalter oder Phasen schnittDimmer.

Das sollte doch so etwas sein, richtig ?

Dann habe ich sowas sogar noch daheim.

Danke für deine Hilfe.


P.s. in deiner rule ist eine geschweifte Klammer zuviel. (2te Zeile nach then)
Gruss mad-mike

openHABian 4.1.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 14078
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule zum "blinken" eines Relais

Beitrag von udo1toni »

Ja, genau, topp. Nullspannungsschalter ist genau das, was Du willst.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 417
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Rule zum "blinken" eines Relais

Beitrag von mad-mike »

Moin,

Kann man auch einen Timer innerhalb eines Timers Starten?

Oben die Rule läuft. Jetzt soll das ganze noch etwas erweitert werden, weil sich mit der zeit ein paar Punkte gezeigt haben.

Punkt 1: Starten die Rule automatisch:

Code: Alles auswählen

Item Puffer_T2 
Größer 55°C

Punkt 2 : Rule soll wie oben etwa 10 minuten laufen. (Deswegen hier die frage nach Timer von 10 minuten) jedoch hat nach meinem Versuch nix mehr gestartet)

punkt 3: nach ende der 10 Minuten soll Item dauerhaft on.

Punkt 4: Item soll ende , Wenn:

Code: Alles auswählen

FRITZDECT_210_Leistung
unter 50 Watt...



Aktuell wird das ganze manuell gestartet, taktet 10 Minuten hin, danach stelle ich auf Dauer ON,
Ausschalten tue ich auch manuell.. passt man natürlich nicht jede minute drauf auf :oops:
Gruss mad-mike

openHABian 4.1.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 14078
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule zum "blinken" eines Relais

Beitrag von udo1toni »

Ja, aber nein.

Wie sieht Deine Rule aktuell aus?

Mein Tipp an der Stelle wäre, die Zyklen zu zählen. Nehmen wir an, der Timer schaltet alle (iOnTime + iOffTime) Sekunden zweimal den Zustand um, dann bedeutet das 2 * 10 * 60 / (iOnTime + iOffTime) Schaltvorgänge innerhalb von 10 Minuten.
Du zählst also mit einer Integer Variable mit:

Code: Alles auswählen

// globale Variable
var Integer iCountBlink = 0

...

// im Timer ganz vorne
iCountBlink += 1 // Zähler um 1 erhöhen
val Integer iBorder = 2 * 10 * 60 / (iOnTime + iOffTime)
if(iCountBlink > iBorder) {
    tEndlos.cancel // Timer abbrechen
    MyRelais.sendCommand(ON) // und Licht dauerhaft einschalten
}
...
Das Ausschalten des Lichts kann natürlich innerhalb der Rule erledigt werden, wenn newState OFF ist, einfach vor dem return; noch das passende sendCommand(OFF) mit einbauen.

vollständige Rule evtl. so:

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 = 50                                             // 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?
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

    if(tEndlos === null && fTemp > iMinTemp) {                           // 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 
                MyRelais.sendCommand(ON)                                 // Licht einschalten
                return;                                                  // und nix weiter machen
            }
            var iTime = if(MyRelais.state != ON) iOnTime else iOffTime   // Falls Relais nicht ON, ONzeit setzen, ansonsten OFFzeit
            MyRelais.sendCommand(if(MyRelais.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
        MyRelais.sendCommand(OFF)                                        // Ausschalten
        tEndlos.cancel                                                   // Timer abbrechen
        tEndlos = null                                                   // Zeiger auf null
    }
end
Aber grau ist alle Theorie... :)
Es gäbe natürlich auch diverse andere Möglichkeiten, das zu lösen
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 417
Registriert: 6. Jan 2021 18:05
Answers: 2

Re: Rule zum "blinken" eines Relais

Beitrag von mad-mike »

Danke dir...
Habe gestern die Temperaturen zum testen etwas tiefer gesetzt. Lief auch sofort. ;) Die OFF Bedingung habe ich im Test jedoch nicht erreicht.

Weiter unten hast du den part geschrieben:

Code: Alles auswählen

    } else if(tEndlos !== null && fPower < iMaxPower) {                  // Timer existiert und Leistung unterschritten

Kann man hier auch eine ODER abfrage mit einfügen?? Ich meine als beispiel:
Item DHW ist größer Puffer_t2 gleich

Code: Alles auswählen

sendCommand(OFF)
??

Code: Alles auswählen

[code]    } else if(tEndlos !== null && fPower < iMaxPower) oder DHW > Puffer_T2 {                  // Timer existiert und Leistung unterschritten
[/code]

sowas z.B.??


Danke und Gruß :)
Gruss mad-mike

openHABian 4.1.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 14078
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule zum "blinken" eines Relais

Beitrag von udo1toni »

Ja, sicher:

Code: Alles auswählen

else if(tEndlos !== null && (fPower < iMaxPower || DHW > Puffer_T2)) { // Timer existiert und (Leistung unterschritten oder Temperatur erreicht)
Die erste Bedingung muss erfüllt sein (Timer existiert), von den beiden anderen Bedingungen muss mindestens eine erfüllt sein.
DHW und Puffer_T2 sollten in diesem Fall allerdings lokale oder globale Variablen sein :) ansonsten sollten die Itemstatus zunächst sicher in lokale Variablen überführt werden, so wie bei fPower und fTemp schon vorgeführt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Antworten