Externe Trigger bzw. externes setzen von Readings

Begonnen von bismosa, 18 Dezember 2021, 11:47:10

Vorheriges Thema - Nächstes Thema

bismosa

Hallo!

Bisher sind mir zwei Methoden bekannt, um mit externen Scripten bzw. externen Geräten readings zu setzen oder auch Kommandos auszuführen:
1.) Auf dem Raspberry (auf dem auch FHEM läuft):
perl /opt/fhem/fhem.pl 7072 "setreading myFHEMDevice readingName wert"
Dies läuft sehr performant.

2.) Alle geräte, die im gleichen (Heim-)Netzwerk sind:
wget -qO/dev/null http://MeinServer:8083/fhem?cmd=setreading%20myFHEMDevice%20readingName%20wert &> /dev/null &

Ich habe einige (leider viele) Tage damit verbraucht herauszufinden, warum meine FHEM Instanz auf einem Raspberry Pi 3b die meiste Zeit bei 100% CPU Auslastung ist.
Leider hatte ich ein fehlerhaftes Script in einer externen Shell-Datei, das jede Sekunde Werte gesendet hat. Viel zu viel. Dazu habe ich bis dato nur die Variante 2 Verwendet. Hier kommt es doch zu einer recht hohen CPU-Auslastung von FHEM.

Nun habe ich einige externe Geräte (z.B. Wassermelder mit einem ESP32), die über "Variante 2" readings setzen. Hier kann ich immer noch die höhere CPU-Auslastung beobachten.

Warum ist die CPU-Auslastung bei Variante 2 so hoch? Liegt es daran, dass erst eine Verbindung aufgebaut werden muss?
Gibt es vielleicht noch eine andere Möglichkeit um die Readings zu setzen, die ich überlesen habe?

Gruß
Bismosa
1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...

Otto123

#1
Hi Bismosa,

Du kannst Variante 1 auch mit netcat verwenden. Beispiel:
echo set Aktor1 on | nc -w 1 raspib 7072
Für Variante 2 habe ich eine elegantere "Umschreibung" https://github.com/heinz-otto/fhemcl da dürfte sich aber ev. nicht viel an der CPU Auslastung (die ich noch nie so beobachtet habe) ändern. Sie verwendet am Ende auch wget aber mit dem Parameter &XHR=1 - wie Rudi schreibt ist das weniger Aufwand.

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

xenos1984

Da führen viele Wege nach Rom...

Ich verwende für solche Sensoren / Datenquellen MQTT. Auf der FHEM-Seite sind die Geräte als MQTT2_DEVICE angelegt. Auf der Gegenseite benutze ich dann Mosquitto (PC / Raspberry Pi etc.) oder PubSubClient (Arduino / ESP etc.). Damit ist die CPU-Auslastung relativ gering. Außerdem hat es den Vorteil, dass MQTT2_DEVICE z.B. auch als JSON gesendete Daten "auspacken" und auf mehrere Readings verteilen kann, ohne dass man jedes Reading einzeln übertragen muss.

rudolfkoenig

ZitatBisher sind mir zwei Methoden bekannt, um mit externen Scripten bzw. externen Geräten readings zu setzen oder auch Kommandos auszuführen:
Mir fallen folgende Wege ein, um FHEM-Befehle aus einem Skript zu triggern:
- telnet, wie oben beschrieben, ueber fhem.pl oder netcat/etc. Telnet ist eigentlich eine direkte TCP/IP Schnittstelle, und hat nur wenig mit dem telnet Programm oder dem Protokoll zu tun.
- HTTP ueber curl, wget, etc. Der Aufwand ist groesser, weil FHEMWEB normalerweise eine HTTP-Seite als Antwort liefert. Wer diese Schnittstelle verwendet, sollte den Parameter &XHR=1  setzen, um den Aufwand zu reduzieren.

Folgende Methoden sind nur Benachrichtigungen, und brauchen zusaetzliche Logik in FHEM, um Befehle auszufuehren:
- MQTT ueber mosquitto_pub
- inotify erlaubt die effiziente Benachrichtigung, wenn eine Datei sich geaendert hat

Die Methoden mit externen Geraete zaehle ich jetzt nicht auf: die Mehrheit der FHEM-Module ist dafuer gebaut, um mit externen Geraeten zu kommunizieren.

bismosa

Hallo!

Danke für die Antworten  :)

Der Tipp mit dem "&XHR=1" ist auf jeden Fall sehr nützlich! Ich habe es gerade mal mit einem kleinen Script getestet.
Hier mal die Ergebnisse (Nicht repräsentativ, da ich im laufenden System getestet habe) Die Auslastung ohne weitere Kommandos liegt so bei 10-20%:

ein Reading pro Sekunde setzen:
CPU-Auslastung   Kommando
10-20% (kaum Unterschied) - perl /opt/fhem/fhem.pl 7072 "setreading myFHEMDevice readingName wert"
50-60%                              - wget -qO/dev/null http://server:8083/fhem?cmd=setreading%20dummytest%20var%20$Zahl&XHR=1
100%                                 - wget -qO/dev/null http://server:8083/fhem?cmd=setreading%20dummytest%20var%20$Zahl

Solange die Readings nicht zu oft kommen, könnte ich meine Scripte nur anpassen mit dem "&XHR=1". Das wäre der einfachere aber schlechtere Weg.

Wenn ich auf einem anderen Linux-System bin, nutze ich ab sofort am besten telnet:
{ echo "setreading dummytest var 12345";  sleep 1; } | telnet server:7072
oder netcat
echo 'setreading dummytest var 2389' | nc -w1 server 7072
Das läuft viel besser und schneller  :)

MQTT wäre auch eine Variante. Müsste ich mich aber erstmal besser einarbeiten und bräuchte dann wohl noch zusätzliche Devices.
Von einem ESP sollte es dann auch keine zu große hürde sein. Da habe ich aktuell aber kein offenes Projekt laufen. Das kommt dann.

Danke!

Gruß
Bismosa



1x nanoCUL 433MHz (SlowRF Intertechno) für Fenstersensoren
1x nanoCUL 868Mhz für MAX (9x HT 1xWT)
1x ZigBee CUL
Weiteres: Squeezebox server, Kindle Display, ESP8266, Löterfahrung, ...