Hauptmenü

$SELF Abfrage auf cmd

Begonnen von tomspatz, 15 Juli 2017, 11:02:40

Vorheriges Thema - Nächstes Thema

tomspatz

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

ares

Was willst Du insgesamt erreichen? Nur einen Trigger auslösen?
https://wiki.fhem.de/wiki/Trigger

CoolTux

= ist eine Zuweisung
== Ist ein nummerischer Vergleichsoperator
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

tomspatz

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

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Per

attr selftrigger nicht vergessen. Und dann fleissig probieren ;).

tomspatz

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

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tomspatz

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

Ellert

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.

tomspatz

@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

Ellert

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

tomspatz

#12
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

Per

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!

Ellert

Zitat von: Per am 16 Juli 2017, 21:45:15
Doch, so geht das!
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.

amenomade

Ich zitiere mich selbst:
ZitatSelbst-triggernde DOIFs sind immer tricky... Kann man es nicht anders machen? Was willst Du genau machen?
;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

tomspatz

#16
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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF