Licht nach x Minuten aus, wenn enigma2-Receiver Status wechselt von on nach off

Begonnen von der_da, 11 Januar 2016, 11:10:31

Vorheriges Thema - Nächstes Thema

der_da

Hallo liebes Forum,

bisher war ich nur stiller Mitleser und habe seit einiger Zeit meine FHEM-Installation am laufen. Ich habe eine (für mich) knifflige Aufgabe, die ich nicht so recht hinbekomme:
Wenn abends der TV ausgeschaltet wird, muss ich derzeit manuell die letzten Lichter ausschalten (oder man schaltet halt zu einer festen Uhrzeit automatisch).
Schön wäre es, wenn die Hausautomation so schlau wäre, und nach dem Ausschalten des TV (Enigma2-Receiver) nach einiger Zeit die diversen Lichter selbst ausschalten würde.
Mit
get TVReceiver power
kann ich ja den Zustand des Receivers abfragen. Aber wie bekomme ich mit, dass der Receiver (sagen wir zw. 20:00 und 22:30) an gewesen ist und jetzt aus ist. Ich will ja verhindern, dass das Licht einfach ausgeschaltet wird, nur weil mal kein fernsehen geguckt wurde.

betateilchen

Falls der TVReceiver einen event generiert, wenn er ausgeschaltet wird, kannst Du einfach ein notify definieren, das darauf reagiert.

define Licht_aus notify TVReceiver.off set Licht on-for-timer 1800

Dann geht 1800 Sekunden (30 Minuten) nach dem Abschalten des Receivers das Licht aus.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

der_da

Hmm - Danke, aber ...  :)

Das Event sieht so aus:
ENIGMA2 Wz.TvReceiver power: off
und mein notify so:
Wz.TvReceiver:off set Fernsehboard on-for-timer 10
nur 10 Sekunden, damit ich nicht so lange warten muss, bis das Licht ausgeht :-)
Leider geht das Licht aber nicht aus :-\
Wenn ich es richtig verstehe, dann bedeutet Wz.TvReceiver:off in meinem notify, egal ob power: off oder irgendwas: off das notify auslöst. Das sollte dann doch so gehen - oder?

marvin78

Du musst auf das exakte Event reagieren bzw. RegEx verwenden. off != power: off. Mit deinem notify reagierst du nur auf state.

Sowas

define Licht_aus notify TVReceiver.power.*off set Licht on-for-timer 1800

könnte funktionieren, je nachdem, was durch das Device noch für Events ausgelöst werden, aber zu ungenau sein.

Wie das Event ganz genau aussieht, kannst du auch mit der sub Log feststellen, falls es noch nicht passt.

Bitte mit den Grundlagen beschäftigen.

betateilchen

Zitat von: marvin78 am 11 Januar 2016, 12:33:16
Sowas

define Licht_aus notify TVReceiver.power.*off set Licht on-for-timer 1800

könnte funktionieren,

Da fehlte das Wz. davor ;)

define Licht_aus notify Wz.TvReceiver.power..off set FernsehBoard on-for-timer 1800

Zitat von: marvin78 am 11 Januar 2016, 12:33:16
Wie das Event ganz genau aussieht,

wissen wir ja:

Zitat von: der_da am 11 Januar 2016, 12:29:06
Das Event sieht so aus:
ENIGMA2 Wz.TvReceiver power: off
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

marvin78

Wenn das stimmt, schon. Ich traue Usern nicht, die nicht einmal wissen, dass jedes Reading ein eigenes Event erzeugen kann.

betateilchen

Zitat von: marvin78 am 11 Januar 2016, 13:21:06
Ich traue Usern nicht, die nicht einmal wissen, dass jedes Reading ein eigenes Event erzeugen kann.

Denk mal bitte zurück an Deine Anfangszeit von fhem. War Dir von der ersten Minute an klar, wie die Begriffe "event" und "reading" zusammenhängen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

marvin78

