altes bash Script durch Python Script/Befehle ersetzen

Begonnen von Steffen@Home, 09 November 2022, 18:34:10

Vorheriges Thema - Nächstes Thema

Steffen@Home

Hallo Zusammen,

ich habe für das Auslesen meiner DHT Sensoren damals ein bash Script (mit Adafruit_Python_DHT) geschrieben das mir die Werte an FHEM sendet.

Nun habe ich auf CircuitPython-DHT Library umgestellt und weiß nun nicht wie man den Befehl:
/opt/fhem/fhem.pl 7072 meinpasswort "setreading WZTemp temperature $Temp"


mit Python abbildet. Kann mir jemand helfen?
Danke und Gruß Steffen
Pi 1 - FHEM, HM-MOD-RPI-PCB, HM-RT-CC-DN, HM-WDS10-TH-O, HM-Sec-SCo, HM-LC-Sw1PBU-FM, Relais Platine für ext. Ansteuerung, LD382 Wifi LED Controller, DHT
Pi 2 - Kamera, DHT
Pi 3 - FHEM2, Grafana, DHT, Magnet-Sensoren, Relais-Platine

Otto123

Hallo Steffen,

zumindest habe ich da mal was im Wiki verankert - Allerdings über HTTP und nicht über Telnet:
https://wiki.fhem.de/wiki/CsrfToken-HowTo#Python

Ist allerdings ne Weile her und ich kann quasi kein python
Und ich meine es gibt mehr als eine Anbindung an FHEM mit irgendwelchen Bibliotheken.

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

Ralf W.

http://twitter.com/RWausD
Schon gewusst, dass Haarausfall zu einer Glatze führen kann?

FHEM: NUC7PJYH2, Ubuntu Server 22.04.2 LTS, HMCCU - RaspberryMatic, DE ConBee II, diverse Sensoren und Aktoren.

Steffen@Home

#3
Moin,

theoretisch könnte ich doch bash script(leicht abgeändert) so lassen und dieses jetzt nur mit einem cmd-line Argument aufrufen oder?
Kann man ein bash script aus python aufrufen und ein Argument mitgeben das ich dann im bash verarbeite und dort per telnet sende?
Danke.

Folgendes habe ich gefunden und muss ich mal testen:

import subprocess
subprocess.check_call(["./script.sh", arg1, arg2])
Pi 1 - FHEM, HM-MOD-RPI-PCB, HM-RT-CC-DN, HM-WDS10-TH-O, HM-Sec-SCo, HM-LC-Sw1PBU-FM, Relais Platine für ext. Ansteuerung, LD382 Wifi LED Controller, DHT
Pi 2 - Kamera, DHT
Pi 3 - FHEM2, Grafana, DHT, Magnet-Sensoren, Relais-Platine

Wernieman

#4
Anstatt fhem.pl aufzurufen, kannst Du doch per telnet (auf Konsole ncat) Kontakt aufnehmen? Wie das mit Phyton geht, muß ich aber passen, hatte es bisher mit bash und php umgesetzt ... nach Google suche müsste es aber auch mit Phyton gehen.
- 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

betateilchen

Man könnte auch über python einen simplen webserver bereitstellen, der den Messwert liefert und diesen dann aus FHEM per HTTPMOD abfragen. (HTTPMOD wird ja inzwischen für jeden Sche... verwendet)

*duck-und-weg*
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

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

Steffen@Home

Habe es jetzt quick and dirty gelöst:

Das Python Script: (könnte man noch optimieren   ;)) Anregungen gerne Willkommen

#!/usr/bin/env python
import time
import board
import adafruit_dht
import subprocess

# Initial the dht11 device, with data pin connected to GPIO10:
#dhtDevice = adafruit_dht.DHT22(board.D18)
dhtDevice = adafruit_dht.DHT11(board.D10)

# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
# dhtDevice = adafruit_dht.DHT22(board.D18, use_pulseio=False)

#try:
# Print the values to the serial port
temperature_c =("%.1f"%dhtDevice.temperature)
#        temperature_f = temperature_c * (9 / 5) + 32
humidity =("%.1f"%dhtDevice.humidity)
#        print(
#            "Temp: {:.1f} F / {:.1f} C    Humidity: {}% ".format(
#               temperature_f, temperature_c, humidity
#          )
#     )
print(temperature_c)
print(humidity)
subprocess.check_call(["/home/pi/sendToFHEM.sh", temperature_c, humidity])
dhtDevice.exit()

#except RuntimeError as error:
        # Errors happen fairly often, DHT's are hard to read, just keep going
#        print(error.args[0])
#    time.sleep(2.0)
#    continue
#except Exception as error:
#    dhtDevice.exit()
#    raise error

#    time.sleep(2.0)



das aufgerufene Bash-Script:


#!/bin/bash
#echo $1
#echo $2
/opt/fhem/fhem.pl 7072 password "setreading WZTemp temperature $1"
/opt/fhem/fhem.pl 7072 password "setreading WZTemp humidity $2"

Pi 1 - FHEM, HM-MOD-RPI-PCB, HM-RT-CC-DN, HM-WDS10-TH-O, HM-Sec-SCo, HM-LC-Sw1PBU-FM, Relais Platine für ext. Ansteuerung, LD382 Wifi LED Controller, DHT
Pi 2 - Kamera, DHT
Pi 3 - FHEM2, Grafana, DHT, Magnet-Sensoren, Relais-Platine

Wernieman

1. Warum machst Du es nicht in Phyton
2. Warum machst Du 2 Aufrufe, wenn es auch in einem geht? (ist bei mir nur SSL-Geschützt, deshalb etwas "aufwendiger)
echo -en "passwort\nFHEM-Befehl1\nFhem-Befehl-2\n ......analoge Befehle.....\nquit\n" | /usr/bin/ncat -w5 -4 --ssl fhem-Server 7073 >/dev/null

Beispiel ohne ssl gibt es in der Doku und wenn kein Passwort vergeben wird, dann einfach obiges passwort incl. folgenden \n weglassen,
- 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

Steffen@Home

Zitat von: Wernieman am 12 November 2022, 16:31:18
1. Warum machst Du es nicht in Phyton
2. Warum machst Du 2 Aufrufe, wenn es auch in einem geht? (ist bei mir nur SSL-Geschützt, deshalb etwas "aufwendiger)
echo -en "passwort\nFHEM-Befehl1\nFhem-Befehl-2\n ......analoge Befehle.....\nquit\n" | /usr/bin/ncat -w5 -4 --ssl fhem-Server 7073 >/dev/null

Beispiel ohne ssl gibt es in der Doku und wenn kein Passwort vergeben wird, dann einfach obiges passwort incl. folgenden \n weglassen,
In Python bin ich mit dem Telnet nicht klar gekommen, die alte Bibliothek ist obsolet. Da war es einfacher für mich das bash-Script aufzurufen das ich eh schon hatte.
Nach welcher Stelle muss ich suchen in der Doku?
Pi 1 - FHEM, HM-MOD-RPI-PCB, HM-RT-CC-DN, HM-WDS10-TH-O, HM-Sec-SCo, HM-LC-Sw1PBU-FM, Relais Platine für ext. Ansteuerung, LD382 Wifi LED Controller, DHT
Pi 2 - Kamera, DHT
Pi 3 - FHEM2, Grafana, DHT, Magnet-Sensoren, Relais-Platine

Wernieman

https://fhem.de/commandref_DE.html#telnet
Oder im Forum, ich glaube auch im FHEM-Wiki, bin mir nicht sicher.
Gibt hier im Forum auch Scripte, um über z.B. Web zuzugreifen
- 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

Otto123

Das ist ja der FHEM Client Modus ;) geht auch in einer Zeile
#!/bin/bash
#echo $1
#echo $2
/opt/fhem/fhem.pl 7072 password "setreading WZTemp temperature $1 ; setreading WZTemp humidity $2"
ansonsten nochmal nach #1 fliegen (python und Web)
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

Ja aber anstelle fhem-Client Modus ist es besser, per nc/telnet/ncat o.Ä. es durchzuführen. ist auch aus Sicht der Resourcenverbrauches besser.

Und .. man kann das sogar Anwenden, wenn auf irgendeiner Maschine gar kein FHEM installiert ist, man aber Daten zu fhem pushen (oder pollen *) ) möchte ....

*) Zu pollen gibt es aber bessere Möglichkeiten  ;)
- 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