DOIF schalten solange Bedingung erfüllt ist

Begonnen von JMW, 20 April 2016, 23:58:18

Vorheriges Thema - Nächstes Thema

JMW

Hallo, ich möchte meine Lüftung per Soll- und Ist-Wert schalten. Hierzu habe ich ein DOIF, der prüft, ob der Sollwert größer oder kleiner als der Istwert ist und dann entweder solange hochschaltet bzw. runterschaltet.
Dummerweise funktioniert das nicht so wie erhofft.

define df_LueftungsStufe_Soll dummy
define df_LueftungsStufe dummy

define Lueftung_schalten dummy
attr Lueftung_schalten webCmd hoch:runter


1.Versuch klappt nicht:

define di_Lueftung_schalten DOIF ([df_LueftungsStufe_Soll] > [df_LueftungsStufe]) ( set Lueftung_schalten hoch, { Log 3, "Soll > Ist" } ) \
                            DOELSEIF ([df_LueftungsStufe_Soll] < [df_LueftungsStufe]) ( set Lueftung_schalten runter, { Log 3, "Soll < Ist" } ) \
DOELSE ( { Log 3, "Soll = Ist" } )
attr di_Lueftung_schalten do always
attr di_Lueftung_schalten repeatcmd 5

define nt_Lueftung_schalten notify Lueftung_schalten {\
my $Status=ReadingsVal("df_LueftungsStufe","state","0");;\
if ("$EVENT" eq "hoch") {\
  $Status = $Status+1;;\
}\
  else {\
  $Status = $Status-1;;\
}\
fhem("setreading df_LueftungsStufe state $Status");;\
}


Schaltet die ganze Zeit. Hier wird nie der DOELSE Pfad erreicht, obwohl ich sehe, dass der Soll- und Istwert irgendwann gleich sind.

Erst folgender Code funktioniert:

2.Versuch klappt, ist aber umständlich

define di_Lueftung_fertig DOIF ([df_LueftungsStufe_Soll] ne [df_LueftungsStufe]) ( set df_LueftungsStufe_Soll [df_LueftungsStufe_Soll] )
attr di_Lueftung_fertig do always
attr di_Lueftung_fertig repeatcmd 2

define di_Lueftung_schalten DOIF ([df_LueftungsStufe_Soll] > [df_LueftungsStufe]) ( set Lueftung_schalten hoch, { Log 3, "Soll > Ist" } ) \
                            DOELSEIF ([df_LueftungsStufe_Soll] < [df_LueftungsStufe]) ( set Lueftung_schalten runter, { Log 3, "Soll < Ist" } ) \
DOELSE ( { Log 3, "Soll = Ist" } )
attr di_Lueftung_schalten do always

define nt_Lueftung_schalten notify Lueftung_schalten {\
my $Status=ReadingsVal("df_LueftungsStufe","state","0");;\
if ("$EVENT" eq "hoch") {\
  $Status = $Status+1;;\
}\
  else {\
  $Status = $Status-1;;\
}\
fhem("setreading df_LueftungsStufe state $Status");;\
}


Hier wird das eigentliche Schalten nur ausgeführt, wenn der Soll- und Istwert noch nicht gleich sind.

Wieso klappt das nicht im ersten Code?

CoolTux

In der Schule habe ich gelernt das es 5 mathematische Vergleichsoperatoren gibt.

Größer
Kleiner
Gleich
GrößerGleich
KleinerGleich

Und nun schau mal Dein erstes Beispiel an und Du weißt warum er nicht schaltet wenn der Soll- und Istwert noch nicht gleich ist
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Per

Zwar kein DOIF-Problem, aber mich wundert es, dass es überhaupt geht, da du doch mit
Zitat von: JMW am 20 April 2016, 23:58:18setreading df_LueftungsStufe state $Status
keinen neuen Event erzeugst. Wird beim Abfragen der nicht eventauslösenden Terme ein Get ausgelöst?

Statt
set Lueftung_schalten hoch/runter
könntest du
set Lueftung_schalten 1/-1
nehmen, dann sparst du im sub die if-Verzweigung.

Außerdem, wenn du eh schon mit Perl (sub) arbeitest, warum nicht gleich im DOIF? Statt
set Lueftung_schalten hoch
geht auch ganz kurz
set df_LueftungsStufe {([df_LueftungsStufe] + 1)}

JMW

#3
Danke schonmal für die Vereinfachung beim Setzen der LüftungsStufe.

Das Problem beim 1. Beispiel ist z.B. Folgendes: Ist der Sollwert größer als der Istwert, dann wird andauernd der Wert hochgesetzt. Hier hätte ich erwartet, dass irgendwann der Sollwert = Istwert erkannt wird und deshalb der DOIF im DOELSE-Zweig endet.
Es wird aber immer "Soll > Ist" ausgegeben und der Dummy Istwert wird über den Sollwert hinaus hochgezählt.

Im 2.Beispiel wird nur ein Event gesetzt, falls der Istwert noch nicht gleich dem Sollwert entspricht. Hier wird dann immer ein Ereignis für das DOIF generiert. Wie gesagt, ich hätte erwartet, dass dies
attr di_Lueftung_schalten repeatcmd 5 macht, aber dann der Vergleich funktioniert.

Habe ich da einen Denkfehler?

Per

Zitat von: JMW am 21 April 2016, 12:47:18Habe ich da einen Denkfehler?
Zitat von: Per am 21 April 2016, 09:35:31Zwar kein DOIF-Problem, aber mich wundert es, dass es überhaupt geht, da du doch mitkeinen neuen Event erzeugst. Wird beim Abfragen der nicht eventauslösenden Terme ein Get ausgelöst?
Probier doch mal statt setstate set aus. Immerhin machst du das bei deinem di_Lueftung_fertig ja auch!
Sonst bekommt ja niemand die Änderung mit.

CoolTux

Zitat von: JMW am 21 April 2016, 12:47:18
Danke schonmal für die Vereinfachung beim Setzen der LüftungsStufe.

Das Problem beim 1. Beispiel ist z.B. Folgendes: Ist der Sollwert größer als der Istwert, dann wird andauernd der Wert hochgesetzt. Hier hätte ich erwartet, dass irgendwann der Sollwert = Istwert erkannt wird und deshalb der DOIF im DOELSE-Zweig endet.
Es wird aber immer "Soll > Ist" ausgegeben und der Dummy Istwert wird über den Sollwert hinaus hochgezählt.

Im 2.Beispiel wird nur ein Event gesetzt, falls der Istwert noch nicht gleich dem Sollwert entspricht. Hier wird dann immer ein Ereignis für das DOIF generiert. Wie gesagt, ich hätte erwartet, dass dies
attr di_Lueftung_schalten repeatcmd 5 macht, aber dann der Vergleich funktioniert.

Habe ich da einen Denkfehler?

Das liegt an Deinem do always
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

JMW

Es geht leider alles nicht. Ich habe das "do always" weg gemacht und ein "?" in die DOIF Bedingung reingemacht.
Hier mein kompletter Code:

define df_LueftungsStufe_Soll dummy
attr df_LueftungsStufe_Soll group Lueftung
define df_LueftungsStufe dummy
attr df_LueftungsStufe group Lueftung

define Lueftung_schalten dummy
attr Lueftung_schalten group Lueftung
attr Lueftung_schalten webCmd 1:-1

#define di_Lueftung_fertig DOIF ([df_LueftungsStufe_Soll] ne [df_LueftungsStufe]) ( set df_LueftungsStufe_Soll [df_LueftungsStufe_Soll] )
#attr di_Lueftung_fertig do always
#attr di_Lueftung_fertig repeatcmd 2

define di_Lueftung_schalten DOIF ([df_LueftungsStufe_Soll] > [?df_LueftungsStufe]) ( set Lueftung_schalten 1, { Log 3, "Soll > Ist" } ) \
                            DOELSEIF ([df_LueftungsStufe_Soll] < [?df_LueftungsStufe]) ( set Lueftung_schalten -1, { Log 3, "Soll < Ist" } ) \
                            DOELSE ( { Log 3, "Soll = Ist" } )
#attr di_Lueftung_schalten do always
attr di_Lueftung_schalten group Lueftung
attr di_Lueftung_schalten repeatcmd 2

define nt_Lueftung_schalten notify Lueftung_schalten {\
Log 3, "Notify: Lueftung_schalten" ;;\
my $Status=ReadingsVal("df_LueftungsStufe","state","0");;\
if ("$EVENT" eq 1) {\
  $Status = $Status+1;;\
  #fhem("set SendePlatineKanal1 on");;\
}\
  elsif ("$EVENT" eq -1) {\
  $Status = $Status-1;;\
  #fhem("set SendePlatineKanal1 off");;\
}\
if ($Status > 3) {$Status = 0;;}\
if ($Status < 0) {$Status = 3;;}\
fhem("set df_LueftungsStufe $Status");;\
#if ($Status == 0) { fhem("set vMP3Remote_Btn4 press short");; }\
#if ($Status == 1) { fhem("set vMP3Remote_Btn4 press long");; }\
#if ($Status == 2) { fhem("set vMP3Remote_Btn5 press short");; }\
#if ($Status == 3) { fhem("set vMP3Remote_Btn5 press long");; }\
}


Sobald sich Soll und Ist unterscheiden bekomme ich Folgendes:

2016-04-21 13:41:35 dummy df_LueftungsStufe 1
2016-04-21 13:41:35 dummy Lueftung_schalten 1
2016-04-21 13:41:35 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:41:35 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:41:35 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:41:35 DOIF di_Lueftung_schalten wait_timer: 21.04.2016 13:41:37 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:41:37 DOIF di_Lueftung_schalten wait_timer: no timer
2016-04-21 13:41:37 dummy df_LueftungsStufe 2
2016-04-21 13:41:37 dummy Lueftung_schalten 1
2016-04-21 13:41:37 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:41:37 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:41:37 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:41:37 DOIF di_Lueftung_schalten wait_timer: 21.04.2016 13:41:39 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:41:39 DOIF di_Lueftung_schalten wait_timer: no timer
2016-04-21 13:41:39 dummy df_LueftungsStufe 3
2016-04-21 13:41:39 dummy Lueftung_schalten 1
2016-04-21 13:41:39 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:41:39 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:41:39 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:41:39 DOIF di_Lueftung_schalten wait_timer: 21.04.2016 13:41:41 cmd_1 df_LueftungsStufe_Soll


Bzw:

2016.04.21 13:37:26 3: Soll = Ist
2016.04.21 13:37:46 3: Notify: Lueftung_schalten
2016.04.21 13:37:46 3: Soll > Ist
2016.04.21 13:37:48 3: Notify: Lueftung_schalten
2016.04.21 13:37:48 3: Soll > Ist
2016.04.21 13:37:52 3: Notify: Lueftung_schalten
2016.04.21 13:37:52 3: Soll > Ist
2016.04.21 13:37:57 3: Notify: Lueftung_schalten
2016.04.21 13:37:57 3: Soll > Ist
2016.04.21 13:37:59 3: Notify: Lueftung_schalten
2016.04.21 13:37:59 3: Soll > Ist
2016.04.21 13:38:01 3: Notify: Lueftung_schalten
2016.04.21 13:38:01 3: Soll > Ist
2016.04.21 13:38:03 3: Notify: Lueftung_schalten
2016.04.21 13:38:03 3: Soll > Ist
2016.04.21 13:38:05 3: Notify: Lueftung_schalten
2016.04.21 13:38:05 3: Soll > Ist
2016.04.21 13:38:07 3: Notify: Lueftung_schalten
2016.04.21 13:38:07 3: Soll > Ist
2016.04.21 13:38:09 3: Notify: Lueftung_schalten
2016.04.21 13:38:09 3: Soll > Ist
2016.04.21 13:38:11 3: Notify: Lueftung_schalten
2016.04.21 13:38:11 3: Soll > Ist