Bevor ich mich an sowas hier gewagt habe, wusste ich das, ja. Ich lese deutlich länger hier mit, als ich Hausautomation tatsächlich betreibe. ;) Aber ich bin kein Maßstab, ITler und ich habe das auch nicht als Vorwurf gemeint. Ich glaube bloß nicht ohne Vorbehalt, dass Angaben über das Event stimmen und zudem wollte ich eine weitere Möglichkeit aufzeigen, mit der man das Event heraus findet (der Event-Monitor ist hier nicht immer 100% hilfreich bzw. anstrengend bei vielen Events).

betateilchen

Zitat von: marvin78 am 11 Januar 2016, 13:21:06
Ich traue Usern nicht, die nicht einmal wissen,

Eine solche Aussage finde ich gegenüber einem Fragesteller mit erkennbar weniger als 10 Beiträgen trotzdem unpassend.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

marvin78

Das ist deine Meinung. Meine ist eine andere. Ich sage nur, was ich denke und das ist nunmal, dass ich so einer Aussage nicht traue.

Wir sollten den Thread des Users aber nicht für diesen Kram kapern. Das ist nämlich wirklich unpassend.


Brice

Interessante Idee, muss auch automatisieren, wenn mein Enigma2-Modul wieder läuft.
Zitat von: der_da am 11 Januar 2016, 12:29:06
Wz.TvReceiver:off set Fernsehboard on-for-timer 10
sollte so funktionieren:
Wz.TvReceiver:set_off.* set Fernsehboard on-for-timer 10

Und wenn du nicht möchtest, das beim Ausschalten des Receiver am Nachmittag das Licht für 10 Sekunden angeht, gibst du eine eine Bedingung mit, z.B.
Wz.TvReceiver:set_off.* if (hour >=21) set Fernsehboard on-for-timer 10
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

betateilchen

Zitat von: Brice am 11 Januar 2016, 18:23:10

Wz.TvReceiver:set_off.* if (hour >=21) set Fernsehboard on-for-timer 10



Das funktioniert so definitiv nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Brice

Richtig, war ungetestet. Nachdem ich meine VUPlus Uno wieder in FHEM eingebinden konnte, habe ich es für mich so gelöst:

SetTopBox:power:.off {if (ReadingsVal("LED_TV","state","on")) { fhem "set LED_TV on-for-timer 10" }}

FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

betateilchen

das ist keine Lösung, denn das kann auch nicht funktionieren...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Brice

Funktioniert, sogar mit der Structure Licht. Und nein, ich bin nicht blind...

Warum sollte es nicht funktionieren, wo sollte der Fehler liegen? Bei mir: Vu+ Uno, diverse FS20ST und HUE.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

marvin78

Mit was vergleichst du denn oben ReadingsVal("LED_TV","state","on") ?

Es funktioniert vielleicht, aber tut es auch wirklich das, was es soll?

Brice

LED_TV ist eine FS20ST. Mir geht es darum, dass der on-for-timer-Befehl nur dann geschickt wird, wenn die LED an ist (bei aus würde diese ja für für die definiert Zeit an gehen).

Ich nutze dieses Konstrukt seit längerer Zeit für mehrere Dinge, z.B.

Bewegungsmelder_Bad:on.* {if ((ReadingsVal("Radio_Bad","state","off") && ($hour >= 5 && $hour <= 22))){ fhem "set Radio_Bad on-for-timer 180" }}

Das kann sicher optimiert werden. Meine Kenntnisse reichen für mehr nicht aus und alles funktioniert so, wie es von mir beabsichtigt ist.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

marvin78

Das tut es sicher nicht.

Du musst den Wert, der aus dem Reading "Radio_Bad" kommt mit irgendetwas vergleichen.


Bewegungsmelder_Bad:on.* {if ((ReadingsVal("Radio_Bad","state","off") eq "off" && ($hour >= 5 && $hour <= 22))){ fhem "set Radio_Bad on-for-timer 180" }}

Man könnte das ganze Geraffel aber auch weg lassen und mit Filtern arbeiten.

Bewegungsmelder_Bad:on.* {if ($hour >= 5 && $hour <= 22){ fhem "set Radio_Bad:FILTER=STATE!=on on-for-timer 180" }}

Brice

Wir driften schon wieder ab.

Zitat von: marvin78 am 12 Januar 2016, 10:33:29
Das tut es sicher nicht.
Es hat sich aus der Familie seit Einrichtung im Sommer 2015 noch niemand beschwert :-)

Aber richtig, der Vergleich (eq "off") fehlt, den hatte ich in anderen Notify eingebaut. Ich habe keine Ahnung, warum es trotzdem funktioniert.

Bewegungsmelder_Bad:on.* {if ($hour >= 5 && $hour <= 22){ fhem "set Radio_Bad:FILTER=STATE!=on on-for-timer 180" }}
Danke. Funktioniert und ist einfacher, ich werde mich mal mit Filter beschäftigen.
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

betateilchen

Zitat von: Brice am 12 Januar 2016, 11:21:28
Ich habe keine Ahnung,

...  8)

Zitat von: Brice am 12 Januar 2016, 11:21:28
warum es trotzdem funktioniert.

Weil sowohl "on" als auch "off" in diesem if() IMMER einen logischen Wert 1 liefern und deshalb in deiner mit && (logisches UND) verknüpften Abfrage immer nur der zweite Vergleich relevant ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Brice

Danke für die Erklärung.

Ich habe meine cfg durchsucht und es war die einzige relevante Definition, in der das eq "<irgendwas>" fehlte. Insoweit hatte ich mich am falschen Codebeispiel orientiert.

Und zum Thema Automatisierung, aber wahrscheinlich nichts für den Theadersteller:

Bisher wurde mein MediaCenter (Fernseher, Bose, und Peripherie, aber nicht die SetTopBox, die geht eh in den DeepStandBy) per Fritz!DECT200 ausgeschaltet. Gleichzeitig wurde über per Notify die sub "Bettfertig" eingestellt (im Schlafzimmer die HUE eingeschaltet und ein bestimmter Radiosender auf den WLan-Lautsprecher gestreamt).

DECT200_3:set_off.* {
if ($hour >=21) {Bettfertig}
}


Des Weiteren hatte ich per Notify" Alles Aus" über eine Fernbedienung (FS20 S8) alle nicht mehr benötigten Verbraucher ausgeschaltet.

In die Funktion "VUPlus_aus" habe ich jetzt die sub "Bettfertig" dahingehend modifiziert, dass alles ausgeschaltet wird. Das spart einen weiteren Klick auf der FB.
sub
Bettfertig()
{
  {fhem("set MyPlayer http://streams.harmonyfm.de/harmonyfm/mp3/livestream.m3u")};
  {fhem("set MyPlayer on")};
  {fhem("set MyPlayer volume 20")};
  {fhem("set HUEDevice3 on")};
  {fhem("set HUEDevice3 pct 10")};
  {fhem "set LED_TV off"}
  {fhem("set LED_Kueche off")}
  {fhem("set LED_Balkon off")}
  {fhem("set LED_Wohnzimmer off")}
  {fhem("set HUEDevice1 off")}
  {fhem("set HUEDevice2 off")}
  {fhem("set Drucker off")}
  }


Da das Intervall für die Aktualisierung der Readings der SetTopBox auf 45 sek steht, bleibt i.d.R. genug Zeit, um das Zimmer nicht im Dunkeln verlassen zu müssen. Falls die SetTopBox nicht eingeschaltet war, wird weiterhin die FS20 S8 benutzt.

Der Thread hat mich weitergebracht, ich konnte meine Automatisierungen verbessern.

Verbesserungen in meinem Code sind weiterhin willkommen
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

der_da

