<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>REST &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/tag/rest/feed" rel="self" type="application/rss+xml" />
	<link>https://www.smarthomeng.de</link>
	<description>Die Device Integrations-Plattform für Dein Smart Home</description>
	<lastBuildDate>Sat, 07 Apr 2018 08:02:55 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.5</generator>

<image>
	<url>https://www.smarthomeng.de/wp-content/uploads/global/logo_small_152x152-150x150.png</url>
	<title>REST &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<link>https://www.smarthomeng.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Das Webservices-Plugin</title>
		<link>https://www.smarthomeng.de/das-smarthomeng-webservices-plugin</link>
					<comments>https://www.smarthomeng.de/das-smarthomeng-webservices-plugin#respond</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Fri, 23 Mar 2018 18:56:42 +0000</pubDate>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Webservices]]></category>
		<guid isPermaLink="false">http://test.smarthomeng.de/?p=228</guid>

					<description><![CDATA[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<a class="moretag" href="https://www.smarthomeng.de/das-smarthomeng-webservices-plugin"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>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.</p>
<p>Daneben verfügt das Webservices Plugin über eine webbasierte GUI, über die alle Items und die dazugehörigen Webservice-URLs angesehen werden können.</p>
<p>Die automatisch generierte Dokumentation findet sich unter <a target="blank" href="http://smarthomeng.de/user/plugins_doc/config/webservices.html">http://smarthomeng.de/user/plugins_doc/config/webservices.html.</a></p>
<p>Der Sourcecode im Master-Branch von SmartHomeNG unter <a target="blank" href="https://github.com/smarthomeNG/plugins/tree/master/webservices">https://github.com/smarthomeNG/plugins/tree/master/webservices</a>.</p>
<p>Support findet ihr im Forum unter: <a target="blank" href="https://knx-user-forum.de/forum/supportforen/smarthome-py/1163886-support-thread-f%C3%BCr-das-webservices-plugin">https://www.smarthomeng.de/?category_name=plugins&amp;s=webservicessupport: https://knx-user-forum.de/forum/supportforen/smarthome-py/1163886-support-thread-f%C3%BCr-das-webservices-plugin</a>.</p>
<p>Beispiele zur Nutzung sind in den Artikeln <a href="https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng">&#8222;SmartHomeNG on a Watch – Anbindung des Garmin ConnectIQ SSK an SmartHomeNG&#8220;</a> und <a href="https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng" target="_blank" rel="noopener">&#8222;Entfernungsmessung auf Basis eines ESP32 und SmartHomeNG&#8220;</a> dargestellt.</p>
<h1>Konfiguration</h1>
<p>In der Datei <code>etc/module.yaml</code> sollte der Port für das Webservice-Interface gesetzt werden. Dies geschieht über die Angabe des <code>servicesport</code>:</p>
<pre><code class="language-yaml"># etc/module.yaml
http:
    class_name: http
    class_path: modules.http
    port: '1234'
    user: admin
    password: ''
    hashed_password: '...'
    <span style="color: #ff0000;">servicesport: '4321'</span>
    starturl: backend
</code></pre>
<p>Bei Bedarf eines Schutzes via Basic Authentication, kann zusätzlich noch der <code>service_user</code>, das <code>service_password</code> bzw. das <code>service_hashed_password</code> gesetzt werden:</p>
<pre><code class="language-yaml">
    service_user: serviceuser
    service_password: ''
    service_hashed_password: 'xxx'
</code></pre>
<p>In der etc/plugin.yaml wird nun das Plugin aktiviert:</p>
<pre><code class="language-yaml">WebServices:
    class_name: WebServices
    class_path: plugins.webservices
    mode: set
</code></pre>
<p>Der <code>mode</code> lässt sich alternativ auf <code>all</code> setzen. Damit werden automatisch alle Items via Webservice-API verfügbar gemacht. Ist wie oben <code>set</code> gesetzt, müssen Items explizit freigegeben und zu sogenannten &#8222;Itemsets&#8220; (Mengen von Items) gruppiert werden.</p>
<p>Ist dies geschehen, so wird das Plugin nach einem Neustart aktiv und kann verwendet werden. Im Beispiel <code>set</code> ist nun noch folgendes zu tun:</p>
<p>In der Definition der Items, muss das Attribut <code>webservices_set</code> 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.<br />
Schreibend ist nur der Zugriff auf einzelne Items möglich. Alle Items die in Sets sind, sind auch einzeln lesend zugreifbar.</p>
<p>Ein Item kann zudem mehrere Sets haben, wie im Item <code>MyItem2</code> unten verdeutlicht ist:</p>
<pre><code class="language-yaml">MyItem:
    type: str
    webservices_set: 'MySet1'
    webservices_data: 'val'

MyItem2:
    type: num
    webservices_set:
     - 'MySet1'
     - 'MySet2'
    webservices_data: 'full'
</code></pre>
<p>Das optionale Attribut <code>webservices_data</code> bedeutet folgendes: Ist hier nur <code>val</code> 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.</p>
<p><img decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_val.png" alt="" class="alignnone size-full wp-image-240" width="484" height="91" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_val.png 484w, https://www.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_val-300x56.png 300w" sizes="(max-width: 484px) 100vw, 484px" /><br />
Will man auch sämtliche Metadaten des Items haben, so setzt man <code>full</code></p>
<p><img fetchpriority="high" decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_full.png" alt="" class="alignnone size-full wp-image-244" width="714" height="655" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_full.png 714w, https://www.smarthomeng.de/wp-content/uploads/2018/03/beispielitem_full-300x275.png 300w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<h1>Zugriff auf Items</h1>
<h2>Simple Webservice Interface</h2>
<p>Das &#8222;Simple Webservices Plugin&#8220; erlaubt lesenden und schreibenden Zugriff auf Items ausschliesslich über URLs als GET Request.</p>
<p>Lesend wird dabei nach folgendem Schema zugegriffen:</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/ws/items/<mark>«item_path»</mark>
</code></pre>
<p>Ein Beispiel ist <code>http://192.168.178.100:1234/ws/items/knx.gf.office.light</code></p>
<p>Will man einen Wert schreiben, so hängt man diesen URL-codiert einfach hinten an:</p>
<pre><code class="language-bash">
<mark>http://«your_services_port»</mark>/ws/items/<mark>«item_path»</mark>/<mark>«value»</mark>
</code></pre>
<p>Also beispielsweise <code>http://192.168.178.100:1234/ws/items/office.light/0</code> oder <code>http://192.168.178.100:1234/ws/items/office.light/False</code>, was das Licht ausschaltet.</p>
<h2>REST (compliant) Interface</h2>
<p>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.</p>
<p>Lesend bleibt bis auf die URL alles beim Gleichen:</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/<span style="color: #ff0000;">rest</span>/items/<mark>«item_path»</mark>
</code></pre>
<p>Analog zu oben also im Beispiel <code>http://192.168.178.100:1234/<span style="color: #ff0000;">rest</span>/items/knx.gf.office.light</code></p>
<p>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 <code>Content-Type: application/json</code> gesetzt ist.<br />
Der Request wird dann direkt gegen die Basis URL des Items gesendet:</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/rest/items/<mark>«item_path»</mark>
</code></pre>
<p>Ein POST/PUT Request mit 0 im HTTP Body an <code>http://192.168.178.100:1234/rest/items/office.light</code> ebenfalls das Licht ausschalten.</p>
<p>Testen lässt sich das Ganze dann beispielsweise mit dem Plugin Postman aus dem Chrome App Store (<a href="https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop">Link</a>):</p>
<p><img decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/postman.png" alt="" class="alignnone size-full wp-image-259" width="1769" height="1048" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/postman.png 1769w, https://www.smarthomeng.de/wp-content/uploads/2018/03/postman-300x178.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/postman-768x455.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/postman-1024x607.png 1024w" sizes="(max-width: 1769px) 100vw, 1769px" /></p>
<p>Die HTTP Methoden PATCH und DELETE werden zur Zeit noch nicht unterstützt!</p>
<h2>Fehlerfall</h2>
<p>Im Fehlerfall, etwa bei einem falschen oder nicht freigegebenen Itempfad, wird bei <strong>beiden</strong> Interfaces (REST und Simple) eine JSON Fehlermeldung zurückgegeben:</p>
<p><img loading="lazy" decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/ws_fehlerfall.png" alt="" class="alignnone size-full wp-image-261" width="589" height="190" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_fehlerfall.png 589w, https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_fehlerfall-300x97.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></p>
<h2>Itemsets (lesend) zugreifen</h2>
<p>Sowohl via REST, als auch das Simple Webservices Interface lassen sich Itemsets lesend zugreifen.</p>
<p>Dies geschieht über folgende URL:</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/ws/itemset/<mark>«set_name»</mark>
</code></pre>
<p>bzw.</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/rest/itemset/<mark>«set_name»</mark>
</code></pre>
<p>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 <code>val</code> oder <code>full</code> gesetzt ist, werden die Daten entsprechend gemerged:</p>
<p><img loading="lazy" decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/itemset.png" alt="" class="alignnone size-full wp-image-263" width="820" height="757" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/itemset.png 820w, https://www.smarthomeng.de/wp-content/uploads/2018/03/itemset-300x277.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/itemset-768x709.png 768w" sizes="(max-width: 820px) 100vw, 820px" /></p>
<p>Neben dem expliziten Zugriff auf die Itemsets, lassen sich auch alle (erlaubten) Items auf einmal abfragen:</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/ws/items
</code></pre>
<p>bzw.</p>
<pre><code class="language-bash">
http://<mark>«your_server_ip»</mark>:<mark>«your_services_port»</mark>/rest/items
</code></pre>
<p>Für den Zugriff auf die Items im resultierenden JSON Dictionary, wird ebenfalls der Pfad des jew. Items verwendet.</p>
<h1>Web GUI</h1>
<p>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.</p>
<p><img loading="lazy" decoding="async" src="http://test.smarthomeng.de/wp-content/uploads/2018/03/ws_webgui.png" alt="" class="alignnone size-full wp-image-267" width="1327" height="711" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_webgui.png 1327w, https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_webgui-300x161.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_webgui-768x411.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/ws_webgui-1024x549.png 1024w" sizes="(max-width: 1327px) 100vw, 1327px" /></p>
<p>In zukünftigen Artikeln wird die Nutzung des Webservices Plugins in Beispielapplikationen beschrieben.</p>
<p>Ein Proof of Concept existiert bereits für die <a href="https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng">ConnectIQ IDE (Garmin Uhren)</a> und ein Projekt auf Basis eines ESP32. Hier kann unter <a href="https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng" target="_blank" rel="noopener">https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng</a> 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.</p>
<p>&nbsp;</p>
<p><em>(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.)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/das-smarthomeng-webservices-plugin/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
