Ausgabe von Bash Skript verwenden

Begonnen von tomix, 15 Januar 2024, 06:57:18

Vorheriges Thema - Nächstes Thema

tomix

Hallo zusammen
Ich stehe etwas auf dem Schlauch. Ich habe folgendes Skript:
#!/bin/bash

# Hole die aktuellen Daten vom Shelly Pro 3 EM

# IP-Adresse des Shelly
SHELLY="192.168.178.27"

# FHEM Befehl
COMMAND="/opt/fhem/fhem.pl 8083"

DEVICE="shellypro3em_script"

# Aktuelle Zeit
#DATETIME=`date '+%Y-%m-%d_%T'`

DATA=`curl -s -X POST -d '{"id":1,"method":"EM.GetStatus","params":{"id":0}}' http://${SHELLY}/rpc`

#DEVICE=`echo $DATA | jq -r '."src"'`

DATA=`echo $DATA | jq -r '. | .[]' | tail -n +4 | head -n -1 | tr -d "[:space:]" | tr -d "\"" | tr "," "\n" | cut -d ":" -f 1,2 --output-delimiter=" "`
IFS=$'\n'
for line in $DATA
 do `echo $COMMAND "\"set" $DEVICE $line"\""`
done

Rufe ich das Skipt auf der Konsole auf erhalte ich folgendes:
./shelly_pro3em_dummy.sh: Zeile 23: /opt/fhem/fhem.pl 8083 "set shellypro3em_script id 0": Datei oder Verzeichnis nicht gefunden
./shelly_pro3em_dummy.sh: Zeile 23: /opt/fhem/fhem.pl 8083 "set shellypro3em_script a_current 0.79": Datei oder Verzeichnis nicht gefunden
./shelly_pro3em_dummy.sh: Zeile 23: /opt/fhem/fhem.pl 8083 "set shellypro3em_script a_voltage 234.1": Datei oder Verzeichnis nicht gefunden
...

Paste ich eine Zeile rein und rufe diese auf scheint es zu klappen, aber ich erhalte trotzdem keinen Wert angezeigt in FHEM.

Wie bringe ich die Ausgabe «ins» Device (am liebsten direkt via at_log aufruf in FHEM)?

Der Shelly Pro3EM könnte MQTT, allerdings sendet bei jeder Änderung alle Daten und das sind einfach zu viele Daten pro Zeit.

Gruss
tomix

Icinger

/opt/fhem/fhem.pl 8083 "set shellypro3em_script id 0"Du führst damit innerhalb von FHEM den shell-Befehl
set shellypro3em_script id 0aus.

Klar, dass da eine Fehlermeldung kommt.

Aus der Commandref:
ZitatShell-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden)

Ohne den "" sollte es funktionieren.

Also
do `echo $COMMAND "set" $DEVICE $line""`

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

tomix

Zitat von: Icinger am 15 Januar 2024, 07:31:35/opt/fhem/fhem.pl 8083 "set shellypro3em_script id 0"Du führst damit innerhalb von FHEM den shell-Befehl

Die Aussage verstehe ich nicht. Ich dachte innerhalb von FHEM wird dann ein "set shellypro3em_script id 0" ausgeführt.

Ich versuche mal besser zu formulieren was ich will. Ich will aus der Bash ein «setreading shellypro3em_script wert 123» in FHEM ausführen, also wie wenn ich das in der Weboberfläche ins Command-Feld tippe. Dann erhalte ich unter Readings beim Device:
wert 123 2024-01-17 00:14:50

Zitat von: Icinger am 15 Januar 2024, 07:31:35Aus der Commandref:
ZitatShell-Befehle (diese müssen von doppelten Anführungszeichen "" eingeschlossen werden)

Ohne den "" sollte es funktionieren.

Also
do `echo $COMMAND "set" $DEVICE $line""`

Das ändert nichts.

Ich will einen FHEM-Befehl ausführen und keinen Shellbefehl. Ist der Port der Telnetport oder der Webport? Telnet gibt es nicht nur Web.

Wie würde es via http gehen? Das hier klappt auch nicht:
http://itix:8083/fhem?cmd=setreading%20shellypro3em_script%20test%2012345

Gruss
tomix

Otto123

Hallo Tomix,

ist alles ein wenig verwirrt.
8083 ist der Web Port, dort geht normal kein telnet.
fhem.pl arbeitet mit telnet, üblicherweise auf port 7072. Allerdings ist telnet per default nicht aktiv.

Also mit dem Befehl in der Shell könnte es was werden.
/opt/fhem/fhem.pl 7072 "set shellypro3em_script id 0"Falls Dir in der FHEM Kommandozeile ein
list TYPE=telnetetwas zurück liefert.

Wenn das klappt nimmst  Du den Vorschlag von Icinger allerdings mit anderem Port. ;)

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

tomix

:-( man darf nicht zu lange am Post schreiben, dann muss man sich erneut anmelden und alles ist weg.

Nun halt nur kurz. Ich dachte Telnet ist nicht aktiv. Übergabe klappt mit:
/opt/fhem/fhem.pl 33341 "setreading shellypro3em_script foo 123"
Wieso der zusammengesetzte Befehl im Skript dann nicht ausgeführt werden kann, weiss ich nicht. So klappt es nun:
do /opt/fhem/fhem.pl 33341 "setreading $DEVICE $line"
Dauert aber eine gefühlte Ewigkeit (über 15 Sekunden). Könnten alle Werte auf einmal übertragen werden?
Ja, so:
/opt/fhem/fhem.pl 33341 "setreading shellypro3em_script a 1; setreading shellypro3em_script b 2"
Wie würde es wie via http/https klappen? Das wäre universeller.

Gruss
tomix

Otto123

#5
Hi,
Zitatman darf nicht zu lange am Post schreiben, dann muss man sich erneut anmelden und alles ist weg.
Aber doch nur wenn Du dein Login zeitlich limitiert hast?!
Du darfst diesen Dateianhang nicht ansehen.
warum der fhem.pl Befehl lange dauern soll kann ich nicht erklären, normal ist die telnet Schnittstelle die schnellste.
Die Ausführung der gezeigten Zeile dauert 15 sec? Oder Deine Schleife?

Per HTTP geht, ist halt etwas komplexer wegen csrf_token und url encoding, aber die Aufgabe habe ich in einen fhem Client gepackt: https://github.com/heinz-otto/fhemcl
Den nimmst Du so wie er ist als Befehl und der Syntax ist analog zum fhem.pl (oder etwas universeller :) )
Aber HTTP ist etwas langsamer als telnet.

Es geht auch per MQTT - ich meine nicht direkt vom shelly sondern aus dem shellscript ;)

Zitat von: tomix am 17 Januar 2024, 13:12:48Wieso der zusammengesetzte Befehl im Skript dann nicht ausgeführt werden kann
Weil dabei die " völlig wegfallen, siehst Du wenn Du das echo so mal ausführst. Muss man nochmal umschreiben.

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

tomix

Zitat von: Otto123 am 17 Januar 2024, 13:23:41Aber doch nur wenn Du dein Login zeitlich limitiert hast?!
Bin nicht so oft da und habe wohl einfach Enter gedrückt.

Zitat von: Otto123 am 17 Januar 2024, 13:23:41Die Ausführung der gezeigten Zeile dauert 15 sec? Oder Deine Schleife?
Die Schlaufe, ich werde alles zusammenfassen und dann sollte es vertretbar sein.

Zitat von: Otto123 am 17 Januar 2024, 13:23:41Weil dabei die " völlig wegfallen, siehst Du wenn Du das echo so mal ausführst.
Die sind eben drin und wenn ich die echo Ausgabe ausführe klappt es ja.
$ test=`echo "echo hallo \"foo\""`
$ $test
hallo "foo"

Gruss
tomix

Otto123

zur Schleife kann ich nichts sagen, ich denke aber nicht das der fhem Befehl das Problem ist.
Ich meinte diesen Ausdruck, da fehlen anschließend die "
echo $COMMAND "set" $DEVICE $line""
richtig ist das mMn einfach so:
echo $COMMAND \"set $DEVICE $line\"
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

betateilchen

ist das nicht alles furchtbar umständlich, nur um ein paar Werte aus einem Shelly zu bekommen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

tomix

Zitat von: betateilchen am 17 Januar 2024, 20:52:15ist das nicht alles furchtbar umständlich, nur um ein paar Werte aus einem Shelly zu bekommen?
Doch aber ich habe keine Idee wie es einfacher gehen könnte, da das MQTT-Interval beim Shelly nicht beschränkt werden kann.



tomix

Zitat von: Otto123 am 17 Januar 2024, 19:08:49zur Schleife kann ich nichts sagen, ich denke aber nicht das der fhem Befehl das Problem ist.

Das hier ist das Problem:
IFS=$'\n'
Folgendes funktioniert nun:
#!/bin/bash

# Hole die aktuellen Daten vom Shelly Pro 3 EM

# IP-Adresse des Shelly
SHELLY="192.168.178.27"

# FHEM Befehl
COMMAND="/opt/fhem/fhem.pl 33341"

# PARAMETER für FHEM Befehl
PARAMETER=""

DEVICE="shellypro3em_script"

# Aktuelle Zeit
#DATETIME=`date '+%Y-%m-%d_%T'`

DATA=`curl -s -X POST -d '{"id":1,"method":"EM.GetStatus","params":{"id":0}}' http://${SHELLY}/rpc`

#DEVICE=`echo $DATA | jq -r '."src"'`

DATA=`echo $DATA | jq -r '. | .[]' | tail -n +4 | head -n -1 | tr -d "[:space:]" | tr -d "\"" | tr "," "\n" | cut -d ":" -f 1,2 --output-delimiter=" "`
IFS=$'\n'
for line in $DATA
 do PARAMETER=`echo $PARAMETER"setreading $DEVICE $line; "`
done

#echo -e "\n1. Aufruf"
#echo $PARAMETER
/opt/fhem/fhem.pl 33341 "$PARAMETER"

#echo -e "\n2. Aufruf"
# Klappt nicht auf Grund von IFS und Escapezeichen im String!
#PARAMETER=`echo "\"$PARAMETER\""`
#echo $PARAMETER
#echo ""
#unset IFS
#/opt/fhem/fhem.pl 33341 $PARAMETER

Dazu in FHEM
defmod shellypro3em_script dummy
defmod shellypro3em_script_FileLog FileLog ./log/shellypro3em_script_FileLog-%Y.log shellypro3em_script:.*
defmod at_shelly_pro3em_script at +*00:01:00 {system("/usr/local/bin/shelly_pro3em_script.sh")}
Schön ist das definitiv nicht. Wird aber nun mal so bleiben, bis ein paar andere Baustellen gelöst sein.

Gruss
tomix

MadMax-FHEM

Hast du dir das Shelly Modul mal angesehen?

Das holt auch die Daten von Shelly Geräten über http...

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

Der Code defmod at_shelly_pro3em_script at +*00:01:00 {system("/usr/local/bin/shelly_pro3em_script.sh")}sollte einfacher so gehen:
defmod at_shelly_pro3em_script at +*00:01:00 "/usr/local/bin/shelly_pro3em_script.sh"
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