Seite 1 von 1

Skript Verknüpfung PIR-Melder mit Lichtschalter

Verfasst: 28. Jan 2026 18:49
von der_pman
Hallo alle zusammen,

ich versuche seit dem Update auf 5.X.X mein bis dahin funktionierendes Script wieder zu beleben.

Code: Alles auswählen

var Timer timer = null
rule "Licht Flur bei Bewegung Einschalten"
when
    Item EG_Flur_PM_erkannt received update ON
then
       if((EG_Flur_PM_erkannt.state === ON) && (timer === null) && (EG_Flur_PM_Helligkeit.state < 0.2)) {
        Flur_Licht.sendCommand(ON)
        timer = createTimer(now.plusMinutes(1), [|
            logInfo("FILE", "Flur Timer abgelaufen und aus")
            EG_Flur_PM_erkannt.postUpdate(OFF)
            Flur_Licht.sendCommand(OFF)
            timer = null
        ])
    } 
      else if (timer !== null) {
        logInfo("FILE", "Flur Timer verlängert")
        timer.reschedule(now.plusMinutes(1))  
    }
      else {
	    logInfo("File","Flur Bewegung erkannt, aber noch zu hell: Nichts zu tun")
	}
end
Ziel ist, wenn die vom PIR gemessene Helligkeit unter 0.2 fällt und Bewegung im Flur ist, soll das Licht für 1 Minute eingeschaltet werden.
Ist dann immer noch Bewegung im Flur soll das Licht anbleiben, wenn nicht - ausschalten.

** Ergänzung **
Das erste Einschalten funktioniert - aber die Verlängerung der Einschaltzeit schlägt fehl.

Ich benötige einen Denkanstoß da ich mich irgendwie verzettelt habe, vielleicht fehlt ja auch nur irgendwo ein "=" oder eine Klammer.

Ich muss über eine Regel/Programm gehen, da ich für die beiden HM-Geräte keine Direktverknüpfung einrichten kann.
Dabei ist es dann auch egal, ob ich die Programmierung in der CCU oder in openhab gestalte.

Danke schon mal

der_pman

Re: Skript Verknüpfung PIR-Melder mit Lichtschalter

Verfasst: 29. Jan 2026 23:47
von udo1toni
Es gibt ein paar Ungereimtheiten. Zunächst einmal

Code: Alles auswählen

(EG_Flur_PM_erkannt.state === ON)
Diese Bedingung ist verkehrt. === bedeutet "ist identisch". Das ist etwas anderes als "ist gleich", welches so aussieht: ==
Der Vergleich === ist in der DSL nur im Zusammenhang mit dem Wert null zulässig und sinnvoll, denn hier wird geprüft, ob der Zeiger einer Variablen auf eine bestimmte Speicherstelle verweist, eben diejenige, welche null repräsentiert. Wann immer eine Variable mit null initialisiert wird, wird deren Zeiger auf diese eine Speicherzelle umgeschrieben. Wenn der Wert nicht mehr null sein soll, bekommt die Variable eine andere Speicherzelle zugewiesen, welche dann mit dem konkreten Wert gefüllt wird.
Warum diese Bedingung im Zusammenhang mit .state überhaupt funktionieren könnte, ist mir nicht so ganz klar.
Allerdings: die Rule triggert bei einem Update ON, damit ist zwingend der Status ON. Da das abgefragte Item identisch mit dem Trigger ist, ist dieser Teil also sinnfrei.

Der Aufbau der Rule insgesamt erscheint mir reichlich umständlich. Eigentlich möchtest Du, dass die Rule nichts tut, fall die Helligkeit über 0.2 ist. Warum fragst Du das nicht zu Beginn ab?
An dieser Stelle könnte es noch ein weiteres Problem geben, welches speziell nach einem Update auftauchen kann, und zwar der ITemtyp. Handelt es sich um ein Number Item, oder eventuell (neuerdings) um ein Number:Illuminance Item? Bei letzterem gehört eine Einheit zum Wert, gewöhnlich lx. Diese muss beim Vergleich mit angegeben werden, alternativ kann man die Einheit vom Status strippen, muss dann aber darauf achten, wie der Wert im Item gespeichert wird.

Eine weitere Frage wäre die nach dem normalen Verhalten des Bewegungsmelders. Was passiert, wenn der Melder keine Bewegung erkennt (für x Sekunden...) Setzt der Melder das Item selbst auf OFF zurück, oder sendet der Melder ausschließlich ON?
Egal wie, einfacher geht es so:

Code: Alles auswählen

var Timer tFlur = null

rule "Licht Flur bei Bewegung Einschalten"
when
    Item EG_Flur_PM_erkannt received update ON
then
    if((EG_Flur_PM_Helligkeit.state as Number).floatValue > 0.2) {             // zu hell
        logInfo("motion","Flur Bewegung erkannt, aber zu hell: Nichts zu tun")
        return;                                                                // Abbruch der Rule
    }

    tFlur?.cancel                                                              // Falls Timer existiert, abbrechen
    if(Flur_Licht.state != ON)                                                 // Falls Licht aus
        Flur_Licht.sendCommand(ON)                                             // Licht einschalten
    else                                                                       // sonst
        logInfo("motion", "Flur Timer wird verlängert")                        // Meldung wegen Verlängerung

    tFlur = createTimer(now.plusMinutes(1), [|                                 // Timer erstellen
        logInfo("motion", "Flur Timer abgelaufen und aus")
        Flur_Licht.sendCommand(OFF)                                            // Licht aus
    ])
end
Als erstes prüft die Rule, ob es zu hell ist. Ist das der Fall, wird die Rule abgebrochen.
Als nächstes wird ein existierender Timer abgebrochen. Existiert der Timer nicht, wird der cancel-Befehl nicht ausgeführt (das ist das ?)
Man könnte auch stattdessen

Code: Alles auswählen

if(tFlur !== null) tFlur.cancel
schreiben, das Fragezeichen ist halt (wesentlich) kürzer.
Nun prüft die Rule, ob das Licht eingeschaltet ist, und schaltet das Licht ein, falls nicht. War es bereits an, muss der Timer aktiv gewesen sein, also handelt es sich um eine Verlängerung.

Die Logmeldungen sind beim Entwickeln vielleicht gut, aber bei einer so simplen Rule doch eher unnötig (sorry...), entsprechend wäre die Rule "ohne" auch etwa schlanker:

Code: Alles auswählen

var Timer tFlur = null

rule "Licht Flur bei Bewegung Einschalten"
when
    Item EG_Flur_PM_erkannt received update ON
then
    if((EG_Flur_PM_Helligkeit.state as Number).floatValue > 0.2) return;

    tFlur?.cancel
    if(Flur_Licht.state != ON) Flur_Licht.sendCommand(ON)

    tFlur = createTimer(now.plusMinutes(1), [|
        Flur_Licht.sendCommand(OFF)
    ])
end
Abschließend noch zum log-Befehl:
Dieser erwartet zwei Strings als Parameter, der erste String gibt dabei den Logger Namen an, der zweite die Meldung. Der Loggername wird vererbt, d.h. es wird immer der String org.openhab.core.model.script. vorangestellt, es ergibt sich also für die Rule oben der Loggername org.openhab.core.model.script.motion
Der Witz bei der Sache: man kann über den Loggernamen zur Laufzeit bestimmen, ob solche Meldungen überhaupt ausgegeben werden (im Log-bereich unten rechts auf das Zahnrad und einen Eintrag für den Loggernamen erzeugen, danach kann man das Level setzen, ab dem geloggt wird).
Es gibt insgesamt vier Logbefehle, in aufsteigender Reihenfolge nach "Schwere" der Meldung logDebug(), logInfo(), logWarn() und logError(). Die Befehle funktionieren identisch und unterscheiden sich lediglich im generierten Loglevel, man kann also in einer (komplexen) Rule diverse Logmeldungen generieren, später aber einen Teil dieser Meldungen ausblenden um z.B. nur "schlimme" Fehler gemeldet zu bekommen
FILE ist als Teil-Name eines Loggers nicht gut ;) (zu unspezifisch)

Re: Skript Verknüpfung PIR-Melder mit Lichtschalter

Verfasst: 31. Jan 2026 17:36
von der_pman
Hallo Udo,

vielen Dank für Deine Unterstützung.
Nachdem ich das Skript umgestellt habe, wollte das Licht erst einmal noch nicht.
Daher habe ich openhab beendet, den Cache bereinigt und sicherheitshalber den Pi neu gestartet.
Und siehe da - es funktioniert. :)

Ich staune immer wieder wie elegant Du solche Probleme löst und die Skripte straffst, vereinfachst und übersichtlich gestaltest.
Hast Du schon mal überlegt (wenn es Bedarf gibt) ob Du mal ein Webinar machen möchtest, es muss ja auch nicht umsonst sein.
Ich wäre Dein erster und bester Kunde 8-)

LG der_pman

Re: Skript Verknüpfung PIR-Melder mit Lichtschalter

Verfasst: 12. Feb 2026 18:52
von der_pman
Hallo in die Runde,

das Skript funktioniert so weit, dass das Licht im Flur zuverlässig eingeschaltet wird.
Allerdings wird der Timer nicht verlängert wenn durchgehend Bewegung im Flur ist.
Nur wenn man gerade zur Ablaufzeit den Flur betritt, wird nach einem Sekundenbruchteil wieder eingeschaltet.

Anbei einmal die Einstellungen des Bewegungsmelders (HmIP-SPI):
HMip-SPI.jpg
HMip-SPI-2.jpg
und vom Schaltaktor (HM-LC-Sw1PBU-FM)
HM-LC-Sw1PBU-FM.jpg
Kann ich hier an den Einstellungen noch etwas anpassen, damit das Licht permanent anbleibt solange Bewegung im Flur ist.

Gruß der_pman

Re: Skript Verknüpfung PIR-Melder mit Lichtschalter

Verfasst: 13. Feb 2026 01:13
von udo1toni
Mein Tipp wäre, Anzahl der auszulassenden, unveränderten Statusmeldungen auf 0 zu setzen.
Allerdings habe ich selbst kein Homematic im Einsatz, aber dieser Parameter klingt für mich verdächtig.