Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Brockmann

Zitat von: Spartacus am 20 Februar 2015, 19:04:14
Aber das Einschalten funzt halt nicht mehr, wenn ich state.NRW.FerienClone.dum  wieder auf "0" setze!

Natürlich funktioniert das nicht und warum das so ist, hatte ich ja auch geschrieben. Wenn Du als Teilbedingung einfach nur [state.NRW.FerienClone.dum] ohne Vergleich nimmst, dann ist diese Teilbedingung IMMER WAHR. Also egal, ob Du [state.NRW.FerienClone.dum] auf 1 oder 0 setzt, dieser Teil der Bedingung ist immer wahr. Solange [OG.kz.AL.Wecker.dum] auf "ein" steht, wird das DOIF deshalb immer die erste Kondition treffen und niemals die zweite. Aber es müsste die zweite treffen um den Wecker auszuschalten. Deshalb kannst Du den Wecker ein-, aber nicht wieder ausschalten. Du musst also [state.NRW.FerienClone.dum] in der Kondition mit irgendwas vergleichen. Womit genau, kann ich aber nur mutmassen, da ich ja nicht weiß, was so für Daten in Deinen Dummy stehen. Deshalb schrieb ich ja auch "Meinst Du vielleicht".

Spartacus

#1426
Zitat von: Brockmann am 21 Februar 2015, 15:03:18
Natürlich funktioniert das nicht und warum das so ist, hatte ich ja auch geschrieben. Wenn Du als Teilbedingung einfach nur [state.NRW.FerienClone.dum] ohne Vergleich nimmst, dann ist diese Teilbedingung IMMER WAHR. Also egal, ob Du [state.NRW.FerienClone.dum] auf 1 oder 0 setzt, dieser Teil der Bedingung ist immer wahr. Solange [OG.kz.AL.Wecker.dum] auf "ein" steht, wird das DOIF deshalb immer die erste Kondition treffen und niemals die zweite. Aber es müsste die zweite treffen um den Wecker auszuschalten. Deshalb kannst Du den Wecker ein-, aber nicht wieder ausschalten. Du musst also [state.NRW.FerienClone.dum] in der Kondition mit irgendwas vergleichen. Womit genau, kann ich aber nur mutmassen, da ich ja nicht weiß, was so für Daten in Deinen Dummy stehen. Deshalb schrieb ich ja auch "Meinst Du vielleicht".
Hallo Brockmann,
ok, mag sein! Dann müsste der Code also so aussehen, da "state.NRW.FerienClone.dum" die Werte "1" oder "0" annehmen können.

(([state.NRW.FerienClone.dum] eq "1" or [hl.01.Feiertag.cdm:today] ne "none")  and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))


Allerdings triggert er immer noch auf cmd1, wenn FerienClone von "1" auf "0" gesetzt wird!  Ich verstehe das irgendwie noch nicht!
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

Brockmann

#1427
Zitat von: Spartacus am 21 Februar 2015, 15:51:00
Allerdings triggert er immer noch auf cmd1, wenn FerienClone von "1" auf "0" gesetzt wird!  Ich verstehe das irgendwie noch nicht!
Probier es mal mit [state.NRW.FerienClone.dum] == 1, weil es ja ein numerischer Vergleich ist.
Ansonsten in der Situation list <Name Deines DOIFs> und entweder selbst analysieren oder hier posten.

automatisierer

Zitat von: Brockmann am 21 Februar 2015, 16:20:36
Probier es mal mit [state.NRW.FerienClone.dum] = 1, weil es ja ein numerischer Vergleich ist.
Ansonsten in der Situation list <Name Deines DOIFs> und entweder selbst analysieren oder hier posten.

ich will nicht klugscheißen, aber mit einem = wirds wohl nicht funzen, müssen schon == sein.

Brockmann

Zitat von: automatisierer am 21 Februar 2015, 16:27:07
ich will nicht klugscheißen, aber mit einem = wirds wohl nicht funzen, müssen schon == sein.
Wo Du Recht hast...

Spartacus

