Dummy State via Ssystemcommand setzen

Begonnen von wollik, 17 Januar 2024, 16:22:36

Vorheriges Thema - Nächstes Thema

wollik

Hallo ins Forum,
ich bekomme es einfach nicht hin den State meines dummys EV_Load als Ausgabewert eines Scripts auf der fhem Commandozeile zu setzen.

defmod EV_Load dummy
attr EV_Load icon wallbox

mit: set EV_Load 1234
wird der State auf 1234 gesetzt.

mit: set EV_Load { .... }
wird immer dieser Befehl in den State geschrieben, nicht aber der Rückgabewert was in den Klammern gemacht wird.
Weder mit fhem, Backtricks, System noch mit qx funktioniert das;(

Von außen (einem anderen Rechner), kann ich diesen State des EV_Load dummies via wget setzen.
Aber ich brauche einen Weg um das intern in fhem setzen zu können indem ich einen Befehl via BASH ausführe und den Rückgabewert dann zum Setzen verwende.
Wenn ich den curl Befehl im fhem + Fenster ausführe wird der Rückgabewert richtig angezeigt.

Mein Ziel ist, über curl Aufrufe, Werte abzuholen und in Fhem Variablen zu schreiben.
Ich kann das natürlich Alles in der Bash erledigen, aber wollte das mit Fhem lösen.

Bitte hat jemand hierzu eine Idee.

Viele Grüße
wollik

 









Otto123

#1
Hallo Wollik,
Zitat von: wollik am 17 Januar 2024, 16:22:36mit: set EV_Load { .... }
mit set EV_Load {( ... )} wird es klappen ;)
Siehe doku https://fhem.de/commandref_modular_DE.html#set

Aber qx() wird das System blockieren für die Zeitdauer der Ausführung.
Zitat von: wollik am 17 Januar 2024, 16:22:36über curl Aufrufe, Werte abzuholen und in Fhem Variablen zu schreiben.
Dafür geht auch ein Perl Kommando aus FHEM: https://wiki.fhem.de/wiki/HttpUtils


Gruß Otto
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

Wernieman

Anstatt Curl kannst Du auch mit FHEM Bordmitteln arbeiten.
Stichworte:
https://wiki.fhem.de/wiki/HTTPMOD
https://wiki.fhem.de/wiki/HttpUtils

Ansonsten ... in Perl den Wert des externen Scriptes ermitteln und mit Bordmitteln reinschreiben. Edit: Siehe auch Beitrag von @Otto. ABER .. die Scripte blockieren so lange FHEM, wie sie laufen, denn FHEM ist nur single-Threaded. Deshalb ist es besser, das Script "non-Blocking" mit "" laufen zu lassen und im Script die Rückgabewerte zu FHEM zu puschen. Wie Du es z.B. bei anderen "externen Scripten" gelöst hast. Alternativ zu wget/curl auch gerne per telnet/telnet-ssl. Siehe Doku (und diverse Threads im Forum)
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

wollik

Hallo Otto, hallo Wernieman,
D A N K E mit den runden Klammern funktioniert es jetzt!
Leider bekomme ich keinen Eintrag ins Log obwohl sich der Wert des Dummies nach dem curl Befehl geändert hat.

Von http bin ich weg, da das Rückgabeformat json ist und ich noch filtern muß.

Das habe ich jetzt in eine doif Anweisung gehängt, die nach einem anderen Dummywert zeitgesteuert ausgeführt wird. Auch von der doif Anweisung bekomme ich keinen Logeintrag ;(
Bitte wie könnte ich einen Logeintrag erzeugen, wenn sich der Dummywert ändert, oder wenn die doif Anweisung ausgrführt wird?

Viele Grüße
wollik



 


Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

wollik

Hallo Wernieman,
ich will in kein extra Log schreiben, sondern in das Defaultlog, in dem alle FHEM Events landen.

Viele Grüße
wollik

Otto123

Hi,

set Befehle werden aber mit verbose level 3 ins FHEM Log geschrieben.

Hast Du verbose irgendwie auf anderem Level?

Gruß Otto
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

wollik

Hallo Otto,
ich habe den globalen Wert für verbose auf 3 was der Default sein müßte.

Viele Grüße
wollik

betateilchen

Ist das nicht wieder mal alles viel zu kompliziert gedacht?

Rückgabewert aus bash in json?

Warum packst Du das nicht einfach in ein JsonMod device? Da kann man seit einiger Zeit auch shell-scripts als Quelle angeben und das json aus dem Ergebnis direkt weiterverarbeiten lassen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Zitat von: wollik am 22 Januar 2024, 21:48:58ich habe den globalen Wert für verbose auf 3 was der Default sein müßte.
wusste ich nicht, wenn Du den Dummy set loggen willst, musst Du bei ihm (also nicht global) verbose 4 einstellen.
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

wollik

#10
Hallo Otto,
ich habe mir eine zweite Fhem Instanz eingreichtet um nur die DOIF's zu Testen.
Also das Loggen funktioniert auch mit dem Defaultwert verbose=3. Ich hatte nur keine Einträge, weil ich
das DOIF mit dem Zeitinterval nicht auf:  do allways  gesetzt hatte.
Jetzt wird das curl regelmäßig gestartet und die Updates der gesetzten Werte erscheinen im Log.

D A N K E
wollik

wollik

Hallo Otto,
bitte hättest Du noch ein Beispiel, wie ich in einem DOIF auch if, elsif und else Abfragen verwenden kann?
Leider komme ich mit der Syntax nicht hin, ich bekomme immer den Fehler:
right bracket without left bracket
Bei diesem DEF:
([+[Check_Interval]]) (set Conn 1,IF ([Conn] eq "1"){(set My_Value 400)IF ([My_Value] gt "200"){(set Check_Interval 120)}ELSE {(set Check_Interval 300)}},set Min_Value 123)

Mit Umbrüchen zur besseren Ansicht:
defmod Get_Conn DOIF ([+[Check_Interval]])
   (set Conn 1,
   IF ([Conn] eq "1"){
      set My_Value 400
      IF ([My_Value] gt "200"){
         (set Check_Interval 120)}
      ELSE {(set Check_Interval 300)
      }
   }
   ,set Min_Val 123)
 


Vermutlich verwende ich die if's und die Klammern falsch und komme nach sehr vielen Versuchen hiermit nicht weiter, bitte hättest Du dazu eine Idee?

Viele Grüße
wollik





Otto123

#12
Hi,
Zitat von: wollik am 24 Januar 2024, 16:56:30Vermutlich verwende ich die if's und die Klammern falsch und komme nach sehr vielen Versuchen hiermit nicht weiter, bitte hättest Du dazu eine Idee?
Du verwechselst primär Perl if (Bedingung) {Perl Befehle} else {Perl Befehle}[/font] mit FHEM IF(Bedingung) (FHEM Befehle) ELSE (FHEM Befehle)

(set Conn 1,
  IF ([Conn] eq "1") (
    set My_Value 400,
    IF ([My_Value] gt "200") (set Check_Interval 120)
    ELSE (set Check_Interval 300)
  ) , set Min_Val 123
)

Allerdings habe ich nur versucht die Klammern zu setzen, den Sinn des Codes habe ich  nicht verstanden ;)
Gruß Otto
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

wollik

Hallo Otto,
JA das wars!
Die Logik ist nur zum Testen, wann welcher Befehl im DOFI ausgeführt wird. Die Bedingungen der IF's wechsle ich dann im DOIF und bekomme dann andere Einträge und evtl. Fehler im Eventlog für meine Überprüfungen.

D A N K E nochmals
wollik

wollik

#14
Hallo Otto,
S O R R Y dass ich schon wieder frage!
Ich habe in den Logs folgende Updatesituation von Dummys in DOIF's festgestellt:
1. Wenn ein Dummy direkt gesetzt wird, wird die Änderung direkt mit dem neuen Wert gelogged.

2. Wenn innerhalb einer IF Anweisung das Dummy über einen Rückgabewert (z.B. von einem Externen Prog gesetzt wird, wird der Wert im Log richtig angezeit (Siehe Value__Set).

3. So lange man/frau sich innerhalb dieser IF Anweisung bewegt wird leider der alte Wert des Dummys verwendet !?! (Siehe Value_Copy Werte) Somit kann mit diesem falschen Wert nicht weiter gearbeitet werden ;(

4. Nach der IF Anweisung wird der Wert des Dummys aber dann richtig gesetzt, so wie es auch beim ersten Setzen im Log protokolliert wurde.

5. Um mit den richtigen Werten in dieser IF Abfrage weiter arbeiten zu können, müßte man/frau nochmals so eine zweite IF Abfrage ausßerhalb verwenden, evtl. wäre es auch mit einem sleep möglich zu warten bis der Wert richtig gesetzt ist aber das würde dann unser FHEM blokieren.

Zum Nachstellen habe ich eine kleine Umgebung gebaut, die via DIOF alle 11 Sekunden einen Zeitstempel (MM:SS) via Bash holt und in das Dummy VALUE__Set schreibt.
In der problematischen IF-Anweisung wird dieser Wert in das Dummy_Copy copiert der dann leider den alten Wert des Dummys Value__Set vom vorherigen run reincopiert. Ich mache das ein paar mal um aufzuzeigen, dass das Problem in dieser IF-Anweisung liegt.
Danach wird die IF-Anweisung verlasssen und der Zeitstempel in das Dummy Value_Last kopiert was, nun den richtigen Wert anzeigt.

Hier die lesbare DOIF:

defmod Test DOIF ([+[Interval]])
(set Conn 1,
   IF ([Conn] eq "1")(
      set My_Value 400,
     IF ([My_Value] gt "200")(
        (set Value__Set {(`date |cut -d ':' -f2,3|cut -d ' ' -f1`)}),
        set Value_Copy [Value__Set],
        set Value_Copy [Value__Set],
        set Value_Copy [Value__Set],
        set Value_Copy [Value__Set],
        set Value_Copy [Value__Set])
      ELSE (set Check_Interval 300)
     ),
     set Value_Last [Value__Set]
)


Bitte hast Du dazu eine Idee?

Viele Grüße
wollik

Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen.