[erledigt] sleep 3;set XYZ;set ABC vs. {fhem("sleep 3;set XYZ;set ABC")}

Begonnen von MadMax-FHEM, 04 März 2020, 17:37:01

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

Ich bin aktuell etwas am "Erweitern" meiner "Programmierung"...
...ich mache viel mit myUtils und Subs...

Um bestimmte Dinge ausprobieren zu können gebe ich Aufrufe schon mal in FHEMWEB-cmd ein...

Folgendes (siehe Betreff) sollte doch "identisch" sein (ja in FHEMWEB nach Perl und wieder zurück ist "Quatsch" aber in myUtils muss ich ja fhem("") aufrufen):

FHEMWEB-cmd:

sleep 3;set XYZ on;set ABC on


EDIT: das funktioniert (natürlich)

FHEMWEB-cmd:

{fhem("sleep 3;set XYZ on;set ABC on")}

liefert folgenden Fehler:
Unknown command {fhem("sleep, try help.

EDIT: es wird aber wie gewünscht ausgeführt...
EDIT2: gut, nicht ganz, der letzte set führt dazu, dass im state des Devices dann 'on")}' statt on steht...

Gestern ist mir bei ähnlichen Aufrufketten sogar fhem abgestürzt (bzw. wurde durch systemd [vermute ich] neu gestartet)...

Bzw. (habe eben noch mal ins Log geschaut) war es wegen readingsProxy:


Unmatched ) in regex; marked by <-- HERE in m/^off") <-- HERE }[ :]/ at ./FHEM/33_readingsProxy.pm line 240.


Und zwar folgende "Kette":


set readingsProxyDev on; sleep 5; set readingsProxyDev off; sleep 1; set readingsProxyDev on; sleep 3; set readingsProxyDev off; sleep 1; set readingsProxyDev on; sleep 2; set readingsProxyDev off


Bzw. genauer eben folgendes in FHEMWEB-cmd:

{fhem("set readingsProxyDev on; sleep 5; set readingsProxyDev off; sleep 1; set readingsProxyDev on; sleep 3; set readingsProxyDev off; sleep 1; set readingsProxyDev on; sleep 2; set readingsProxyDev off")}


Mit ebenfalls (ähnlicher) Fehlermeldung bzgl. unknown command...

Dann habe ich ein wenig mit "blink" rumgetan aber irgendwie...

Allerdings habe ich gestern (danach?) ein update gemacht und "musste" heute noch mal...

Ist das nun "gleichbedeutend" (also z.B. sleep 3; set XYZ on bzw. {fhem("sleep 3; set XYZ on")  ) und sollte funktionieren...
...oder bin ich da auf dem komplett falschen Dampfer!?


Wenn ich das in FHEMWEB-cmd mit doppelten Strichpunkten eingebe, also z.B.:


sleep 3;; set dmWoZiLichtTest blink 3 2;; sleep 10;; set dmLeinwandTest on


kommt: Last parameter must be quiet

Was bedeutet das nun wieder?

EDIT: und eigentlich habe ich es mit einfachen Strichpunkten so laufen wie ich es möchte (zumindest lief es mal, ob die bereits mal funktionierenden noch tun muss ich bei Gelegenheit mal testen)...

UND: ich habe solche "Ketten" bereits im Einsatz und sie funktionieren/funktionierten.
Z.B.:

fhem("set Steckdose_Buero_SchreibTisch_Sw on; sleep 10; set Steckdose_Buero_SchreibTisch_RasPI_Sw on");


das so in einer myUtils Sub...

EDIT:
Das selbe so {fhem("set Steckdose_Buero_SchreibTisch_Sw on; sleep 10; set Steckdose_Buero_SchreibTisch_RasPI_Sw on")} in FHEMWEB-cmd liefert dann wieder:

Unknown command {fhem("set, try help.

EDIT: jetzt dachte ich ok, vielleicht ein Leerzeichen zwischen der geschweiften Klammer (-> Perl) und den Befehlen also { fhem("...    statt {fhem("...   aber dann kommt (nat.): Unknown command {, try help.

EDIT: ich bin wirklich etwas ratlos... :-\

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Hallo Joachim,

zumindest die Frage kann ich beantworten:
ZitatEDIT:
Das selbe so {fhem("set Steckdose_Buero_SchreibTisch_Sw on; sleep 10; set Steckdose_Buero_SchreibTisch_RasPI_Sw on")} in FHEMWEB-cmd liefert dann wieder:
Das kann nicht gehen, dass muss in der Kommandozeile so :
{fhem("set Steckdose_Buero_SchreibTisch_Sw on;; sleep 10;; set Steckdose_Buero_SchreibTisch_RasPI_Sw on")}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

MadMax-FHEM

Danke.

Aber in einer Sub tut es!?
(also hab ich an einigen Stellen und es funktioniert, zumindest so mein Eindruck ;)  )

Und ich glaube ich habe auch doppelte Strichpunkte (überall) probiert, ging aber auch nicht...
...glaube ich.

Ich werde mal heute Abend noch etwas "experimentieren"...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Ich habe da manchmal den Eindruck, es hängt vom FHEM Befehl ab, ob die Erkennung tolerant ist oder nicht.
sleep parsed noch nach quiet ? Ich weiß es nicht...

Aber mit {fhem()} übergibst Du in der Kommandozeile Perl über den FHEM Interpreter an Perl, da müssen die ;; doppelt sein!

In einer Sub wird das gehen, aber bei sleep bin ich nicht sicher. Da hatte ich vor langer Zeit mal was überprüft mit eigenartigen Ergebnissen. Wo hab ich das aufgeschrieben  ::)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig

ZitatIch werde mal heute Abend noch etwas "experimentieren"...
Vielleicht ist es sinnvoller, vorher zu verstehen, wie FHEM arbeitet:
- was man in der Kommandozeile eintippt, oder fhem() als Argument mitgibt oder at/notify als "Befehl" ausfuehrt, wird vom AnalyzeCommandChain verarbeitet.
- diese Funktion ist einfach gestrickt, und trennt alles am ; in einzelne Befehle, und fuehrt sie der Reihe nach aus.
- damit man Strichpunkt in den Befehlen verwenden kann, wird ;; _vor_ dem Auftrennen durch einen "geheimen" String ersetzt, und dieser String nach dem Auftrennen durch einen einfachen ; wieder ersetzt.

Das hat zur Folge, dass fuer jede Schachtelung einer FHEM-Befehlskette ein ; zu verdoppeln ist.

FHEMWEB versucht dabei zu helfen, was aber zur Verwirrung eher beitraegt:
- DEF in der Detailansicht ersetzt implizit alle ; durch ;;, da es hier sicher um _ein_ Befehl (modifiy) handelt.
- RawDef und das + oben links macht das auch fuer jede Zeile einzeln, wobei man mit \ eine "mehzeilige Zeile" basteln kann.

Das heisst, bevor man helfen kann, muss man wissen, _WO_ ein Befehl eingegeben wurde.

Otto123

Rudi, gibt es da noch eine kleine Unzulänglichkeit in der Erkennung von AnalyzeCommandChain bei unnötigen ";" im Perl Teil?
sowas funktioniert nicht, die ;; am Ende des fhem() stören:defmod MyNotifyTestMix notify led:.* sleep 5;;{\
if ($EVENT eq "an") {fhem("kommando");;\
}}

so funktioniert es
defmod MyNotifyTestMix notify led:.* {\
if ($EVENT eq "an") {fhem("kommando");;\
}}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig

Das Mischen von FHEM-, perl- und Shell Befehlen in einer Befehlskette ist nicht zugesichert.
Dass es manchmal funktioniert, beweist noch nicht das Gegenteil.

MadMax-FHEM

Zitat von: rudolfkoenig am 05 März 2020, 13:26:01
Vielleicht ist es sinnvoller, vorher zu verstehen, wie FHEM arbeitet:

Danke für die Antwort, da bin ich ja (gerade) dran bzw. versuche zu verstehen (oder dachte das schon mal zu haben)...
...daher "experimentieren" weil so wie ich es verstehe/verstanden habe/geglaubt habe wasauchimmer es halt irgendwie einen Knoten verursacht...

Zitat von: rudolfkoenig am 05 März 2020, 13:26:01
- was man in der Kommandozeile eintippt, oder fhem() als Argument mitgibt oder at/notify als "Befehl" ausfuehrt, wird vom AnalyzeCommandChain verarbeitet.
- diese Funktion ist einfach gestrickt, und trennt alles am ; in einzelne Befehle, und fuehrt sie der Reihe nach aus.
- damit man Strichpunkt in den Befehlen verwenden kann, wird ;; _vor_ dem Auftrennen durch einen "geheimen" String ersetzt, und dieser String nach dem Auftrennen durch einen einfachen ; wieder ersetzt.

Das hat zur Folge, dass fuer jede Schachtelung einer FHEM-Befehlskette ein ; zu verdoppeln ist.

Wenn ich also keinen Strichpunkt im Befehl haben will/bzw. habe ich ja nicht oder!?

Und ich will, dass die Einzelbefehle einer nach dem anderen abgearbeitet wird, dann müsste doch:

fhem("sleep 3;set Irgendwas on;set Wasanderes off")

richtig sein?
(in einer Sub)


Zitat von: rudolfkoenig am 05 März 2020, 13:26:01
Das heisst, bevor man helfen kann, muss man wissen, _WO_ ein Befehl eingegeben wurde.

Also alles was ich in meinem Post geschrieben habe bezieht sich auf Eingabe in das FHEMWEB-cmd-Fenster...

sleep 3;set Irgendwas on
funktioniert.


{fhem("sleep 3;set Irgendwas on")}
funktioniert nicht (ganz).
Es kommt ein Fehler: unknown command {fhem("sleep try help
Und im Device Irgendwas steht dann statt on eben on")}

Und das verstehe ich nicht.


So etwas habe ich (vielfach) in Subs in myUtils und es tut seit langem so wie ich es haben wollte:

fhem("sleep 3;set Irgendwas on;set Wasanderes off")

Sorry, dass ich mich so schwer tue aber irgendwie krieg ich das (grad) nicht zusammen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

rudolfkoenig

ZitatAlso alles was ich in meinem Post geschrieben habe bezieht sich auf Eingabe in das FHEMWEB-cmd-Fenster......{fhem("sleep 3;set Irgendwas on")}
Wie ich geschrieben habe: Die Kommandozeile hat keine Spezialbehandlung, und deswegen wird an ; getrennt, das ergibt zwei Strings:
{fhem("sleep 3
set Irgendetwas on")}

Die beiden Zeichenketten werden nach dem Trennen einzeln geprueft, und als FHEM Befehl eingestuft, da sie weder in {} (fuer perl), noch in "" (fuer Shell) eingeschlossen sind.
Da kein FHEM Befehl mit dem Namen {fhem("sleep existiert, wird eine Fehlermeldung ausgegeben.

MadMax-FHEM

Ok, dann verstehe ich das (langsam)...

Allerdings ist dann der (viel gegebene Hinweis) mit:

probiere das doch einfach im FHEMWEB-cmd aus und wenn es da läuft dann...
...nicht wirklich ein guter Hinweis...

D.h. wenn ich das dann testen will (in FHEMWEB-cmd), muss ich es so eingeben:

{fhem("sleep 3;;set Irgendwas on")}

(bringt auch keinen Fehler und tut)

Aber wenn ich es dann in einer Sub verwenden will doch wieder so!?

fhem("sleep 3;set Irgendwas on")

Eieiei...

Ok, dann ist das klar(er)... ;)

Hmmm, vielleicht habe ich das in der Vergangenheit nur nie wirklich in FHEMWEB-cmd getestet...
...sondern einfach gemacht und den Sub-Aufruf getestet... :)

Wäre mein nächstes "Exeriment" gewesen... ;)

Danke und sorry noch mal, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

rudolfkoenig

Wenn ich pruefen will, ob in meiner perl Funktion
fhem("sleep 3; set Irgendetwas on");
funktioniert, dann gebe ich in der Kommandozeile nur
sleep 3; set Irgendetwas on
ein.

Wenn man in der Perl-Funktion fhem("{perlcode}") aufruft, dann ist Zeit darueber nachzudenken, wie man es einfacher baut.

MadMax-FHEM

Zitat von: rudolfkoenig am 05 März 2020, 15:19:03
Wenn ich pruefen will, ob in meiner perl Funktion
fhem("sleep 3; set Irgendetwas on");
funktioniert, dann gebe ich in der Kommandozeile nur
sleep 3; set Irgendetwas on
ein.

Wenn man in der Perl-Funktion fhem("{perlcode}") aufruft, dann ist Zeit darueber nachzudenken, wie man es einfacher baut.

Jaja, jetzt schon klar ;)

Und ja, dass das "umständlich"/"unnötig" ist, war/ist mir klar...

Es ging ja nur darum den Test möglichst nah am Testobjekt zu lassen ;)

Aber ja klar!
Denn fhem("") ist ja quasi die FHEMWEB-cmd-Eingabe ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Zitat von: rudolfkoenig am 05 März 2020, 14:09:52
Das Mischen von FHEM-, perl- und Shell Befehlen in einer Befehlskette ist nicht zugesichert.
Dass es manchmal funktioniert, beweist noch nicht das Gegenteil.
Rudi, sollte man dies im Abschnitt https://commandref.fhem.de/#command mit erwähnen? Also nicht das es nicht zugesichert ist, sondern besser (solange bis es anders ist :) ) das es nicht geht und man sich auf einen Kommando Typ beschränken soll?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig