Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

MartinMuc

#1155
Hallo an die Profis des DOIFs,

ich hab ein kleines Problemchen das ich gerade nicht greifen kann.

Das ganze soll meine Presence stabiler steuern, ich will also eine halbe Stunde nachdem ich die Wohnung verlassen habe (iphone weg und türe innerhalb der Zeit geöffnet) mich abwesend setzen.

Den status Türe geöffnet und iphone weg erkennt er er geht in den cmd 2 wait Timer aber es wird dann nach 30 Minuten nicht geschaltet.

folgedes verwende ich :

define hs doif (([sec_eingang:state] eq "open" or [iPhoneWlan:state] eq "present" or [iPhone:state] eq "present") and ([?rr_Martin:state] ne "home")) (set rr_Martin home)
DOELSEIF ([iPhoneWlan:state] eq "absent" and [iPhone:state] eq "absent" and [?rr_Martin:state] eq "home" and [sec_eingang:state:sec]<1900) (set rr_Martin absent)
attr hs wait  0:1800



cmd_event  sec_eingang 2015-01-15 16:56:31
cmd_nr 1  2015-01-15 16:56:31
e_iPhoneWlan_state   absent   2015-01-16 08:10:12
e_iPhone_state  absent  2015-01-16 08:09:27
e_sec_eingang_state  closed  2015-01-16 08:08:21
state  cmd_1  2015-01-15 16:56:31
wait_timer  no timer  2015-01-16 08:40:12


Gruß
Martin
Cubietruck mit CUL und HM USB

Zephyr

Zitat von: Damian am 15 Januar 2015, 20:51:06
Lösung deines Problems sollte recht einfach sein. Durch das Schalten des Lichtest triggerst du dein Modul selbst. Daher solltest du deine Abfrage für den Lichtstatus mit Fragezeichen beginnen, damit dein Modul nicht erneut getriggert wird (das ist in der commandref des Moduls auch erklärt). Eigentlich reicht der trigger für "buttons", alles andere sind reine Abfragen. Also:

Ich gebe zu: Weil ich nicht verstanden habe, was das mit den Loops / Rekursionen zu bedeuten hat habe ich darüber in der Dokumentation hinweg gelesen. Aber herzlichen Dank für den Hinweis.

Viele Grüße
Zephyr
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Brockmann

Zitat von: MartinMuc am 16 Januar 2015, 08:48:13
cmd_event  sec_eingang 2015-01-15 16:56:31
cmd_nr 1  2015-01-15 16:56:31
e_iPhoneWlan_state   absent   2015-01-16 08:10:12
e_iPhone_state  absent  2015-01-16 08:09:27
e_sec_eingang_state  closed  2015-01-16 08:08:21
state  cmd_1  2015-01-15 16:56:31
wait_timer  no timer  2015-01-16 08:40:12

Das Problem dürfte hier liegen:
e_sec_eingang_state  closed  2015-01-16 08:08:21
Die wait-Periode startet um 08:10:12, dieses Reading wurde aber schon um 08:08:21 geschrieben.
Da kommt die Bedingung
[sec_eingang:state:sec]<1900
nicht mehr hin, weil der Wert um 08:40:12 schon >1900 ist.

MartinMuc

Ha ich blinder ;)

das ist es wohl da war mein Puffer zu klein.

Danke Brockmann probier ich aus.

viele Grüße
Martin
Cubietruck mit CUL und HM USB

Ironangel

Ich nochmal,

ich habe jetzt meinen DOIF-Befehl ein wenig umgestellt. Klappt aber irgendwie nicht. Ich erwarte jetzt die zweite Bedingung. Es kommt aber die dritte. Kann jemand einen Fehler sehen?