Hi,
sorry! Es funzt nicht! Die Events von "state.NRW.FerienClone.dum" kann ich im EventLog sehen, die kommen sauber. "OG.kz.AL.Wecker.dum" habe ich permanent auf "ein" stehen. aber es wird immer cmd1 ausgeführt. Egal welchen Wert ich in "state.NRW.FerienClone.dum" einstelle!
nternals:
   CFGFN      Config/98-Sonos.cfg
   DEF        (([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none")  and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
   NAME       di.01.OG.kz.SON.ZP_S1
   NR         142
   NTFY_ORDER 50-di.01.OG.kz.SON.ZP_S1
   STATE      ein
   TYPE       DOIF
   Readings:
     2015-02-21 16:42:27   cmd_event       state.NRW.FerienClone.dum
     2015-02-21 16:42:27   cmd_nr          1
     2015-02-21 16:43:20   e_state.NRW.FerienClone.dum_STATE 1
     2015-02-21 16:42:27   state           ein
   Condition:
     0          (InternalDoIf('state.NRW.FerienClone.dum','STATE','') == 1 or ReadingValDoIf('hl.01.Feiertag.cdm','today','') ne "none")  and InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
     1          InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
     2          InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "aus"
   Devices:
     0           state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
     1           OG.kz.AL.Wecker.dum
     2           OG.kz.AL.Wecker.dum
     all         state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
   Do:
     0          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
     1          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1})
     2          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
     1           OG.kz.AL.Wecker.dum:STATE
     2           OG.kz.AL.Wecker.dum:STATE
     all         state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
   Readings:
     0           hl.01.Feiertag.cdm:today
     all         hl.01.Feiertag.cdm:today
   State:
   Timerfunc:
   Trigger:
Attributes:
   alias      Weckersteuerung
   cmdState   ein|ein|aus
   group      Sonos Script
   room       98-Sonos


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

automatisierer

#1431
Zitat von: Spartacus am 21 Februar 2015, 16:49:47
Hi,
sorry! Es funzt nicht! Die Events von "state.NRW.FerienClone.dum" kann ich im EventLog sehen, die kommen sauber. "OG.kz.AL.Wecker.dum" habe ich permanent auf "ein" stehen. aber es wird immer cmd1 ausgeführt. Egal welchen Wert ich in "state.NRW.FerienClone.dum" einstelle!
nternals:
   CFGFN      Config/98-Sonos.cfg
   DEF        (([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none")  and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
   NAME       di.01.OG.kz.SON.ZP_S1
   NR         142
   NTFY_ORDER 50-di.01.OG.kz.SON.ZP_S1
   STATE      ein
   TYPE       DOIF
   Readings:
     2015-02-21 16:42:27   cmd_event       state.NRW.FerienClone.dum
     2015-02-21 16:42:27   cmd_nr          1
     2015-02-21 16:43:20   e_state.NRW.FerienClone.dum_STATE 1
     2015-02-21 16:42:27   state           ein
   Condition:
     0          (InternalDoIf('state.NRW.FerienClone.dum','STATE','') == 1 or ReadingValDoIf('hl.01.Feiertag.cdm','today','') ne "none")  and InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
     1          InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "ein"
     2          InternalDoIf('OG.kz.AL.Wecker.dum','STATE','') eq "aus"
   Devices:
     0           state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
     1           OG.kz.AL.Wecker.dum
     2           OG.kz.AL.Wecker.dum
     all         state.NRW.FerienClone.dum hl.01.Feiertag.cdm OG.kz.AL.Wecker.dum
   Do:
     0          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
     1          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1})
     2          (set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0})
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
     1           OG.kz.AL.Wecker.dum:STATE
     2           OG.kz.AL.Wecker.dum:STATE
     all         state.NRW.FerienClone.dum:STATE OG.kz.AL.Wecker.dum:STATE
   Readings:
     0           hl.01.Feiertag.cdm:today
     all         hl.01.Feiertag.cdm:today
   State:
   Timerfunc:
   Trigger:
Attributes:
   alias      Weckersteuerung
   cmdState   ein|ein|aus
   group      Sonos Script
   room       98-Sonos


Christian

cmdState Ein|Ein|Aus soll doch heißen, dass cmd1 und cmd2 einschaten und cmd3 ausschalten soll. Falsch?

Wenn ich dazu in deinem Listing unter Do: gucke, deute ich die Ausführungsteile mal so, dass cmd1 und cmd3 ausschalten und nur cmd2 einschaltet.

Der Rest ist anfürsich ganz einfach, wenn die Bedingungen von cmd1 wahr sind, wird cmd1 ausgeführt. Falls die Bedingungen nicht wahr sind, und dennoch cmd1 ausgeführt wird, ist, wie Damian so schön sagte, dein Perl Interpreter defekt.

Bei deinem listing ist z.B. die erste Bedingung 'wahr' und die dritte Bedingung 'wahr' da diese mit and verküpft sind, wird cmd1 ausgeführt, also alles richtig. wenn state.NRW.FerienClone.dum z.B. '0' ist und dennoch cmd1 ausgeführt wird, dann wird wohl die Ausgabe von hl.01.Feiertag.cdm:today nicht 'none' sein, dass solltest du mal überprüfen.

so lange die Bedingungen für cmd1 wahr sind, bleibt das DOIF da stehen, und überprüft die Bedingungen für cmd2 und cmd3 nicht.

Gruß
Ingo


EDIT: Ich kenne das holiday-Modul nicht, habs nur grad mal überflogen, aber ich vermute das da der Fehler liegt. kannst ja mal ein 'list hl.01.Feiertag.cdm' machen und posten.


Spartacus

#1432
Hallo,
ich glaube wirklich es ist der perl-Interpreter! Der Status vom holiday-Modul wird per clonedummy an "hl.01.Feiertag.cdm" übertragen.

Hier das Listing:
Internals:
   CFGFN      Config/99-Dienste.cfg
   DEF        hl.01.Feiertag
   NAME       hl.01.Feiertag.cdm
   NOTIFYDEV  hl.01.Feiertag
   NR         195
   NTFY_ORDER 50-hl.01.Feiertag.cdm
   STATE      defined
   TYPE       cloneDummy
   Readings:
     2015-02-21 15:37:14   state           defined
     2015-02-21 00:00:02   today           none
     2015-02-21 00:00:02   tomorrow        none
     2015-02-21 00:00:02   yesterday       none
Attributes:
   alias      Feiertag
   cloneIgnore 1
   group      Kalender
   room       99-Dienste


cmdState Ein|Ein|Aus, bedeutet in diesem Zusammenhang, dass die Weckerautomatik von fhem in den ersten beiden Fällen greift und im letzten Fall durch den Switch "OG.kz.AL.Wecker.dum" außer Kraft gesetzt wird. Dann kann ich den Wecker nur noch zu Fuß über den Sonos-Controller steuern.

Und hier noch der Schalter:
Internals:
   CFGFN      Config/98-Sonos.cfg
   NAME       OG.kz.AL.Wecker.dum
   NR         146
   STATE      ein
   TYPE       dummy
   Readings:
     2015-02-21 15:41:20   state           ein
Attributes:
   alias      Weckautomatik
   devStateIcon aus:Wecker.Aus ein:Wecker.Wochentags
   group      Sonos Wecker
   room       98-Sonos
   webCmd     ein:aus

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 21 Februar 2015, 18:00:41
Hallo,
ich glaube wirklich es ist der perl-Interpreter!

Da kann ich nur schmunzeln. Es gab aber ein Problem mit der 0 im Dummy bei DOIF.

Schau mal, ob du die aktuelle Version von DOIF hast.

Sonst kannst du immer etwas vereinfachen, um es zu testen, hier z. B.

DOIF ([state.NRW.FerienClone.dum] == 1)(set bla on) DOELSE (set bla off)

Gruß

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

automatisierer

Zitat von: Spartacus am 21 Februar 2015, 18:00:41

cmdState Ein|Ein|Aus, bedeutet in diesem Zusammenhang, dass die Weckerautomatik von fhem in den ersten beiden Fällen greift und im letzten Fall durch den Switch "OG.kz.AL.Wecker.dum" außer Kraft gesetzt wird. Dann kann ich den Wecker nur noch zu Fuß über den Sonos-Controller steuern.

bei cmd1 machst du aber auch aus.
Zitat
(([state.NRW.FerienClone.dum] == 1 or [hl.01.Feiertag.cdm:today] ne "none")  and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))


