Automatischer Farbwechsel Küchenbeleuchtung

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von zinnik »

Hallo,

Ich habe mir die RGBW Led Streifen Zigbee vom Lidl gekauft. Diese kann man wunderbar in der Hue bridge einbinden und damit auch in Openhab.

Ich habe folgendes vor:

Wenn TV an (also Power über 10Watt) und Rollo Wohnzimmer unten ist dann soll die Sockelbeleuchtung der Küche angehen und ein Automatischer Farbwechsel über die HSB Farben stattfinden.

Ich habe noch zusätzlich einer Trigger Item "Automatischer_Farbwechsel_Kueche_Sockel" angelegt so dass ich den Farbwechsel auch manuell starten kann ohne die Bedingung Fernseher und Rollo

Wenn Fernseher aus dann soll die Beleuchtung und der Farbwechsel stoppen.

Ich habe mir versucht aus anderen Ideen ein Script und eine Ruel dazu zusammen zu bauen aber komme nicht so ganz weiter.
Das Script soll in der Rule aller 2 Sekunden aufgerufenwerden und eine neue Farbe generieren.

Das Script funktioniert auch aber die Rule zickt.

hue_fade_kueche_sockel.script

Code: Alles auswählen

var hsb             = KuecheSockelZone_Farbe.state as HSBType 
var DecimalType hue = new DecimalType(hsb.hue.intValue % 359 + 1)
var PercentType sat = new PercentType(hsb.saturation.intValue) 
var brightValue     = 65;

if (KuecheSockelZone_Helligkeit.state == ON) { 
    brightValue = 30; 
}

var PercentType bright = new PercentType(brightValue) 
var HSBType     newHsb = new HSBType(hue, sat, bright)
 
sendCommand(KuecheSockelZone_Farbe,                    newHsb); 
//sendCommand(item_buero_buero_hinter_monitoren_color,    newHsb); 
//sendCommand(item_buero_buero_lampe_decke_color,         newHsb); 
//sendCommand(item_buero_buero_unter_tisch_color,         newHsb); 
//sendCommand(item_buero_buero_unter_regal_color,         newHsb); 
// ...

und hier noch die Rule dazu

Automatischer_Farbwechsel_Kueche_ Sockel.rules

Code: Alles auswählen

rule "Automatischer_Farbwechsel_Kueche_Sockel" 
when 
    Time cron "*/2 * * * * ?" 
then 
    if (Automatischer_Farbwechsel_Kueche_Sockel.state == ON)
       if (EnergieTVWohnzimmer_Power.state instanceof Number)                    // enthält das Item einen gültigen Zahlenwert?
         if ((EnergieTVWohnzimmer_Power.state as Number).floatValue <= 10)     // kleiner oder gleich 10?
           if(RolloWohnzimmerrechts_Level.state instanceof Number)
             if((RolloWohnzimmerrechts_Level.state as Number).floatValue <= 90) // kleiner oder gleich 10?
            //return; 
            { 
        callScript("hue_fade_kueche_sockel"); 
        } 
end
Ich würde mich freuen wenn hier jemand weiterhelfen kann.
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von udo1toni »

Grundsätzlich werden Befehle in der DSL nicht mit einem Semikolon abgeschlossen.
Grundsätzlich heißt, es gibt mindestens eine Ausnahme (in diesem Fall: exakt eine Ausnahme), und diese ist return;

Der Grund hierfür: return dient dem Abbruch einer Rule. Dabei muss immer ein "Grund" für den Abbruch angegeben werden, das ist der nachfolgende Wert hinter return. Deshalb wird der nachfolgende Befehl verschluckt, wenn man kein Semikolon setzt. Nun könnte man auf die Idee kommen, einen konkreten Wert mitzugeben, das Dumme ist nur: das Script kann den Wert nirgends los werden, weshalb die Rule dann abstürzen würde. Man muss also einen null-Value übergeben, die einfachste Möglichkeit dazu ist das Semikolon.
Ansonsten kommt es in der DSL nicht vor.
Es ist möglich, dass es nicht direkt zu einem Fehler führt, wetten würde ich darauf aber nicht.

