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?
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
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)}
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?
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.
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
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
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
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.
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.
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.
Ja, ich arbeite über das cfg direkt. Verhält sich der Code anders, wenn ich den Code im Web-Formular bearbeite?
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?
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.
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
Es scheint so, als ob das Problem der Wechsel des Triggers ist.
Ich lasse mir nun zusätzlich die Events ausgeben (z.B. SOLL = IST = 3 -> SOLL = 4):
define tdi_Lueftung_schalten DOIF ([tdf_LueftungsStufe_Ist] < [tdf_LueftungsStufe_Soll]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] + 1)}, { Log 3, "Events from device $DEVICE:$EVENTS : test Soll > Ist: ".[tdf_LueftungsStufe_Ist] } ) \
DOELSEIF ([tdf_LueftungsStufe_Ist] > [tdf_LueftungsStufe_Soll]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] - 1)}, { Log 3, "Events from device $DEVICE:$EVENTS : test Soll < Ist: ".[tdf_LueftungsStufe_Ist] } ) \
DOELSEIF ([tdf_LueftungsStufe_Ist] == [tdf_LueftungsStufe_Soll]) ( { Log 3, "test Soll = Ist: ".[tdf_LueftungsStufe_Ist] } ) \
DOELSE ( { Log 3, "Soll ? Ist: ".[tdf_LueftungsStufe_Ist] } )
2016.04.21 22:16:48 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 3
2016.04.21 22:16:50 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 4
2016.04.21 22:16:52 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 5
2016.04.21 22:16:54 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 6
2016.04.21 22:16:56 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 7
2016.04.21 22:16:58 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 8
2016.04.21 22:17:00 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 9
Wenn sich der Sollwert vom Istwert ändert, so wird der Trigger verwendet, um den Istwert zu ändern.
Hier soll dann der Trigger auf den Wechsel des Istwerts ausgelöst werden.
Durch den repeatsame wird jedoch weiterhin der Trigger des inital geänderten Sollwertes benutzt und
der geht nicht weg.
Kann man das mit DOIF überhaupt lösen? Mir scheint es, als ob DOIF nicht mit geänderten Werten zurechtkommt,
die es selbst geändert hat.
Zitat von: JMW am 21 April 2016, 20:51:37Wieso soll ich in der Logausgabe die LueftungsStufe nochmals um 1 addiert ausgeben.
Weil ich unterwegs war und nicht wusste, ob die aktuelle oder die beim Start vorhandenen Werte genommen werden. Wenn es so passt, ist es ja ok.
Ich bin mal einem Verdacht nachgegangen und habe was Interessantes festgestellt (aber dazu muss
Damian mithelfen):
Als Parameter habe ich neben
wait und
do always (alles andere rausgehauen) noch
selftrigger (!) probiert und siehe da, es klappt (inkl. Halt bei Gleichheit). ABER nur in eine Richtung. Nämlich die im DOIF-Zweig, die im DOELSE nimmt er nicht.
Dabei war auch egal, ob ich
DOELSEIF (soll == ist) oder
DOELSE verwende.
Getrixt mit selftrigger 1:1 oder 1,1 hat auch nicht funktioniert.
So, eine funktionierende Lösung :
([soll] ne [ist]) (set ist {([ist] + (([soll] > [ist]) ? 1 : -1))})
DOELSE ()
wait 1|1
do always
selftrigger 1
Super, danke für die Hilfe.