Schön, wie hier aus einer simplem Anfrage ein langer Thread wird  :)
Ich habe es nun hinbekommen (Danke vor Allem an betateilchen).
Nun habe ich aber immer noch ein kleines Problem(chen):
Ich prüfe nun mit Wz.TvReceiver.power.*off auf ein Off-Event und das klappt auch. Allerdings scheint es ab und zu vorzukommen, dass ein Off-Event erzeugt wird, obwohl der Receiver definitiv nicht off war. Gestern abend ist zwei mal einfach so das Licht ausgegangen, mitten beim Fernsehen. Man müsste also solche kurzen Aussetzer irgendwie abfangen und erst dann auslösen, wenn innerhalb einer gewissen Zeit nach einem Off-Event nicht wieder ein On-Event auftaucht. Wie? :-\

marvin78


Otto123

Oder DOIF
define Tipp DOIF ([Wz.TvReceiver:power] eq "off")(set Fernsehboard on-for-timer 10)
attr Tipp wait 5


Vorausgesetzt ich habe dein Device richtig verstanden Wz.TvReceiver und das reading ist power - richtig?

ZitatIch prüfe nun mit Wz.TvReceiver.power.*off auf ein Off-Event und das klappt auch.
Damit prüfst Du auf alles was Wz TvReceiver power und off enthält - die alten Hasen mögen mich korregieren  ???

Schau Dir das mal im Eventmonitor ne Weile an.

- wenn also im Programm Titel "off" vorkommt geht das Licht aus.

Wäre meine Erklärung für off "Events"


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Brice

Zitat von: der_da am 11 Januar 2016, 11:10:31
...nach einiger Zeit die diversen Lichter selbst ausschalten würde...

Du teilst uns zuwenig Details mit. Falls dein Device <Fernsehboard> eine Structure ist, kann es zu unerwünschten Effekten kommen.



FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

der_da

Hallo!
Danke für die Tipps.
Mein Device <Fernsehboard> ist ein dummy.
Und ich werde mal eine Weile den Eventmonitor beobachten, wann da "off"-Events auftauchen, obwohl keine auftauchen sollten.

Das da hat übrigens bei mir nicht funktioniert:
define Tipp DOIF ([Wz.TvReceiver:power] eq "off")(set Fernsehboard on-for-timer 10)
attr Tipp wait 5

::)
Wenn ich es richtig verstehe, dann wird das DOIF erst dann ausgeführt (set Fernsehboard on...), wenn 5 Sekunden vergangen sind und die Bedingung dann immer noch wahr ist (Wz.TvReceiver:power eq "off"). Sollte also in der Zwischenzeit (nach 5 Sekunden) Wz.TvReceiver:power wieder "on" sein, wird das DOIF nicht ausgeführt? Wenn ja, werde ich mal im Eventlog prüfen, wie lange es dauert, bis aus dem "off" wieder ein "on" wurde und eventuell die Zeiten anpassen.

Außerdem werde ich mich mal mit dem watchdog beschäftigen (danke an marvin78).

Otto123

Moin,

Bei mir hat das eigentlich genau so funktioniert .. ???

naja mein Beispiel ist quasi ein watchdog, anders funktioniert das device watchdog auch nicht. Du hast ein richtig beschrieben  :) mit einer Ausnahme: Das DOIF wird ausgeführt in dem Moment wo power nach off wechselt. Wenn Innerhalb von 5 sec power wieder nach on wechselt würde der Ausführungsteil (zweite Klammer) nicht ausgeführt.

Ich gehe aber davon aus, der Zustand vom reading power wechselt nicht. Aber das Wz.TvReceiver Device (ist doch Enigma oder?) liefert jede Menge Events, auch die von Programm Titeln, wenn da mal "The power off love" (ich weiß falsch geschrieben, kommt aber beim TV Programm schon mal vor)  oder so kommt, triggert dein notify. Also nur als Idee ...

Noch ein Hinweis: Mit "hat nicht funktioniert" kann hier keiner was anfangen. Du müsstest dazu schon noch Details liefern. Schau Dir bitte mal die Detailansicht des DOIFs an, da stehen jede Menge Infos. Zur Not mach einen Screenshot vor und nach dem ausschalten des Gerätes. Ob im Log zu dem Zeitpunkt was steht wäre auch interessant. Du kannst auch das Logging des Gerätes hochschrauben.

Mir kommt noch eine andere Idee, bevor Du ein zusätzliches Watchdog baust, sollten wir die Sache mit dem Event genau untersuchen. Logge doch einfach in Deinem notify den event mit. So in etwa (nicht getestet)

Log 1, ("Poweroff ausgelöst durch: $EVENT");

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

der_da

Hallo Otto123,
danke für deine Erklärung. Nein, es wird nur das Event "power" ausgewertet und siehe da, vorhin kam folgendes vor:
2016-01-14 11:01:55 ENIGMA2 Wz.TvReceiver power: off
2016-01-14 11:02:13 ENIGMA2 Wz.TvReceiver power: on
Und das, obwohl definitiv der Receiver durchlief. Also werde ich mal die Zeit für das Doif auf 30 Sekunden erhöhen, in der Hoffnung, dass das ausreicht.  ;)

Otto123

Sehr interessant. Ich logge das mal bei mir mit.

Das Enigma Modul setzt allerdings auch das power reading auf off im Standby. Schaltest Du den Receiver in den Deep Standby? Dann geht presence auf absent.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

der_da

Ich habe jetzt mal die Auswertung von power geändert auf presence. Das scheint zuverlässiger zu melden.

"funktioniert nicht" bedeutet:

Mein DOIF:
define TV_aus_dann_Licht_aus DOIF ([Wz.TvReceiver.presence] eq "absent") (set Fernsehboard off)
attr TV_aus_dann_Licht_aus wait 30


Folgendes meldet das EventLog beim Einschalten bzw. Ausschalten des Receivers:
2016-01-14 14:02:05 ENIGMA2 Wz.TvReceiver presence: present
2016-01-14 14:04:45 ENIGMA2 Wz.TvReceiver presence: absent


Aber das DOIF wird nicht getriggert. STATE ist immer noch initialized, obwohl ich den Receiver mehrfach ein- und ausgeschaltet habe (und auch die 30 Sekunden gewartet habe).

Otto123

Naja beim DOIF ist es in meinem Beispiel die Abfrage des readings und nicht die Auswertung des  Event, damit musst Du den Doppelpunkt
[Wz.TvReceiver:presence] schreiben

Ich werde Dir mal noch nach heute Abend von einem längeren Log berichten, aber was ich bei mir sehe ist genau ein on beim einschalten und ein off beim ausschalten. Irgendwas muss bei Dir da für die Zusatz "off" verantwortlich sein.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

der_da

Danke Otto123,

das war der entscheidende Punkt (im wahrsten Sinne des Wortes)!  ;D
Es funktioniert jetzt mit dem automatischen Abschalten des Lichts.

Mein Enigma2 läuft auf einem Topfield 7700. Der ist wahrscheinlich an der Grenze seiner hardwaretechnischen Fähigkeiten. Es kommt öfters die "Sanduhr" während die Bildwiedergabe/ggf. Aufnahme(n) aber einwandfrei funktioniert. Eventuell ist das der Grund für die unregelmäßigen Power-Off-Events? Mir ist aber aufgefallen, dass "Power on" nach dem Einschalten des Gerätes viel früher gemeldet wird als "Presence on" und ich glaube auch beim Herunterfahren wird Presence später auf "absent" gesetzt als Power auf "off". Insofern hoffe ich, dass die Auswertung von Presence stabiler läuft. Ich werde das beobachten.

Otto123

Das Power reading scheint mir wirklich über die Receiver Software (WebIF) gesteuert zu werden. Die presence wird wahrscheinlich einfach über Lan Ping gemacht, das würde zumindest den Unterschied erklären.

Schau mal
passt:
ZitatMein Enigma2 läuft auf einem Topfield 7700.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz