Hauptmenü

Doif Schaltet unlogisch

Begonnen von rico5588, 18 Dezember 2016, 12:33:05

Vorheriges Thema - Nächstes Thema

rico5588

Hallo Ihr,

ich habe hier ein DOIF (Lueftungsautomatik), was an einer Stelle unlogisch schaltet, und ich könnte dazu Hilfe gebrauchen.
([Luma:state] eq "Auto" and [10:00-14:14]) (set LueftungRico dimzl_operatingmode Stufe_2)
DOELSEIF ([Luma:state] eq "Stufe3") (set LueftungRico dimzl_operatingmode Stufe_3) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Stufe2") (set LueftungRico dimzl_operatingmode Stufe_2) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Stufe1") (set LueftungRico dimzl_operatingmode Stufe_1) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Aus") (set LueftungRico dimzl_operatingmode Aus) ( set Luma Auto)
DOELSE (set LueftungRico dimzl_operatingmode Aus)

Attr Lueftungsautomatik wait 100:1,8000:1,8000:1,8000:1,8000:0
Attr Lueftungsautomatik do always
Legende:
Luma (Dummy)= Fernbedienung (state - Auto,Stufe1,Stufe2,Stufe3,Aus)
Das Problem:
Wenn ich mich im Zeitfenster von CMD_1 befinde [10:00-14:14], kann ich alle Stufen von Dummy einstellen und das Doif haut hin (Zählt den Wait Timer hoch und schaltet dann zurück in "Auto")
Wenn ich Luma auf 1 (2-3 ist egal) Schalte sollte die Anlage auf Stufe 1 für 8000 sec. laufen. Wenn aber in dieser Zeit die Zeit von CMD_1 zuende ist [14:14] schaltet das Doif in CMD_6 (den Timer ab!) und die Anlage geht aus und der 2. Befehl (set Luma Auto wird übergangen).
Wenn man die Zeit von CMD_1 mit einem ? anführt geht das zwar, aber wenn Luma auf Auto steht, geht die Anlage in der Zeit von [10:00-14:14] nicht mehr an!!!

Eigentlich ne einfache Sache - geht nur irgendwie nicht...

MFG Rico

Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Ellert

Das liegt an DOELSE, der Fall tritt ein, wenn das Zeitinterval abläuft, da solltest Du eine Bedingung für "Aus" formulieren und DOELSEIF nutzen.

rico5588

Hallo,

ich habe den Code vereinfacht dargestellt um mein Problem besser darzustellen.
Hier der eigentliche Code...
([?test3] > 800 and [11:30-14:00|8] and [Luma] eq "Auto" or [11:30-14:00] and [Luma] eq "Auto" or [?test3] > 800 and [10:00-12:00|7] and [Luma] eq "Auto" or [?test3] > 800 and [14:00-16:00|7] and [Luma] eq "Auto" or [18:55-19:00] ) (set LueftungRico dimzl_operatingmode Stufe_2)
DOELSEIF ([19:00-23:50] and [?Wozi.DHT22:Temperature] - [?Ausenwetter:temperature] > 2 and [?Wozi.DHT22:Temperature] > 29 and [Luma] eq "Auto" ) (set LueftungRico dimzl_operatingmode Stufe_1, set Luma Auto)
DOELSEIF ([00:10-10:00] and [?Wozi.DHT22:Temperature] > 29 and [?Ausenwetter:temperature] < 21 and [Luma] eq "Auto" ) (set LueftungRico dimzl_operatingmode Stufe_2, set Luma Auto)
DOELSEIF ([23:59]) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Stufe3") (set LueftungRico dimzl_operatingmode Stufe_3) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Stufe2") (set LueftungRico dimzl_operatingmode Stufe_2) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Stufe1") (set LueftungRico dimzl_operatingmode Stufe_1) ( set Luma Auto)
DOELSEIF ([Luma:state] eq "Aus") (set LueftungRico dimzl_operatingmode Aus) ( set Luma Auto)
DOELSE (set LueftungRico dimzl_operatingmode Aus)


Ich kann doch nun nicht alle "Auszeiten" in eine neue Zeile pressen, oder ? soll das der richtige weg sein? das wäre doch dann auch alles doppelt.
MFG Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Ellert

Dann erweitere die Ausschaltzeiten um 8000s, dann kannst Du sicher sein dass der Lüfter vor 14:14 eingeschaltete Lüfter seine 8000 s laufen kann, bis DOELSE zu schlägt  ;)

rico5588

 ::)
Machbar aber nicht das was ich wollte.
Es wäre schön wenn ihr mir das verhalten von DOIF hier noch mal besser erklären könntet so das ich es verstehe.
Für mich ergibt das im Moment noch keinen Sinn.
Ich habe ein Bedienung die wahr ist (Luma steht auf "Stufe2") und führe den Befehl dazu aus (Lüftung auf Stufe2). Zwischenrein kommt eine Bedienung die nicht wahr ist (die Zeit von CMD_1 ist zwar alle, aber die 2. Bedienung  das Luma auf Auto steht ist nicht gegeben, diese steht immer noch auf "stufe2"). Somit dürfte sich ja nichts ändern.
Macht es aber...->Problem 1
Problem2 . Nun beim Sprung von Stufe2 auf die letzte Zeile wird Luma nicht wieder auf Auto gesetzt und das DOIF selber, trotz "do always" merkt das nicht...
Doif steht in CMD 9 obwohl in Zeile 6 abgefragt wird wenn Luma auf Stufe 2 steht und so weiter und so weiter, da stimmt doch was nicht.
MFG
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Ellert

#5
Zu Problem 1:
Schon in den ersten Zeilen der Befehlsreferenz steht die erste Verhaltensregel des DOIF:
ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
Das ist in Deinem Fall der DOELSE Zweig. Der Zweig mit dem Timer wird überprüft, er wird unwahr, andere Zweige werden nicht überprüft, bleibt nur der Sammelzweig DOELSE.

Zu Problem 2:
Da möchte ich Dich anstossen selbst in der Befehlsreferenz unter dem Attribut selftrigger nachschlagen, denn Loops sind im DOIF per Vorgabe unterbunden. Bei der Gelegenheit könntest Du auch gleich beim Attribut do always nachschlagen, was es bewirkt.

Wie Du das Abbrechen der Wait-Timers verhindern kannst  ist hier beschrieben: partielle_Deaktivierung_der_Befehlsausführung oder Du definierst ein at  mit set Luma Auto als Befehl.

rico5588

Danke erstmal für die Antwort,

Ich habe es scheinbar doch noch nicht ganz verstanden und werde mir meinen Code nochmal neu bauen.
Tipps wie man es besser machen kann nehme ich natürlich gern an.

Rico
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

Ellert

ZitatIch habe es scheinbar doch noch nicht ganz verstanden
Wo genau hast Du noch ein Verständnisproblem?

rico5588

Hallo,

war doch gestern wieder recht spät geworden 8) und habe alles über den Haufen geworfen....
ich habe mir als Vorlage dann dies hier genommen.
https://wiki.fhem.de/wiki/DOIF/Ein-_und_Ausgabe_in_FHEMWEB_und_Tablet-UI_am_Beispiel_einer_Schaltuhr
Bin bis jetzt auch zufrieden und es scheint alles zu gehen, denn Rest zeigt die Zeit.

([$SELF:P_button] eq "Auto" and [[$SELF:P_mybegin1,"00:00"]|8] or [$SELF:P_button] eq "Auto" and [[$SELF:P_mybegin2,"00:02"]|8] or [$SELF:P_button] eq "Auto" and [[$SELF:P_mybegin3,"00:04"]|7])
(set LueftungRico dimzl_operatingmode Stufe_2)
DOELSEIF([$SELF:P_button] eq "Auto" and [[$SELF:P_myend1,"00:01"]|8] or [$SELF:P_button] eq "Auto" and [[$SELF:P_myend2,"00:03"]|8] or [$SELF:P_button] eq "Auto" and [[$SELF:P_myend3,"00:05"]|7])
(set LueftungRico dimzl_operatingmode Aus)
DOELSEIF (["$SELF:P_button: Stufe1"] ) ##manuell Stufe1 für 8000 sec
(set LueftungRico dimzl_operatingmode Stufe_1) (set time_switch_Labor P_button Auto) (set LueftungRico dimzl_operatingmode Aus)
DOELSEIF (["$SELF:P_button: Stufe2"] ) ##manuell Stufe2 für 8000 sec
(set LueftungRico dimzl_operatingmode Stufe_2) (set time_switch_Labor P_button Auto) (set LueftungRico dimzl_operatingmode Aus)
DOELSEIF (["$SELF:P_button: Stufe3"] ) ##manuell Stufe3 für 8000 sec
(set LueftungRico dimzl_operatingmode Stufe_3) (set time_switch_Labor P_button Auto) (set LueftungRico dimzl_operatingmode Aus)
DOELSEIF (["$SELF:P_button: Aus"] ) ##manuell Aus für 8000 sec
(set LueftungRico dimzl_operatingmode Aus) (set time_switch_Labor P_button Auto)
attr time_switch_Labor alias Schaltuhr
attr time_switch_Labor cmdState on|off
attr time_switch_Labor group Labor: Zeitsteuerung mit manuell Ein/Aus
attr time_switch_Labor readingList P_button P_mybegin1 P_myend1  P_mybegin2 P_myend2  P_mybegin3 P_myend3
attr time_switch_Labor room DOIF_Labor
attr time_switch_Labor setList P_button:uzsuSelectRadio,Auto,Stufe1,Stufe2,Stufe3,Aus P_mybegin1:time P_myend1:time P_mybegin2:time P_myend2:time P_mybegin3:time P_myend3:time
attr time_switch_Labor wait 1:1:1,200,212:1,8000:1,8000:1,8000
attr time_switch_Labor webCmd P_button


Habe je 3 Ein und Aus- Schaltzeiten über Readings angelegt, lässt sich jetzt einfacher stellen! Was mir noch fehlt ist eine schön Umsetzung ob der Timer am Wochentag oder am Wochenende gilt. Momentan ist es Fix Programmiert.
Und später möchte ich noch ein paar weitere Bedingungen einbringen (z.b. nur an wenn Solar überschuß)
MFG
Geht nicht gibt's nicht.
NUC-I3+Proxmox, Fritzbox 7590 AX, Synology DS423+
Dimplex Wärmepumpe, Lüftungsanlage, Solarlog 1200
HM,IT,Lacross,EspEasy,Modbus,MQTT2, Freund von Shelly

upsalmo

#9
Hi, ich habe genau dasselbe Problem mit meiner Heizungssteuerung.


define WZ_Heizung_AUTO
DOIF (([08:30-12:00|7] or [14:00-23:45]) and [WG_Status] eq "Tag")
(set WZ_Heizung_Clima desired-temp 22.5)
DOELSEIF ([WG_Status] eq "Nacht")
(set WZ_Heizung_Clima desired-temp 17.0)
DOELSEIF ([WG_Status] eq "Abwesend")
(set WZ_Heizung_Clima desired-temp 19.0)
DOELSEIF ([WG_Status] eq "Urlaub")
(set WZ_Heizung_Clima desired-temp 14.0)
DOELSE
(set WZ_Heizung_Clima desired-temp 20.0)


Wenn ich manuell den Wohnungsstatus (WG_Status) auf beispielsweise "Abwesend" setze, klappt das wunderbar: die Heizung sinkt auf 19.0 Grad ab. Wenn ich aber über Mittag weg bin, entsteht das Problem:  Um 14:00 Uhr wird das DOIF (korrekt) getriggert. Die erste Bedingung ist unwahr, weil zwar die Tageszeit stimmt, aber der WG_Status nicht auf "Tag", sondern auf "Abwesend" steht. Das DOIF springt dann in den letzten Zweig DOELSE.
Ich weiß, dass dies durchaus das Standardverhalten von DOIF ist. Ich habe deshalb extra

attr WZ_Heizung_AUTO checkall 1

gesetzt. Das sollte laut Commandref dafür sorgen, dass ALLE Zweige abgeprüft werden und nicht nur der, der die triggernde Uhrzeit enthält. Der erste WAHRE Zweig, müsste dann doch cmd_3 sein, oder? Der WG_Status steht ja schließlich immer noch auf "Abwesend". Warum springt das DOIF dann trotzdem noch in den letzten DOELSE-Zweig?

Ma_Bo

#10
Versuch es mal so:


DOIF ([WG_Status] eq "Nacht")
(set WZ_Heizung_Clima desired-temp 17.0)
DOELSEIF ([WG_Status] eq "Abwesend")
(set WZ_Heizung_Clima desired-temp 19.0)
DOELSEIF ([WG_Status] eq "Urlaub")
(set WZ_Heizung_Clima desired-temp 14.0)
DOELSEIF (([08:30-12:00|7] or [14:00-23:45]) and [WG_Status] eq "Tag")
(set WZ_Heizung_Clima desired-temp 22.5)
DOELSE
(set WZ_Heizung_Clima desired-temp 20.0)


Aber eigentlich sollte dein DOIF auch so schalten, mach mal bitte ein list von dem DOIF
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Ellert

Zitat von: upsalmo am 23 Dezember 2016, 23:02:26
Hi, ich habe genau dasselbe Problem mit meiner Heizungssteuerung.


define WZ_Heizung_AUTO
DOIF (([08:30-12:00|7] or [14:00-23:45]) and [WG_Status] eq "Tag")
(set WZ_Heizung_Clima desired-temp 22.5)
DOELSEIF ([WG_Status] eq "Nacht")
(set WZ_Heizung_Clima desired-temp 17.0)
DOELSEIF ([WG_Status] eq "Abwesend")
(set WZ_Heizung_Clima desired-temp 19.0)
DOELSEIF ([WG_Status] eq "Urlaub")
(set WZ_Heizung_Clima desired-temp 14.0)
DOELSE
(set WZ_Heizung_Clima desired-temp 20.0)


Wenn ich manuell den Wohnungsstatus (WG_Status) auf beispielsweise "Abwesend" setze, klappt das wunderbar: die Heizung sinkt auf 19.0 Grad ab. Wenn ich aber über Mittag weg bin, entsteht das Problem:  Um 14:00 Uhr wird das DOIF (korrekt) getriggert. Die erste Bedingung ist unwahr, weil zwar die Tageszeit stimmt, aber der WG_Status nicht auf "Tag", sondern auf "Abwesend" steht. Das DOIF springt dann in den letzten Zweig DOELSE.
Ich weiß, dass dies durchaus das Standardverhalten von DOIF ist. Ich habe deshalb extra

attr WZ_Heizung_AUTO checkall 1

gesetzt. Das sollte laut Commandref dafür sorgen, dass ALLE Zweige abgeprüft werden und nicht nur der, der die triggernde Uhrzeit enthält. Der erste WAHRE Zweig, müsste dann doch cmd_3 sein, oder? Der WG_Status steht ja schließlich immer noch auf "Abwesend". Warum springt das DOIF dann trotzdem noch in den letzten DOELSE-Zweig?
In dem Absatz steht auch:
Zitat... dass bei einem Event-Trigger auch Bedingungen geprüft werden, die das triggernde Device nicht beinhalten.
Ein ablaufender Timer ist kein Event-Trigger. Events werden durch ablaufende Timer nicht erzeugt, sondern nur durch Geräte initiiert.

upsalmo

ZitatEin ablaufender Timer ist kein Event-Trigger. Events werden durch ablaufende Timer nicht erzeugt, sondern nur durch Geräte initiiert.

Alles klar, das ist eine Erklärung. Vielen Dank dafür. Dann muss ich mir wohl ein komplett System überlegen. DOIF ist dann wohl (leider!) doch nicht das richtige.

Ellert

Grundsätzlich hast Du immer die Möglichkeit die Bedingungen je Zweig so zu formulieren, dass immer nur ein Zweig wahr wird.

Wenn Du nach wahrwerden einer Bedingung weitere Abfragen benötigst, kannst Du IF verwenden

(<Bedingung 1>)
  (
   IF (<Bedingung a im Befehlsteil>) (<weitere Befehle>),
   IF (<Bedingung b im Befehlsteil>) (<weitere Befehle>),
   IF (<Bedingung c im Befehlsteil>) (<weitere Befehle>),
   .
   .
   .
   )
DOELSEIF (<Bedingung 2>)
  (Befehle)

IF ist in diesem Fall ein FHEM-Befehl mit DOIF ähnlicher Syntax, siehe IF

Damian

#14
Zitat von: upsalmo am 24 Dezember 2016, 23:09:02
Alles klar, das ist eine Erklärung. Vielen Dank dafür. Dann muss ich mir wohl ein komplett System überlegen. DOIF ist dann wohl (leider!) doch nicht das richtige.

Vielleicht kannst du mit dieser Version etwas anfangen:

https://forum.fhem.de/index.php/topic,63375.0.html
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF