Seite 2 von 5

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 9. Jan 2020 21:32
von Steinspiel
Moin,

Erst einmal Danke für Deine Hilfe. Bevor ich noch verwirrter werde, habe ich das ganze mal versucht zu Papier zu bringen so wie ich es verstanden habe. Vielleicht hilft das ja meinem eigenen Verständnis etwas auf die Sprünge... ;-)

Bild

Also "dummy.items" ist einfach nur so da als so ne Art Softwareschalter... und besteht nur aus einer Zeile:

Code: Alles auswählen

Number OffsetBewegungsmelder
Die beiden "*_offset.rules" fragen zu einer bestimmten Zeit das dummy.items ab und senden das Kommando: (0)
Hier mein Beispiel für das "sechzehn_offset.rules"

Code: Alles auswählen

rule "Offset ab 16 Uhr"
when
        Time cron "* * 16 ? * MON-FRI"    //Zeitschaltpunkt MO - FRI 16:00 Uhr
then
        OffsetBewegungsmelder.sendCommand(0)
end
Wobei ich noch nicht weiß *wie* man mit "Time cron" Zeiten von - bis definiert. Hier in meinen Beispiel heißt das ja nur in "aller Sekunde / Minute von 16:00 Uhr", oder?

Gut, "zeitschalt_*.rules" fragt dann die beiden "*_offset.rules" nach OffsetBewegungsmelder.state 0 oder 1 ab und schaltet dann die Lampen. Hier mein Beispiel für "zeitschalt_16.rules" für "lampe_1"

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                                          // Timervariable global definieren

rule "Bewegungsmelder mit timeout"
when
        Item bw_melder received command ON                              // Bewegung wurde erkannt

then
if(OffsetBewegungsmelder.state  == 0){                              //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 0
    tBewegung.cancel                                               // zunächst eventuell laufende Timer entfernen
    if(lampe_1.state != OFF) lampe_1.sendCommand(OFF)       // Licht ausschalten, falls vor 4 Uhr noch an war.
}
if(OffsetBewegungsmelder.state  == 1){                              //Offsetitem wird hier abgefragt, in dem Fall Schaltzustand 1
    tBewegung.cancel                                               // zunächst eventuell laufende Timer entfernen
    if(lampe_1.state != ON) lampe_1.sendCommand(ON)         // Licht einschalten, falls noch nicht an.
    tBewegung = createTimer(now.plusMinutes(60), [ |                // Timer anlegen
        if(lampe_1.state != OFF) lampe_1.sendCommand(OFF)   // Licht ausschalten, falls noch nicht aus
        tBewegung = null                                            // Timervariable deinitialisieren
    ])
}
end
Ist das erstmal vom Ansatz her richtig oder bin ich völlig auf dem Holzweg? Weil, funktionieren tut es hier noch nicht. :-(

Danke schon mal für die Geduld...

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 13. Jan 2020 13:03
von udo1toni
Um mal von vorne anzufangen:
Dein Time cron Ausdruck ist Müll.

Code: Alles auswählen

Time cron "* * 16 ? * MON-FRI"
bedeutet: Montag bis Freitag von 16:00:00 Uhr bis 16:59:59 Uhr jede Sekunde.
Das möchtest Du nicht!
Korrekt ist der Ausdruck so:

Code: Alles auswählen

Time cron "0 0 16 ? * MON-FRI"
Montag bis Freitag, um 16:00:00 Uhr

Nächster Punkt: Der Bewegungsmelder liefert kein Kommando? Das ist schade, macht aber nichts. Jetzt heißt es aber aufgepasst! Wann exakt soll die Rule ausgeführt werden? Nur beim Wechsel zwischen OFF und ON, oder bei jedem ON Ereignis?
Für die erste Variante wäre der Trigger changed ok, für die zweite Variante musst Du aber received update verwenden.

Dritter Punkt: Du kannst natürlich so viele *.rules Dateien anlegen, wie Du willst, es bietet sich aber an, Regeln, die zusammengehören, in eine gemeinsame Datei zu packen.

Wenn die Aufgabenstellung lautet: Bei Bewegungserkennung soll im Zeitraum 1 Lampe 1 mit Länge 1 geschaltet werden, im Zeitraum 2 aber Lampe 2 mit Länge 2, so reicht eigentlich eine Regel aus. Falls man die gleichen Zeiträume in mehreren Rules verwenden möchte, bietet es sich an, ein Item zu definieren, in dem man den aktuellen Zeitraum speichert, um dann in Abhängigkeit von dem Item zu arbeiten. Hier aber die Variante ohne weiteren Balast:

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                                               // Timervariable definieren

rule "Bewegungsmelder mit timeout"
when
    Item bw_melder received update ON                                    // Bewegung wurde erkannt
then
    if(now.getMinuteOfDay >= 16*60  && now.getMinuteOfDay < 18 * 60) {   // zwischen 16:00 und 18:00 Uhr
        tBewegung?.cancel                                                // zunächst eventuell laufende Timer entfernen
        if(lampe_2.state != OFF) lampe_2.sendCommand(OFF)                // falls falsche Lampe eingeschaltet, ausschalten, nur nötig, falls die Zeiträume aneinander stoßen!
        if(lampe_1.state != ON) lampe_1.sendCommand(ON)                  // falls Lampe ausgeschaltet, einschalten
        tBewegung = createTimer(now.plusMinutes(60),[|                   // Timer starten
            if(lampe_1.state != OFF) lampe_1.sendCommand(OFF)            // nach Ablauf falls Lampe eingeschaltet, ausschalten
        ])
    }
    if(now.getMinuteOfDay >= 20*60  || now.getMinuteOfDay < 4 * 60) {    // zwischen 20 und 4 Uhr (veränderte Verknüpfung beachten!)
        tBewegung?.cancel                                                // zunächst eventuell laufende Timer entfernen
        if(lampe_1.state != OFF) lampe_1.sendCommand(OFF)                // falls falsche Lampe eingeschaltet, ausschalten, nur nötig, falls die Zeiträume aneinander stoßen!
        if(lampe_2.state != ON) lampe_2.sendCommand(ON)                  // falls Lampe ausgeschaltet, einschalten
        tBewegung = createTimer(now.plusSeconds(30),[|                   // Timer starten
            if(lampe_2.state != OFF) lampe_2.sendCommand(OFF)            // nach Ablauf falls Lampe eingeschaltet, ausschalten
        ])
    }
end
Bei den erwähnten Zeiträumen bestünde eigentlich keine Gefahr, dass die falsche Lampe noch an ist, aber evtl. sind das ja nur Beispiele.
Man könnte darüber nachdenken, gerade für den 1. Zeitraum die Einschaltdauer der Lampe dahingehend zu begrenzen, dass sie nicht über den Planungszeitraum hinaus eingeschaltet ist, also spätestens um 18:00 Uhr ausgeschaltet wird. Da kommt es aber natürlich sehr drauf an, was man nun konkret erreichen will (oben tldr; weshalb mir diese Info vielleicht durchgerutscht ist - ich ging jetzt von einer Nachtlichtfunktion aus).

Re: Rule für Bewegungsmelder Schaltung ?

Verfasst: 13. Jan 2020 21:09
von Steinspiel
Moin,

Als erstes: ich habe mein Thema auf [Gelöst] gesetzt weil ich mit sehr viel Hilfe aus dem Forum hier, meine erste "Schaltung" zustande gebracht habe! :-)

Der Raspberry / openHAB läuft gerade mal gut zwei Wochen und bisher hatte ich meine paar "smarten Geräte" mit Apps konfiguriert, deshalb mögen mache Fragen sehr wirr erschienen sein oder erscheinen werden... ;-)

Auf jeden Fall meinen Dank an alle Helfer und auch wenn ich weiß das vieles noch optimiert werden kann will ich zeigen wie die Rules bisher bei mir laufen, vieleicht hilft es ja anderen Anfängern...

Mein HUE Bewegungsmelder schaltet jetzt zu mehreren Zeitpunkten unterschiedliche Tradfri Lampen verschieden lange ein.

Bild

Dazu habe ich ein dummy.items für den Offset mit nur einer Zeile Inhalt

Code: Alles auswählen

Number OffsetBewegungsmelder
Dann drei "offset.rules" die zu den gewünschten Zeitschaltpunkten den Offset 0, 1 und 2 senden. Als Beispiel hier meine Regel für das Nachtlicht von 17:00 - 04:59 Uhr. In den anderen Dateien sind nur Zeit und Offset angepasst.

Code: Alles auswählen

// Nachtlicht Flur wird geschaltet - Offset 2

rule "offset_EIN_Nachtlicht_2"
when
        Time cron "* * 17-4 ? * * *"    //Zeitschaltpunkt 17:00 - 04:59 Uhr
then
        OffsetBewegungsmelder.sendCommand(2)
            logInfo("Offset_EIN_Nachtlicht", "Kommando 2 wird gesendet, Nachtlicht WIRD geschaltet")

end
Dann eine Regel die eine Flurlampe als Nachtlicht 10% gedimmt für 20 sekunden einschaltet

Code: Alles auswählen

var Timer tBewegung = null                                                              // Timervariable global definieren


rule "Nachtlicht"

when
        Item Bew_Sens_Presence changed to ON                                            // Bewegung erkannt
        
then
        tBewegung?.cancel   
                                                                                         // zunächst eventuell laufende Timer entfernen

        if(Flur2_an_aus.state == ON) {                                                  // Abfrage ob Flur2 schon an ist, wenn ja ABBRUCH
                return;
        }

        if(OffsetBewegungsmelder.state == 2)                                            // Offset nach "2" abgefragt    

        {
          
              sendCommand(Flur2_Dimmen, 10)                                             // Flur_2 auf 10% Dimmen, Ein

                tBewegung = createTimer(now.plusSeconds(20), [ |                        // Timer anlegen auf 20 sekunden
                
                sendCommand(Flur2_Dimmen, 0)                                            // Flur_2 auf 0% Dimmen, Aus
                        tBewegung = null                                                // Timervariable deinitialisieren

        ])

        }
end
Sowie die letzte Regel die alle drei Flurlampen + eine weitere Küchenlampe nur einschaltet.

Code: Alles auswählen

var Timer tBewegung = null                                                              // Timervariable global definieren


rule "BM_Schaltung_alles"

when
        Item Bew_Sens_Presence changed to ON                                            // Bewegung erkannt
        
then

        if(OffsetBewegungsmelder.state == 1)                                            // Offset nach "1" abgefragt     

        {
                sendCommand(oben_Dimmen, 100)                                             // Kueche auf 10 % Dimmen, Ein          
                sendCommand(Flur1_Dimmen, 80)                                             // Flurlampe 1 auf 80% Dimmen, Ein
                sendCommand(Flur2_Dimmen, 80)                                             // Flurlampe 2 auf 80% Dimmen, Ein
                sendCommand(Flur3_Dimmen, 80)                                             // Flurlampe 3 auf 80% Dimmen, Ein

                                                                                        // keine AUS Schaltung


        }
end
Die Regeln lafen jetzt seit gut 30 Stunden und bisher ist mir noch kein Fehler aufgefallen.

Danke noch einmal,

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 14. Jan 2020 02:11
von udo1toni
Kannst Du mal bitte einen Blick in die Datei /var/log/openhab2/openhab2.log werfen? Ich garantiere Dir, dass Du eine erschreckende Menge an Logzeilen siehst - jede Sekunde eine Zeile mit dem Inhalt

Code: Alles auswählen

Datum und Uhrzeit [...Offset_EIN_Nachtlicht]: Kommando 2 wird gesendet, Nachtlicht WIRD geschaltet
bzw. den anderen Meldungen.

Deine Rules sind so nicht gut.

Die Umschaltung des Modus läuft jede Sekunde, warum? Das ist echt nicht sinnvoll. Nur beim Start des Systems erkauft man sich hier scheinbar einen Vorteil, da der Modus ja einmal pro Sekunde gesetzt wird. Aber jeweils eine der drei Rules wird jede Sekunde ausgeführt (24*60*60 = 86.400 Rule-Ausführungen), wo doch eine Rule mit vier Triggern reichen würde (Ein Trigger ist dabei System started, der beim Speichern der Rules triggert) die dann einmal bei Systemstart (oder Speichern der Rules-Datei) und dreimal pro Tag ausgeführt wird.
Dann hast Du noch zwei weitere Rules, die immer zeitgleich triggern (weil sie den selben Trigger verwenden). openHAB führt default maximal 5 Rules zeitgleich aus, bei Bewegung zur vollen Sekunde bleibt also noch zwei Slots übrig. Das ist extrem ineffizient.

Abgesehen davon frage ich mich wegen des Triggers, ob das Nachtlicht nach 20 Sekunden ausgehen soll, obwohl der Bewegungsmelder fortlaufend Bewegung wahrnimmt. (Das ist das wahrscheinlichste Verhalten, da die Rule nur bei changed trriggern wird, was zwingend voraussetzt, dass vor dem ON ein OFF gesendet wird. Bei fortlaufender Bewegung sollte es aber keine OFF-Impulse geben.

Code: Alles auswählen

var Timer tBewegung = null                                                              // Timervariable global definieren

// Offset Umschaltung

rule "Offset Umschaltung"
when
    Time cron "0 0  5 ? * *" or                                 // Zeitschaltpunkt 05:00:00 Uhr
    Time cron "0 0 14 ? * *" or                                 // Zeitschaltpunkt 14:00:00 Uhr
    Time cron "0 0 17 ? * *" or                                 // Zeitschaltpunkt 17:00:00 Uhr
    System started                                              // Rules-Datei wurde (erneut) geladen
then
    var Number nOffset = 2                                      // default ist Nachtlicht
    if(now.getHourOfDay >  4 && now.getHourOfDay < 14)          // falls zwischen 5 und 14 Uhr
        nOffset = 0                                             // Taglicht
    if(now.getHourOfDay > 13 && now.getHourOfDay < 17)          // falls zwischen 14 und 17 Uhr
        nOffset = 1                                             // Abendlicht
    OffsetBewegungsmelder.postUpdate(nOffset)                   // Setze das Item
    logInfo("offset", "Kommando {} wird gesendet.",nOffset)     // logge das Ereignis
end

rule "Bewegung"
when
    Item Bew_Sens_Presence changed to ON                                            // Bewegung erkannt
then
    tBewegung?.cancel                                                                // zunächst eventuell laufende Timer entfernen
    var Integer iOffset = 0
    if(OffsetBewegungsmelder.state instanceof Number) iOffset = (OffsetBewegungsmelder.state as Number).intValue
    switch(iOffset) {
        case 2: {
            logInfo("bewegung","Bewegung... Nachtlicht")
            if(Flur2_an_aus.state == ON) return;                                                  // Abfrage ob Flur2 schon an ist, wenn ja ABBRUCH
            Flur2_Dimmen.sendCommand(10)                                            // Flur_2 auf 10% Dimmen, Ein
            tBewegung = createTimer(now.plusSeconds(20), [ |                        // Timer anlegen auf 20 sekunden
                Flur2_Dimmen.sendCommand(0)                                         // Flur_2 auf 0% Dimmen, Aus
            ])
        }
        case 1: {
            logInfo("bewegung","Bewegung... Abendlicht")
            oben_Dimmen.sendCommand(100)                                             // Kueche auf 100 % Dimmen, Ein          
            Flur1_Dimmen.sendCommand(80)                                             // Flurlampe 1 auf 80% Dimmen, Ein
            Flur2_Dimmen.sendCommand(80)                                             // Flurlampe 2 auf 80% Dimmen, Ein
            Flur3_Dimmen.sendCommand(80)                                             // Flurlampe 3 auf 80% Dimmen, Ein
        }
        default: {
            logInfo("bewegung","Bewegung... Tag. Kein Licht.")
        }
    }
end
Wie in meinem anderen Posting erwähnt, ist das zusätzliche Item OffsetBewegungsmelder nicht zwingend notwendig. Im Gegenteil verkompliziert es die Geschichte, da der Modus auch beim Laden der Rules Datei gesetzt werden muss, was, wie man sehen kann, mehr Code bedeutet.

Hier nochmal der weitgehend identische Code konkret angepasst:

Code: Alles auswählen

// globale Variablen zu Beginn der *.rules Datei definieren!
var Timer tBewegung = null                                                   // Timervariable definieren

rule "Bewegungsmelder"
when
    Item Bew_Sens_Presence received update ON                                // Bewegung wurde erkannt
then
    logInfo("bewegung","Bewegung erkannt.")
    if(now.getHourOfDay >  4 && now.getHourOfDay < 14) {                     // zwischen 05:00 und 14:00 Uhr
        logInfo("bewegung","Es ist Tag. Kein Licht.")
        return;
    }
    if(now.getHourOfDay > 13 && now.getHourOfDay < 17) {                     // zwischen 14:00 und 17:00 Uhr
        logInfo("bewegung","Es ist Nachmittag. Volles Licht.")
        oben_Dimmen.sendCommand(100)                                         // Kueche auf 100 % Dimmen, Ein          
        Flur1_Dimmen.sendCommand(80)                                         // Flurlampe 1 auf 80% Dimmen, Ein
        Flur2_Dimmen.sendCommand(80)                                         // Flurlampe 2 auf 80% Dimmen, Ein
        Flur3_Dimmen.sendCommand(80)                                         // Flurlampe 3 auf 80% Dimmen, Ein
    }
    if(now.getHourOfDay > 16 || now.getHourOfDay < 5) {                      // zwischen 17:00 und 05:00 Uhr
        logInfo("bewegung","Es ist Nacht. Kleines Licht.")
        if(Flur2_Dimmen.state > 0) {                                         // Abfrage ob Flur2 schon an ist, wenn ja ABBRUCH
            logInfo("bewegung","Licht ist bereits eingeschaltet. Abbruch.")
            return;
        }
        tBewegung?.cancel                                                    // zunächst eventuell laufende Timer entfernen
        Flur2_Dimmen.sendCommand(10)                                         // Flur_2 auf 10% Dimmen, Ein
        tBewegung = createTimer(now.plusSeconds(20), [ |                     // Timer anlegen auf 20 sekunden
            Flur2_Dimmen.sendCommand(0)                                      // Flur_2 auf 0% Dimmen, Aus
        ])
    }
end

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 7. Jun 2020 23:56
von Bigsmi
Hallo ihr lieben. Ich bin neu hier und habe ein Problem .... ich habe openhab 2.5.5 auf einem Rasp4 laufen. Nun habe ich mir einen Conbee2 dazugeholt und alles läuft seit einigen Wochen wunderbar. Nun wollte ich mich mal an die Sensoren ran wagen und scheitere Qualvoll :-(

Ich habe den Aqara Bewegungsmelder. Wird dank der "Zigbee bridge Deconz) auch gleich gefunden, 2 Things mit den entsprechenden Items wie Lichtempfindlichkeit oder Bewegung usw. Nun schaffe ich es aber nicht dass dieser eine Aktion auslöst. Ganz einfaches Bespiel:

Jemand kommt in den Hof und Licht geht an. Ich habe nun scchon hunderte Möglichkeiten versucht...
Zum Beispiel:

deconz:presencesensor:947c7a41:00158d000476cb94010406:presence (switch).
rule “Bewegungsmelder”
when
Channel “deconz:presencesensor:947c7a41:00158d000476cb94010406:presence” triggered ON
then
sendCommand (Wohnzimmer_Stehlampe (ON)
end

innerhalb der Phoscn App lässt sich der Bewegungsmelder problemlos z.B. Birnen verbinden, abef über die Rules bekomme ich da einfach nichts hin :-(
Wäre toll wenn jemnd mir eine Hilfe bieten könnte...

1000 Dank schon mal

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 8. Jun 2020 08:17
von Darkwin101
Ich weiß jetzt nicht ob der Channel trigger unterstützt wird wenn du aber wie du schreibst Items entsprechend angelegt hast dann lass die Rule darüber starten.

Code: Alles auswählen

when
Item Bewegung  changed to ON  // Bewegung ist das Item das du für erkannte Bewegung angelegt hast
then

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 7. Jan 2021 23:44
von Trommse
Hallo zusammen, ich habe mir die Regel mal geklaut. Aber ich bekomme jetzt bei dem tBewegung einen Fehler.
Das muss irgendwie an der Bedingung des Tageslichtsensors liegen - seit dem ich den eingefügt habe kommt der Fehler. Was mache ich falsch?

rule:

Code: Alles auswählen

rule "Motion_Maja_Licht mit Timeout"
when
    Item OG_IKEA_Motion_Maja_Regal_Status changed to ON              // Bewegung wurde erkannt
then
if(deConz_Tageslichtsensor_Lightlevel.state == "Dark")
    tBewegung?.cancel                                 // zunächst eventuell laufende Timer entfernen
    if(OG_IKEA_Licht_Maja_Regal_Betrieb.state != ON) OG_IKEA_Licht_Maja_Regal_Betrieb.sendCommand(ON)       // Licht einschalten, falls noch nicht an.
    tBewegung = createTimer(now.plusSeconds(180), [ |  // Timer anlegen
        if(OG_IKEA_Licht_Maja_Regal_Betrieb.state != OFF) OG_IKEA_Licht_Maja_Regal_Betrieb.sendCommand(OFF) // Licht ausschalten, falls noch nicht aus
        tBewegung = null                              // Timervariable deinitialisieren
    ])
end
Fehler:
2021-01-07 23:37:08.156 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.Timer 24 2021-01-07T23:37:08.150+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1d35166 (conditionalExpression: false)

<null>.tBewegung = <XNullLiteralImplCustom>

} ] threw an unhandled Exception:

java.lang.NullPointerException: null

at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:857) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:469) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

at com.sun.proxy.$Proxy398.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 8. Jan 2021 02:01
von udo1toni
Die Rule hat zum einen vermutlich einen Fehler, nämlich die Zeile

Code: Alles auswählen

if(deConz_Tageslichtsensor_Lightlevel.state == "Dark")
ist das Item deConz_Tageslichtsensor_Lightlevel ein String Item? Wenn nein, ist der Vergleich unzulässig. Handelt es sich aber um ein String Item, sollte der Vergleich explizit mit einem String geschehen. .state liefert aber einen Status, nicht einem String. Du solltest also noch ein .toString ergänzen. Weiterhin nehme ich an, dass die Bedingung den gesamten Code umfassen soll, nicht nur das Löschen des Times. also so:

Code: Alles auswählen

rule "Motion_Maja_Licht mit Timeout"
when
    Item OG_IKEA_Motion_Maja_Regal_Status changed to ON
then
    if(deConz_Tageslichtsensor_Lightlevel.state.toString == "Dark") {
        tBewegung?.cancel

        if(OG_IKEA_Licht_Maja_Regal_Betrieb.state != ON) 
            OG_IKEA_Licht_Maja_Regal_Betrieb.sendCommand(ON)

        tBewegung = createTimer(now.plusSeconds(180), [ |
            if(OG_IKEA_Licht_Maja_Regal_Betrieb.state != OFF)
                OG_IKEA_Licht_Maja_Regal_Betrieb.sendCommand(OFF)
            tBewegung = null
        ])
    }
end
Die geschwungenen Klammern bilden einen "Codeblock".
Allerdings fehlt noch die Definition der globalen Variable:

Code: Alles auswählen

var Timer tBewegung = null
Diese muss ganz oben in der Datei (vor der ersten Rule) stehen.

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 8. Jan 2021 15:24
von Trommse
Hallo Udo,

vielen Dank. In meiner bisherigen Rule war auch der Tageslichtsensor so drin, da gab es keine Probleme.

Code: Alles auswählen

rule "Motion_Maja_Licht" 
when 
    Item OG_IKEA_Motion_Maja_Regal_Status changed to ON 
then 
if(deConz_Tageslichtsensor_Lightlevel.state == "Dark")
    {
    sendCommand(OG_IKEA_Licht_Maja_Regal_Betrieb,ON)
    }
end
Nur bleibt dabei immer das Licht an, deshalb wollte ich das ändern.
Die Definition der globalen Variable habe ich oben in der Datei, die hatte ich jetzt nur nicht mitkopiert weil da noch Rules zwischen sind. Ich teste das mal.

Re: [Gelöst] Rule für Bewegungsmelder Schaltung ?

Verfasst: 8. Jan 2021 23:06
von KellerK1nd
Trommse hat geschrieben: 8. Jan 2021 15:24 Hallo Udo,

vielen Dank. In meiner bisherigen Rule war auch der Tageslichtsensor so drin, da gab es keine Probleme.

Code: Alles auswählen

rule "Motion_Maja_Licht" 
when 
    Item OG_IKEA_Motion_Maja_Regal_Status changed to ON 
then 
if(deConz_Tageslichtsensor_Lightlevel.state == "Dark")
    {
    sendCommand(OG_IKEA_Licht_Maja_Regal_Betrieb,ON)
    }
end
Nur bleibt dabei immer das Licht an, deshalb wollte ich das ändern.
Die Definition der globalen Variable habe ich oben in der Datei, die hatte ich jetzt nur nicht mitkopiert weil da noch Rules zwischen sind. Ich teste das mal.
Ist ja logisch, du schaltest in deiner Regel das Licht nur ein. Musst dir Gedanken machen, wie du das Licht ausschalten willst, ob mit triggern auf OFF des Melders, oder so wie Udo dir schon geschrieben hat, in dem bei jedem Trigger auf ON ein Timer gestartet wird und der Timer nur resetet wird, wenn der Melder wieder auf ON triggered.