JMW

#7
Und hier mein funktionierendes Beispiel (Istwert = 0, Sollwert = 0 -> Sollwert = 3 -> Istwert = 0->1->2->3):

define df_LueftungsStufe_Soll dummy
attr df_LueftungsStufe_Soll group Lueftung
define df_LueftungsStufe dummy
attr df_LueftungsStufe group Lueftung

define Lueftung_schalten dummy
attr Lueftung_schalten group Lueftung
attr Lueftung_schalten webCmd 1:-1

define di_Lueftung_fertig DOIF ([df_LueftungsStufe_Soll] ne [df_LueftungsStufe]) ( set df_LueftungsStufe_Soll [df_LueftungsStufe_Soll] )
attr di_Lueftung_fertig do always
attr di_Lueftung_fertig repeatcmd 2

define di_Lueftung_schalten DOIF ([df_LueftungsStufe_Soll] > [?df_LueftungsStufe]) ( set Lueftung_schalten 1, { Log 3, "Soll > Ist" } ) \
                            DOELSEIF ([df_LueftungsStufe_Soll] < [?df_LueftungsStufe]) ( set Lueftung_schalten -1, { Log 3, "Soll < Ist" } ) \
                            DOELSE ( { Log 3, "Soll = Ist" } )
attr di_Lueftung_schalten do always
attr di_Lueftung_schalten group Lueftung
#attr di_Lueftung_schalten repeatcmd 2

define nt_Lueftung_schalten notify Lueftung_schalten {\
Log 3, "Notify: Lueftung_schalten" ;;\
my $Status=ReadingsVal("df_LueftungsStufe","state","0");;\
if ("$EVENT" eq 1) {\
  $Status = $Status+1;;\
  #fhem("set SendePlatineKanal1 on");;\
}\
  elsif ("$EVENT" eq -1) {\
  $Status = $Status-1;;\
  #fhem("set SendePlatineKanal1 off");;\
}\
if ($Status > 3) {$Status = 0;;}\
if ($Status < 0) {$Status = 3;;}\
fhem("set df_LueftungsStufe $Status");;\
#if ($Status == 0) { fhem("set vMP3Remote_Btn4 press short");; }\
#if ($Status == 1) { fhem("set vMP3Remote_Btn4 press long");; }\
#if ($Status == 2) { fhem("set vMP3Remote_Btn5 press short");; }\
#if ($Status == 3) { fhem("set vMP3Remote_Btn5 press long");; }\
}



Dann bekomme ich Folgendes:

2016-04-21 13:49:58 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:49:58 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:49:58 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:49:58 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:49:58 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:49:58 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:49:58 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:49:58 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:49:58 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:00 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:00 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:00 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:00 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:00 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:00 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:00 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:00 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:00 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:00 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:02 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:02 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:02 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:02 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:02 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:02 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:02 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:02 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:02 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:02 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:04 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:04 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:04 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:04 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:04 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:04 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:04 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:04 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:04 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:04 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:06 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:06 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:06 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:06 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:06 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:06 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:06 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:06 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:06 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:06 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:08 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:08 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:08 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:08 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:08 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:08 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:08 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:08 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:08 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:08 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:10 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:10 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:10 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:10 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:10 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:10 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:10 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:10 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:10 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:10 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:12 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:12 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:12 DOIF di_Lueftung_schalten cmd_nr: 3
2016-04-21 13:50:12 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:12 DOIF di_Lueftung_schalten cmd_3
2016-04-21 13:50:12 dummy df_LueftungsStufe_Soll 0
2016-04-21 13:50:12 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:12 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:12 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:12 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:14 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:13 dummy df_LueftungsStufe 1
2016-04-21 13:50:13 dummy Lueftung_schalten 1
2016-04-21 13:50:13 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:50:13 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:13 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:50:13 dummy df_LueftungsStufe_Soll 3
2016-04-21 13:50:14 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:14 dummy df_LueftungsStufe 2
2016-04-21 13:50:14 dummy Lueftung_schalten 1
2016-04-21 13:50:14 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:50:14 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:14 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:50:14 dummy df_LueftungsStufe_Soll 3
2016-04-21 13:50:14 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:14 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:14 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:14 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:16 cmd_1 df_LueftungsStufe_Soll
2016-04-21 13:50:16 DOIF di_Lueftung_fertig wait_timer: no timer
2016-04-21 13:50:16 dummy df_LueftungsStufe 3
2016-04-21 13:50:16 dummy Lueftung_schalten 1
2016-04-21 13:50:16 DOIF di_Lueftung_schalten cmd_nr: 1
2016-04-21 13:50:16 DOIF di_Lueftung_schalten cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:16 DOIF di_Lueftung_schalten cmd_1
2016-04-21 13:50:16 dummy df_LueftungsStufe_Soll 3
2016-04-21 13:50:16 DOIF di_Lueftung_fertig cmd_nr: 1
2016-04-21 13:50:16 DOIF di_Lueftung_fertig cmd_event: df_LueftungsStufe_Soll
2016-04-21 13:50:16 DOIF di_Lueftung_fertig cmd_1
2016-04-21 13:50:16 DOIF di_Lueftung_fertig wait_timer: 21.04.2016 13:50:18 cmd_1 df_LueftungsStufe_Soll


Bzw.:


2016.04.21 13:50:04 3: Soll = Ist
2016.04.21 13:50:06 3: Soll = Ist
2016.04.21 13:50:08 3: Soll = Ist
2016.04.21 13:50:10 3: Soll = Ist
2016.04.21 13:50:12 3: Soll = Ist
2016.04.21 13:50:13 3: Notify: Lueftung_schalten
2016.04.21 13:50:13 3: Soll > Ist
2016.04.21 13:50:14 3: Notify: Lueftung_schalten
2016.04.21 13:50:14 3: Soll > Ist
2016.04.21 13:50:16 3: Notify: Lueftung_schalten
2016.04.21 13:50:16 3: Soll > Ist
2016.04.21 13:50:18 3: Soll = Ist
2016.04.21 13:50:21 3: Soll = Ist
2016.04.21 13:50:23 3: Soll = Ist
2016.04.21 13:50:25 3: Soll = Ist
2016.04.21 13:50:27 3: Soll = Ist
2016.04.21 13:50:29 3: Soll = Ist
2016.04.21 13:50:31 3: Soll = Ist
2016.04.21 13:50:33 3: Soll = Ist

Per

Zitat von: JMW am 21 April 2016, 13:42:33und ein "?" in die DOIF Bedingung reingemacht.
Warum? Jetzt setzt du schon mit set statt setstate, dafür ignorierst du die Events mit dem Fragezeichen.
Mit deiner funktionierenden "Lösung" machst du nix anderes, als den gekillten Event wieder herzustellen.

CoolTux

Zitat von: Per am 21 April 2016, 13:55:17
Warum? Jetzt setzt du schon mit set statt setstate, dafür ignorierst du die Events mit dem Fragezeichen.
Mit deiner funktionierenden "Lösung" machst du nix anderes, als den gekillten Event wieder herzustellen.

Bei Dummy's braucht man setstate nicht, da geht auch ein set.

Alles andere ist mir ein zu großes kuddelmuddel, gerade auch weil anscheinend über die cfg gearbeitet wird.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

JMW

Ja, aber ich bekomme in der ersten Version doch zu viele Events. Warum zählt er denn sonst die ganze Zeit?
In der zweiten Version stelle ich den Trigger auch nur für den SollWert wieder her. Das ist doch nicht das Gleiche.

JMW

Ja, ich arbeite über das cfg direkt. Verhält sich der Code anders, wenn ich den Code im Web-Formular bearbeite?

JMW

Jetzt habe ich den Code zusammengekürzt! Beispiel: df_LueftungsStufe_Soll wird von 0 auf 3 gesetzt -> df_LueftungsStufe läuft von 0 kontinuierlich hoch und hält nicht bei 3 an.

define df_LueftungsStufe_Soll dummy
define df_LueftungsStufe dummy

