FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: holle75 am 30 September 2018, 14:44:00

Titel: set DOIF cmd_next
Beitrag von: holle75 am 30 September 2018, 14:44:00
Hallo, sagen wir mal ein DOIF hat viele cmd stati. Nun kann ich ja über "set DOIF cmd_x" einen genauen Status anfahren. Wie wäre es, wenn ich aber den nächsten cmd-Status aktivieren wollte?

jemand eine Idee?

Danke und Gruß
H.

Titel: Antw:set DOIF cmd_next
Beitrag von: Ellert am 30 September 2018, 21:14:26
Du könntest über "set magic" den nächsten Zustand berechnen, s. https://commandref.fhem.de/commandref_DE.html#set

set <name> {(calcNextState)}
Titel: Antw:set DOIF cmd_next
Beitrag von: Damian am 30 September 2018, 21:20:20
Zitat von: Ellert am 30 September 2018, 21:14:26
Du könntest über "set magic" den nächsten Zustand berechnen, s. https://commandref.fhem.de/commandref_DE.html#set

set <name> {(calcNextState)}

und jetzt kommt die Frage: wie sieht calcNextState aus?

Dazu muss man die Anzahl der Zweige bestimmen und aufgrund des aktuellen Zustands den nächsten bestimmen. Das dürfte schon kompliziert genug sein.
Titel: Antw:set DOIF cmd_next
Beitrag von: Ellert am 30 September 2018, 23:29:37
Zitatjemand eine Idee?
Es ist halt eine Idee, im einfachsten Fall ungetestet so
{(Value(<name>) =~ /(\d+)/;;"cmd_".($1+1))}
Titel: Antw:set DOIF cmd_next
Beitrag von: Per am 01 Oktober 2018, 13:00:22
Zitat von: Damian am 30 September 2018, 21:20:20
Dazu muss man die Anzahl der Zweige bestimmen und aufgrund des aktuellen Zustands den nächsten bestimmen. Das dürfte schon kompliziert genug sein.
Naja, den aktuellen Zustand gibt es als Reading und in den letzten Case schreibt man einfach
set $SELF cmd_1
rein.
Titel: Antw:set DOIF cmd_next
Beitrag von: holle75 am 01 Oktober 2018, 20:04:08
Männer, ich kann euch nicht folgen

Zitat von: Ellert am 30 September 2018, 23:29:37
{(Value(<name>) =~ /(\d+)/;;"cmd_".($1+1))}

das einzige was ich verstehe, ist das +1 im Code. Wüßte jetzt nicht wie und wo das so hin sollte? Sobald ihr mit Perl loslegt ist bei mir leider Sense. Aber +1 macht mir Sinn ;)

Zitat von: Per am 01 Oktober 2018, 13:00:22
Naja, den aktuellen Zustand gibt es als Reading und in den letzten Case schreibt man einfach
set $SELF cmd_1
rein.

Per, wie immer mir zu schnell. Wieso will ich in einem case das DOIF auf cmd_1 setzen? Will doch +1 und nicht was fest definiertes.
Titel: Antw:set DOIF cmd_next
Beitrag von: Ellert am 01 Oktober 2018, 20:20:12
Zitat von: holle75 am 01 Oktober 2018, 20:04:08
Wüßte jetzt nicht wie und wo das so hin sollte?
In den Set-Befehl, ich hatte "set magic" erwähnt in diesem Zusammenhang.

Die Commandref findest Du selbst? ;)
Titel: Antw:set DOIF cmd_next
Beitrag von: holle75 am 01 Oktober 2018, 20:36:20
Danke Ellert, ja klar finde ich die commandref. Warum auch nicht? Immer die erste Anlaufstelle ;) ...

.... EDIT: wobei jetzt meine Suchfunktion im Browser kein "Magic" in der commandref im Bereich DOIF findet. Mmh?

Ah ok, jetzt deinem Link weiter oben gefolgt.
Titel: Antw:set DOIF cmd_next
Beitrag von: Per am 02 Oktober 2018, 11:17:14
Zitat von: holle75 am 01 Oktober 2018, 20:04:08Per, wie immer mir zu schnell. Wieso will ich in einem case das DOIF auf cmd_1 setzen? Will doch +1 und nicht was fest definiertes.
Wenn du im letzten (aktiven) Case bist, gehst du damit einfach auf den danach, welcher als Dummy wieder an den Anfang geht. Also quasi
i = i + 1
if i = max then i = 1
mit DOIF-Mitteln.

Zitat von: Ellert am 30 September 2018, 23:29:37
Es ist halt eine Idee, im einfachsten Fall ungetestet so
{(Value(<name>) =~ /(\d+)/;;"cmd_".($1+1))}
Wäre es nicht noch einfacher, auf das Reading cmd_nr zu gehen?
Titel: Antw:set DOIF cmd_next
Beitrag von: holle75 am 02 Oktober 2018, 11:23:51
Per, sag ja du bist zu schnell ;)

So verstehe ich das (prinzipiell, nicht im Detail).

Muß mich mal um die Syntax (die ich noch nicht ganz verstehe) und die Umsetzung die nächsten Tage kümmern. set magic ist Neuland.... und wie ich das in einen Dummy baue kann ja nur einen Tag rumprobieren bedeuten :D
Titel: Antw:set DOIF cmd_next
Beitrag von: Per am 02 Oktober 2018, 11:52:25
Aufruf
set testdoif next

Def
def testdoif DOIF (["$SELF:next"])(set $SELF cmd_([$SELF:cmd] + 1))
DOELSEIF...
DOELSEIF...
DOELSEIF...
DOELSE (set $SELF cmd_2) ## hier 2, weil in 1 ja jetzt das Inkrement steht

(wobei ich für das (["$SELF:next"]) keine Garantie übernehme, mit Events stehe ich etwas auf Kriegsfuss! ;) Ist aber hier das gleiche Prinziep wie bei der Web-Oberfläche, also zur Not dort "klauen".
)
Man kann das Inkrement auch ins set verlagern, bräuchte dann aber wieder Perl (siehe "Formel" von Ellert).
Titel: Antw:set DOIF cmd_next
Beitrag von: holle75 am 02 Oktober 2018, 13:22:58
das sieht fast zu einfach aus? ;)

aber verstehen würde ich es.

allerdings möchte ich das ungern in das Hauptdoif welches geschaltet werden soll einbauen, weil das schon soooo komplex ist (du kennst es ja).

Aber ein:

def testdoif DOIF (["dummy:next"])(set Hauptdoif cmd_([Hauptdoif:cmd] + 1))

sollte es dann ja tun. Schwierig dann nur, den letzten DOELSEIF Zweig im Hauptdoif hier abzufangen und wieder auf den ersten Fall zu setzen.
Titel: Antw:set DOIF cmd_next
Beitrag von: Per am 02 Oktober 2018, 13:48:46
Zitat von: holle75 am 02 Oktober 2018, 13:22:58du kennst es ja
Naja, was der letzte Stand ist (sind ja zwei DOIFs, glaube ich), darüber habe ich den Überblick verloren.

Zitat von: holle75 am 02 Oktober 2018, 13:22:58
Aber ein:

def testdoif DOIF (["dummy:next"])(set Hauptdoif cmd_([Hauptdoif:cmd] + 1))

sollte es dann ja tun.
Ja, wäre aber ein extra DOIF.


Zitat von: holle75 am 02 Oktober 2018, 13:22:58Schwierig dann nur, den letzten DOELSEIF Zweig im Hauptdoif hier abzufangen und wieder auf den ersten Fall zu setzen.
Der sollte aber einfach hinten ans Haupt-DOIF dran zu hängen sein. Oder du gehst von einer bekannten Anzahl aus, dann kannst du das Hilfs-DOIF erweitern:
def testdoif DOIF (["dummy:next"] and [?Hauptdoif:cmd_nr] == max)(set Hauptdoif cmd_1)
DOELSEIF (["dummy:next"])(set Hauptdoif cmd_([Hauptdoif:cmd] + 1))


Wahrscheinlich würde sogar
def testdoif DOIF (["dummy:next"] and [?Hauptdoif:cmd_nr] == maxcmd)(set Hauptdoif cmd_1)
DOELSE (set Hauptdoif cmd_([Hauptdoif:cmd] + 1))

gehen. Einen Test wäre es wert.
maxcmd ist halt die Anzahl der Cases des HauptDOIF.
Titel: Antw:set DOIF cmd_next
Beitrag von: holle75 am 02 Oktober 2018, 14:08:25
Zitat von: Per am 02 Oktober 2018, 13:48:46
hrscheinlich würde sogar
def testdoif DOIF (["dummy:next"] and [?Hauptdoif:cmd_nr] == maxcmd)(set Hauptdoif cmd_1)
DOELSE (set Hauptdoif cmd_([Hauptdoif:cmd] + 1))

gehen. Einen Test wäre es wert.
maxcmd ist halt die Anzahl der Cases des HauptDOIF.

das sieht mir ausgesprochen gut aus. Werde ich probieren.... muß heute und morgen noch den (vollautomatisierten) Hühnerstall fertigbauen. Gerade gutes Wetter. Werde berichten.

Danke Per! und auch Ellert fürs mitdenken.

Edit: Achso und als kleiner Exkurs zu der Diskussion die commandref Richtung Perl-DOIF umzubauen:

Das hier ist gerade ein Paradebeispiel wie ich (und wahrscheinlich auch andere die kein Perl können) DOIF nutzen. Auch ich bekomme Angst ,wenn Code für mich nicht mehr "leserlich"  ist. Das ist das tolle an DOIF. Egal wie viele Sondermöglichkeiten und Komplexitätssteigerungen durch Attribute es noch gibt. Im Kern kann ich supersimpel (auch mit Hilfe von so freundlichen Menschen wie Per und Ellert und Damian ---- ich ziehe hiermit erneut meinen Hut) recht viel erreichen.

Ohne DOIF gäbe es für mich kein fhem. Nicht weil ich es nicht trotzdem großartig finden würde, sondern einfach, weil ich keine neue Programmiersprache lernen kann. Zu viele andere Aufgaben. Vielleicht irgendwann, wenn ich mal Rentner bin ;)

.... und was ist daran schlimm?! :D

EDIT: Syntax für die Berechnung muss noch geschweifte Klammern haben

([?BeregnungDOIF_Trigger:AutomaticIsRunning] eq "on" and ["^BeregnungSkip$:next"]) (set BeregnungDOIF_Trigger cmd_{([BeregnungDOIF_Trigger:cmd_nr]+1)})