Spartacus

Hallo,
nochmals danke für Eure Unterstützung, aber ich drehe mich im Kreis!
Ich habe heute ein Update gemacht. Das DOIF sollte aktuell sein!
Ich habe jetzt den Code gekürzt und die Feiertage rausgenommen.
(([state.NRW.FerienClone.dum] == 1)  and [OG.kz.AL.Wecker.dum] eq "ein" )
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "ein")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Volume => 2, Enabled => 1}))
DOELSEIF
([OG.kz.AL.Wecker.dum] eq "aus")
((set OG.kz.SON.ZP_S1 Alarm Update 674 {Enabled => 0}))

Aber es läuft einfach nicht!

Mit dem set Befehl schalte ich den Alarm im Sonos ab. Das ist ja auch richtig. Wenn Feiertag ist oder Ferien sind, dann brauche ich keinen Wecker!

Wenn keine Ferien sind und kein Feiertag ist, dann sollte cmd2 greifen. An WE ist das wurscht, da der Sonos Wecker nur von Mo-Fr. im Sonos selber konfiguriert ist.

Mit meinem Dummy Switch will ich jetzt diese ganze Ferien-Automatik abschalten! Heißt: wenn "OG.kz.AL.Wecker.dum" auf "aus" steht, gilt dir Konfig im Sonos. Hier soll deshalb r cmd3 kommen und eigentlich gar nix machen.

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

der-Lolo

Bei den vielen Versuchen die Du schon unternommen hast blickt wahrscheinlich niemand mehr so recht was jetzt schon alles versucht wurde...

ich würde mal

== 1 gegen eq "1" tauschen.

Damian

Zitat von: der-Lolo am 21 Februar 2015, 19:03:44
Bei den vielen Versuchen die Du schon unternommen hast blickt wahrscheinlich niemand mehr so recht was jetzt schon alles versucht wurde...

ich würde mal

== 1 gegen eq "1" tauschen.

das ist egal, der Perl-Interpreter ist da sehr großzügig ;)

Gruß

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

Spartacus

#1438
Zitat von: der-Lolo am 21 Februar 2015, 19:03:44
Bei den vielen Versuchen die Du schon unternommen hast blickt wahrscheinlich niemand mehr so recht was jetzt schon alles versucht wurde...

ich würde mal

== 1 gegen eq "1" tauschen.
Hi,
damit sind wir angefangen...

Ich habe den Code jetzt total abgespeckt und selbst das funktioniert nicht!
Es gibt die Dummy Devices "state.NRW.FerienClone.dum" und "OG.kz.AL.Wecker.dum"

"OG.kz.AL.Wecker.dum" steht auf "ein". Ändere ich dieses Dummy Device auf "aus", trifft cmd 3 zu. Schalte ich es auf "ein" kommt cmd2. Soweit alles gut.

Jetzt stelle ich "OG.kz.AL.Wecker.dum" auf "ein" und schallte "state.NRW.FerienClone.dum" von "0" nach "1". Es wird cmd1 ausgeführt. Nun schalte ich "state.NRW.FerienClone.dum" auf "5" und die Lampe bleibt aus. Es triggert cmd1. Das ist falsch!

define di.01.OG.kz.SON.ZP_S1 DOIF ([state.NRW.FerienClone.dum] eq "1") \
(set Lampe off)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "ein")\
(set Lampe on)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "aus")\
(set Lampe off)
attr di.01.OG.kz.SON.ZP_S1 alias Weckersteuerung
attr di.01.OG.kz.SON.ZP_S1 cmdState ein|ein|aus
attr di.01.OG.kz.SON.ZP_S1 group Sonos Script
attr di.01.OG.kz.SON.ZP_S1 room 98-Sonos

Das gibt es doch gar nicht, oder?
Christian

NACHTRAG:
DOIF-Version:
$Id: 98_DOIF.pm 8031 2015-02-18 17:49:10Z damian-s $
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 21 Februar 2015, 20:04:49
Hi,
damit sind wir angefangen...

Ich habe den Code jetzt total abgespeckt und selbst das funktioniert nicht!
Es gibt die Dummy Devices "state.NRW.FerienClone.dum" und "OG.kz.AL.Wecker.dum"

"OG.kz.AL.Wecker.dum" steht auf "ein". Ändere ich dieses Dummy Device auf "aus", trifft cmd 3 zu. Schalte ich es auf "ein" kommt cmd2. Soweit alles gut.

Jetzt stelle ich "OG.kz.AL.Wecker.dum" auf "ein" und schallte "state.NRW.FerienClone.dum" von "0" nach "1". Es wird cmd1 ausgeführt. Nun schalte ich "state.NRW.FerienClone.dum" auf "5" und die Lampe bleibt aus. Es triggert cmd1. Das ist falsch!

define di.01.OG.kz.SON.ZP_S1 DOIF ([state.NRW.FerienClone.dum] eq "1") \
(set Lampe off)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "ein")\
(set Lampe on)\
DOELSEIF\
([OG.kz.AL.Wecker.dum] eq "aus")\
(set Lampe off)
attr di.01.OG.kz.SON.ZP_S1 alias Weckersteuerung
attr di.01.OG.kz.SON.ZP_S1 cmdState ein|ein|aus
attr di.01.OG.kz.SON.ZP_S1 group Sonos Script
attr di.01.OG.kz.SON.ZP_S1 room 98-Sonos

Das gibt es doch gar nicht, oder?
Christian

NACHTRAG:
DOIF-Version:
$Id: 98_DOIF.pm 8031 2015-02-18 17:49:10Z damian-s $

Wenn du "state.NRW.FerienClone.dum" auf "5" schaltest ist zwar die erste Bedingung falsch aber die anderen Bedingungen werden erst gar nicht ausgewertet, weil  state.NRW.FerienClone.dum dort nicht vorkommt. Es bleibt der Zustand cmd1.

Es funktioniert alles so, wie programmiert und in der Commandref des Moduls beschrieben ist.

Gruß

Damian

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