Autor Thema: HTTP API  (Gelesen 2899 mal)

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
HTTP API
« am: 12 Juli 2022, 19:17:28 »
Gibt es schon eine allgemein verwendbare HTTP API in Fhem mit der man set- und get-Befehle der Devices ausführen und deren Readings abfragen könnte, z. B. per
http://<ip-addr>:8085/api/set?device=<devname>&cmd=<cmd>
http://<ip-addr>:8085/api/get?device=<devname>&cmd=<cmd>
http://<ip-addr>:8085/api/read?device=<devname>&reading=<cmd>
oder wurde solch eine Funktionalität schon modulspezifisch verwendet?

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25618
Antw:HTTP API
« Antwort #1 am: 12 Juli 2022, 21:02:45 »
HTTPMOD?

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18254
  • Stoppt den Unicode-Irrsinn!
Antw:HTTP API
« Antwort #2 am: 13 Juli 2022, 09:33:36 »
oder vielleicht auch mit HTTPSRV?

Zitat
  Provides a mini HTTP server plugin for FHEMWEB. It serves files from a given directory.
  It optionally accepts a query string to set readings of this device if an attribute allows the given reading<p>

  HTTPSRV is an extension to <a href="HTTPSRV">FHEMWEB</a>. You must install FHEMWEB to use HTTPSRV.</p>

Edit: ich glaube, das mit dem reading hatte ich falsch verstanden. Aber erste Versuche hier haben gerade gezeigt, dass HTTPSRV eine gute Basis sein könnte, eine solche API zu bauen :)
« Letzte Änderung: 13 Juli 2022, 10:18:52 von betateilchen »
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #3 am: 13 Juli 2022, 17:40:04 »
Danke für die Tipps. HTTPSRV scheint wirklich eine gute Basis zu sein.

Offline M.Schulze

  • Commercial User
  • Jr. Member
  • **
  • Beiträge: 53
  • Principal Strategist, Maker
    • Home Control DEMO
Antw:HTTP API
« Antwort #4 am: 14 Juli 2022, 09:08:31 »
Was hast du denn genau vor?

Ein Gerät mit einer vorgegebenen, fertigen HTTP API in FHEM integrieren?

Oder in deinem Gerät/Programm eine "FHEM friendly HTTP API" implementieren (z.B. mit POSTMAN), um sie "auch" mit FHEM zu nutzen, und ggf. auch zu standardisieren?


"FHEM friendly HTTP API" = "FHEM HTTP API" gibt es ja aktuell nicht. Weder eine API noch die Module dafür.


MfG
Home Control (HCtrl.de) - Operating Home-Automation as a Service (HAaaS)
https://musterhaus:demo@musterhaus.hctrl.de/

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #5 am: 14 Juli 2022, 18:21:41 »
Ziel ist es, Fhem Devices von externen Systemen aus über eine html-API zu steuern, auszulesen und zu beschreiben. Die erste Idee für die html-Sequenzen ist:
http://<ip-addr>:8083/fhem/api/set?device=<devname>&cmd=<cmd>
http://<ip-addr>:8083/fhem/api/get?device=<devname>&cmd=<cmd>
http://<ip-addr>:8083/fhem/api/read?device=<devname>&reading=<name>
http://<ip-addr>:8083/fhem/api/write?device=<devname>&reading=<name>&value=<val>

Offline zap

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4317
    • HMCCU
Antw:HTTP API
« Antwort #6 am: 14 Juli 2022, 21:13:09 »
Ich würde kein URL Encoding verwenden, sondern ein JSON API bauen (POST Requests). Ist sicherer, flexibler und es gibt sicher reichlich Beispiele dafür.

Beispiel:

POST http://ip:port/fhem/api