Internals:
   DEF        ([netatmo_cojones_indoor:co2]>"1200") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off, set LED_CO_Warnung off)
   NAME       netatmo
   NR         35
   NTFY_ORDER 50-netatmo
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-01-16 16:10:29   cmd_event       netatmo_cojones_indoor
     2015-01-16 16:10:29   cmd_nr          3
     2015-01-16 17:40:29   e_netatmo_cojones_indoor_co2 653
     2015-01-16 16:10:29   state           cmd_3
     2015-01-16 16:00:00   timer_1_c2      17.01.2015 16:00:00
     2015-01-16 12:11:32   timer_2_c2      16.01.2015 23:59:00
   Condition:
     0          ReadingValDoIf('netatmo_cojones_indoor','co2','')>"1200"
     1          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
   Days:
   Devices:
     0           netatmo_cojones_indoor
     all         netatmo_cojones_indoor
   Do:
     0          set LED_Mediteran off,set LED_CO_Warnung on
     1          set LED_Mediteran on
     2          set LED_Mediteran off, set LED_CO_Warnung off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
   Readings:
     0           netatmo_cojones_indoor:co2
     all         netatmo_cojones_indoor:co2
   Realtime:
     0          16:00:00
     1          23:59:00
   State:
   Time:
     0          16:00:00
     1          23:59:00
   Timecond:
     0          1
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     1           0  1
Attributes:
   room       Home

maxritti

Hallo zusammen,


irgendwie stehe ich nach wie vor mit meinen Rollos auf dem Kriegsfuss.
Gerade eben, als mein Helligkeitssensor die definierte Helligkeit unterschritten hat, sind die Rollos im EG alle runter gegangen.
Im OG dagegen sind alle oben geblieben. Und ich weiß nicht wirklich warum.

Hier mal die Definition eines DOIFs von einem im OG befindlichen Rollo:


