FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: cosinuz am 27 November 2016, 11:16:03

Titel: DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 27 November 2016, 11:16:03
Hallo zusammen,

ich komme damit einfach nicht weiter.

Folgendes möchte ich:
1. Wenn Gerät per lan-ping erreichbar und Steckdose an = nichts verändern
2. Wenn Gerät per lan-ping nicht erreichbar und Steckdose an = Steckdose ausschalten

Probiert habe ich es wie folgt:

define vuplusSZ_LAN_10.10.10.64 PRESENCE lan-ping 10.10.10.121 20
attr vuplusSZ_LAN_10.10.10.64 event-on-change-reading state
attr vuplusSZ_LAN_10.10.10.64 ping_count 10
define FileLog_SZ_LAN_10.10.10.64 FileLog ./log/vuplusSZ_LAN_10.10.10.64-%Y.log vuplusSZ_LAN_10.10.10.64
define VAR_AKTOR_SD_02_UEBERWACHUNG01 DOIF ([vuplusSZ_LAN_10.10.10.64] eq "absent") (set AKTOR_SD_02:FILTER=state!=off off)
attr VAR_AKTOR_SD_02_UEBERWACHUNG01 do always
attr VAR_AKTOR_SD_02_UEBERWACHUNG01 wait 320
attr VAR_AKTOR_SD_02_UEBERWACHUNG01 room DOIF



Aber leider passiert folgendes:
Steckdose = an und Gerät = erreichbar aber Steckdose geht nach 320 Sekunden aus.
Könnt Ihr mir mal erklären was ich übersehen habe?


LOG:

2016.11.27 11:01:13 3: CUL_HM set AKTOR_SD_02 on
2016.11.27 11:06:34 3: CUL_HM set AKTOR_SD_02 off


2016-11-27_11:01:14 vuplusSZ_LAN_10.10.10.64 absent
2016-11-27_11:02:22 vuplusSZ_LAN_10.10.10.64 present




Vielen Dank!
Gruß
cosinuz




Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Uef am 27 November 2016, 13:11:01
Ich bin jetzt nicht der DOIF-Experte, aber das Ganze verhält sich wie programmiert:


Der Sinn des wait erschließt sich nicht - zumindest steht davon nichts in Deinen Anforderungen.
Und ob diese Auswertung im Ausführungsteil funktioniert, kann ich nicht beurteilen. In der commandref von DOIF findet man aber nichts dazu, dass so etwas unterstützt wird (außer vielleicht als Perl-Code, das ist aber hier nicht der Fall).

Wieso nicht grundsätzlich wesentlich einfacher (ist auch leichter zu pflegen):
wenn Du den Status des Aktors (="on") als zweite Bedingung mit in den Bedingungsteil nimmst, den Ausführungsteil auf ein einfaches set reduzierst (und ggf. das wait entfernst), sollte es wie geplant laufen.

Falls Du den Countdown des waits abbrechen willst, weil doch wieder ein PRESENCE = present aufgetreten ist, benötigst Du einen weiteren DOIF/DOELSEIF-Zweig mit einem wait-Wert von Null (siehe commendref DOIF - Verzögerungen).

Uef
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 27 November 2016, 15:47:48
Hi Uef,

erstmal vielen Dank für deine Antwort! Aber ich sehe vor lauter Bäumen den Wald nicht mehr. Ich wühle mich nun schon seit 2 Tagen durch dieses Thema und komme keinen Schritt weiter. Meinst Du so?
Zitat
Falls Du den Countdown des waits abbrechen willst, weil doch wieder ein PRESENCE = present aufgetreten ist, benötigst Du einen weiteren DOIF/DOELSEIF-Zweig mit einem wait-Wert von Null (siehe commendref DOIF - Verzögerungen).
Ja das ist richtig. So hätte ich das gerne.

Meinst Du das so?

