Seit SmartHomeNG 1.4.x besteht die Möglichkeit, das Webservices Plugin zu nutzen. Das Webservices Plugin stellt zwei unterschiedliche Möglichkeiten bereit lesend (und schreibend) auf Items zuzugreifen: REST und das Simple Webservice Interface.

Daneben verfügt das Webservices Plugin über eine webbasierte GUI, über die alle Items und die dazugehörigen Webservice-URLs angesehen werden können.

Die automatisch generierte Dokumentation findet sich unter http://smarthomeng.de/user/plugins_doc/config/webservices.html.

Der Sourcecode im Master-Branch von SmartHomeNG unter https://github.com/smarthomeNG/plugins/tree/master/webservices.

Support findet ihr im Forum unter: https://www.smarthomeng.de/?category_name=plugins&s=webservicessupport: https://knx-user-forum.de/forum/supportforen/smarthome-py/1163886-support-thread-f%C3%BCr-das-webservices-plugin.

Beispiele zur Nutzung sind in den Artikeln „SmartHomeNG on a Watch – Anbindung des Garmin ConnectIQ SSK an SmartHomeNG“ und „Entfernungsmessung auf Basis eines ESP32 und SmartHomeNG“ dargestellt.

Konfiguration

In der Datei etc/module.yaml sollte der Port für das Webservice-Interface gesetzt werden. Dies geschieht über die Angabe des servicesport:

# etc/module.yaml
http:
    class_name: http
    class_path: modules.http
    port: '1234'
    user: admin
    password: ''
    hashed_password: '...'
    servicesport: '4321'
    starturl: backend

Bei Bedarf eines Schutzes via Basic Authentication, kann zusätzlich noch der service_user, das service_password bzw. das service_hashed_password gesetzt werden:


    service_user: serviceuser
    service_password: ''
    service_hashed_password: 'xxx'

In der etc/plugin.yaml wird nun das Plugin aktiviert:

WebServices:
    class_name: WebServices
    class_path: plugins.webservices
    mode: set

Der mode lässt sich alternativ auf all setzen. Damit werden automatisch alle Items via Webservice-API verfügbar gemacht. Ist wie oben set gesetzt, müssen Items explizit freigegeben und zu sogenannten „Itemsets“ (Mengen von Items) gruppiert werden.

Ist dies geschehen, so wird das Plugin nach einem Neustart aktiv und kann verwendet werden. Im Beispiel set ist nun noch folgendes zu tun:

In der Definition der Items, muss das Attribut webservices_set gesetzt werden. Die Idee des Itemsets ist, dass man beispielsweise bei der Verwendung in einer Android oder iOS App nur einen Request pro Seite machen muss, auch wenn es mehrere Items gibt, die angezeigt werden soll. Items die zu einem Set gruppiert werden, lassen sich also über dieses gemeinsam via Webservice auslesen. Eine Seite der GUI in der App entspräche also einem Itemset.
Schreibend ist nur der Zugriff auf einzelne Items möglich. Alle Items die in Sets sind, sind auch einzeln lesend zugreifbar.

Ein Item kann zudem mehrere Sets haben, wie im Item MyItem2 unten verdeutlicht ist:

MyItem:
    type: str
    webservices_set: 'MySet1'
    webservices_data: 'val'

MyItem2:
    type: num
    webservices_set:
     - 'MySet1'
     - 'MySet2'
    webservices_data: 'full'

Das optionale Attribut webservices_data bedeutet folgendes: Ist hier nur val gesetzt, wird nur der Wert und der Pfad des Items im JSON Format zurückgeliefert. Dies dient bspw. bei mobilen Anwendungen der Reduzierung der Datenmenge.


Will man auch sämtliche Metadaten des Items haben, so setzt man full

Zugriff auf Items

Simple Webservice Interface

Das „Simple Webservices Plugin“ erlaubt lesenden und schreibenden Zugriff auf Items ausschliesslich über URLs als GET Request.

Lesend wird dabei nach folgendem Schema zugegriffen:


http://«your_server_ip»:«your_services_port»/ws/items/«item_path»

Ein Beispiel ist http://192.168.178.100:1234/ws/items/knx.gf.office.light

Will man einen Wert schreiben, so hängt man diesen URL-codiert einfach hinten an:


http://«your_services_port»/ws/items/«item_path»/«value»

Also beispielsweise http://192.168.178.100:1234/ws/items/office.light/0 oder http://192.168.178.100:1234/ws/items/office.light/False, was das Licht ausschaltet.

REST (compliant) Interface

Um auch den REST Standard zu unterstützen, gibt es weiterhin auch das REST Interface. Dieses verhält sich leicht anders, als das Simple Webservices Interface.

Lesend bleibt bis auf die URL alles beim Gleichen:


http://«your_server_ip»:«your_services_port»/rest/items/«item_path»

Analog zu oben also im Beispiel http://192.168.178.100:1234/rest/items/knx.gf.office.light

Schreibend müssen die Daten aber als HTTP Body in einem PUT oder POST Request übergeben werden, so wie es durch den REST Standard vorgegeben wird. Dabei ist sicherzustellen, dass im HTTP Header der Content-Type: application/json gesetzt ist.
Der Request wird dann direkt gegen die Basis URL des Items gesendet:


http://«your_server_ip»:«your_services_port»/rest/items/«item_path»

Ein POST/PUT Request mit 0 im HTTP Body an http://192.168.178.100:1234/rest/items/office.light ebenfalls das Licht ausschalten.

Testen lässt sich das Ganze dann beispielsweise mit dem Plugin Postman aus dem Chrome App Store (Link):

Die HTTP Methoden PATCH und DELETE werden zur Zeit noch nicht unterstützt!

Fehlerfall

Im Fehlerfall, etwa bei einem falschen oder nicht freigegebenen Itempfad, wird bei beiden Interfaces (REST und Simple) eine JSON Fehlermeldung zurückgegeben:

Itemsets (lesend) zugreifen

Sowohl via REST, als auch das Simple Webservices Interface lassen sich Itemsets lesend zugreifen.

Dies geschieht über folgende URL:


http://«your_server_ip»:«your_services_port»/ws/itemset/«set_name»

bzw.


http://«your_server_ip»:«your_services_port»/rest/itemset/«set_name»

Das Ergebnis sind die jeweiligen Daten der enthaltenen Items als Dictionary. Der key für den Zugriff ist dabei jeweils der Pfad des Items. Je nachdem, ob val oder full gesetzt ist, werden die Daten entsprechend gemerged:

Neben dem expliziten Zugriff auf die Itemsets, lassen sich auch alle (erlaubten) Items auf einmal abfragen:


http://«your_server_ip»:«your_services_port»/ws/items

bzw.


http://«your_server_ip»:«your_services_port»/rest/items

Für den Zugriff auf die Items im resultierenden JSON Dictionary, wird ebenfalls der Pfad des jew. Items verwendet.

Web GUI

Die Liste der zugreifbaren Items und Itemsets kann wie oben geschrieben auch via WebGUI abgerufen werden. Diese ist aus dem Backend-Plugin in der Pluginliste verlinkt.

In zukünftigen Artikeln wird die Nutzung des Webservices Plugins in Beispielapplikationen beschrieben.

Ein Proof of Concept existiert bereits für die ConnectIQ IDE (Garmin Uhren) und ein Projekt auf Basis eines ESP32. Hier kann unter https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng auch nachgelesen werden, wie sich die Daten via REST und Simple Webservices Interface aus C-Code heraus übertragen lassen. Auch ein erster Ansatz für ESPEasy wurde bereits umgesetzt.

 

(Die in diesem Artikel verwendeten Screenshots wurden selber erstellt. Das Titelbild ist unter der Creative Commons Zero (CC0) Lizenz veröffentlicht und wurde von www.pexels.com bezogen.)

Kategorien: PluginsTipps & Tricks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.