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.
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.
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?
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.
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
Wenn das stimmt, schon. Ich traue Usern nicht, die nicht einmal wissen, dass jedes Reading ein eigenes Event erzeugen kann.
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?
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).
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.
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.
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
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.
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" }}
das ist keine Lösung, denn das kann auch nicht funktionieren...
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.
Mit was vergleichst du denn oben ReadingsVal("LED_TV","state","on") ?
Es funktioniert vielleicht, aber tut es auch wirklich das, was es soll?
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.
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" }}
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.
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.
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
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? :-\
Das klingt nach watchdog.
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
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.
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).
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
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. ;)
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
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).
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.
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.
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 (http://forum.fhem.de/index.php/topic,14792.msg389892.html#msg389892)
passt:
ZitatMein Enigma2 läuft auf einem Topfield 7700.
Gruß Otto