Ich gehe davon aus, dass Du den eigentlichen Befehl in das Script ausgelagert hast, weil Du dieses Script auch von anderen Rules aus ansprichst. In den meisten Fällen wird es elegantere Wege geben, damit umzugehen. Dazu gehört auch dieser fürchterliche Trigger, das ist wirklich nicht schön.
Besser stattdessen:

Code: Alles auswählen

// Globalen Variablen müssen zu Beginn der Datei definiert werden!
var Timer tKitchenColour = null

rule "Automatischer Farbwechsel Küche Sockel"
when
    Item Automatischer_Farbwechsel_Kueche_Sockel changed or
    Item EnergieTVWohnzimmer_Power changed or
    Item RolloWohnzimmerrechts_Level changed
then
    tKitchenColour?.cancel
    if(Automatischer_Farbwechsel_Kueche_Sockel.state == OFF)
        return;

    if(!(EnergieTVWohnzimmer_Power.state instanceof Number)) {
        logWarn("kitchenColor","Kann Stromaufnahme nicht ermitteln! Abbruch ({})",EnergieTVWohnzimmer_Power.state)
        return;
    }
    if((EnergieTVWohnzimmer_Power.state as Number).floatValue <= 10)
        return;

    if(!(RolloWohnzimmerrechts_Level.state instanceof Number)) {
        logWarn("kitchenColor","Kann Behanghöhe nicht ermitteln! Abbruch ({})",RolloWohnzimmerrechts_Level.state)
        return;
    }

    if(RolloWohnzimmerrechts_Level.state <= 90)
        return;

    tKitchenColour = createTimer(now.plusNanos(10000000),[|
        if(!(KuecheSockelZone_Farbe.state instanceof HSBType)) {
            logWarn("kitchenColor","KuecheSockelZone_Farbe liefert kein HSB! Abbruch ({})",KuecheSockelZone_Farbe.state)
            return;
        }
        val myHSB = KuecheSockelZone_Farbe.state as HSBType
        var myHue = myHSB.hue + 1
        if(myHue > 359) myHue = 0
        val mySat = myHSB.saturation
        var myBright = 65
        if(KuecheSockelZone_Helligkeit.state == ON)
            myBright = 30
        val newHSB = new HSBType(myHue,mySat,myBright)
        KuecheSockelZone_Farbe.sendCommand(newHSB) // alternativ: newHSB.toString

        tKitchenColour.reschedule(now.plusSeconds(2))
    ])
end
Da ich kein farbiges Licht habe, kann ich es nicht selbst ausprobieren :) Aber ein paar Kommentare zum Code:

Erst mal triggert die Rule nicht alle zwei Sekunden, sondern bei Wertänderung der beteiligten Items. Das spielt dann eine Rolle, wenn eine der Bedingungen dazu geführt hat, dass der Farbwechsel stoppt, denn somit läuft auch die Rule nicht mehr alle zwei Sekunden.

Der Rulecode beginnt mit einem Abbruch des Timers, falls er läuft. Nun werden nacheinander die verschiedenen Bedingungen abgefragt. Die Warnmeldungen sind nicht unbedingt notwendig, aber zumindest sinnvoll, bis die Rule so arbeitet wie gewünscht.
Ein Rollershutter Item (RolloWohnzimmerrechts_Level) hat keine Einheit, es ist also sinnlos, irgendwelche Verrenkungen anzustellen, um sie loszuwerden.

Sobald alle Hürden genommen sind, wird der Timer angelegt und fast unmittelbar ausgeführt. Eigentlich sollte ein now() ohne .plusIrgendwas ausreichen, aber es gab schon mal Situationen, wo das nicht wunschgemäß funktioniert hat, deshalb also 10 ms Verzögerung.
Innerhalb des Timer Codeblocks prüft die Rule, ob ein gültiger HSB-Wert extrahiert werden kann (das ist gar nicht so sicher)
Dann wird der Wert extrahiert, hue bestimmt (unnötig, die Werte vollständig zu bestimmen), die Nummer mit dem Modulo Operator kann funktionieren, ich bin mir aber nicht sicher, welche Typvoraussetzungen dazu erfüllt sein müssen, deshalb die weniger elegante Methode. ;)
Die Werte für Saturation und Brightness werden ebenso bestimmt und ein neuer Wert vom Typ HSB erzeugt.
Der Wert wird nun gesendet, und zwar mit der Methode .sendCommand, anstatt die Action sendCommand zu verwenden.

