Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

satprofi

Alles klar. Werds ausbessern. Habe anderen thread gefunden wo selbiges problem auftritt aber HCS Modul verdächtigt wird

Gesendet von meinem GT-I9300

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Simon74

Kann ich DOIF für meine Kamerasteuerung sinnvoll nutzen ?
Also Positionen anfahren und Motion-Detect On/Off, alles in einem DOIF anstatt notifys..

Wäre mein Code so richtig ?
Was er machen soll, Logik:
1. Wenn Kamera eingeschaltet
2. Wenn Personen abwesend: Set Kameraposition + Motion-Detect ON
3. Wenn TV und LED aus: Set Kameraposition + Motion-Detect ON (Nachtalarm)
4. Wenn 2+3 nicht zutrifft: Kameraposition + Motion-Detect OFF

cam.alarm_on.off
([t5.ping.cam1] eq "present") ()
DOELSEIF ([Personen:state] eq "absent")
  (set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ([!isday()] and [t5.ku.sd2_Sw] eq "off" and [t5.wz.sd1_Sw] eq "off")
  (set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Nacht)"})
DOELSE 
  (set t5.cam1 cmd 9,set t5.cam1 cmd 14,{Log 1, "Kamera-Alarm: Aus"})



Damian

Zitat von: Simon74 am 04 November 2014, 14:22:39
Kann ich DOIF für meine Kamerasteuerung sinnvoll nutzen ?
Also Positionen anfahren und Motion-Detect On/Off, alles in einem DOIF anstatt notifys..

Wäre mein Code so richtig ?
Was er machen soll, Logik:
1. Wenn Kamera eingeschaltet
2. Wenn Personen abwesend: Set Kameraposition + Motion-Detect ON
3. Wenn TV und LED aus: Set Kameraposition + Motion-Detect ON (Nachtalarm)
4. Wenn 2+3 nicht zutrifft: Kameraposition + Motion-Detect OFF

cam.alarm_on.off
([t5.ping.cam1] eq "present") ()
DOELSEIF ([Personen:state] eq "absent")
  (set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ([!isday()] and [t5.ku.sd2_Sw] eq "off" and [t5.wz.sd1_Sw] eq "off")
  (set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Nacht)"})
DOELSE 
  (set t5.cam1 cmd 9,set t5.cam1 cmd 14,{Log 1, "Kamera-Alarm: Aus"})



cam.alarm_on.off ist keine Bedingung
([t5.ping.cam1] eq "present") ()  was soll hier passieren.

Bitte noch mal genau in der Commandref nach der Syntax schauen.

Vielleicht meinst du so etwas:

define di_kamera DOIF ([t5.ping.cam1] eq "present" and [Personen:state] eq "absent")
  (set t5.cam1 cmd 6,set t5.cam1 cmd 15,{Log 1, "Kamera-Alarm: Ein (Abwesend)"})
DOELSEIF ..


Sonst die Beispiel in der Commanref noch mal studieren.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Simon74

Achso sorry, die erste Codezeile sollte nur den Namen der Definition darstellen.
Commandref habe ich schon gelesen: Von links nach rechts und,
"Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist"

Also muss ich immer ALLE Bedinungen bei mehreren DOIFELSE schreiben, richtig ?

Damian

Zitat von: Simon74 am 04 November 2014, 16:43:21
Achso sorry, die erste Codezeile sollte nur den Namen der Definition darstellen.
Commandref habe ich schon gelesen: Von links nach rechts und,
"Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist"

Also muss ich immer ALLE Bedinungen bei mehreren DOIFELSE schreiben, richtig ?

ja, und in die jeweilige Bedingung muss alles rein, was für die Ausführung wichtig ist - mit and bzw. or verknüpft.

Der letzte DOELSE-Fall ohne Bedingung ist bei mehreren Bedingung mit Vorsicht zu genießen. Da kann es schnell passieren, dass man eine Konstellation übersehen hat, die dann zu diesem "sonst"-Fall führt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Simon74

Ich habe noch ein Beispiel das ich nicht gelöst bekomme.
Ich möchte wenn Helligkeit > 35 und Anwesend die Leds einschalten.
Ausschalten erst wieder wenn PC und Receiver ausgeschaltet werden.

([bewemelder:brightness] < 35 and [!isday()] and [Personen:state] ne "absent" and ([pc:state] eq "on" or [receiver:state] eq "on"))
(set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
  DOELSE
  (set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})


Die Probleme dabei:
   1. Wenn ich zwischendurch das Licht einschalte, schalten (Bewegungsmelderhelligkeit) die Leds wieder aus, möchte ich nicht
   2. Wenn ich dazwischen abwesend war gehen die Leds nicht mehr an (Leds werden vom Abwesenheitstrigger mit ausgeschaltet)
   3. Einschalten sollte es immer wenn Anwesend und Helligkeit> (ohne den Status der Geräte)
   

Damian

Zitat von: Simon74 am 04 November 2014, 22:30:05
Ich habe noch ein Beispiel das ich nicht gelöst bekomme.
Ich möchte wenn Helligkeit > 35 und Anwesend die Leds einschalten.
Ausschalten erst wieder wenn PC und Receiver ausgeschaltet werden.

([bewemelder:brightness] < 35 and [!isday()] and [Personen:state] ne "absent" and ([pc:state] eq "on" or [receiver:state] eq "on"))
(set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
  DOELSE
  (set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})


Die Probleme dabei:
   1. Wenn ich zwischendurch das Licht einschalte, schalten (Bewegungsmelderhelligkeit) die Leds wieder aus, möchte ich nicht
   2. Wenn ich dazwischen abwesend war gehen die Leds nicht mehr an (Leds werden vom Abwesenheitstrigger mit ausgeschaltet)
   3. Einschalten sollte es immer wenn Anwesend und Helligkeit> (ohne den Status der Geräte)

[!isday()] kann nicht gut funktionieren.

vielleicht kannst du darauf aufbauen:

([bewemelder:brightness] > 35 and !isday() and [Personen:state] ne "absent" )
    (set t5.wz.bs1.b on,{Log 1, "bm.fl_wz.led.brightness: LED Ein"})
DOELSEIF ([pc:state] eq "off" and [receiver:state] eq "off" or [Personen:state] eq "absent")
    (set t5.wz.bs1.b off,{Log 1, "bm.fl_wz.led.brightness: LED Aus"})


Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

hansgans

ich hab da irgendwo nen fehler  kann mir da wer helfen ?

define waschen DOIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "off" ) (set sw_wasch_Sw on) DOELSEIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "on" ) (set sw_wasch_Sw off)

