Automatisches Licht im Treppenhaus / Flur

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

Moderatoren: Cyrelian, seppy

Antworten
Der Linus
Beiträge: 25
Registriert: 20. Apr 2017 14:22
Answers: 0

Automatisches Licht im Treppenhaus / Flur

Beitrag von Der Linus »

wertes Auditorium,

ich "Bastele" schon ein paar Jahre mit openHAB herum, habe jetzt aber (durch ein verunglücktes Upgrade auf OH4) ein komplettes neues System aufgesetzt und arbeite jetzt von Anfang an systematisch, was vorher nicht konsequent der Fall war. (Beispiel: Einheitliche Nomenklatur, nur die Things hinzufügen, die auch direkt ins Modell gepackt werden...)
Ich habe ein Hue Subsystem, das ich funktionell gerne auf OH portieren möchte, eben um nur EINE Automatisierungslösung zu haben und um verschiedene Sub-Systeme in einem System interdisziplinär zu verknüpfen.

Ich habe mit Homematic alles was Heizung, Temperatur, geöffnete Fenster und sowas angeht abgedeckt, die Steuerung der Heizung erfolgt aber in openHAB, genau so möchte ich das mit Hue haben.

Jetzt stoße ich auf den ersten Schönheitsfehler (Funktion ist so gegeben, wie ich das möchte, trotzdem läuft (nach Log) was schief.

Ausgangsbasis:

im Flur 1.OG sind zwei Bewegungsmelder und eine Lampengruppe, bestehend aus 4 einzelnen Leuchtmitteln. Die Lampengruppe ist aus dem Hue System als Room übernommen worden.
Aufgabe: bei Bewegung soll abhängig von der Uhrzeit (Tags/Nachts) entweder die ganze Gruppe auf 50% angeschaltet (Tags) oder 2 Lampen auf 5% angeschaltet (Nachts) werden und 10 Sekunden nachdem die Motions von ON auf OFF gewechselt sind (beide) sollen die Lampen wieder ausgehen.

ich habe das in Blockly gelöst (Bin nicht so der große Programmierer) und zwar wie folgt:

Die Trigger für die Regel sind die beiden Motions, Wechsel von OFF auf ON

Code: Alles auswählen

triggers:
  - id: "1"
    configuration:
      itemName: OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung
      state: ON
      previousState: OFF
    type: core.ItemStateChangeTrigger
  - id: "2"
    configuration:
      itemName: OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung
      state: ON
      previousState: OFF
    type: core.ItemStateChangeTrigger
der Script Part sollte dann dieser sein...

Code: Alles auswählen

     script: >
        var thread = Java.type('java.lang.Thread')



        if (((time.ZonedDateTime.now()).hour()) >= 22 || ((time.ZonedDateTime.now()).hour()) <= 5) {
          items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('5');
          console.info('Rule_Hue_OG_FL = 5%');
        } else if (((time.ZonedDateTime.now()).hour()) <= 21 && ((time.ZonedDateTime.now()).hour()) >= 6) {
          items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('50');
          console.info('Rule_Hue_OG_FL = 50%');
        }

        while (!(items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung').state == 'OFF' && items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung').state == 'OFF')) {
          thread.sleep(1000);
        }

        if (cache.private.exists('OG_FL_Timer') === false || cache.private.get('OG_FL_Timer').hasTerminated()) {
          cache.private.put('OG_FL_Timer', actions.ScriptExecution.createTimer('OG_FL_Timer', time.ZonedDateTime.now().plusSeconds(10), function () {
            items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('0');
            console.info('Rule_Hue_OG_FL = 0%');
            cache.private.remove('OG_FL_Timer');
          }));
        } else {
          cache.private.get('OG_FL_Timer').reschedule(time.ZonedDateTime.now().plusSeconds(10));
        };
    type: script.ScriptAction
wenn die Rule retriggert wird, kommt es zu folgenden Fehlermeldungen im Log...

Code: Alles auswählen

2023-10-05 12:09:36.619 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job 'OG_FL_Timer' failed and stopped
java.lang.IllegalStateException: Multi threaded access requested by thread Thread[OH-scheduler-11704,5,main] but is not allowed for language(s) js.
	at com.oracle.truffle.polyglot.PolyglotEngineException.illegalState(PolyglotEngineException.java:129) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.PolyglotContextImpl.throwDeniedThreadAccess(PolyglotContextImpl.java:1034) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.PolyglotContextImpl.checkAllThreadAccesses(PolyglotContextImpl.java:893) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.PolyglotContextImpl.enterThreadChanged(PolyglotContextImpl.java:723) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.PolyglotEngineImpl.enterCached(PolyglotEngineImpl.java:1991) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.HostToGuestRootNode.execute(HostToGuestRootNode.java:110) ~[bundleFile:?]
	at com.oracle.truffle.api.impl.DefaultCallTarget.callDirectOrIndirect(DefaultCallTarget.java:85) ~[bundleFile:?]
	at com.oracle.truffle.api.impl.DefaultCallTarget.call(DefaultCallTarget.java:102) ~[bundleFile:?]
	at com.oracle.truffle.polyglot.PolyglotFunctionProxyHandler.invoke(PolyglotFunctionProxyHandler.java:154) ~[bundleFile:?]
	at jdk.proxy1.$Proxy1302.run(Unknown Source) ~[?:?]
	at org.openhab.automation.jsscripting.internal.threading.ThreadsafeTimers.lambda$0(ThreadsafeTimers.java:85) ~[bundleFile:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:189) ~[?:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:88) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: com.oracle.truffle.api.TruffleStackTrace$LazyStackTrace
kann sich das mal jemand ansehen und evtl mit mir diesen bug finden / eliminieren? wie kann ich es besser machen?

evtl hilft es, die Blockly darstellung dazu zu packen?
05-10-_2023_12-11-46.jpg
von udo1toni » 5. Okt 2023 19:43
Vorweg: Ich programmiere nicht in Blockly, entsprechend kann ich keine fertige Lösung anbieten.
Aber letztlich ist der beschrittene Weg der falsche :)
Deine Fehlermeldung lässt sich auf
Multi threaded access requested but is not allowed for language(s) js.
Das heißt: Deine Rule wird mehrfach gestartet, was nicht erlaubt ist.
Das kommt vor allem dadurch zustande, dass Du die Rule "ewig" laufen lässt.
Es gibt ein paar ganz wichtige Regeln in openHAB: 1. niemals Schleifen bauen (while) die "unendlich" laufen können. 2. Thread.sleep() nur im absoluten Ausnahmefall verwenden, insbesondere darauf achten, dass die Zeitspanne deutlich unter einer Sekunde bleibt.


Sinnvolle Variante: Zunächst einmal erstellst Du eine Gruppe, die genau die beiden Bewegungsmelder enthält. Es gibt verschiedene Varianten, die einfache ist, eine Aggregation zu definieren (All OFF then OFF else ON). Diese Gruppe nenne ich hier mal gMotion, Typ der Gruppe sollte natürlich ebenfalls Switch sein, so wie die eigentlichen Bewegungsmelder Items.

Nun brauchst Du also nur noch einen Trigger, nämlich gMotion changed to ON.
Der Trick kommt nun: Du legst eine zweite Rule an, die triggert auf gMotion changed to OFF.
Die erste Rule kümmert sich vor allem darum, das Licht mit der korrekten Helligkeit einzuschalten. Weiterhin löscht diese Rule den Timer, falls er vorhanden ist (cache.private.get('OG_FL_Timer')?.cancel)

Die zweite Rule startet den Timer, der das Licht ausschaltet.
Der Code im Timer schaltet das Licht aus, es wird nichts geprüft, es wird einfach ausgeschaltet.

Begründung: Beim Einschalten des Lichts wird ein laufender Timer gelöscht. damit wird also verhindert, dass das Licht von einem bereits gestarteten Timer ausgeschaltet wird. Anschließend wechselt der Zustand des Group Items irgendwann wieder auf OFF, womit der Timer gestartet wird. Läüft der Timer dann ab, so wird das Licht ausgeschaltet, wird die erste Rule vorher getriggert, wird der Timer beseitigt und das Spiel beginnt von vorn.

