DOIF Kaffeemaschine schaltet im letzten schritt nicht ab ??

Begonnen von Micky, 07 September 2019, 14:56:16

Vorheriges Thema - Nächstes Thema

Micky

Hallo,

brauche Hilfe beim DOIF, das mit der Kaffeemaschine ist etwas kompliziert, also wenn ich die Kaffeemaschine per 12V Taster der Kaffeemaschine an und ausschalte bekommt das Fibaro FGS-222 nichts davon mit deshalb so umständlich und doppelt gemoppelt

Über APP und FHEM funktioniert das ein und ausschalten und die damit verbunden DOIFs gut.

Zitat([Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)

cmd_1 und cmd_2 funktionieren auch soweit nur bei cmd_3 sprich die letzte abfrage

Anbei das Komplette DOIF

([Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)

DOELSEIF
([Kaffeemaschine:state] eq "on")
(set Pushnachricht msg 'Silvia 1tes mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Silvia 2tes mal an' 'Kaffemaschine wird weiter angeschaltet gelassen {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine on-for-timer 1740)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')

## Kaffeemaschine per Taster anschalten damit das erkannt wird wird Steckdose aus und angeschaltet, anschliessend wieder die Kaffeemaschine an
DOELSEIF
([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 1)
(set Pushnachricht msg 'Kaffeemaschine Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschinen_Steckdose off)
(set Kaffeemaschinen_Steckdose on)
(set Kaffeemaschine on)
(set Pushnachricht msg 'Kaffeemaschine ausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off)

DOELSE


wait 0:0,1740,3,3,30:0,3,3,3,1740,3

er spring von cmd_3_4 auf cmd_4 und vernachlässigt die letzten 2 Set Befehle.

Warum geht die Kaffeemaschine nicht aus nach 1740 sek sprich 29 min.?

Vielen Dank

Damian

Weil während der Wartezeit andere Bedingung wahr wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

#2
ah verstehe,

dachte wenn er im cmd_2 ist vom DOIF das es dann erstmal komplett cmd_2 zB alle befehle durchläuft bevor er wieder auf einem anderen cmd springt

Kann ich das irgendwie umgehen oder anders die DOIF schreiben ?

Danke nochmal

Damian

Zitat von: Micky am 07 September 2019, 20:08:53
ah verstehe,

dachte wenn er im cmd_2 ist vom DOIF das es dann erstmal komplett cmd_2 zB alle befehle durchläuft bevor er wieder auf einem anderen cmd springt

Kann ich das irgendwie umgehen oder anders die DOIF schreiben ?

Danke nochmal

Du musst zunächst herausfinden, in welchen Zweig während der Wartezeit gewechselt wird.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

Hi Damian,

also er geht dann in den DOELSE sprich cmd_4

also als wenn nix zutrifft

Damian

Wenn du den letzten Fall nicht brauchst, dann kannst du DOELSE weglassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

#6
Hi,

danke das war das Problem.

Gibt es allerdings eine Möglichkeit nach jedem Durchgang das DOIF wieder auf cmd_1 zu setzten ?

da er im Anschluss auf cmd_3 bleibt, wenn ich dann wieder die Kaffeemaschine starte passiert nix weil es kein neues Ereignis gibt nehme ich an.
eigentlich müsste er doch sowieso nach jedem Durchgang wieder auf cmd_1 gehen da die Kaffeemaschine ausgeschaltet wird am ende von jeder DOELSEIF  (cmd_2 sowie cmd_3)

([Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)

DOELSEIF
([Kaffeemaschine:state] eq "on" and [DOIF_Kaffeemaschine:state] ne "cmd_3")
(set Pushnachricht msg 'Silvia 1tes mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Silvia 2tes mal an' 'Kaffemaschine wird weiter angeschaltet gelassen {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine on-for-timer 1740)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')

DOELSEIF
([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 0.9)
(set Pushnachricht msg 'Silvia Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschinen_Steckdose off)
(set Kaffeemaschinen_Steckdose on)
(set Kaffeemaschine on)
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')


EDIT: ich glaub mit dem Attribut " do always" scheint es zu gehen.

Damian

do always ist in deiner Definition nicht günstig, da du mit [Kaffeemaschinen_Steckdose:power] > 0.9 einen Trigger hast, der vermutlich ständig Events produziert.

Für deinen Fall gibt es das Attribut selftrigger, damit kannst du auf eigene Events in der Bedingung reagieren, z. B.


([$SELF:state] eq "cmd_3" or [Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)...



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

Micky

#8
Zitat von: Damian am 08 September 2019, 09:23:55
do always ist in deiner Definition nicht günstig, da du mit [Kaffeemaschinen_Steckdose:power] > 0.9 einen Trigger hast, der vermutlich ständig Events produziert.

Für deinen Fall gibt es das Attribut selftrigger, damit kannst du auf eigene Events in der Bedingung reagieren, z. B.


([$SELF:state] eq "cmd_3" or [Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)...


Guten Morgen Damian,

also habs jetzt so abgeändert, ich dachte er würde dann in einer Endlosschleife gehen da er schliesslich bei cmd_3 aufhört, und der Zustand dann wieder wahr sein würde.
Aber scheint zu funktionieren, anbei der letzte abschnitt vom Code.

muss man nach dem Or nicht alles klammern ??

([$SELF:state] eq "cmd_3"  or ([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 900 and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home"))


DOELSEIF
([$SELF:state] eq "cmd_3" or [Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 900 and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home")
(set Pushnachricht msg 'Silvia Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschinen_Steckdose off)
(set Kaffeemaschinen_Steckdose on)
(set Kaffeemaschine on)
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')

Damian

Es gibt eine Rangfolge in Perl (die DOIF-Bedingung ist in Wirklichkeit Perl) wie in allen anderen Programmiersprachen, grob: zuerst Vergleich dann and und dann or, ansonsten entsprechend klammern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

#10
Hi,

müsste es dann nicht in einer Endlosschleife enden bei

[$SELF:state] eq "cmd_3"

da nach der cmd_3 Durchgang er ja schliesslich wieder auf state cmd_3 stehen bleibt ?

Edit: hab es getestet, er startet den Durchgang garnicht mehr obwohl
[$SELF:state] eq "cmd_3"
im DOIF steht, hast du eine Idee ?

als wenn cmd_3 nicht getriggert wird.

Micky

#11
verstehe nicht wenn DOIF Bedingung Kaffeemaschine:state eq off ist muss er doch eigentlich nach cmd_3 auf cmd_1 gehen ?
Wieso bleibt er auf cmd_3


([Kaffeemaschine:state] eq "off")
(set Kaffeemaschine on, set Kaffeemaschine off)

DOELSEIF
([Kaffeemaschine:state] eq "on" and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home")
(set Pushnachricht msg 'Silvia 1tes mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Silvia 2tes mal an' 'Kaffemaschine wird weiter angeschaltet gelassen {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine on-for-timer 1740)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')

DOELSEIF
([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 100 and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home")
(set Pushnachricht msg 'Silvia Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschinen_Steckdose off)
(set Kaffeemaschinen_Steckdose on)
(set Kaffeemaschine on)
(set Kaffeemaschine off, set Kaffeemaschine on, set Kaffeemaschine off)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')


wenn ich am ende
DOELSE einfüge klappt es allerdings springt er dann vor dem ende des wait auf cmd_4 und die Kaffeemaschine bleibt leider an

0:0,1740,0,0,1738:0,3,3,3,22,0

alles was unter 30 sek ist das macht er super bis ende cmd_3.6 in diesem bspl 22sek
wenn der wait Timer >30 sek ist dann springt er vor dem ende schon auf cmd_4 ohne cmd_3.5 sowie cmd_3.6 auszuführen

stimmt evtl. was nicht mit dem wait Timer ?

danke nochmal für die Hilfe

Damian

Da ich deinen "Zustandsautomaten" nicht im Einzelnen nachvollziehen konnte, kann ich dir da keine Lösung präsentieren. Beim wait sollten auch Endlosschleifen funktionieren, ohne wait wird FHEM beim zweiten Durchlauf die Schleife zwangsunterbrechen, damit das System nicht zum Erliegen kommt. Wie gesagt, jeder Wechsel des Zweiges unterbricht einen laufenden Timer und damit die Ausführung weiterer Befehle des Zweiges.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

#13
Abend,

ok aber zumindest läuft er ohne DOELSE bis zum ende durch und bricht den wait nicht vorher ab.

kannst du mir bei der Sache mit dem [$SELF:state] eq "cmd_3" helfen da diese ja nicht funktioniert.

ich hab auch versucht
set $SELF cmd_1
oder
set DOIF_Kaffeemaschine cmd_1

allerdings bleibt er nach Ablauf von cmd_3 auf cmd_3


DOELSEIF
([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 100 and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home")
(set Pushnachricht msg 'Silvia Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine on)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off)
(set DOIF_Kaffeemaschine cmd_1)


wenn ich es in FHEM Befehlszeile teste klappt es mittels
set DOIF_Kaffeemaschine cmd_1

im DOIF macht er das leider nicht

Damian

Zitat von: Micky am 08 September 2019, 18:55:36
Abend,

ok aber zumindest läuft er ohne DOELSE bis zum ende durch und bricht den wait nicht vorher ab.

kannst du mir bei der Sache mit dem [$SELF:state] eq "cmd_3" helfen da diese ja nicht funktioniert.

ich hab auch versucht
set $SELF cmd_1
oder
set DOIF_Kaffeemaschine cmd_1

allerdings bleibt er nach Ablauf von cmd_3 auf cmd_3


DOELSEIF
([Kaffeemaschine:state] eq "off" and [Kaffeemaschinen_Steckdose:power] > 100 and [HS_manuell:state] eq "off" and [rgr_Residents:state] eq "home" and [HomeStatus:state] eq "home")
(set Pushnachricht msg 'Silvia Manuel 1 mal an' 'Kaffemaschine wird aufgewärmt {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine on)
(set Pushnachricht msg 'Kaffeemaschine autoausschaltung' 'Kaffemaschine wird ausgeschaltet {(localtime)}''Micky-Iphone' 0 '')
(set Kaffeemaschine off)
(set DOIF_Kaffeemaschine cmd_1)


wenn ich es in FHEM Befehlszeile teste klappt es mittels
set DOIF_Kaffeemaschine cmd_1

im DOIF macht er das leider nicht

Zitatset DOIF_Kaffeemaschine cmd_1
kann im DOIF selbst nicht funktionieren, da nach der Ausführung erst der Status gesetzt wird und der ist dann eben nicht cmd_1, sondern der des aktuellen Zweiges.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Micky

#15
Hi,

ok verstehe, wäre es sinnvoller das ganze als notify zu machen?




Damian

Zitat von: Micky am 09 September 2019, 14:58:48
Hi,

ok verstehe, wäre es sinnvoller das ganze als notify zu machen?

Wie sah deine letzte Definition ohne set ... cmd_1 aus?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF