Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Aarghh

Moin Moin,

ich habe jetzt lange probiert, getestet und evaluiert. Und anscheinend triggert DOIF bei mir bei jeder Änderung des GEOFANCY Moduls. Egal wer grade wo ankommt oder weggeht.
Kann natürlich auch ein Fehler der Implementierung von GEOFANCY, Denkfehler meinerseits oder vielleicht ja auch so gewollt sein, ich versuch es erstmal hier, weil ein notify korrekt funktioniert. Zum Versuchsaufbau:  ;)

DOIF:
define do_PERSON2_Status DOIF ([geofancy:PERSON2] =~ "left ORT" and [?do_PERSON2_Status] eq "anwesend") (...)

NOTIFY (funktioniert):
geofancy.*PERSON2.* set push msg 'Test' 'notify durch geofancy ausgelöst' 'Mich' 0 ''

Wenn jetzt eine ANDERE Person einen Ort verlässt oder betritt, wird das DOIF von PERSON2 getriggert. Die betreffenden Readings für PERSON2 sind zu dem Moment zutreffend:

  geofancy:PERSON2  = left Ort1
  do_PERSON2_Status = anwesend

sollten aber ja nicht ausgewertet werden(,oder?), da PERSON2 sich "nicht bewegt" hat und damit kein Event für diese Readings vom GEOFANCY Modul ausgelöst wurde. Events von do_PERSON2_Status sollten durch das ? ja eh nicht beachtet werden, richtig?

Riecht also alles nach nem Problem von GEOFANCY dachte ich. (Leider) hat ein test Notify korrekt funktioniert und triggert nur bei Bewegungen von PERSON2.

Also, hab ich was falsch verstanden? Oder funktioniert hier was nicht so, wie es soll?

Schönen Gruß,

    Alex

Damian

Zitat von: Aarghh am 01 Februar 2015, 12:33:02
Moin Moin,

ich habe jetzt lange probiert, getestet und evaluiert. Und anscheinend triggert DOIF bei mir bei jeder Änderung des GEOFANCY Moduls. Egal wer grade wo ankommt oder weggeht.
Kann natürlich auch ein Fehler der Implementierung von GEOFANCY, Denkfehler meinerseits oder vielleicht ja auch so gewollt sein, ich versuch es erstmal hier, weil ein notify korrekt funktioniert. Zum Versuchsaufbau:  ;)

DOIF:
define do_PERSON2_Status DOIF ([geofancy:PERSON2] =~ "left ORT" and [?do_PERSON2_Status] eq "anwesend") (...)

NOTIFY (funktioniert):
geofancy.*PERSON2.* set push msg 'Test' 'notify durch geofancy ausgelöst' 'Mich' 0 ''

Wenn jetzt eine ANDERE Person einen Ort verlässt oder betritt, wird das DOIF von PERSON2 getriggert. Die betreffenden Readings für PERSON2 sind zu dem Moment zutreffend:

  geofancy:PERSON2  = left Ort1
  do_PERSON2_Status = anwesend

sollten aber ja nicht ausgewertet werden(,oder?), da PERSON2 sich "nicht bewegt" hat und damit kein Event für diese Readings vom GEOFANCY Modul ausgelöst wurde. Events von do_PERSON2_Status sollten durch das ? ja eh nicht beachtet werden, richtig?

Riecht also alles nach nem Problem von GEOFANCY dachte ich. (Leider) hat ein test Notify korrekt funktioniert und triggert nur bei Bewegungen von PERSON2.

Also, hab ich was falsch verstanden? Oder funktioniert hier was nicht so, wie es soll?

Schönen Gruß,

    Alex

dann musst du wie bei notify auf das Ereigniss triggern:

define do_PERSON2_Status DOIF ([geofancy:?PERSON2] and [?do_PERSON2_Status] eq "anwesend") (...)

Gruß

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

duke-f

Zitat von: KernSani am 01 Februar 2015, 01:08:25
Ich begebe mich auf dünnes Eis, da ich DOIF zwar verwende aber sicher kein Experte bin... Meinem Verständnis nach funktioniert dein DOELSEIF-Zweig nur, wenn es 16:00 Uhr ist und de entsprechenden Events für WasserKeller und WM_16Uhr eintreten. Das wird wohl kaum der Fall sein. Für reine Statusabfragen gibt's das ? - siehe commandref.

Grüße,

Oli

Das scheint es gewesen zu sein.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Aarghh

Ahhh, ohhh, aha!
..und es hat klick gemacht! Wieso bin ich da noch nie vorher gegengelaufen?
Auf jeden Fall 1000 Dank für das bestimmt 100 mal Beantworten genau dieser Frage! ;)

Gruß, Alex

Damian

Zitat von: Aarghh am 02 Februar 2015, 12:42:33
Ahhh, ohhh, aha!
..und es hat klick gemacht! Wieso bin ich da noch nie vorher gegengelaufen?
Auf jeden Fall 1000 Dank für das bestimmt 100 mal Beantworten genau dieser Frage! ;)

Gruß, Alex

Dass man nach reinen Ereignissen mit regulären Ausdrücken triggern kann, wie beim notify, ist nicht selbstverständlich. Diese Funktionalität mit Fragezeichen wurde erst in den letzten Versionen von DOIF eingebaut (und in der Doku aufgenommen).

Gruß

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

Spartacus

Hallo,
habe gerade einen Hänger!

Will in einem DOIF ein Dummy Device abfragen.
([Test.dum] = 10) (set Test on)
DOELSE (set Test off)

funktioniert nicht, wenn Test.dum auf 10 gesetzt wird.
allerdings funzt dies hier korrekt.
([Test.dum] < 10) (set Test on)
DOELSE (set Test off)


Wie frage ich denn auf Gleichheit ab?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 02 Februar 2015, 22:21:09
Hallo,
habe gerade einen Hänger!

Will in einem DOIF ein Dummy Device abfragen.
([Test.dum] = 10) (set Test on)
DOELSE (set Test off)

funktioniert nicht, wenn Test.dum auf 10 gesetzt wird.
allerdings funzt dies hier korrekt.
([Test.dum] < 10) (set Test on)
DOELSE (set Test off)


Wie frage ich denn auf Gleichheit ab?
Christian

mit: ==

bei Zeichenketten: eq

So etwas steht aber in der Commandref zu DOIF.

Gruß

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

Spartacus

Hi Damian,
Mit == funzt bei diesem Bsp. auch nicht! Sorry hatte vergessen es zu erwähnen!
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Damian,
Vergiss es! Ich hatte ein Leerzeichen vergessen.
Geht jetzt!
Danke,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

FunkOdyssey

Zitat von: Damian am 30 Januar 2015, 23:50:45
So, ich habe bei mir die Sache nachgestellt, mit:

DEF        ([{ReadingsVal("test_d","state","00:00")}])(set bla on)
   NAME       di_test
   NR         374
   NTFY_ORDER 50-di_test
   STATE      initialized
   TYPE       DOIF
   Readings:
     2015-01-30 23:38:45   state           initialized
     2015-01-30 23:38:45   timer_1_c1      31.01.2015 15:00:00


und

DEF        ([global:?INITIALIZED] or [test_d:?])(modify di_test [di_test:&DEF])
   NAME       di_init
   NR         375
   NTFY_ORDER 50-di_init
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-01-30 23:38:45   cmd_event       global
     2015-01-30 23:38:45   cmd_nr          1
     2015-01-30 23:38:45   e_global_events INITIALIZED
     2015-01-30 23:37:53   e_test_d_events 15:00
     2015-01-30 23:38:45   state           cmd_1


funktioniert alles wie gewünscht, sowohl "set test_d 15:00" als auch Neustart führen zum korrekten Setzen der Zeit bei di_test.

Du musst bei [global:?INITIALIZED] Großbuchstaben verwenden.

Gruß

Damian

Ich habe eure Diskussion verfolgt, da ich ähnliches vorhab. Darum habe ich euren Tipp nun ausprobiert und folgenden Code im Einsatz:


auto_jal_master] eq "ja")
  (attr di_auto_jal_1 disable 0)
DOELSEIF
([auto_jal_master] eq "nein")
  (attr di_auto_jal_1 disable 1)
DOELSEIF
(
[auto_jal_time_workday]
or [auto_jal_time_weekend]
or [auto_jal_time_close_min]
or [auto_jal_time_close_max]
or [global:?INITIALIZED]
)
  (modify di_auto_jal_1 [di_auto_jal_1:&DEF])


Hier ist mir jedoch nun aufgefallen, dass Readings sekündlich aktualisiert werden. Die Uhrzeiten bei den Readings sind somit immer rot. Außerdem füllt sich die Liste der "10 letzten Änderungen" (?-Symbol beim Save config-Button) mit Massen an Änderungen.

Hat jemand einen Tipp, woran das liegt?
Oder bracht ihr auch den anderen Code rund um die Dummys und der DOIFs?
Ich habe die Zeile mit dem [global:?INITIALIZED] erst einmal wieder entfernt. Daher kann ich den Fehler auch gerade schlecht beschreiben.

duke-f

#1270
Zitat von: duke-f am 02 Februar 2015, 08:44:12
Das scheint es gewesen zu sein.

Hab' mich zu früh gefreut. Nachdem ich alles auf folgende Art geändert habe, ging gestern früh das Radio wie gewollt an, heute jedoch wieder nicht. :(

Jetzt ist das entsprechende DOIF so:

define Wecker dummy
attr Wecker group Wecker
attr Wecker room Kinderzimmer,Medien,Wecker
attr Wecker setList state:off,normal,Cottbus
attr Wecker webCmd state


define Radio_Wecker DOIF ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)


EDIT:
Ich vergaß zu erwähnen: Im Log gibt es um 6:57 keinen Eintrag.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Damian

Zitat von: duke-f am 03 Februar 2015, 08:02:34
Hab' mich zu früh gefreut. Nachdem ich alles auf folgende Art geändert habe, ging gestern früh das Radio wie gewollt an, heute jedoch wieder nicht. :(

Jetzt ist das entsprechende DOIF so:

define Wecker dummy
attr Wecker group Wecker
attr Wecker room Kinderzimmer,Medien,Wecker
attr Wecker setList state:off,normal,Cottbus
attr Wecker webCmd state


define Radio_Wecker DOIF ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)


EDIT:
Ich vergaß zu erwähnen: Im Log gibt es um 6:57 keinen Eintrag.

Dann poste hier die Ausgabe von:  list Radio_Wecker

Gruß

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

duke-f

Zitat von: Damian am 03 Februar 2015, 11:04:10
Dann poste hier die Ausgabe von:  list Radio_Wecker

Gruß

Damian

Aber gerne doch.

Radio_Wecker

Internals:
   DEF        ([06:57|8] and [?Wecker] eq "normal") (set Panasonic on,set Pumpe_Hz on-for-timer 180) DOELSEIF ([05:58] and [?Wecker] eq "Cottbus") (set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off)
   NAME       Radio_Wecker
   NR         542
   NTFY_ORDER 50-Radio_Wecker
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-02-02 06:57:00   cmd_event       timer_1
     2015-02-02 06:57:00   cmd_nr          1
     2015-02-02 06:57:00   state           cmd_1
     2015-02-03 06:57:00   timer_1_c1      04.02.2015 06:57:00|8
     2015-02-03 05:58:00   timer_2_c2      04.02.2015 05:58:00
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"8") and InternalDoIf('Wecker','STATE','') eq "normal"
     1          DOIF_time_once($hash->{timer}{1},$wday,"") and InternalDoIf('Wecker','STATE','') eq "Cottbus"
   Days:
     0          8
   Devices:
   Do:
     0          set Panasonic on,set Pumpe_Hz on-for-timer 180
     1          set Pumpe_Hz on-for-timer 180,set Panasonic on,set Wecker normal,define Pana_Cottbus at 07:05 set Panasonic off
   Helper:
     last_timer 2
     sleeptimer -1
   Internals:
   Readings:
   Realtime:
     0          06:57:00
     1          05:58:00
   State:
   Time:
     0          06:57:00
     1          05:58:00
   Timecond:
     0          0
     1          1
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0
     1           1
Attributes:
   group      Wecker
   room       Kinderzimmer,Wecker


und Wecker:

Internals:
   NAME       Wecker
   NR         540
   STATE      normal
   TYPE       dummy
   Readings:
     2015-01-31 15:18:17   state           normal
Attributes:
   group      Wecker
   room       Kinderzimmer,Medien,Wecker
   setList    state:off,normal,Cottbus
   webCmd     state
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Brockmann

Zitat von: duke-f am 03 Februar 2015, 11:25:26
Radio_Wecker

Das DOIF ändert innerhalb der Woche seinen Status nie (sofern sich Wecker nicht ändert).
Folglich wird eine Aktion Montags ausführt und dann erst wieder wieder Samstags, weil da die andere Bedingung zutrifft und sich der Zustand ändert.

Hier gilt (wenn auch in etwas erweitertem Sinn):

Zitat von: Commandref
Angaben, bei denen aufgrund der Definition kein Zustandswechsel erfolgen kann z. B.:

define di_light DOIF ([08:00]) (set switch on)
attr di_light do always

müssen mit Attribut do always definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.

Damian

Zitat von: Brockmann am 03 Februar 2015, 12:44:31
Das DOIF ändert innerhalb der Woche seinen Status nie (sofern sich Wecker nicht ändert).
Folglich wird eine Aktion Montags ausführt und dann erst wieder wieder Samstags, weil da die andere Bedingung zutrifft und sich der Zustand ändert.

Hier gilt (wenn auch in etwas erweitertem Sinn):

ja, hier fehlt offenbar das do always Attribut.

Gruß

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