define VAR_AKTOR_SD_01_UEBERWACHUNG01 dummy
define VAR_AKTOR_SD_01_UEBERWACHUNG02 DOIF ([vuplusWZ_LAN_10.10.10.60] eq "absent" and [AKTOR_SD_01] eq "on") (set VAR_AKTOR_SD_01_UEBERWACHUNG01 off) DOELSE (set VAR_AKTOR_SD_01_UEBERWACHUNG01 on)
attr VAR_AKTOR_SD_01_UEBERWACHUNG02 do always
attr VAR_AKTOR_SD_01_UEBERWACHUNG02 wait 320:320

define VAR_AKTOR_SD_01_UEBERWACHUNG03 DOIF ([vuplusWZ_LAN_10.10.10.60] eq "absent" and [AKTOR_SD_01] eq "on" and [VAR_AKTOR_SD_01_UEBERWACHUNG01] eq "off") (set AKTOR_SD_01 off)
attr VAR_AKTOR_SD_01_UEBERWACHUNG03 do always




Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 27 November 2016, 17:16:20
Da ich eine Lösung brauchte und sich das Wochenede zum Ende neigt habe ich nun wie folgt gelöst

define VAR_AKTOR_SD_02_UEBERWACHUNG01 dummy
define VAR_AKTOR_SD_02_UEBERWACHUNG02 at +*00:03:00 IF ([vuplusSZ_LAN_10.10.10.64] eq "absent" and [AKTOR_SD_02] eq "on") \
(set VAR_AKTOR_SD_02_UEBERWACHUNG01 off) ELSE (set VAR_AKTOR_SD_02_UEBERWACHUNG01 unknown)

define VAR_AKTOR_SD_02_UEBERWACHUNG03 at +*00:03:30 \
IF ([vuplusSZ_LAN_10.10.10.64] eq "absent" and [AKTOR_SD_02] eq "on" and [VAR_AKTOR_SD_02_UEBERWACHUNG01] eq "off") \
(set AKTOR_SD_02 off, set VAR_AKTOR_SD_02_UEBERWACHUNG01 off) \
ELSE (set VAR_AKTOR_SD_02_UEBERWACHUNG01 unknown)


Scheint irgendwie zu funktionieren. Aber sauber scheint das nicht zu sein. Über weitere Hilfe würde ich mich trotzdem freuen.
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Uef am 27 November 2016, 17:27:40
Hallo cosinuz,

ich dachte eigentlich viel einfacher.
Das PRESENCE device aus dem ersten Post bleibt so.
Dann nur ein DOIF etwa wie folgt:

define VAR_AKTOR_SD_01_UEBERWACHUNG01 DOIF ([vuplusWZ_LAN_10.10.10.60] eq "absent" and [AKTOR_SD_01] eq "on") (set AKTOR_SD_01 off) DOELSE (set AKTOR_SD_01 on)
attr VAR_AKTOR_SD_01_UEBERWACHUNG01 do always
attr VAR_AKTOR_SD_01_UEBERWACHUNG01 wait 320:0


Die Null im wait sorgt dafür, im Fall eines present der 320-sec-Timer für den ersten Zweig sofort unterbrochen wird und das "set off" gar nicht ausgeführt wird; vermutlich könnte man das "set on" noch einsparen, aber zu debuggen ist das so erstmal klarer.
Auch das "do always" kann man vermutlich noch weglassen, aber das müsste man nochmal in Ruhe überlegen - oder ausprobieren :-)

BTW: Du musst im ELSE-Zweig ebenfalls noch eine Bedingung einbauen, damit die Steckdose nicht gleich wieder eingeschaltet wird: sobald der erste Zweig ausgeführt wird, ist die Bedingung für den DOELSE-Zweig erfüllt - und die Steckdose geht vermutlich gleich wieder an (ich hab's jetzt nicht getestet).
Du hast aber nichts dazu geschrieben, was eigentlich zum Wieder-Einschalten der Steckdose führen soll ...
Am besten mal alle Zuständskombinationen des Gesamtgebildes auflisten und die gewünschten Übergänge mit ihren Aktionen festlegen. Dann wird i.d.R. schon recht klar, wieviele DO(ELSE)IF-Zweige man braucht und mit welchen Bedingungen.

Uef


In Deinem letzten Post hast andere Namen für die devices gewählt als im ersten; die müsstest Du also nochmal kontrollieren.
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Otto123 am 27 November 2016, 17:33:41
Hi cosinuz,

ich habe so was ähnliche im Einsatz. Wenn Fernseher aus dann Satbox aus...
die DEF für das DOIF
(([LGwebOSTV] eq "absent") and ([ET9200:recordings] == 0)) (set ET9200 shutdown)Kein do always und kein wait, weil der Status vom Fernseher eindeutig ist.

In Deinem Fall
define VAR_AKTOR_SD_01_UEBERWACHUNG01 DOIF ([vuplusWZ_LAN_10.10.10.60] eq "absent") (set AKTOR_SD_01 off)

Gruß Otto
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 27 November 2016, 19:53:05
Danke für Euer Feedback! :)
Meine Zeit ist für heute leider abgelaufen. Ich schaue mir das nächsten Samstag nochmal genauer an.  ;)
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 02 Dezember 2016, 15:47:03
Hallo zusammen,

Am besten mal alle Zuständskombinationen des Gesamtgebildes auflisten und die gewünschten Übergänge mit ihren Aktionen festlegen. Dann wird i.d.R. schon recht klar, wieviele DO(ELSE)IF-Zweige man braucht und mit welchen Bedingungen.
OK, Du hast natürlich recht. :)
Ich habe mir die Woche mal genauere Gedanken zu dem Thema gemacht.

Und mein Ziel wäre folgendes:
Kurze Erklärung warum ich das möchte.
Ich besitze mehrere Geräte im Wohnzimmer die sehr viel Standyby-Strom verbrauchen. Z.B. TV, SAT-Receiver, Amazon-TV Box, Playstation, etc.
Meine Familie vergisst auch immer die Geräte wie z.b. die Playstation, Dolby-Anlage und so weiter auszuschalten. D.H. die Geräte sind die ganze Nacht über eingeschaltet.

Erste Frage für mich war, "was soll ich benutzen? if (Perl), IF (FHEM intern), DOIF (FHEM intern, aber aktueller)? Nach einigen Recherchen hier habe ich das Gefühl, dass ich mit DOIF auf dem richtigen Weg bin. Ist doch richtig, oder?

Daher folgende Idee von mir.

Geräte einschalten
1. Meine Familie muss mit einer Homematic Fernbedienung die Steckdose einschalten, wo alle Geräte dranhängen. (kein Problem)

Geräte ausschalten
1. Der SAT-Receiver wird ausgeschaltet (das bekommt meine Familie immer hin) 

2. Überprüfung des Receivers durch LAN-Ping / Pingcheck alle 20 Sekunden 5 Ping's
define vuplusTEST_LAN_10.10.10.121 PRESENCE lan-ping 10.10.10.121 20
attr vuplusTEST_LAN_10.10.10.121 event-on-change-reading state
attr vuplusTEST_LAN_10.10.10.121 ping_count 5
define FileLog_vuplusTEST_LAN_10.10.10.121 FileLog ./log/vuplusTEST_LAN_10.10.10.121-%Y.log vuplusTEST_LAN_10.10.10.121

scheint zu funktionieren

3. Sollte der Receiver über LAN-Ping nicht erreichbar sein = Steckdose ausschalten
define VAR_AKTOR_SDLM_01_UEBERWACHUNG01 DOIF ([vuplusTEST_LAN_10.10.10.121] eq "absent") (set AKTOR_SDLM_01_Sw off)
scheint zu funktionieren

3.1 Weiter Abfrage: die Überprüfung sollte alle 2 Minuten (erstmal zum testen alle 2 Minuten, später dann alle 10 Minuten) stattfinden UND wenn die Steckdose = on (Wenn sie off ist, braucht sie ja nicht mehr abgeschaltet werden.
define VAR_AKTOR_SDLM_01_UEBERWACHUNG01 DOIF ([+:02] and [vuplusTEST_LAN_10.10.10.121] eq "absent" and [AKTOR_SDLM_01_Sw] eq "on") (set AKTOR_SDLM_01_Sw off)
attr VAR_AKTOR_SDLM_01_UEBERWACHUNG01 do always

doalways wegen "alle x Minuten"
scheint zu funktionieren


3.2 Weitere Abfragen: Nach "alle 2 Minuten" und "Receiver = absent" und "Steckdose = on", 5 Minuten warten und noch einmal prüfen.
Warum?
Es kann ja passieren, dass FHEM um 11:02 die Prüfung startet und 10 Sekunden vorher schalten wir die Steckdose ein. In diesem Fall benötigt der Receiver ca. 40-60 Sekunden bis er per LAN erreichbar ist und der Status ist aber noch "absent". D.H. die Steckdose schaltet sich ein und schaltet sich direkt wieder ab.
Daher müsste man irgendwie eine weitere Schleife einbauen, um diesen Fall abzufangen.
Z.B. nach 2 Minuten noch einmal einen Ping-Check. Dann kann man sich relativ sicher sein, dass der Receiver wirklich offline oder online ist.

INFO: Hat sich erledigt. Siehe unten.

Randinfos:
Ich hatte mal versucht, dass ganze über die verbrauchte Wattzahl zu steuern. Das funktionierte aber nicht, da ich die Wattzahl nicht genau spezifizieren konnte. (unterschiedliche Geräte waren zur unterschiedlichen Zeit eingeschaltet. Daher der versuch per LAN-Ping)
Außderdem habe ich das mal über eine Logitech Fernbedinung inkl. IR/Funk HUB laufen lassen (direkt über FHEM Connect). Aber leider patch Logitech die Geräte dauernd und nach einiger Zeit funktionierte es auf einmal nicht mehr. Daher kommt diese Lösung auch nicht mehr für mich in Frage. ;(

Danke und Gruß
cosinuz
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Otto123 am 02 Dezember 2016, 16:33:23
Hallo cosinuz,

um Dich in Deinen Gedankengängen zu unterbrechen: Es gibt für den VUPlus ein Modul -> ENIGMA2

Wozu willst Du den SAT Receiver noch über ne Steckdose ausschalten? Dessen Standby ist genauso wie der einer Steckdose.

Gruß Otto
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 02 Dezember 2016, 16:47:14
Hallo Otto,

mein Problem ist weniger der SAT Receiver sondern mehr die anderen Geräte die bei mir im Schrank hängen. Den SAT-Receiver möchte ich nur als trigger benutzen, da das Gerät immer eindeutig ein oder ausgeschaltet ist und ein LAN Interface besitzt. Einschalten möchte ich den Receiver nur manuell (per Homematic Fernbedienung / Steckdose), weil das Gerät sich direkt einschaltet wenn Spannung anliegt (nach Stromausfall, etc).

Gruß
cosinuz
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Otto123 am 02 Dezember 2016, 17:01:32
Ok,

aber presence macht doch den Job der Überprüfung? Wozu willst Du nochmal überwachen?

Gruß Otto

Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 02 Dezember 2016, 20:43:53
Hallo Otto,

was meinst Du mit "nochmal"?
Meinst Du?
ZitatWeitere Abfragen: Nach "alle 2 Minuten" und "Receiver = absent" und "Steckdose = on", 5 Minuten warten und noch einmal prüfen.
Wenn ich mit dem Receiver Filme aufnehme oder abspiele kann es passieren, dass mal ein paar "pings" am Interface verloren gehen. Dann würde die Steckdose mitten im Film einfach abgeschaltet.

Außerdem versuche ich so, DOIF besser zu verstehen. ;)

Gruß
cosinuz
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: Otto123 am 02 Dezember 2016, 21:45:54
Hi cosinuz,
deswegen sage ich doch Modul ENIGMA2
Beispiel:
Ich prüfe meinen Fernseher und wenn der aus ist und der Satreceiver nichts mehr aufnimmt, fahre ich den Receiver runter.

define di_Satbox DOIF (([LGwebOSTV] eq "absent") and ([ET9200:recordings] == 0)) (set ET9200 shutdown)

Das  Modul meldet sicher ob er läuft oder nicht.

So prüfe ich ob ein Gerät da ist und ob es länger als 5 min weg ist. Das könntest Du für Dich anpassen:

define di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set PersonOtto absent) DOELSEIF ([st_Dev_Otto] eq "present")(set PersonOtto present)
attr di_Dev_Otto room Status
attr di_Dev_Otto wait 300