define Lueftung_schalten dummy
attr Lueftung_schalten webCmd 1:-1

define di_Lueftung_schalten DOIF ([df_LueftungsStufe_Soll] > [df_LueftungsStufe]) ( set df_LueftungsStufe {([df_LueftungsStufe] + 1)}, { Log 3, "Soll > Ist" } ) \
                            DOELSEIF ([df_LueftungsStufe_Soll] < [df_LueftungsStufe]) ( set df_LueftungsStufe {([df_LueftungsStufe] - 1)}, { Log 3, "Soll < Ist" } ) \
                            DOELSE ( { Log 3, "Soll = Ist" } )
#attr di_Lueftung_schalten do always
attr di_Lueftung_schalten repeatcmd 2


Wieso wird niemals der DOELSE Zweig aktiv, obwohl beim Hochzählen irgendwann [df_LueftungsStufe_Soll] > [df_LueftungsStufe] nicht mehr erfüllt ist?


Per

Log doch mal den Status mit:
( set df_LueftungsStufe {([df_LueftungsStufe] + 1)}, { Log 3, "Soll > Ist => ".([df_LueftungsStufe] + 1) } )
Und als "Notbremse" würde ich statt DOELSE
DOELSEIF ([df_LueftungsStufe_Soll] == [df_LueftungsStufe]) ( { Log 3, "Soll = Ist" } )
dranhängen. Zumindest, bis es läuft.

JMW

#14
Wieso soll ich in der Logausgabe die LueftungsStufe nochmals um 1 addiert ausgeben.

define tdi_Lueftung_schalten DOIF ([tdf_LueftungsStufe_Soll] > [tdf_LueftungsStufe_Ist]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] + 1)}, { Log 3, "test Soll > Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSEIF ([tdf_LueftungsStufe_Soll] < [tdf_LueftungsStufe_Ist]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] - 1)}, { Log 3, "test Soll < Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSEIF ([tdf_LueftungsStufe_Soll] == [tdf_LueftungsStufe_Ist]) ( { Log 3, "test Soll = Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSE ( { Log 3, "Soll ? Ist: ".[tdf_LueftungsStufe_Ist] } )


Ohne die "+1" sehe ich jedenfalls das:

2016.04.21 20:45:52 3: test Soll = Ist: 0
2016.04.21 20:46:10 3: test Soll > Ist: 1
2016.04.21 20:46:12 3: test Soll > Ist: 2
2016.04.21 20:46:14 3: test Soll > Ist: 3
2016.04.21 20:46:16 3: test Soll > Ist: 4
2016.04.21 20:46:18 3: test Soll > Ist: 5
2016.04.21 20:46:20 3: test Soll > Ist: 6
2016.04.21 20:46:22 3: test Soll > Ist: 7
2016.04.21 20:46:24 3: test Soll > Ist: 8
2016.04.21 20:46:26 3: test Soll > Ist: 9
2016.04.21 20:46:28 3: test Soll > Ist: 10
2016.04.21 20:46:30 3: test Soll > Ist: 11
2016.04.21 20:46:33 3: test Soll > Ist: 12
2016.04.21 20:46:35 3: test Soll > Ist: 13
2016.04.21 20:46:37 3: test Soll > Ist: 14
2016.04.21 20:46:39 3: test Soll > Ist: 15
2016.04.21 20:46:41 3: test Soll > Ist: 16
2016.04.21 20:46:43 3: test Soll > Ist: 17
2016.04.21 20:46:45 3: test Soll > Ist: 18
2016.04.21 20:46:47 3: test Soll > Ist: 19
2016.04.21 20:46:50 3: test Soll > Ist: 20
2016.04.21 20:46:52 3: test Soll > Ist: 21
2016.04.21 20:46:54 3: test Soll > Ist: 22
2016.04.21 20:46:56 3: test Soll > Ist: 23
2016.04.21 20:46:58 3: test Soll > Ist: 24
2016.04.21 20:47:00 3: test Soll > Ist: 25


Internals:
   DEF        ([tdf_LueftungsStufe_Soll] > [tdf_LueftungsStufe_Ist]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] + 1)}, { Log 3, "test Soll > Ist: ".[tdf_LueftungsStufe_Ist] } )
                            DOELSEIF ([tdf_LueftungsStufe_Soll] < [tdf_LueftungsStufe_Ist]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] - 1)}, { Log 3, "test Soll < Ist: ".[tdf_LueftungsStufe_Ist] } )
                            DOELSEIF ([tdf_LueftungsStufe_Soll] == [tdf_LueftungsStufe_Ist]) ( { Log 3, "test Soll = Ist: ".[tdf_LueftungsStufe_Ist] } )
                            DOELSE ( { Log 3, "Soll ? Ist: ".[tdf_LueftungsStufe_Ist] } )
   NAME       tdi_Lueftung_schalten
   NR         1048
   NTFY_ORDER 50-tdi_Lueftung_schalten
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-04-21 20:59:36   Device          tdf_LueftungsStufe_Ist
     2016-04-21 21:05:01   cmd_event       tdf_LueftungsStufe_Ist
     2016-04-21 21:05:01   cmd_nr          1
     2016-04-21 20:59:36   e_tdf_LueftungsStufe_Ist_STATE 0
     2016-04-21 20:58:48   e_tdf_LueftungsStufe_Soll_STATE 3
     2016-04-21 21:05:01   state           cmd_1
     2016-04-21 21:05:01   wait_timer      21.04.2016 21:05:03 cmd_1 tdf_LueftungsStufe_Ist
   Condition:
     0          InternalDoIf($hash,'tdf_LueftungsStufe_Soll','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) > InternalDoIf($hash,'tdf_LueftungsStufe_Ist','STATE','','',AttrVal($hash->{NAME},'notexist',undef))
     1          InternalDoIf($hash,'tdf_LueftungsStufe_Soll','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) < InternalDoIf($hash,'tdf_LueftungsStufe_Ist','STATE','','',AttrVal($hash->{NAME},'notexist',undef))
     2          InternalDoIf($hash,'tdf_LueftungsStufe_Soll','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) == InternalDoIf($hash,'tdf_LueftungsStufe_Ist','STATE','','',AttrVal($hash->{NAME},'notexist',undef))
   Devices:
     0           tdf_LueftungsStufe_Soll tdf_LueftungsStufe_Ist
     1           tdf_LueftungsStufe_Soll tdf_LueftungsStufe_Ist
     2           tdf_LueftungsStufe_Soll tdf_LueftungsStufe_Ist
     all         tdf_LueftungsStufe_Soll tdf_LueftungsStufe_Ist
   Do:
     0:
       0           set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] + 1)}, { Log 3, "test Soll > Ist: ".[tdf_LueftungsStufe_Ist] }
     1:
       0           set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] - 1)}, { Log 3, "test Soll < Ist: ".[tdf_LueftungsStufe_Ist] }
     2:
       0           { Log 3, "test Soll = Ist: ".[tdf_LueftungsStufe_Ist] }
     3:
       0           { Log 3, "Soll ? Ist: ".[tdf_LueftungsStufe_Ist] }
   Helper:
     event      0
     globalinit 1
     last_timer 0
     sleepdevice tdf_LueftungsStufe_Ist
     sleepsubtimer 0
     sleeptimer 0
     timerdev   tdf_LueftungsStufe_Ist
     timerevent 0
     triggerDev tdf_LueftungsStufe_Ist
     timerevents:
       0
       1
     triggerEvents:
       0
       1
   Internals:
     0           tdf_LueftungsStufe_Soll:STATE tdf_LueftungsStufe_Ist:STATE
     1           tdf_LueftungsStufe_Soll:STATE tdf_LueftungsStufe_Ist:STATE
     2           tdf_LueftungsStufe_Soll:STATE tdf_LueftungsStufe_Ist:STATE
     all         tdf_LueftungsStufe_Soll:STATE tdf_LueftungsStufe_Ist:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     All:
   State:
   Trigger:
Attributes:
   group      todo
   repeatcmd  2