([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "off" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
  (set OG_elt_RO_Strasse off)
DOELSEIF ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "on" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
  (set OG_elt_RO_Strasse on)

 
Und der Vollständigkeit halber auch mal ein list davon:

Internals:
   CFGFN
   DEF        ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "off" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and ([{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]))
  (set OG_elt_RO_Strasse off)
DOELSEIF ([du_Rollo_Master] eq "an" and [?OG_elt_RO_Strasse:state] ne "on" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
  (set OG_elt_RO_Strasse on)
   NAME       di_OG_elt_RO_Strasse
   NR         176
   NTFY_ORDER 50-di_OG_elt_RO_Strasse
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-01-15 17:09:42   cmd_event       EG_dr_TS_Terrasse
     2015-01-15 17:09:42   cmd_nr          1
     2015-01-16 18:58:49   e_EG_dr_TS_Terrasse_luminosity 0.14
     2015-01-15 17:09:42   state           cmd_1
     2015-01-16 16:10:00   timer_1_c1      17.01.2015 16:10:00
     2015-01-15 21:30:00   timer_2_c1      16.01.2015 21:30:00
     2015-01-15 21:30:00   timer_3_c1      16.01.2015 21:30:00
     2015-01-16 06:40:00   timer_4_c2      17.01.2015 06:40:00|8
     2015-01-16 09:30:00   timer_5_c2      17.01.2015 09:30:00|7
   Condition:
     0          InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ReadingValDoIf('OG_elt_RO_Strasse','state','') ne "off" and ((ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and (DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,""))) or DOIF_time_once($hash->{timer}{2},$wday,""))
     1          InternalDoIf('du_Rollo_Master','STATE','') eq "an" and ReadingValDoIf('OG_elt_RO_Strasse','state','') ne "on" and (DOIF_time_once($hash->{timer}{3},$wday,"8") or DOIF_time_once($hash->{timer}{4},$wday,"7"))
   Days:
     3          8
     4          7
   Devices:
     0           du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
     1           du_Rollo_Master
     all         du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru
   Do:
     0          set OG_elt_RO_Strasse off
     1          set OG_elt_RO_Strasse on
   Helper:
     last_timer 5
     sleeptimer -1
   Internals:
     0           du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
     1           du_Rollo_Master:STATE
     all         du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE
   Readings:
     0           EG_dr_TS_Terrasse:luminosity
     all         EG_dr_TS_Terrasse:luminosity
   Realtime:
     0          16:10:00
     1          21:30:00
     2          21:30:00
     3          06:40:00
     4          09:30:00
   State:
   Time:
     0          {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
     1          {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
     2          {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
     3          {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
     4          {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
   Timecond:
     0          0
     1          0
     2          0
     3          1
     4          1
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
   Timerfunc:
   Timers:
     0           0  1  2
     1           3  4
   Trigger:
Attributes:
   room       LichtRollo


Meiner Meinung nach hätte der off Befehl doch gesendet werden sollen, als EG_dr_TS_Terrasse:luminosity  kleiner als der Wert im Dummy du_Rollo_Luminosity_ru (ist eingestellt auf 0,7) geworden ist.
Irgendwie habe ich den Eindruck, dass dies an der Teilbedingung [?OG_elt_RO_Strasse:state] ne "off" liegt.
Denn wenn ich diese aus dem DOIF entferne, gehen die Rollos mMn verlässlich hoch und runter.
Sobald dies drin steht, gehts manchmal und manchmal wie vorhin eben nicht.

Nur ich bekomme noch nicht wirklich einen Idee warum es mal und mal nicht geht.
Ist diese [?OG_elt_RO_Strasse:state] nicht so, dass state von OG_elt_RO_Strasse abgefragt wird, sobald das DOIF durch ein anderes im DEF befindliches Event getriggert wird?

MartinMuc

Zitat von: Ironangel am 16 Januar 2015, 17:45:28
Ich nochmal,

ich habe jetzt meinen DOIF-Befehl ein wenig umgestellt. Klappt aber irgendwie nicht. Ich erwarte jetzt die zweite Bedingung. Es kommt aber die dritte. Kann jemand einen Fehler sehen?


Internals:
   DEF        ([netatmo_cojones_indoor:co2]>"1200") (set LED_Mediteran off,set LED_CO_Warnung on) DOELSEIF ([16:00-23:59]) (set LED_Mediteran on) DOELSE (set LED_Mediteran off, set LED_CO_Warnung off)
   NAME       netatmo
   NR         35
   NTFY_ORDER 50-netatmo
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-01-16 16:10:29   cmd_event       netatmo_cojones_indoor
     2015-01-16 16:10:29   cmd_nr          3
     2015-01-16 17:40:29   e_netatmo_cojones_indoor_co2 653
     2015-01-16 16:10:29   state           cmd_3
     2015-01-16 16:00:00   timer_1_c2      17.01.2015 16:00:00
     2015-01-16 12:11:32   timer_2_c2      16.01.2015 23:59:00
   Condition:
     0          ReadingValDoIf('netatmo_cojones_indoor','co2','')>"1200"
     1          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
   Days:
   Devices:
     0           netatmo_cojones_indoor
     all         netatmo_cojones_indoor
   Do:
     0          set LED_Mediteran off,set LED_CO_Warnung on
     1          set LED_Mediteran on
     2          set LED_Mediteran off, set LED_CO_Warnung off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
   Readings:
     0           netatmo_cojones_indoor:co2
     all         netatmo_cojones_indoor:co2
   Realtime:
     0          16:00:00
     1          23:59:00
   State:
   Time:
     0          16:00:00
     1          23:59:00
   Timecond:
     0          1
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     1           0  1
Attributes:
   room       Home


Bei dir haben die Cojones getriggert, da Bedingung 1 nicht zutrifft und Bedingung 2 keine Cojones hat bleibt nur der Else Fall übrig
Cubietruck mit CUL und HM USB

harry66

hallo,

hat jemand eine idee wie ich folgende DOIF ([GDS:a_valid] eq 1 and [GDS:a_count] eq 1 ) (set gds_Warnung [GDS:a_0_event], attr gds_Warnung fp_HOME 430,530,0) DOELSEIF ([GDS:a_valid] eq 1  and [GDS:a_count] eq 2 ) (set gds_Warnung [GDS:a_0_event]+[GDS:a_1_event], attr gds_Warnung fp_HOME 430,530,0) DOELSEIF ([GDS:a_valid] eq 0 ) (deleteattr gds_Warnung fp_HOME)

richtig schreiben muss damit "attr gds_Warnung fp_HOME 430,530,0" funktioniert.
Oder hat jemand eine andere Idee/Lösung um eine Wetterwarnung im Floorplan bei bedarf einzublenden/auszublenden.

Gruß Rolf
BananaPI, RPI, nanoCUL433, RCS 1000 N Comfort, Dect200, Powerline546E, MAX!Cube, 7xMAX! HT's,3xMAX!FK HMLAN, HM-LC-Bl1PBU-FM, HM-LC-Sw4-Ba-PCB Relay Karte,  LW12, Sqeezelite, TabletUI=Kindel 8" FireHD+Handy,AmazonEcho

MaJu

@harry:
Was ist denn wenn keine Warnung vorliegt?

Aus einem anderem Thema, das du hier nutzen kannst, so als Denkanstoß:
Ich habe im Floorplan eine Anzeige, wer anruft. Wenn kein Gespräch geführt wird, lasse ich den dummy dafür auf den Status "aufgelegt" setzen.
Dann habe ich widerum ein Bild das "Anrufanzeige.aufgelegt.png" heißt und 1x1 pixel transparent ist. Es wird also ein komplett durchsichtiges 1-Pixel-Bild angezeigt, damit verschwindet es auch vom Floorplan, ohne mit den Attributen zu spielen.

Also lass den dummy gds_Warnung auf "nichts" setzen wenn nix da ist und erstelle dir ein durchsichtiges 1-Pixel-Bild "gds_Warnung.nichts.png"
Erlebnisreiche Grüße aus Leipzig!

Ironangel

Zitat von: MartinMuc am 16 Januar 2015, 19:42:09
Bei dir haben die Cojones getriggert, da Bedingung 1 nicht zutrifft und Bedingung 2 keine Cojones hat bleibt nur der Else Fall übrig

Haha, auf dem Arm nehmen kann ich mich selbst. Ich frage hier, da ich eine vernünftige Antwort erwarte und nicht um mich verarschen zu lassen.

MartinMuc

Das war eine vernünftige Antwort Ironangel, netatmo hat mit 653 getriggert das ist nicht größer als 1200 darum ist fall 1 nicht gültig

In Zweig 2 steht keine Bedingung für Netatmo daher ist dieser Fall auch nicht gültig also bleibt dir nur der Else Fall, aber das hab ich ja schon geschrieben
Cubietruck mit CUL und HM USB

harry66

@MaJu gute Idee werde ich mal testen

Gruß Rolf
BananaPI, RPI, nanoCUL433, RCS 1000 N Comfort, Dect200, Powerline546E, MAX!Cube, 7xMAX! HT's,3xMAX!FK HMLAN, HM-LC-Bl1PBU-FM, HM-LC-Sw4-Ba-PCB Relay Karte,  LW12, Sqeezelite, TabletUI=Kindel 8" FireHD+Handy,AmazonEcho

Ironangel

Zitat von: MartinMuc am 17 Januar 2015, 07:50:50
Das war eine vernünftige Antwort Ironangel, netatmo hat mit 653 getriggert das ist nicht größer als 1200 darum ist fall 1 nicht gültig

In Zweig 2 steht keine Bedingung für Netatmo daher ist dieser Fall auch nicht gültig also bleibt dir nur der Else Fall, aber das hab ich ja schon geschrieben

Ups, sorry. Habe ich in den falschen Hals bekommen.

Soll ja auch so sein. Aber ich hatte den zweiten Teil erwartet. Wenn der Co2 nicht höher ist wie 1200 dann soll in der Zeit von 16:00 - 23:59 Uhr die LED_Mediteran angehen. Wenn wir nach 16:00 Uhr haben, trifft dieser Fall doch zu. Gerade traff der zweite Teil zu. Aber um 16:10 hat fhem wieder den dritten Teil aktiviert. Wieso? Wo ist den mein Denkfehler?

VG,
Jörg

MartinMuc

#1168
Jedesmal wenn sich der netatmo wert verändert passiert entweder Bedingung 1 oder der elsefall. Packe in das doelse noch einen netatmo <=1200 dann zieht der in der Zeit und nicht der elsefall
Cubietruck mit CUL und HM USB

Ironangel

Danke, probiere ich.