{
   "method": "set",
   "device": "myDev",
   "command": "state",
   "valuelist": [ 1, 2, 100 ]
}
2xCCU3, diverse Komponenten (Fenster, Rolladen, Themostate, Stromzähler, Steckdosen ...)
FHEM mit Raspi für CCU Integration.
IOBroker für UI (VIS), Hue, Sonos usw.
Maintainer der Module FULLY, Meteohub und HMCCU (Schnittstelle CCU-FHEM = best of both worlds approach

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #7 am: 15 Juli 2022, 19:11:17 »
Danke für die Anregung.

Ich verwende die Erweiterungsfunktion des zentralen Moduls FHEMWEB. Als Muster für das neue Modul dient das Modul HTTSRV. Soweit ich das beurteilen kann, übergibt FHEMWEB an ein plugin ausschließlich die url. Das klappt gut und ist für die Steuerung der Devices die einfachste Lösung.

Für die Rückgabewerte ist natürlich die JSON-Formatierung eine gute Alternative. 

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #8 am: 28 Juli 2022, 16:56:16 »
Danke nochmals für die Tipps. Das Modul HTTPAPI ist jetzt fertig. Ich stelle es umgehend ins svn.
Hilfreich Hilfreich x 1 Liste anzeigen

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18254
  • Stoppt den Unicode-Irrsinn!
Antw:HTTP API
« Antwort #9 am: 28 Juli 2022, 18:24:48 »
  my $fileName = $gPath . '/03_HTTPAPI.pm';

Bist Du sicher, dass das funktioniert?

  if(open(INPUTFILE, $fileName)) {
    binmode(INPUTFILE);
    @contents= <INPUTFILE>;

Zum Lesen von Dateien stellt FHEM die Funktion FileRead() bereit.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #10 am: 28 Juli 2022, 20:42:10 »
  my $fileName = $gPath . '/03_HTTPAPI.pm';

Bist Du sicher, dass das funktioniert?
Ne, ist aber schnell gelöst.

Zitat
  if(open(INPUTFILE, $fileName)) {
    binmode(INPUTFILE);
    @contents= <INPUTFILE>;

Zum Lesen von Dateien stellt FHEM die Funktion FileRead() bereit.
Wie praktisch, sehe ich mir an.

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18254
  • Stoppt den Unicode-Irrsinn!
Antw:HTTP API
« Antwort #11 am: 29 Juli 2022, 11:16:01 »
Wie praktisch, sehe ich mir an.

hm... Du solltest aber auch an die Nutzer denken, die mit configDB arbeiten.

FileRead() unterscheidet beim Lesen zwischen fhem.cfg und configDB Installationen.
Wird configDB verwendet, will FileRead() die Datei aus der Datenbank lesen, dort wird die Moduldatei logischerweise nicht gefunden.
Da die Moduldatei immer aus dem Dateisystem gelesen werden muss, solltest Du das im Aufruf von FileRead() mit angeben.

Index: FHEM/02_HTTPAPI.pm
===================================================================
--- FHEM/02_HTTPAPI.pm (revision 26269)
+++ FHEM/02_HTTPAPI.pm (working copy)
@@ -210,7 +210,7 @@
 sub HTTPAPI_CommandRef($) {
   my ($hash) = @_;
   my $fileName = $gPath . '/02_HTTPAPI.pm';
-  my ($err, @contents) = FileRead($fileName);
+  my ($err, @contents) = FileRead( { FileName => $fileName, ForceType => 'file' } );
   return ($hash, 404, 'close', "text/plain; charset=utf-8", encode($encoding, "error=404 Not Found, file $fileName not found")) if ($err);
   my $contents = join("\n", @contents);
   $contents =~ /\n=begin.html([\s\S]*)\n=end.html/gs;
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Lesen gefährdet die Unwissenheit!

Offline klaus.schauer

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1272
Antw:HTTP API
« Antwort #12 am: 29 Juli 2022, 12:25:12 »
Ändere ich natürlich. Gut dass der eine oder andere einen Überblick hat und sich meldet.