FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: JMW am 20 April 2016, 23:58:18

Titel: DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 20 April 2016, 23:58:18
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?
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: CoolTux am 21 April 2016, 05:51:50
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
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 21 April 2016, 09:35:31
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)}
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag 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?
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 21 April 2016, 12:58:35
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: CoolTux am 21 April 2016, 13:11:46
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
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 13:42:33
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
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 13:51:52
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
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 21 April 2016, 13:55:17
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: CoolTux am 21 April 2016, 14:06:29
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 14:08:32
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 14:10:22
Ja, ich arbeite über das cfg direkt. Verhält sich der Code anders, wenn ich den Code im Web-Formular bearbeite?
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 14:52:01
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?

Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 21 April 2016, 15:05:07
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 20:51:37
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
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 21 April 2016, 22:34:46
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.

Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 21 April 2016, 23:47:33
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.
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: Per am 22 April 2016, 07:12:10
So, eine funktionierende Lösung :
([soll] ne [ist]) (set ist {([ist] + (([soll] > [ist]) ? 1 : -1))})
DOELSE ()
wait 1|1
do always
selftrigger 1
Titel: Antw:DOIF schalten solange Bedingung erfüllt ist
Beitrag von: JMW am 22 April 2016, 23:21:08
Super, danke für die Hilfe.