HTTP Client für FHEM

Begonnen von Otto123, 21 Februar 2019, 16:43:57

Vorheriges Thema - Nächstes Thema

Otto123

Der eingebaute Client Modus in der fhem.pl funktioniert nur über die Telnet Schnittstelle von FHEM, diese wird aber per default gar nicht mehr definiert.
Ich habe mal in 3 Varianten einen FHEM Client gebaut: als Bash-, Powershell- und Perlscript.
Die Scripts liegen auf GitHub und können jederzeit aktuell von dort geholt werden.
Der FHEM Client verfügt einheitlich über folgende Möglichkeiten:

  • Angabe komplette URL oder nur Portnummer (lokaler Zugriff) [http://<Username>:<Password>@<hostname>:]<portNummer>

    • Zugriff über Standard WEB sofort nach FHEM Installation möglich, csrf Token wird verwendet.
    • Angabe von Basic Auth in der URL möglich.
    • mehrzeilige DEFs möglich. Analog Raw Definition
  • FHEM Befehle als:

    • Argument(e) (analog fhem.pl)
    • Dateiname der Befehlsdatei mit Codeschnipseln (z.B. ganz oder teilweise fhem.cfg).
    • Zeilen über die Pipeline (cat Befehlsdatei | fhemcl 8083)
  • Ausgabe der FHEM Antwort, z.B. bei list Befehlen, analog zum Client Modus in fhem.pl
  • Kurze Hinweise zur Verwendung
Getestet habe ich die Bash und Perl Scripts unter Raspbian, das Powershell Script unter Windows 10.

Mit Sicherheit ist es noch nicht völlig frei von bugs! Verwendung also auf eigene Gefahr!

Holen kann man sich die Scripts (auch unter Windows/Powershell) direkt mit wget
wget -O fhemcl.sh https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.sh
wget -O fhemcl.ps1 https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.ps1
wget -O fhemcl.pl https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.pl

Beispiele
Aufruf analog zur fhem.pl
perl fhemcl.pl 8083 "set Aktor01 toggle"
Oder mit kompletter url und Befehlsdatei
bash fhemcl.sh http://fhemserver:8083 "befehle.txt"
Oder per Pipeline
cat "befehle.txt"|.\fhemcl.ps1 http://fhemserver:8083

Ich würde unter Linux die bash Variante und unter Windows die Powershell Variante verwenden.
Die Perl Variante ist vergleichsweise langsam (und ich habe das schlechtere Gefühl über die Qualität meines Codes).   ;)

Wie so oft: der eigentlich Code ist in ein paar Zeilen, der Rest ist (Fehler)Behandlung der Eingabe, Verkettung mehrzeiliger Definitionen usw...

Ich habe komplette fhem.cfg getestet, das läuft soweit Fehlerfrei. Die Ausgabe (vor allem perl Script) ist noch verbesserungswürdig.
Es sollte problemlos möglich sein, Grundkonfigurationen sowie komplette Definitionsschnipsel egal von welchem System einzuspielen.

Ich habe ziemlich viel zusammen kopiert, ich hoffe ich habe nicht all zuviel Mist gebaut. :)

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

steffen83

Danke für den Schnipsel, kann ich sicherlich gebrauchen.

Da ich gerade dabei bin mich mit Open CV zu beschäftigen um die Klingelbilder auszuwerten, planst du zufällig sowas auch in Python (3)?
Ich muss von Python zu fhem kommen :-(

Gesendet von meinem MI 8 mit Tapatalk

Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

Otto123

Moin,

im Wiki gibt es einen Python schnipsel:
https://wiki.fhem.de/wiki/CsrfToken-HowTo#Python
Such mal nach ring.py da ist der Zugriff auch realisiert.

Und sicher, das Prinzip steht jetzt in drei Sprachen da und ist sicher leicht nach Python zu übertragen. Aber ich habe da keine Ambition. Mir reicht Bash und Powershell.
Die Perl Variante habe ich nur gemacht um selbst zu üben und Rudi vielleicht bei der Umstellung des fhem Client Modus auf HTTP zu helfen.

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

Otto123

Da Sidey in einem Thread, wo ich nicht antworten kann, gefragt hat was ich im Script eigentlich mache:
for ((i=0; i<${#cmdarray[*]}; i++));do
    # concat def lines with ending \ to the next line, remove any \r from line
    cmd=${cmdarray[i]//[$'\r']}
    while [ ${cmd:${#cmd}-1:1} = '\' ];do
          ((i++))
          cmd=${cmd::-1}$'\n'${cmdarray[i]//[$'\r']}
    done
    # urlencode loop over String
...
    # send command to FHEM and filter the output (tested with list...).
...
done
in cmdarray steht pro Element eine Zeile aus dem Input. Wenn eine Zeile auf \ endet (DEF mehrzeilig) werden alle Folgezeilen bis zum Ende (kein \ ) in einen String zusammengefügt, der \ entfernt und ein Zeilenumbruch eingefügt.
FHEM will die DEF als einen String und keine \ am Zeilenende. Beispiel:
Willi\
Rudi\
Lustig
daraus wird Willi\nRudi\nLustig
Da ev. Textdateien von Windows kommen, wäre dort CR (\r) zusätzlich zu LF (\n) als Zeilenumbruch drin. Das stört und wird entfernt.
Die weiter Folge im Script ist urlencode wegen http und dann Übergabe an die Webschnittstelle.
Aus der Antwort von FHEM wird der Text zwischen zwei <pre> </pre> herausgefiltert und von weiteren HTML Tags befreit.

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

nils_

Zitat von: Otto123 am 06 März 2019, 21:21:53
Da Sidey in einem Thread, wo ich nicht antworten kann, gefragt hat was ich im Script eigentlich mache:
vote Otto 4 developer :D
viele Wege in FHEM es gibt!

JoWiemann

Zitat von: Otto123 am 21 Februar 2019, 16:43:57
Der eingebaute Client Modus in der fhem.pl funktioniert nur über die Telnet Schnittstelle von FHEM, diese wird aber per default gar nicht mehr definiert.

Sie wird per default nicht mehr aktiviert. Dass heißt allerdings nicht, dass ich sie nicht definieren und nutzen kann. Ich nutze jedenfalls die Telnet-Schnittstelle wie gehabt.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

nils_

dazu: https://forum.fhem.de/index.php/topic,91148.0.html

Zitat von: JoWiemann am 07 März 2019, 08:52:42
Sie wird per default nicht mehr aktiviert.
definiert ist da mMn schon passend. (aber ich will jetzt auch nicht über die wortwahl philosophieren :) )

Zitat von: JoWiemann am 07 März 2019, 08:52:42
Dass heißt allerdings nicht, dass ich sie nicht definieren und nutzen kann.
da spricht ja auch nichts dagegen ;)
viele Wege in FHEM es gibt!

Otto123

Zitat von: JoWiemann am 07 März 2019, 08:52:42
Sie wird per default nicht mehr aktiviert. Dass heißt allerdings nicht, dass ich sie nicht definieren und nutzen kann. Ich nutze jedenfalls die Telnet-Schnittstelle wie gehabt.

Grüße Jörg
Guten Morgen,

Jörg da hast Du Recht. Ich wollte halt einen Weg suchen um ohne Not nicht ein zusätzliches Tor zu öffnen.
Und ich wollte zeigen: Es geht über HTTP problemlos.
Ich will nach dem Setup mein System grundlegend "bestücken". Ich mache so etwas gern automatisiert mit Script.

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