Du brauchst weder eine Schleife, die nichts tut außer Prozessorzeit zu verbraten noch musst Du innerhalb des Timers irgendwelche Prüfungen nutzen.
Das Ganze könnte man in der DSL elegant mit einer einzigen Rule lösen, vermutlich geht das auch mit Blockly, aber, siehe oben... also hier nur der Beispelcode als DSL Rule:

Code: Alles auswählen

//Globale Variablen müssen in der rules Datei vor der ersten Rule definiert werden
var Timer tStairs = null

rule "Treppenlicht schalten"
when
    Item gMotion changed                                                // Zustand der Meldergruppe hat sich geändert
then
    tStairs?.cancel                                                     // Timer löschen, falls vorhanden
    if(newState == ON) {                                                // Falls Bewegung erkannt
        var nBright = 5                                                 // setze Grundhelligkeit 5
        if(now.getHour > 5 && now.getHour < 22)                         // falls zwischen 6 Uhr und 22 Uhr
            nBright = 50                                                // erhöhe Helligkeit auf 50
        OG_FL_Hue_Light_Group_Flur_oben_Helligkeit.sendCommand(nBright) // Sende Helligkeit an Dimmergruppe
        logInfo("stairs","Licht Flur OG auf {} % Helligkeit",nBright)
    } else {                                                            // Falls keine Bewegung erkannt
        tStairs = createTimer(now.plusSeconds(10),[|                    // erzeuge Timer, der in 10 Sekunden abläuft
            OG_FL_Hue_Light_Group_Flur_oben_Helligkeit.sendCommand(0)   // Schalte Licht aus
            logInfo("stairs","Licht Flur OG automatisch aus")
        ])
    }
end
Wie gesagt, vermutlich geht das ähnlich auch mit Blockly - dort halt zwingend mit dem private Cache (der ließe sich auch für eine DSL Rule nutzen, wenn man diese über die UI erstellen wollte).
Gehe zur vollständigen Antwort
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von udo1toni »

Vorweg: Ich programmiere nicht in Blockly, entsprechend kann ich keine fertige Lösung anbieten.
Aber letztlich ist der beschrittene Weg der falsche :)
Deine Fehlermeldung lässt sich auf
Multi threaded access requested but is not allowed for language(s) js.
Das heißt: Deine Rule wird mehrfach gestartet, was nicht erlaubt ist.
Das kommt vor allem dadurch zustande, dass Du die Rule "ewig" laufen lässt.
Es gibt ein paar ganz wichtige Regeln in openHAB: 1. niemals Schleifen bauen (while) die "unendlich" laufen können. 2. Thread.sleep() nur im absoluten Ausnahmefall verwenden, insbesondere darauf achten, dass die Zeitspanne deutlich unter einer Sekunde bleibt.


Sinnvolle Variante: Zunächst einmal erstellst Du eine Gruppe, die genau die beiden Bewegungsmelder enthält. Es gibt verschiedene Varianten, die einfache ist, eine Aggregation zu definieren (All OFF then OFF else ON). Diese Gruppe nenne ich hier mal gMotion, Typ der Gruppe sollte natürlich ebenfalls Switch sein, so wie die eigentlichen Bewegungsmelder Items.

Nun brauchst Du also nur noch einen Trigger, nämlich gMotion changed to ON.
Der Trick kommt nun: Du legst eine zweite Rule an, die triggert auf gMotion changed to OFF.
Die erste Rule kümmert sich vor allem darum, das Licht mit der korrekten Helligkeit einzuschalten. Weiterhin löscht diese Rule den Timer, falls er vorhanden ist (cache.private.get('OG_FL_Timer')?.cancel)

Die zweite Rule startet den Timer, der das Licht ausschaltet.
Der Code im Timer schaltet das Licht aus, es wird nichts geprüft, es wird einfach ausgeschaltet.

Begründung: Beim Einschalten des Lichts wird ein laufender Timer gelöscht. damit wird also verhindert, dass das Licht von einem bereits gestarteten Timer ausgeschaltet wird. Anschließend wechselt der Zustand des Group Items irgendwann wieder auf OFF, womit der Timer gestartet wird. Läüft der Timer dann ab, so wird das Licht ausgeschaltet, wird die erste Rule vorher getriggert, wird der Timer beseitigt und das Spiel beginnt von vorn.

Du brauchst weder eine Schleife, die nichts tut außer Prozessorzeit zu verbraten noch musst Du innerhalb des Timers irgendwelche Prüfungen nutzen.
Das Ganze könnte man in der DSL elegant mit einer einzigen Rule lösen, vermutlich geht das auch mit Blockly, aber, siehe oben... also hier nur der Beispelcode als DSL Rule:

Code: Alles auswählen

//Globale Variablen müssen in der rules Datei vor der ersten Rule definiert werden
var Timer tStairs = null

rule "Treppenlicht schalten"
when
    Item gMotion changed                                                // Zustand der Meldergruppe hat sich geändert
then
    tStairs?.cancel                                                     // Timer löschen, falls vorhanden
    if(newState == ON) {                                                // Falls Bewegung erkannt
        var nBright = 5                                                 // setze Grundhelligkeit 5
        if(now.getHour > 5 && now.getHour < 22)                         // falls zwischen 6 Uhr und 22 Uhr
            nBright = 50                                                // erhöhe Helligkeit auf 50
        OG_FL_Hue_Light_Group_Flur_oben_Helligkeit.sendCommand(nBright) // Sende Helligkeit an Dimmergruppe
        logInfo("stairs","Licht Flur OG auf {} % Helligkeit",nBright)
    } else {                                                            // Falls keine Bewegung erkannt
        tStairs = createTimer(now.plusSeconds(10),[|                    // erzeuge Timer, der in 10 Sekunden abläuft
            OG_FL_Hue_Light_Group_Flur_oben_Helligkeit.sendCommand(0)   // Schalte Licht aus
            logInfo("stairs","Licht Flur OG automatisch aus")
        ])
    }
end
Wie gesagt, vermutlich geht das ähnlich auch mit Blockly - dort halt zwingend mit dem private Cache (der ließe sich auch für eine DSL Rule nutzen, wenn man diese über die UI erstellen wollte).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Der Linus
Beiträge: 25
Registriert: 20. Apr 2017 14:22
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von Der Linus »

Mega. Vielen Dank für deine ausführliche Antwort. Das macht natürlich Sinn und hilft mir unheimlich weiter. Ich age ja, ich stehe am Anfang eines Lernprozesses. Ich habe das in Blockly umgesetzt, genau wie du es gemacht hast, passt es in eine Rule, ohne Wait und ohne for-next Schleife.

und es funktioniert auf anhieb... ;-)

Das kann hier zugemacht werden,

KAyAN
Beiträge: 12
Registriert: 19. Okt 2022 14:38
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von KAyAN »

Der Linus hat geschrieben: 6. Okt 2023 08:53 Mega. Vielen Dank für deine ausführliche Antwort. Das macht natürlich Sinn und hilft mir unheimlich weiter. Ich age ja, ich stehe am Anfang eines Lernprozesses. Ich habe das in Blockly umgesetzt, genau wie du es gemacht hast, passt es in eine Rule, ohne Wait und ohne for-next Schleife.

und es funktioniert auf anhieb... ;-)

Das kann hier zugemacht werden,
Wäre es denn möglich, dass du dein Skript mit anderen teilst?
Danke! :D

Der Linus
Beiträge: 25
Registriert: 20. Apr 2017 14:22
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von Der Linus »

Klar, wenn du mir sagst, wie? Blockly ist ja nun mal Grafisch... soll ich es als Screenshot hier rein packen?

KAyAN
Beiträge: 12
Registriert: 19. Okt 2022 14:38
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von KAyAN »

Das wäre toll.
Danke! :D

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

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von udo1toni »

Bitte keine Grafik, wo es nicht nötig ist...

Es gibt für diesen Zweck die Code Ansicht.
Hat auch den Vorteil, dass man einfach den gesamten Code in eine "leere" Rule hinein kopieren kann, womit die gesamte Rule (mit Blockly Script) generiert wird. Natürlich muss man im Zweifel noch die Namen der Items anpassen :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Der Linus
Beiträge: 25
Registriert: 20. Apr 2017 14:22
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von Der Linus »