sw_kueche_oben_01 ist ein HM-PB-2-WM55 und sw_wasch_Sw ne HM-ES-PMSw1-Pl und ich will auf long ne schaltung von der HM-ES-PMSw1-Pl

weil auf short schon was anderes drauf läuft






Simon74

Vielen Dank Damian für den richtigen Ansatz, ich komme nun weiter.. :-)

Damian

#654
Zitat von: hansgans am 05 November 2014, 19:08:42
ich hab da irgendwo nen fehler  kann mir da wer helfen ?

define waschen DOIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "off" ) (set sw_wasch_Sw on) DOELSEIF ([sw_kueche_oben_01] eq "Long.1.*" and [sw_wasch_Sw] eq "on" ) (set sw_wasch_Sw off)

sw_kueche_oben_01 ist ein HM-PB-2-WM55 und sw_wasch_Sw ne HM-ES-PMSw1-Pl und ich will auf long ne schaltung von der HM-ES-PMSw1-Pl

weil auf short schon was anderes drauf läuft

Triggern auf etwas in der Bedingung hier: sw_wash_Sw , was man im Modul setzt, führt zu einer Rekursion - das ist schlecht, daher

eher so:

define waschen DOIF ([sw_kueche_oben_01] =~ "Long.1.")
(   IF ([sw_wasch_Sw] eq "off")
      (set sw_wasch_Sw on)
    ELSE
      (set sw_wasch_Sw off)
)


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Puschel74

Nach 44 Seiten noch immer nicht alle Fälle abgedeckt - DOIF scheint ja wohl ziemlich mächtig zu sein (oder die wenigsten haben Lust die commandref oder den Beitrag zu lesen  8) ).
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Damian

Zitat von: Puschel74 am 05 November 2014, 22:59:11
Nach 44 Seiten noch immer nicht alle Fälle abgedeckt - DOIF scheint ja wohl ziemlich mächtig zu sein (oder die wenigsten haben Lust die commandref oder den Beitrag zu lesen  8) ).

Naja, es werden auch noch weitere 44 Seiten dazukommen ;) . Spätestens wenn die nächste Version erscheint, die noch mehr interessante Fälle abdecken wird.

Das ist aber nicht schlimm. Zumindest weiß irgendwann jeder, wo er zum Thema DOIF fragen kann. Auch wenn vieles durch lesen der umfangreichen Commandref zum DOIF-Modul selbsterklärend sein sollte.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

satprofi

DOIF ist für ONUs ideal

Gesendet von meinem GT-I9300

gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

der-Lolo

Hallo Damian und sonstige mitleser...

