FHEMWEB: Beliebigen HTTP Endpunkt einrichten

Begonnen von cpj, 17 März 2024, 03:34:30

Vorheriges Thema - Nächstes Thema

cpj

Ich versuche seit einige Tagen erfolglos einen Taster einzubinden, der seine Kommando mittels HTTP an Aktoren schickt.
Die Einbindung der Aktoren an sich über HTTPMOD ist kein Problem.

Requests, die der Taster schickt, können mit curl simuliert werden

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "ID=2&SET4=6&SENDER=4" "http://192.168.1.20/io.xml"

Der Endpunkt ist beim Taster nicht konfigurierbar, nur die IP-Adresse.

Was ich bis jetzt gemacht habe und wo ich stecke ist


defmod webapi FHEMWEB 8088 global
attr webapi room 0_in_work
attr webapi csrfToken none
attr webapi verbose 5
attr webapi allowfrom 192.168.1.66|127.0.0.1

defmod webapisrv HTTPSRV io.xml /opt/fhem/io webapi server
attr webapisrv room 0_in_work
attr webapisrv verbose 5

womit ich dann zu folgendem Ergebnis komme:

2024.03.17 03:29:38 4: Connection accepted from webapi_192.168.1.66_34530
2024.03.17 03:29:38 5: POST /io.xml HTTP/1.1
Host: 192.168.1.20
User-Agent: curl/7.88.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
Content-Length: 20
2024.03.17 03:29:38 4: webapi_192.168.1.66_34530 POST /io.xml&ID=2&SET4=6&SENDER=4; BUFLEN:0
2024.03.17 03:29:38 4: webapi: redirecting /io.xml&ID=2&SET4=6&SENDER=4 to /fhem

Wie kann ich die Konfiguration gestalten, dass mir dieser Aufruf einen beliebigen fhem Befehl triggert.

Ich bin für jede Hilfe dankbar.

rudolfkoenig

ZitatDer Endpunkt ist beim Taster nicht konfigurierbar, nur die IP-Adresse.
Eine Loesung mit HTTPSRV ist nur mit vorheriges URL-Rewriting (z.Bsp. via Apache) moeglich, da mit HTTPSRV zwingend zwei, durch / getrennte Pfadkomponenten hinter der IP Adresse notwendig sind, in der Art http://127.0.0.1/io/xml

Loesung mit FHEMWEB um "set d off" auszufuehren:
define w FHEMWEB 8084 global
attr w webname io.xml
attr w csrfToken none
Aufruf: curl -X POST -d "cmd.1=set&dev.1=d&arg.1=off&XHR=1" http://127.0.0.1:8084/io.xmlVoraussetzung: die gesendeten Daten sind konfigurierbar.

cpj

Danke. Leider sind die gesendeten Daten nicht konfigurierbar.

Einen Perl Proxy, der das Message rewriting übernimmt und an FHEM sendet, konnte ich implementieren.

Das Ganze werde ich dann wohl in ein FHEM Modul gießen.


rudolfkoenig

Vorschlag: wenn das FHEMWEB redirectTo Attribut auf event gesetzt ist, dann wird statt redirect ein FHEM-Event mit den empfangenen Daten generiert.

Spart Proxy und Modul, und ich koennte das mit 2 Zeilen Aenderung (+Doku) ohne Nebeneffekte implementieren.

cpj

Wenn das so einfach und schnell geht, wäre ich sehr dankbar dafür.

rudolfkoenig

Um es zivilisiert zu bauen waren doch 5 Zeilen noetig.
Plus Doku, redirectTo war bisher nicht dokumentiert:

ZitatIf set, and FHEMWEB cannot handle a request, redirect the client to $FW_ME/$redirectTo$arg. If not set, redirect to $FW_ME.
If set to eventFor:<regexp>, and $arg matches the regexp, then an event for the FHEMWEB instance with $arg will be generated.
In deinem Fall wuerde ich sowas wie "attr web redirectTo eventFor:ID=.*" nehmen.

cpj

Vielen Dank!

Es funktioniert bei mir einwandfrei mit

attr webapi redirectTo eventFor:/io.xml&ID=.*

Verwendet wird das Ganze dann in einem DOIF in der Richtung

defmod di_web DOIF ([webapi:"^/io.xml&ID=1&SET1=6$"]) \
    ( set ...) \