Zum Schluss plant der Code den Timer erneut ein, nach zwei Sekunden. Es ist gut möglich, dass der Code etwas Zeit zum Ausführen braucht, dann sollte man besser mit einer globalen Variablen arbeiten, die außerhalb des Timers gefüllt wird. Damit ließe sich der Zeitbedarf für die Berechnung minimieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von zinnik »

Hallo,

vielen Dank für deine Erklärungen, leider habe ich nicht so viel verstanden. Ich weiß dass du es lieb meinst aber es ist schwer wenn das gewisse Verständnis dahinter fehlt.

Ich habe mir dennoch was mitgenommen und die rule jetzt so versucht. Aber leider wieder mit dem unschönen Skript Aufruf.

Ich habe aber noch ein Problemchen. Wenn ich den TV ausschalte also die Leistung geht runter bis unter 10Watt dann stoppt zwar die Rule aber
"Item KuecheSockelZone_Betrieb" bleibt an also der led Stripe bleibt an.

durch das Item KuecheSockelZone_Farbe im Script wird KuecheSockelZone_Betrieb automatisch mit angeschaltet.

Wie füge ich das noch in die rule das es mit ausgeht.

Momentan sieht es so aus:

PS: Die rule von dir habe ich probiert aber da hat sich garnichts getan es kam auch nichts ins Log


Script

Code: Alles auswählen

var hsb             = KuecheSockelZone_Farbe.state as HSBType 
var DecimalType hue = new DecimalType(hsb.hue.intValue % 359 + 1)
var PercentType sat = new PercentType(hsb.saturation.intValue) 
var brightValue     = 65;

if (KuecheSockelZone_Helligkeit.state == ON) { 
    brightValue = 30; 
}

var PercentType bright = new PercentType(brightValue) 
var HSBType     newHsb = new HSBType(hue, sat, bright)
 
sendCommand(KuecheSockelZone_Farbe,                    newHsb); 
//sendCommand(item_buero_buero_hinter_monitoren_color,    newHsb); 
//sendCommand(item_buero_buero_lampe_decke_color,         newHsb); 
//sendCommand(item_buero_buero_unter_tisch_color,         newHsb); 
//sendCommand(item_buero_buero_unter_regal_color,         newHsb); 
// ...

Rule

Code: Alles auswählen

rule "Automatischer_Farbwechsel_Kueche_Sockel" 
when 
    Time cron "*/2 * * * * ?" 
then 
    //if(Automatischer_Farbwechsel_Kueche_Sockel.state == OFF)
       // return;

    if(!(EnergieTVWohnzimmer_Power.state instanceof Number)) {
        logWarn("kitchenColor","Kann Stromaufnahme nicht ermitteln! Abbruch ({})",EnergieTVWohnzimmer_Power.state)
        return;
    }
    if((EnergieTVWohnzimmer_Power.state as Number).floatValue <= 10)
        return;

    if(!(RolloWohnzimmerrechts_Level.state instanceof Number)) {
        logWarn("kitchenColor","Kann Behanghöhe nicht ermitteln! Abbruch ({})",RolloWohnzimmerrechts_Level.state)
        return;
    }

    if(RolloWohnzimmerrechts_Level.state <= 90)
        return; { 
        callScript("hue_fade_kueche_sockel"); 
        } 

end
Bedueten eigentlich die Abfragen von Auto Farbwechsel, TVWohnzimmer und Rollo Wohnzimmer, dass alle drei erfüllt sein müssen oder nur eine von dreien?

Danke für deine Hilfe
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von udo1toni »

zinnik hat geschrieben: 19. Jan 2023 04:46 Bedueten eigentlich die Abfragen von Auto Farbwechsel, TVWohnzimmer und Rollo Wohnzimmer, dass alle drei erfüllt sein müssen oder nur eine von dreien?
return; bedeutet Abbruch. Also ja, damit die Rule beim letzten Befehl ankommt, müssen alle vorigen Bedingungen erfüllt sein.

Du kannst auch mit callScript arbeiten und dennoch auf das fürchterliche Time cron verzichtgen:

Code: Alles auswählen

// Globalen Variablen müssen zu Beginn der Datei definiert werden!
var Timer tKitchenColour = null

rule "Automatischer Farbwechsel Küche Sockel"
when
    Item Automatischer_Farbwechsel_Kueche_Sockel changed or
    Item EnergieTVWohnzimmer_Power changed or
    Item RolloWohnzimmerrechts_Level changed
then
    tKitchenColour?.cancel
    if(Automatischer_Farbwechsel_Kueche_Sockel.state == OFF)
        return;

    if(!(EnergieTVWohnzimmer_Power.state instanceof Number)) {
        logWarn("kitchenColor","Kann Stromaufnahme nicht ermitteln! Abbruch ({})",EnergieTVWohnzimmer_Power.state)
        return;
    }
    if((EnergieTVWohnzimmer_Power.state as Number).floatValue <= 10)
        return;

    if(!(RolloWohnzimmerrechts_Level.state instanceof Number)) {
        logWarn("kitchenColor","Kann Behanghöhe nicht ermitteln! Abbruch ({})",RolloWohnzimmerrechts_Level.state)
        return;
    }

    if(RolloWohnzimmerrechts_Level.state <= 90)
        return;

    tKitchenColour = createTimer(now.plusNanos(10000000),[|
        callScript("hue_fade_kueche_sockel")
        tKitchenColour.reschedule(now.plusSeconds(2))
    ])
end
Und nochmal: da gehört nirgendwo ein Semikolon hin, nur hinter return; alle anderen (auch die in Deinem Script) sind Quatsch.
zinnik hat geschrieben: 19. Jan 2023 04:46 Wenn ich den TV ausschalte also die Leistung geht runter bis unter 10Watt dann stoppt zwar die Rule aber
"Item KuecheSockelZone_Betrieb" bleibt an also der led Stripe bleibt an.
Ja, sicher. Du musst eine zweite Rule schreiben, welche darauf reagiert, dass der Fernseher ausgeschaltet wird. Diese muss das Licht wieder ausschalten.

Nun bist Du allerdings in einem Dilemma, denn so, wie momentan implementiert, wird der Lichtstreifen alle zwei Sekunden ausgeschaltet, sobald eine der Bdeingungen nicht erfüllt ist. damit kannst Du das Lichtband dann nicht mehr unabhängig bedienen.
Deshalb musst Du die beiden Funktionen "Farbwechsel" und "Aktivierung/Deaktivierung" voneinander trennen.

Dazu benötigst Du ein Proxy Item. Ein Proxy Item ist ein ganz normales Item (hier vom Typ Switch), welches aber keinen Link zu einem Channel hat, das heißt, es ist ungebunden. In diesem Item speicherst Du, ob der Farbwechsel an oder aus sein soll:

Code: Alles auswählen

// Globalen Variablen müssen zu Beginn der Datei definiert werden!
var Timer tKitchenColour = null

rule "Automatischer Farbwechsel Küche ein oder aus"
when
    Item Automatischer_Farbwechsel_Kueche_Sockel changed or
    Item EnergieTVWohnzimmer_Power changed or
    Item RolloWohnzimmerrechts_Level changed
then
    if(!(EnergieTVWohnzimmer_Power.state instanceof Number)) {
        logWarn("kitchenColor","Kann Stromaufnahme nicht ermitteln! Abbruch ({})",EnergieTVWohnzimmer_Power.state)
        return;
    }
    if(!(RolloWohnzimmerrechts_Level.state instanceof Number)) {
        logWarn("kitchenColor","Kann Behanghöhe nicht ermitteln! Abbruch ({})",RolloWohnzimmerrechts_Level.state)
        return;
    }
    var soll = FarbwechselAktiv.state
    if(Automatischer_Farbwechsel_Kueche_Sockel.state == OFF )
        soll = OFF
    if((EnergieTVWohnzimmer_Power.state as Number).floatValue <= 10)
        soll = OFF
    if(RolloWohnzimmerrechts_Level.state <= 90)
        soll = OFF

    if(FarbwechselAktiv.state != soll)
        FarbwechselAktiv.postUpdate(soll.toString)