Gruß Otto
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 02 Dezember 2016, 22:09:50
Zitat von: Otto123 am 02 Dezember 2016, 21:45:54
Hi cosinuz,
deswegen sage ich doch Modul ENIGMA2
Beispiel:
Ich prüfe meinen Fernseher und wenn der aus ist und der Satreceiver nichts mehr aufnimmt, fahre ich den Receiver runter.

define di_Satbox DOIF (([LGwebOSTV] eq "absent") and ([ET9200:recordings] == 0)) (set ET9200 shutdown)

Das  Modul meldet sicher ob er läuft oder nicht.

So prüfe ich ob ein Gerät da ist und ob es länger als 5 min weg ist. Das könntest Du für Dich anpassen:

define di_Dev_Otto DOIF ([st_Dev_Otto] eq "absent")(set PersonOtto absent) DOELSEIF ([st_Dev_Otto] eq "present")(set PersonOtto present)
attr di_Dev_Otto room Status
attr di_Dev_Otto wait 300


Gruß Otto

Mensch, jetzt weiss ich auch was Du meinst!! :)
Werde ich morgen direkt testen!! Danke! ;)
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: cosinuz am 03 Dezember 2016, 12:26:15
Hallo,

ich probiere es jetzt mal wie folgt. Scheint bis jetzt zu funktionieren.

define vuplusSZ01 ENIGMA2 10.10.10.64 80 20
define VAR_vuplusSZ01_CHECK01 dummy
define VAR_vuplusSZ01_CHECK02 DOIF ([AKTOR_SD_02] eq "on")(set VAR_vuplusSZ01_CHECK01 on) DOELSEIF ([AKTOR_SD_02] eq "off")(set VAR_vuplusSZ01_CHECK01 off)
attr VAR_vuplusSZ01_CHECK02 wait 300:0

define VAR_vuplusSZ01_CHECK03 DOIF ([vuplusSZ01:power] eq "off" and [VAR_vuplusSZ01_CHECK01] eq "on" and [AKTOR_SD_02] eq "on") (set AKTOR_SD_02 off)
attr VAR_vuplusSZ01_CHECK03 do always

define VAR_vuplusSZ01_CHECK04 DOIF ([03:00] and [AKTOR_SD_02] eq "on") (set vuplusSZ01 shutdown)
attr VAR_vuplusSZ01_CHECK04 do always

@Otto
Danke für den Tipp mit Enigma2! )

Gruß
cosinuz
Titel: Antw:DOIF mit lan-ping funktioniert bei mir nicht richtig
Beitrag von: satprofi am 04 Januar 2017, 19:57:17
Hallo.
Für E2 Receiver gibts doch ein geniales Plugin, ExecuteOnPowerEvent.
Damit kann man einstellen was bei Power_on od. Power_off machen will.

Unter /usr/script legt man sich 2 dateien an, fhemstatus_on.sh , fhemstatus_off.sh .
Diese editiert man dann:
fhemstatus_on.sh

#!/bin/sh
echo set Enigma2 on | nc 192.168.0.xx 7072 & # xx mit eigener ip ersetzen
exit 0


fhemstatus_off.sh

echo set Enigma2 off | nc 192.168.0.xx 7072 & # xx mit eigener ip ersetzen
exit 0


dann legt man sich einen Dummy in fhem an , define Enigma2 dummy

Jetzt wird bei jedem Ein- od. ausschalten der Box der status an fhem gesendet.
Dies kann man dann für div. Aktionen weiterverarbeiten. Ich schalte damit auch div. Steckdosen, vom TV bis AV-receiver ein/aus.