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
/opt/fhem/fhem.pl 8083 "set shellypro3em_script id 0"
Du führst damit innerhalb von FHEM den shell-Befehl
set shellypro3em_script id 0
aus.
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
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
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=telnet
etwas zurück liefert.
Wenn das klappt nimmst Du den Vorschlag von Icinger allerdings mit anderem Port. ;)
Gruß Otto
:-( 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
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?!
Screenshot 2024-01-17 131734.png
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
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
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\"
ist das nicht alles furchtbar umständlich, nur um ein paar Werte aus einem Shelly zu bekommen?
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.
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
Hast du dir das Shelly Modul mal angesehen?
Das holt auch die Daten von Shelly Geräten über http...
Gruß,Joachim
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"