end

rule "Farbwechsel Küche"
when
    Item FarbwechselAktiv changed
then
    tKitchenColour?.cancel
    if(FarbwecheslAktiv.state == OFF) {
        // Hier Code zum Abschalten des Lichts, vermutlich
        KuecheSockelZone_Farbe.sendCommand(OFF)
        // oder alternativ
        KuecheSockelZone_Farbe.sendCommand(new HSBType(0,0,0))
    } else
        tKitchenColour = createTimer(now.plusNanos(10000000),[|
            callScript("hue_fade_kueche_sockel")
            tKitchenColour.reschedule(now.plusSeconds(2))
        ])
end
Das zusätzliche Switch Item trägt den Namen FarbwechselAktiv. Die erste Rule tut nichts anderes, als den Status dieses Items zu ändern, wenn eine der Bedingungen nicht mehr zutrifft.
Die zweite Rule reagiert ausschließlich auf den Wechsel dieses Items. Sie erzeugt bei ON einen Timer, der das Script aufruft und sich danach selbst erneut startet. Ist der Zustand hingegen OFF, wird der Ausschaltbefehl gesendet. Solange sich der Zustand des Items nicht ändert, wird die Rule nicht erneut aufgerufen, deshalb kann das Licht auch unabhängig vom Zustand des Fernsehers usw. bedient werden.
Die Umstellung der Befehle innerhalb des Codes (Abfrage auf ungültige Werte) ist notwendig, da die Rule nun auf jeden Fall etwas tun muss, eben entweder Einschalten oder Ausschalten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von zinnik »

Hallo,

Also das item "Automatischer_Farbwechsel_Kueche_Sockel" ist schon ein Item was selbst erstellt habe ohne Channel

Und das Item "KuecheSockelZone_Betrieb" ist das Original item was auch Kanalgebunden ist.

Das bedeutet das item "Automatischer_Farbwechsel_Kueche_Sockel" möchte ich eigentlich nur benutzen um die Automatik zu starten.
Und das Item "KuecheSockelZone_Betrieb" soll dann die unabhängige Bedienung des Sockellichtes sein.


Lg Sven
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von udo1toni »

Ich hatte es so verstanden, dass Automatischer_Farbwechsel_Kueche_Sockel ein Schalter ist, der die Automatik abschaltet.

Das Item FarbwechselAktiv hingegen bestimmt, ob die Farbwechselroutine gerade läuft oder nicht. Nur wenn die Routine gerade läuft, darf eine Änderung der abgefragten Items zum Ausschalten des Lichts führen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von zinnik »

Ich fasse nochmal alles zusammen. Ich glaube ich habe mich vielleicht auch etwas wirr ausgedrückt.

Items und Funktionen:
EnergieTVWohnzimmer_Power (Misst die Leistung in Watt vom TV) =Number:Power Item
RolloWohnzimmerrechts_Level (Rolladen schalter) =Rolloshutter Item
KuecheSockelZone_Farbe (Farbauswahl über Colorpicker schaltet auch Led Band mit ein) =Color item
KuecheSockelZone_Helligkeit ( damit lässt sich die helligkeit einstellen) =Dimmer Item
KuecheSockelZone_Betrieb ( Einschalter für das Ledband) =Switch Item
Automatischer_Farbwechsel_Kueche_Sockel ( selbsterstelltes item Ohne Link zu einem Channel) = Switch item
Was soll passieren:

Wenn das Rollo im WZ rechts unten ist und der TV an ist als ca. 90Watt dann soll das Ledband in der Küche angehen. und die Farbe soll im Abstand von ca. 2sec durchwechseln.

Das funktioniert soweit....

Wenn ich den TV ausschalte ca10W dann soll das Led Band in der Küche auch wieder ausgehen.

Jedoch so wie Udo schon sagte. Möchte ich das Ledband auch tagsüber unabhängig einschalten können. (zb. Proxy item)

Könntest du mir da mit den Rules weiterhelfen. Danke
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von udo1toni »

Das macht es noch ein wenig einfacher.

Code: Alles auswählen

// Globale Variablen müssen zu Beginn der Datei definiert werden!
var Timer tKitchenColor = null

rule "Automatischer Farbwechsel Küche ein oder aus"
when
    Item EnergieTVWohnzimmer_Power changed or
    Item RolloWohnzimmerrechts_Level changed
then
    if(!(EnergieTVWohnzimmer_Power.state instanceof Number)) {
        logWarn("kitchenColor","Kann Stromaufnahme nicht ermitteln! Abbruch ({})",EnergieTVWohnzimmer_Power.state)
        return;
    }
    var soll = Automatischer_Farbwechsel_Kueche_Sockel.state
    if((EnergieTVWohnzimmer_Power.state as Number).floatValue < 15)
        soll = OFF
    if(RolloWohnzimmerrechts_Level.state <= 90)
        soll = OFF

    if(Automatischer_Farbwechsel_Kueche_Sockel.state != soll)
        Automatischer_Farbwechsel_Kueche_Sockel.postUpdate(soll.toString)
end

rule "Farbwechsel Küche"
when
    Item Automatischer_Farbwechsel_Kueche_Sockel changed
then
    tKitchenColor?.cancel
    if(Automatischer_Farbwechsel_Kueche_Sockel.state == OFF) {
        // Hier Code zum Abschalten des Lichts, vermutlich
        KuecheSockelZone_Helligkeit.sendCommand(0)
    } else
        tKitchenColor = createTimer(now.plusNanos(10000000),[|
            callScript("hue_fade_kueche_sockel")
            tKitchenColor.reschedule(now.plusSeconds(2))
        ])
end
Die erste Rule schaltet den automatischen Farbwechsel ein, wenn der Rollladen über 90% geschlossen ist und der gemessene Verbrauch über 15 liegt (der Fernseher wird sehr sicher mehr brauchen, sobald er an ist und sehr sicher weniger, sobald er aus ist. Exakte Werte als Ein- und Ausschaltschwelle zu nutzen ist hier eher hinderlich).
Die zweite Rule wird nur dann ausgelöst, wenn sich der Zustand des Items Automatischer_Farbwechsel_Kueche_Sockel ändert. Ist der neue Zustand OFF, so war er vorher ON und das Licht muss ausgeschaltet werden (Helligkeit auf 0 sollte auch funtionieren).
Ist der Zustand ON, so war er vorher OFF und der Timer muss angelegt werden.
Danach ist die zweite Rule beendet und wird erst wieder gestartet, wenn sich der Zustand des Items erneut ändert.

Wurde der Timer gestartet, so wird nach 10 Millisekunden (bzw. 10.000.000 Nanosekunden) das Script aufgerufen und anschließend der Timer erneut nach zwei Sekunden eingeplant.

Die Ausführung des Timercodes läuft komplett unabhängig von der Rule Engine über den Scheduler. Wie gesagt, der Code wird nur so lange ausgeführt, wie das Item Automatischer_Farbwechsel_Kueche_Sockel im Zustand ON verharrt, und es läuft dafür keine Rule.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von zinnik »

Hallo leider funktioniert es immer noch nicht.

Ich habe mal simulationsweise die Einschaltbedingung auf 2Watt gesetzt. Das ist ca der Standbyzustand. Weil derzeit nicht daheim bin und den Tv einschalten kann.

Aber wenn ich das richtig verstanden habe, muss doch sobald der Tv über 15 W liefert das Item Automatischer_Farbwechsel_Kueche_Sockel auf ON springen oder? und wenn weniger als 15 Watt wieder auf OFF?
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.

Lg zinnik

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

Re: Automatischer Farbwechsel Küchenbeleuchtung

Beitrag von udo1toni »

zinnik hat geschrieben: 20. Jan 2023 00:45 wenn ich das richtig verstanden habe, muss doch sobald der Tv über 15 W liefert das Item Automatischer_Farbwechsel_Kueche_Sockel auf ON springen oder? und wenn weniger als 15 Watt wieder auf OFF?
Genau, natürlich unter der Voraussetzung, dass der Rollladen unten ( > 90) ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten