Lampe nur ausschalten, falls sie über den Bewegungsmelder eingeschaltet wurde

Begonnen von Thyraz, 13 April 2016, 13:04:42

Vorheriges Thema - Nächstes Thema

Thyraz

Hallo zusammen,

meine dimmbare Lampe wird normal per Bewegungsmelder eingeschaltet und nach einer Zeit ohne Bewegung wieder abgeschaltet.
Soweit als Einzeiler lösbar...

Nun kann diese Lampe aber auch über einen Lichtschalter angesteuert werden, oder über Homekit / Tablet UI usw.
Sobald manuell eingegriffen wurde (Schalter an betätigt, Lampe über TabletUI eingeschaltet, Helligkeit über Homekit auf anderen Wert gedimmt), soll die Lampe nicht mehr automatisch abgeschaltet werden.
Bisher würde mein DOIF aber immer noch die Lampe nach einer Zeit ohne Bewegung abschalten.

Eine Idee war jetzt, ob ich irgendwie die Zeit speichern kann, an der ich die Lampe per Bewegungsmelder eingeschaltet habe, und dann wenn ich abschalten würde überprüfe ob das c.a. die Zeit ist wann das Reading der Lampe (dim/pct oder was immer man eben verwendet) akutalisiert wurde.

Sollte das Reading der Lampe neuer als 1-2s nach dem Einschaltzeitpunkt sein, wurde manuell eingegriffen und die Lampe soll nicht abgeschaltet werden.

Ist das so irgendwie umsetzbar, oder hat jemand eine andere Idee wie sich das realisieren lässt?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

papa

Wenn es ein Homematic Dimmer ist, sollte das mit den virtuellen Kanälen gehen.

http://www.elv.de/elektronikwissen/virtuelle-homematic-aktorkanaele-und-ihre-verknuepfungslogik.html

Wenn nicht, kann man das sicherlich auch in FHEM mit 2 Dummies hinkriegen. Ein Dummy für den Bewegungsmelder und der andere für den Rest. Die Lampe wird dann immer aus der ODER-Verknüpfung beider Dummies geschalten.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Per

DOIF hat den "Parameter" :sec, damit kann man das "Alter" eines Triggers abfragen (habe ich aber nie hinbekommen :-[).
Weiterhin kann man ein Dummy/Userreading setzen, in dem steht, wer/was das Gerät (hier Lampe) eingeschaltet hat.

Thyraz

Hab es nach meiner Idee oben mit dem ReadingsAge jetzt mal getestet.
Würde Dummies gerne vermeiden, da die die Übersichtlichkeit der Abläufe in FHEM imo verschlechtern durch dezentralisieren eines Ablaufs.


## Licht per Bewegung ein
(([MotionSensor:"reportedState: aktiv"]) and([?Lampe:dimmerVal] == 0))
  (setReading meinDoif motionTimeStamp "-")
  (set Lampe dim 25)

## Erneute Bewegung -> Nichts tun
DOELSEIF (([MotionSensor:"reportedState: aktiv"]) and ([?Lampe:dimmerVal] != 0))

## Keine Bewegung mehr
DOELSEIF (([MotionSensor:"reportedState: inaktiv"]) and ([?Lampe:dimmerVal] != 0))
  (IF (({ReadingsAge("meinDoif","motionTimeStamp",999999) - ReadingsAge("Lampe","dimmerVal",0)}) < 2)
    (set RGBWController01 dim 0)
  )


attr do always
attr wait 0:0:180

Dadurch sollte das If ja erst nach 180 Sekunden nach der letzten Bewegung ausgewertet werden.
Man sieht im State des DOIFs auch das Wait und die verschiedenen CMDs durchlaufen

Leider klappt das mit dem verschachtelten IF im DOELSEIF scheinbar nicht.
Die Lampe schaltet nie ab.

Gebe ich hingegen die Berechnung "{ReadingsAge("meinDoif","motionTimeStamp",999999) - ReadingsAge("Lampe","dimmerVal",0)}" direkt in die FHEM Console ein, kommt dabei als Zahlenwert immer 0 oder 1 raus.
An sich sollte das dann doch klappen, oder?

Kann man IF nicht innerhalb DOIF verwenden?
Oder muss man bei Perl Berechnungen das mit den Klammern anders handhaben?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

RoBra81

Hallo,

ich kann zwar deine Frage jetzt nicht direkt beantworten, möchte aber mal einen Hinweis und eine Idee in den Raum werfen. Der Hinweis: ich halte das mit der Zeit für schwierig, da der Bewegungsmelder ja sicherlich weiter triggert, auch wenn die Lampe schon an ist - möglicherweise fällt ein Trigger des Bewegungsmelder mal auf einen manuellen Schaltzeitpunkt und dann meint das DOIF, der Bewegungsmelder hätte geschaltet...
Die Idee: Du könntest ein UserReading source in der Lampe anlegen, welches beim einschalten der Lampe automatisch auf manual gesetzt wird. Löst nun der Bewegungsmelder aus und die Lampe ist aus, dann wird sie eingeschaltet und mit sleep verzögert um 2 Sekunden (um das automatische setzen abzuwarten) das Reading source auf automatic gesetzt. Dieses Reading kannst du dann anderweitig auswerten...

Habe ich selbst so noch nicht probiert, kam mir nur gerade als Idee...

Ronny

Per

Zitat von: Thyraz am 13 April 2016, 14:42:52Leider klappt das mit dem verschachtelten IF im DOELSEIF scheinbar nicht.
Prinzipell klappt IF im DOIF. Probiers mal einzeln.

Thyraz

Zitat von: RoBra81 am 13 April 2016, 15:15:29
Der Hinweis: ich halte das mit der Zeit für schwierig, da der Bewegungsmelder ja sicherlich weiter triggert, auch wenn die Lampe schon an ist - möglicherweise fällt ein Trigger des Bewegungsmelder mal auf einen manuellen Schaltzeitpunkt und dann meint das DOIF, der Bewegungsmelder hätte geschaltet...

Klar, der triggert bei anhaltender (oder wiederkehrender) Bewegung wieder.
Aber der erste DOIF Zweig wird ja nicht wieder ausgeführt, solang das Licht nicht komplett aus ist.

Der Ablauf ist so:

- Bewegung erkannt -> DOIF Zweig 1 (Lampe an, Zeit speichern)
- Bewegung hört auf -> DOIF Zweig 3 (Wait Time zum Auswerten des IF und Abschalten der Lampe startet)
- Während der Wait Time erneut Bewegung -> DOIF Zweig 2 (der nichts ausführt, dient nur zum Abbrechen der Wait Time)
- Bewegung hört auf -> DOIF Zweig 3 (Wait Time startet wieder)
- Wait Time läuft ab, IF wird ausgewertet -> Lampe schaltet aus.


Zitat von: RoBra81 am 13 April 2016, 15:15:29
Die Idee: Du könntest ein UserReading source in der Lampe anlegen, welches beim einschalten der Lampe automatisch auf manual gesetzt wird. Löst nun der Bewegungsmelder aus und die Lampe ist aus, dann wird sie eingeschaltet und mit sleep verzögert um 2 Sekunden (um das automatische setzen abzuwarten) das Reading source auf automatic gesetzt. Dieses Reading kannst du dann anderweitig auswerten...

Das hatte ich bisher so, als ich die Lampe nur über Schalter und Bewegungsmelder geschaltet habe.
Das waren beides DOIFs und ich konnte da problemlos noch das manual/automatic Flag speichern.

Nun kamen aber noch TabletUI und Homekit ins Spiel.
Das Slider Widget für TabletUI kann eben nur einen Befehl ausführen: Dimmen.
Da bekomme ich nicht zusätzlich noch in ein Device oder Dummy ein Reading gespeichert.
Auch bei Homekit dürfte das schwer werden.

Ich bekomme das "Automatic" Flag also nicht mehr zurückgesetzt wenn ich manuell eingreife...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

Ok, das war fies. :P

Alter Code:

IF (({ReadingsAge("meinDoif","motionTimeStamp",999999) - ReadingsAge("Lampe","dimmerVal",0)}) < 2)
  (set RGBWController01 dim 0)


IF arbeitet intern ja schon mit dem Perl-if. Daher darf man die geschwungenen Klammern um das ReadingsAge nicht setzen.
Es reicht so, dann funktioniert es:

IF ((ReadingsAge("meinDoif","motionTimeStamp",999999) - ReadingsAge("Lampe","dimmerVal",0)) < 2)
  (set RGBWController01 dim 0)



Hier nochmal der gesamte Code falls ihn jemand mal gebrauchen kann:

## Licht per Bewegung ein
(([MotionSensor:"reportedState: aktiv"]) and ([?Lampe:dimmerVal] == 0))
  (setReading meinDoif motionTimeStamp "-")
  (set Lampe dim 25)

## Erneute Bewegung -> Nichts tun
DOELSEIF (([MotionSensor:"reportedState: aktiv"]) and ([?Lampe:dimmerVal] != 0))

## Keine Bewegung mehr
DOELSEIF (([MotionSensor:"reportedState: inaktiv"]) and ([?Lampe:dimmerVal] != 0))
  (IF ((ReadingsAge("meinDoif","motionTimeStamp",999999) - ReadingsAge("Lampe","dimmerVal",0)) < 2)
    (set RGBWController01 dim 0)
  )


Die Abschaltung funktioniert nun, wird jedoch verhindert wenn ich manuell an der Lampe rumspiele...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

RoBra81

Zitat von: Thyraz am 13 April 2016, 17:59:30
Das hatte ich bisher so, als ich die Lampe nur über Schalter und Bewegungsmelder geschaltet habe.
Das waren beides DOIFs und ich konnte da problemlos noch das manual/automatic Flag speichern.

Nun kamen aber noch TabletUI und Homekit ins Spiel.
Das Slider Widget für TabletUI kann eben nur einen Befehl ausführen: Dimmen.
Da bekomme ich nicht zusätzlich noch in ein Device oder Dummy ein Reading gespeichert.
Auch bei Homekit dürfte das schwer werden.

Ich bekomme das "Automatic" Flag also nicht mehr zurückgesetzt wenn ich manuell eingreife...

Der Vollständigkeit halber noch meine Lösung (es hat mir keine Ruhe gelassen und ich habe es einfach mal umgesetzt):

Ich habe eine wifilight-Lampe (OG.ez.LI.Bogen) genommen, bei der sich beim Einschalten/Umschalten das Reading RGB ändert und ihr ein UserReading hinzugefügt:

attr OG.ez.LI.Bogen userReadings source:RGB {if (ReadingsVal($name,"state","") eq "on") {return "manual";} else {return "automatic";}}

Der Bewegungsmelder würde nun folgenden Befehl absetzen (habe ich erstmal nur in der Eingabezeile getestet):

set OG.ez.LI.Bogen blau; sleep 2; setreading OG.ez.LI.Bogen source automatic

Damit sollte das Reading source passen und kann ausgewertet werden...

Ronny