Na gut, keine Bilder...

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung
    type: core.ItemStateChangeTrigger
  - id: "2"
    configuration:
      itemName: OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "3"
    configuration:
      blockSource: <xml xmlns="https://developers.google.com/blockly/xml"><block
        type="controls_if" id="_I!KhGlYL8Tmv;9zJ~iL" x="26" y="287"><mutation
        elseif="1"></mutation><value name="IF0"><block type="logic_operation"
        id="Vm}-IK^l^3LC^_/Sa:0I"><field name="OP">OR</field><value
        name="A"><block type="logic_compare" id="j%r3xmcuJ42(kf|rw]N["><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="K0|{YVltDZ+(_t.{z`,d"><value name="itemName"><shadow type="oh_item"
        id="T5Rn.;sopL}n;_ts)Omz"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="T5Rn.;sopL}n;_ts)Omz"><mutation
        itemName="OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung"
        itemLabel="Bewegung"></mutation><field
        name="itemName">OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung</field></block></value></block></value><value
        name="B"><block type="text" id="y[mN*4m]oV*/H6qpZeE$"><field
        name="TEXT">ON</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="TB.j8u;Ydegf!{Xd:*vd"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id=";7LfRIM7BZ20aAH+t}9T"><value name="itemName"><shadow type="oh_item"
        id="TRO$-~AJL6bZwG~@$u;k"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="2M4x{/k(ac8{.w]_5JAp"><mutation
        itemName="OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung"
        itemLabel="Bewegung"></mutation><field
        name="itemName">OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung</field></block></value></block></value><value
        name="B"><block type="text" id="Kq$,LJWU2|i/reDx]0wB"><field
        name="TEXT">ON</field></block></value></block></value></block></value><statement
        name="DO0"><block type="oh_timer_cancel"
        id="WKd8tUG8]VeMI;.Ye=K1"><field name="cache">private</field><value
        name="timerName"><shadow type="text" id="pui:_$q=0.u2CZg,s$nF"><field
        name="TEXT">MyTimer</field></shadow><block type="text"
        id="J]7`:gL6!);~Kbt]EYJ~"><field
        name="TEXT">Timer_OG_FL_Light</field></block></value><next><block
        type="controls_if" id="ZL7OhoQ+asCe#Px5N;_n"><mutation
        elseif="1"></mutation><value name="IF0"><block type="logic_operation"
        id="w)((K,@9.Le@kaTyuZ4R"><field name="OP">OR</field><value
        name="A"><block type="logic_compare" id=")LY59)Mxi=^5(mX4FEq("><field
        name="OP">GTE</field><value name="A"><block type="oh_get_zdt_part"
        id="[]F+8a)@`KCl:0bSR5km"><field
        name="temporalPart">getHour</field><value name="zdt"><block
        type="oh_zdt_now"
        id="SOq}AKx*6mCRVh2P3yZ/"></block></value></block></value><value
        name="B"><block type="math_number" id="c3f)%H:Uk:AH5HhqWAf~"><field
        name="NUM">22</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="o^#irfna{ZSZt]rk?50u"><field
        name="OP">LTE</field><value name="A"><block type="oh_get_zdt_part"
        id="C(t7JThO0xXf?GHzpoI:"><field
        name="temporalPart">getHour</field><value name="zdt"><block
        type="oh_zdt_now"
        id="}Qm7?1@GZz.R;MMB,M+}"></block></value></block></value><value
        name="B"><block type="math_number" id="1d314yZjc/0QfdMevwa;"><field
        name="NUM">5</field></block></value></block></value></block></value><statement
        name="DO0"><block type="oh_event" id=")T0!?WvvKmG/wtvScDZK"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="z4z{0WpQU-;FYEYm.pA!"><field
        name="TEXT">value</field></shadow><block type="text"
        id="-{{pYkpCd.^+;o)U6$rz"><field
        name="TEXT">5</field></block></value><value name="itemName"><shadow
        type="oh_item" id="1S$c/srG|h-YC5ni61CF"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="{m(),VKYB.JyWykOgw1D"><mutation
        itemName="OG_FL_Hue_Light_Group_Flur_oben_Helligkeit"
        itemLabel="Helligkeit"></mutation><field
        name="itemName">OG_FL_Hue_Light_Group_Flur_oben_Helligkeit</field></block></value><next><block
        type="oh_log" id="LERW%V~MSI-+zNgm=!mV"><field
        name="severity">info</field><value name="message"><shadow type="text"
        id="pAagZ#jsbzPNEP1~|pDO"><field name="TEXT">abc</field></shadow><block
        type="text" id="v(jaQbUk?FZE}Dl1}K7p"><field name="TEXT">Rule_Hue_OG_FL
        = 5%</field></block></value></block></next></block></statement><value
        name="IF1"><block type="logic_operation"
        id="p:9TLXluRQpOX|Bi2,Q^"><field name="OP">AND</field><value
        name="A"><block type="logic_compare" id="hl(Bmo*KETzjhevM)ChF"><field
        name="OP">LTE</field><value name="A"><block type="oh_get_zdt_part"
        id="o,7w/$~VtJQz%t3v]];,"><field
        name="temporalPart">getHour</field><value name="zdt"><block
        type="oh_zdt_now"
        id="QX7JHrtNLN`SvI$S-nu="></block></value></block></value><value
        name="B"><block type="math_number" id="2V$n0_9(PC=#uo,TEJ0$"><field
        name="NUM">21</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="Z.9XX3P`(-aLB54-t_vH"><field
        name="OP">GTE</field><value name="A"><block type="oh_get_zdt_part"
        id="927F`-7pzlnJR_V;R{=Q"><field
        name="temporalPart">getHour</field><value name="zdt"><block
        type="oh_zdt_now"
        id="h5I+-=3u,u_4w[/99QPq"></block></value></block></value><value
        name="B"><block type="math_number" id="vckAbwRG(TnH(2T}b(@J"><field
        name="NUM">6</field></block></value></block></value></block></value><statement
        name="DO1"><block type="oh_event" id="_C(,;%/r+z7f,AWZC6Zq"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="CXG$:}Rt-3@i=Lu[?`xS"><field
        name="TEXT">value</field></shadow><block type="text"
        id="$Lt8@ApQh0DBF`z.Qok="><field
        name="TEXT">50</field></block></value><value name="itemName"><shadow
        type="oh_item" id="zn/TnqrnN:fuhxqh/*/y"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="o8wD1V2O7kBh_Ixku9%B"><mutation
        itemName="OG_FL_Hue_Light_Group_Flur_oben_Helligkeit"
        itemLabel="Helligkeit"></mutation><field
        name="itemName">OG_FL_Hue_Light_Group_Flur_oben_Helligkeit</field></block></value><next><block
        type="oh_log" id="bwW!^PTf8TtK(l0Uhe!z"><field
        name="severity">info</field><value name="message"><shadow type="text"
        id="Wq4h_l}g[PnaTbo_^]^^"><field name="TEXT">abc</field></shadow><block
        type="text" id="$xBLh[V2%(Oj]+lCWT$2"><field name="TEXT">Rule_Hue_OG_FL
        =
        50%</field></block></value></block></next></block></statement></block></next></block></statement><value
        name="IF1"><block type="logic_operation"
        id="@}h=u+w#P6p5(LDym1MM"><field name="OP">AND</field><value
        name="A"><block type="logic_compare" id="{=d0H@5Jr9)-L;m!5||7"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="2l_`N|lQanF+eBAnmqB8"><value name="itemName"><shadow type="oh_item"
        id="2.kKF)kjP:_F-dIk/YA1"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id=":D*r[Q(L@^R{K2:8W],f"><mutation
        itemName="OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung"
        itemLabel="Bewegung"></mutation><field
        name="itemName">OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung</field></block></value></block></value><value
        name="B"><block type="text" id="xj5kGC@0U,K;uEA^[%`P"><field
        name="TEXT">OFF</field></block></value></block></value><value
        name="B"><block type="logic_compare" id="0F2gb(n*M#8)NTjsQP)3"><field
        name="OP">EQ</field><value name="A"><block type="oh_getitem_state"
        id="@n1XO7ELOBH`NhK?)XQL"><value name="itemName"><shadow type="oh_item"
        id="TRO$-~AJL6bZwG~@$u;k"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="lA:x.zID#aD?|ltn#;qB"><mutation
        itemName="OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung"
        itemLabel="Bewegung"></mutation><field
        name="itemName">OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung</field></block></value></block></value><value
        name="B"><block type="text" id=".zocQH^l0D0rUi(mS8iV"><field
        name="TEXT">OFF</field></block></value></block></value></block></value><statement
        name="DO1"><block type="oh_timer" id="j9K5rtFOy*kLp/fvnJF3"><field
        name="delayUnits">plusSeconds</field><field
        name="cache">private</field><value name="delay"><shadow
        type="math_number" id="HEuKxppt*waaom;w$VsA"><field
        name="NUM">10</field></shadow></value><value name="timerName"><shadow
        type="text" id="OR:^INH?tK(N%-Pgpj%l"><field
        name="TEXT">MyTimer</field></shadow><block type="text"
        id="OR:^INH?tK(N%-Pgpj%l"><field
        name="TEXT">Timer_OG_FL_Light</field></block></value><statement
        name="timerCode"><block type="oh_event" id="Sd?Thu?%w-D_E6,?B+(A"><field
        name="eventType">sendCommand</field><value name="value"><shadow
        type="text" id="z4z{0WpQU-;FYEYm.pA!"><field
        name="TEXT">value</field></shadow><block type="text"
        id="W)UYYYM!=jKp+Lm!@H;}"><field
        name="TEXT">0</field></block></value><value name="itemName"><shadow
        type="oh_item" id="1S$c/srG|h-YC5ni61CF"><mutation itemName="MyItem"
        itemLabel="MyItem"></mutation><field
        name="itemName">MyItem</field></shadow><block type="oh_item"
        id="MC/`mY~1J:xV#gmr~NGN"><mutation
        itemName="OG_FL_Hue_Light_Group_Flur_oben_Helligkeit"
        itemLabel="Helligkeit"></mutation><field
        name="itemName">OG_FL_Hue_Light_Group_Flur_oben_Helligkeit</field></block></value><next><block
        type="oh_log" id="t$3qiy7g#41~.Sf7kMM2"><field
        name="severity">info</field><value name="message"><shadow type="text"
        id="pAagZ#jsbzPNEP1~|pDO"><field name="TEXT">abc</field></shadow><block
        type="text" id="COeWCYn}L`O~E_l6PXw]"><field name="TEXT">Rule_Hue_OG_FL
        =
        AUS</field></block></value></block></next></block></statement></block></statement></block></xml>
      type: application/javascript
      script: >
        if
        (items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung').state
        == 'ON' ||
        items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung').state
        == 'ON') {
          if (cache.private.exists('Timer_OG_FL_Light')) { cache.private.remove('Timer_OG_FL_Light').cancel(); };
          if (((time.ZonedDateTime.now()).hour()) >= 22 || ((time.ZonedDateTime.now()).hour()) <= 5) {
            items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('5');
            console.info('Rule_Hue_OG_FL = 5%');
          } else if (((time.ZonedDateTime.now()).hour()) <= 21 && ((time.ZonedDateTime.now()).hour()) >= 6) {
            items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('50');
            console.info('Rule_Hue_OG_FL = 50%');
          }
        } else if (items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_oben_BZ_Bewegung').state == 'OFF' && items.getItem('OG_FL_Hue_Bewegungsmelder_Flur_Oben_SZ_Bewegung').state == 'OFF') {
          if (cache.private.exists('Timer_OG_FL_Light') === false || cache.private.get('Timer_OG_FL_Light').hasTerminated()) {
            cache.private.put('Timer_OG_FL_Light', actions.ScriptExecution.createTimer('Timer_OG_FL_Light', time.ZonedDateTime.now().plusSeconds(10), function () {
              items.getItem('OG_FL_Hue_Light_Group_Flur_oben_Helligkeit').sendCommand('0');
              console.info('Rule_Hue_OG_FL = AUS');
              cache.private.remove('Timer_OG_FL_Light');
            }));
          };
        }
    type: script.ScriptAction

KAyAN
Beiträge: 12
Registriert: 19. Okt 2022 14:38
Answers: 0

Re: Automatisches Licht im Treppenhaus / Flur

Beitrag von KAyAN »

Danke! :D

Antworten