Ich bin damit beschäftigt ein DOIF zu entwickeln, drehe mich aber ein bisschen im Kreis.
Es geht mir um meinen Sonos Play3 der im Bad steht, dieser wird über eine PhilipsHue Steckdose geschaltet ( pl_soBad )
Nun passiert etwa 1 von 4 mal das der player sich nicht richtig im Sonos Netz anmeldet.
Obwohl er über die Fritzbox und seine Mac Adresse die IP 192.168.178.53 zugewiesen bekommt meldet er sich bei den anderen Sonos Teilnehmern und dem Sonos Modul mit der IP 192.168.0.57

Auf Sonos Seite versuche ich schon sehr lange diesen Fehler zu verhindern - es gelingt mir aber nicht.

Ich habe nun also ein Presence Device ( pr_soBad ) auf die richtige IP gesetzt und wünsche mir das:
Wenn ich die Steckdose anschalte und der Player diese IP bezieht - das Presence Device und ein Timer disabled wird.
Wenn ich die Steckdose anschalte und der Player die falsche IP benutzt - ein Timer nach zwei Minuten die Steckdose für 10sek ausschaltet und ein neuer Versuch gestartet wird.
Das ganze Spiel soll solange stattfinden bis der player sich korrekt angemeldet hat.

Der Player brauch nach anschalten bis zu 2 Minuten um sich überhaupt anzumelden, deswegen würde ich den Timer starten wenn ich die Steckdose einschalte. Zur zeit sieht das so aus:
ZitatInternals:
   DEF        ([pl_soBad] eq "on") (attr pr_soBad disable 0,attr at_soBad disable 0)
DOELSEIF ([pl_soBad] eq "off") (attr pr_soBad disable 1,attr at_soBad disable 1)
DOELSEIF ([pr_soBad] eq "present") (attr at_soBad disable 1,set Events add Bad Player erkannt)
DOELSEIF ([pr_soBad] eq "disabled") (set Events add Presence Bad disable)
DOELSEIF ([pr_soBad] eq "absent") (set Events add scane nach Player Bad)
DOELSE (set Events add Else Fall do_soBad)
   NAME       do_soBad

Problem ist das der Timer ( at_soBad ) sich nach auslösen löscht.

Ich vermute ein Watchdog würde mir helfen, weiss aber nicht so recht wie und wo ich ansetzen müsste.

Vielleicht kannst Du Damian - oder ein anderer mitleser mir helfen.

1000 Dank!



Damian

#659
Zitat von: der-Lolo am 06 November 2014, 14:14:21
Hallo Damian und sonstige mitleser...

Ich bin damit beschäftigt ein DOIF zu entwickeln, drehe mich aber ein bisschen im Kreis.
Es geht mir um meinen Sonos Play3 der im Bad steht, dieser wird über eine PhilipsHue Steckdose geschaltet ( pl_soBad )
Nun passiert etwa 1 von 4 mal das der player sich nicht richtig im Sonos Netz anmeldet.
Obwohl er über die Fritzbox und seine Mac Adresse die IP 192.168.178.53 zugewiesen bekommt meldet er sich bei den anderen Sonos Teilnehmern und dem Sonos Modul mit der IP 192.168.0.57

Auf Sonos Seite versuche ich schon sehr lange diesen Fehler zu verhindern - es gelingt mir aber nicht.

Ich habe nun also ein Presence Device ( pr_soBad ) auf die richtige IP gesetzt und wünsche mir das:
Wenn ich die Steckdose anschalte und der Player diese IP bezieht - das Presence Device und ein Timer disabled wird.
Wenn ich die Steckdose anschalte und der Player die falsche IP benutzt - ein Timer nach zwei Minuten die Steckdose für 10sek ausschaltet und ein neuer Versuch gestartet wird.
Das ganze Spiel soll solange stattfinden bis der player sich korrekt angemeldet hat.

Der Player brauch nach anschalten bis zu 2 Minuten um sich überhaupt anzumelden, deswegen würde ich den Timer starten wenn ich die Steckdose einschalte. Zur zeit sieht das so aus:
Problem ist das der Timer ( at_soBad ) sich nach auslösen löscht.

Ich vermute ein Watchdog würde mir helfen, weiss aber nicht so recht wie und wo ich ansetzen müsste.

Vielleicht kannst Du Damian - oder ein anderer mitleser mir helfen.

1000 Dank!

Könnte ohne zusätzliche Timer so funktionieren :

define di_sono DOIF ([pl_soBad] eq "on")
(
IF ([pr_soBad] eq "present")
   (set Events add Bad Player erkannt)
ELSE
   (set pl_soBad off, define at_pl_soBad at +00:00:10 set pl_soBad on)
)
attr di_sono wait 120
attr di_sono do always


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF