FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: tomspatz am 15 Juli 2017, 11:02:40

Titel: $SELF Abfrage auf cmd
Beitrag von: tomspatz am 15 Juli 2017, 11:02:40
DOELSEIF ([$SELF:cmd_] = 1)
oder
DOELSEIF ([$SELF:cmd_] = "1")

Ist da eins von richtig um auf den eigenen Status zu Triggern?
Kann ich dann ggf:
DOELSEIF ([$SELF:cmd_] = 1) (set $SELF cmd_5)

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: ares am 15 Juli 2017, 11:09:11
Was willst Du insgesamt erreichen? Nur einen Trigger auslösen?
https://wiki.fhem.de/wiki/Trigger (https://wiki.fhem.de/wiki/Trigger)
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: CoolTux am 15 Juli 2017, 12:30:31
= ist eine Zuweisung
== Ist ein nummerischer Vergleichsoperator
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 15 Juli 2017, 12:55:44
ZitatPerl gewohnt, mit Operatoren
ja gemerkt, doch geht es mir weiter um die richtige Syntax:
DOELSEIF ([$SELF:cmd_] == 1)
oder
DOELSEIF ([$SELF:cmd_] == "1")
bzw passt die Abfrage cmd_ oder nur cmd überhaupt so?

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: amenomade am 15 Juli 2017, 13:31:58
DOELSEIF ([$SELF:cmd] eq "1")
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Per am 15 Juli 2017, 16:13:09
attr selftrigger nicht vergessen. Und dann fleissig probieren ;).
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 15 Juli 2017, 20:45:07
OK Vielen dank an alle. :)
Jetzt bekomme ich allerdings nicht hin das in einem Ausführungszweig das DOIF wieder in ein anderres cmd gesetzt wird, konfus geht das überhaupt??
defmod SteuerungStromWerkstatt DOIF ([WERK_WS01_WOL] eq "on" or [WERK_WS02_WOL] eq "on" ) (\
set WerkstattZentralDummyNotify inactive)\
DOELSEIF ([WERK_WS01_WOL] eq "off" and [WERK_WS02_WOL] eq "off" )(\
set WerkstattZentralDummyNotify active)\
DOELSEIF ([$SELF:cmd] eq "1" and [WerkstattZentralDummy] eq "off")(\
set WerkstattZentralDummy on)(\
set $SELF cmd_1)\
DOELSEIF ([WerkstattZentral:"on|off"])(\
set $SELF cmd_1)(\
set WerkstattZentralDummy $EVENT)(\
set $SELF cmd_2)
attr SteuerungStromWerkstatt do always
attr SteuerungStromWerkstatt group Werkstatt Zentral Einstellungen
attr SteuerungStromWerkstatt selftrigger all
attr SteuerungStromWerkstatt wait 0:0:0,1:0,1,1


Zur Erklärung der vierte Zweig geht noch gar nicht, aber der dritte ist was ich nicht verstehe der dummy wird gesetzt aber das DOIF verbleibt bei cmd_3 und wechselt nicht nach 1 Sekunde zu cmd_1.

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: amenomade am 15 Juli 2017, 21:21:24
Selbst-triggernde DOIFs sind immer tricky... Kann man es nicht anders machen? Was willst Du genau machen?

Ansonsten poste mal ein "list SteuerungStromWerkstatt", wenn er in cmd_3 blockiert ist.
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 16 Juli 2017, 12:11:42
hmmmmm das verstehe ich wirklich nicht.

Das gibt DOIFtools raus beim absetzten von set SteuerungStromWerkstatt cmd_3. Wobei das DOIF dann im cmd_2 steht, das wird so nie passieren deswegen auch die zweite Zeile ignorieren, dieses sollte eh NIE vorkommen wenn es fertig ist.

2017-07-16 11:56:20 dummy WerkstattZentral on
2017-07-16 11:56:20 dummy WerkstattZentralDummy on
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_nr: 3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_seqnr: 1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_event: set_cmd_3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_3_1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt wait_timer: no timer
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt wait_timer: no timer
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1" ist keine gültige Auswahl.


Wobei ich mittlerweile gar nicht sicher bin ob das setzen eines cmd alsio das DOIF in einen definierten Zustand  innerhalb von einem anderen Zweig funktioniert.

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Ellert am 16 Juli 2017, 14:08:38
Zitat von: tomspatz am 16 Juli 2017, 12:11:42
hmmmmm das verstehe ich wirklich nicht.

Das gibt DOIFtools raus beim absetzten von set SteuerungStromWerkstatt cmd_3. Wobei das DOIF dann im cmd_2 steht, das wird so nie passieren deswegen auch die zweite Zeile ignorieren, dieses sollte eh NIE vorkommen wenn es fertig ist.

2017-07-16 11:56:20 dummy WerkstattZentral on
2017-07-16 11:56:20 dummy WerkstattZentralDummy on
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_nr: 3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_seqnr: 1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_event: set_cmd_3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt cmd_3_1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: cmd_nr: 3,cmd_seqnr: 1,cmd: 3.1,cmd_event: set_cmd_3,cmd_3_1,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt wait_timer: no timer
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:20 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: 16.07.2017 11:56:21 cmd_3_2 set_cmd_3,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt wait_timer: no timer
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt Device: SteuerungStromWerkstatt
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1
2017-07-16 11:56:21 DOIF SteuerungStromWerkstatt e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1,e_SteuerungStromWerkstatt_events: wait_timer: no timer,Device: SteuerungStromWerkstatt,e_SteuerungStromWerkstatt_cmd: 3.1" ist keine gültige Auswahl.


Wobei ich mittlerweile gar nicht sicher bin ob das setzen eines cmd alsio das DOIF in einen definierten Zustand  innerhalb von einem anderen Zweig funktioniert.

LG
Tom

Mit set <DOIFname> <Status> wird es nicht funktionieren, das ist mehr dazu gedacht einen Befehlszweig bedingungslos auszuführen, z.B. mit webCmd.

Du müsstest die Selbsttriggerung im Zweig 1 einbauen, etwa so:
([WERK_WS01_WOL] eq "on" or [WERK_WS02_WOL] eq "on" or [$SELF] eq "cmd_3")


Zitat(\
      set $SELF cmd_1)(\
      set WerkstattZentralDummy $EVENT)(\
      set $SELF cmd_2)

Die Idee ist schon interessant, aber so funktioniert DOIF nicht. Du kannst einen Befehlszweig nicht wie eine Subroutine aufrufen und dann in den aufrufenden Zweig zurückkehren.
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 16 Juli 2017, 16:42:36
@Ellert
danke für die Aufklärung.
Du schreibst:
([WERK_WS01_WOL] eq "on" or [WERK_WS02_WOL] eq "on" or [$SELF] eq "cmd_3")
Ich glaube so sollte es sein dann gibt es keine "roten" Klammern hinter $SELF im DEF Editor
([WERK_WS01_WOL] eq "on" or [WERK_WS02_WOL] eq "on" or [$SELF:cmd] eq "3")

ZitatDie Idee ist schon interessant, aber so funktioniert DOIF nicht. Du kannst einen Befehlszweig nicht wie eine Subroutine aufrufen und dann in den aufrufenden Zweig zurückkehren.

Tja das habe ich einen ganzen Abend lang auf Papier gekritzelt, bis ich so weit war das umzuschreiben.
Schade, aber ich war schon selbst skeptisch.

Könnte man das denn auslagern dann vom DOIF ausführen lassen?

Das Ziel ist einen Dummy in der WEB mit einem "echten" Schalter bidirektional zu verknüpfen, dabei halt den dummy "sperren" wenn PC "an" ist.
Das ganze habe ich schon funktionsfähig am laufen mit zwei notify's und zwei DOIF'S würde es allerdings lieber in einem "Baustein" halten daher die experimentierwut. (ist das ein Wort ?)

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Ellert am 16 Juli 2017, 17:41:26
Dass hier [$SELF] eq "cmd_3" rote Klammern erscheinen liegt am codemirror, Dein Vorschlag würde auch klappen.

Was für ein Verhalten zeigt ein echter bidirektionaler Schalter, Ein/Aus für Wechselstrom?

Verriegeln musst Du nicht auslagern und einen Dummy brauchst Du auch nicht.

([$SELF:switch] eq "on") (set RelaisPC on)
DOELSEIF ([PC:presence] eq "absent"))


Attribute
readingList switch
setList switch:on,off
webCmd switch


Das DOIF schaltet das Relais nur, wenn PC absent ist, egal wie oft im WEB on gewählt wird. Den Off-Zweig kannst Du sparen, der wäre nur sinnvoll, wenn der PC auch über switch ausgeschaltet werden sollte. Da switch (Dummyersatz) gesperrt werden soll, wenn der PC an ist, würde ausschalten nie funktionieren, also brauchst Du nur den On-Zweig
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 16 Juli 2017, 19:57:08
hmm das ist aber nur für on und leider nicht "rückwärts" wenn der "echte" Schalter betätigt wird.


Könntest du mir bei der Sub unter die Arme greifen, das ist mir noch ganz neu.
Ich habe mal geschrieben:
sub
WerkstattSchalter
{
my ($event)= @_;
if ($event eq "on")
{
fhem (set WerkstattZentralDummyNotify '\inactive', set WerkstattZentralDummy $event, set WerkstattZentralDummyNotify '\active')
}
if ($event eq "off")
    {
fhem (set WerkstattZentralDummyNotify '\inactive', set WerkstattZentralDummy $event, set WerkstattZentralDummyNotify '\active')
    }
}


Aber erstens habe ich da keine Verzögerung und es ist schon spät. Genug für heute.

LG
Tom
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Per am 16 Juli 2017, 21:45:15
Zitat von: Ellert am 16 Juli 2017, 14:08:38Die Idee ist schon interessant, aber so funktioniert DOIF nicht. Du kannst einen Befehlszweig nicht wie eine Subroutine aufrufen und dann in den aufrufenden Zweig zurückkehren.
Doch, so geht das (https://forum.fhem.de/index.php/topic,66153.msg621599.html#msg621599)!
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Ellert am 16 Juli 2017, 23:54:40
Zitat von: Per am 16 Juli 2017, 21:45:15
Doch, so geht das (https://forum.fhem.de/index.php/topic,66153.msg621599.html#msg621599)!
Ja, stimmt. Ich hatte mir nur den Logauszug angesehen, danach wurde nicht in cmd_1 gesprungen.

Zitat von: tomspatz am 16 Juli 2017, 19:57:08
hmm das ist aber nur für on und leider nicht "rückwärts" wenn der "echte" Schalter betätigt wird.


Könntest du mir bei der Sub unter die Arme greifen, das ist mir noch ganz neu.
Ich habe mal geschrieben:
sub
WerkstattSchalter
{
my ($event)= @_;
if ($event eq "on")
{
fhem (set WerkstattZentralDummyNotify '\inactive', set WerkstattZentralDummy $event, set WerkstattZentralDummyNotify '\active')
}
if ($event eq "off")
    {
fhem (set WerkstattZentralDummyNotify '\inactive', set WerkstattZentralDummy $event, set WerkstattZentralDummyNotify '\active')
    }
}


Aber erstens habe ich da keine Verzögerung und es ist schon spät. Genug für heute.

LG
Tom

Ich habe Deine Problemstellung leider nicht verstanden, könntest Du die mal etwas erläutern, indem Du die beteiligten Eingangs- und Ausgangsgrößen beschreibst und wie die Zustände der Eingangsgrößen die Ausgangsgrößen verändern sollen.
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: amenomade am 17 Juli 2017, 00:05:58
Ich zitiere mich selbst:
ZitatSelbst-triggernde DOIFs sind immer tricky... Kann man es nicht anders machen? Was willst Du genau machen?
;)
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: tomspatz am 17 Juli 2017, 21:19:15
defmod SteuerungStromWerkstatt DOIF ([WERK_WS01_WOL] eq "on" or [WERK_WS02_WOL] eq "on" or [?$SELF:cmd] eq "3") (\
set WerkstattZentralDummyNotify inactive)\
DOELSEIF ([WERK_WS01_WOL] eq "off" and [WERK_WS02_WOL] eq "off" )(\
set WerkstattZentralDummyNotify active)\
DOELSEIF ([?$SELF:cmd] eq "1" and [WerkstattZentralDummy] eq "off")(\
set WerkstattZentralDummy on)\
DOELSEIF ([WerkstattZentral] eq "on" and [?$SELF:cmd] eq "5")(\
set WerkstattZentralDummyNotify inactive)(\
set WerkstattZentralDummy on)(\
set WerkstattZentralDummyNotify active)\
DOELSEIF ([WerkstattZentral] eq "off")(\
set WerkstattZentralDummyNotify inactive)(\
set WerkstattZentralDummy off)(\
set WerkstattZentralDummyNotify active)
attr SteuerungStromWerkstatt do always
attr SteuerungStromWerkstatt group Werkstatt Zentral Einstellungen
attr SteuerungStromWerkstatt selftrigger all
attr SteuerungStromWerkstatt wait 0:0:0:0,1,0:0,1,0


Soweit bin ich schon aber es scheitert am 4 Zweig:

Da sollte auch das cmd_5 berücksichtigt werden aber das das mehrere Zustäde hat klappt das so nicht.
Habe es mit diesem Regex versucht der funktionier zwar auf der Test Seite http://regexr.com/ aber nicht hier.
DOELSEIF ([WerkstattZentral] eq "on" and [?$SELF:cmd] eq "5\D.")(\

Geht das überhaupt so?

LG
Tom

Da sollte auch das cmd_5 berücksichtigt werden
Titel: Antw:$SELF Abfrage auf cmd
Beitrag von: Damian am 17 Juli 2017, 21:34:08
Zitat von: tomspatz am 17 Juli 2017, 21:19:15
DOELSEIF ([WerkstattZentral] eq "on" and [?$SELF:cmd] eq "5\D.")(\

Geht das überhaupt so?

Nein.

Regex geht in Perl (DOIF) nicht mit eq sondern mit =~

Mit Abfragen des eigenen Status baut man einen "Endlichen Automaten".

Solche Automaten können schnell komplex werden.

Ein Programmier-Experte würde sich erstmal eine Übergangsmatrix bzw. Zustandsübergangsdiagramm aufmalen.

Die Gefahr ist, wenn man sofort loslegt, dass man Fälle übersieht, die im nachhinein zum unerwünschten Verhalten führen.