<?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>Webservices &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/tag/webservices/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, 19 May 2018 18:08:56 +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>Webservices &#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>Entfernungsmessung mit ESP32 und SmartHomeNG &#8211; Teil 2: Anbindung eines SSD1306 OLED Displays</title>
		<link>https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays</link>
					<comments>https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays#respond</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Sat, 19 May 2018 17:46:32 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[OLED Display]]></category>
		<category><![CDATA[SSD1306]]></category>
		<category><![CDATA[Wasserstand]]></category>
		<category><![CDATA[Webservices]]></category>
		<category><![CDATA[Zisterne]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1671</guid>

					<description><![CDATA[Als nächsten Schritt meines Projekts zur Überwachung des Wasserstands meiner Zisterne, habe ich ein SSD1306 OLED Display ergänzt, das in meiner Garage in der Nähe der Pumpe installiert werden soll. Hier möchte ich die Wasserhöhe und &#8211; eines Tages &#8211; den Wasserstand anzeigen. Als Vorarbeiten wird im Wesentlichen der Artikel<a class="moretag" href="https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Als nächsten Schritt meines Projekts zur Überwachung des Wasserstands meiner Zisterne, habe ich ein SSD1306 OLED Display ergänzt, das in meiner Garage in der Nähe der Pumpe installiert werden soll. Hier möchte ich die Wasserhöhe und &#8211; eines Tages &#8211; den Wasserstand anzeigen.</p>
<p>Als Vorarbeiten wird im Wesentlichen der Artikel &#8222;<a href="https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng" target="_blank" rel="noopener">Entfernungsmessung auf Basis eines ESP32 und SmartHomeNG</a>&#8220; vorausgesetzt.<a href="https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng"></a></p>
<p>Mittlerweile bin ich bei der Messung des Ultraschallsignales des HR-SR04 allerdings auf die Arduino Bibliothek <a href="https://playground.arduino.cc/Code/NewPing" target="_blank" rel="noopener">NewPing</a> umgestiegen, die die Messung übernimmt:<img fetchpriority="high" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/05/newping_lib.jpg" alt="" width="726" height="96" class="alignnone size-full wp-image-1710" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/05/newping_lib.jpg 726w, https://www.smarthomeng.de/wp-content/uploads/2018/05/newping_lib-300x40.jpg 300w" sizes="(max-width: 726px) 100vw, 726px" />Als Display kommt ein kleines OLED Display mit SSD 1306 Controller zum Einsatz (<a href="https://www.az-delivery.de/products/0-96zolldisplay" target="_blank" rel="noopener">https://www.az-delivery.de/products/0-96zolldisplay</a>, ca. 7 Euro).</p>
<p>Das Display wird wie folgt zusätzlich zum HC-SR04 angeschlossen:</p>
<p><img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/05/Untitled-Sketch-2_Steckplatine.png" alt="" width="529" height="460" class="alignnone wp-image-1673" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/05/Untitled-Sketch-2_Steckplatine.png 1098w, https://www.smarthomeng.de/wp-content/uploads/2018/05/Untitled-Sketch-2_Steckplatine-300x261.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/05/Untitled-Sketch-2_Steckplatine-768x667.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/05/Untitled-Sketch-2_Steckplatine-1024x890.png 1024w" sizes="(max-width: 529px) 100vw, 529px" /></p>
<p>Als Bibliothek kommt die &#8222;<a href="https://github.com/ThingPulse/esp8266-oled-ssd1306" target="_blank" rel="noopener">ESP8266 and ESP32 Oled Driver for SSD1306 display</a>&#8220; von Daniel Eichhorn und Fabrice Weinberg in Version 4.0.0 zum Einsatz:</p>
<p><img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/05/display_lib.jpg" alt="" width="734" height="90" class="alignnone size-full wp-image-1685" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/05/display_lib.jpg 734w, https://www.smarthomeng.de/wp-content/uploads/2018/05/display_lib-300x37.jpg 300w" sizes="(max-width: 734px) 100vw, 734px" /></p>
<p>Der angepasst Sourcecode sieht nun wie folgt aus. Es ist dabei zu beachten, dass das Webservices- Plugin inzwischen über die REST Schnittstelle angesteuert wird. Weiterhin sind alle Log-Outputs für den Seriellen Monitor entfernt worden. Sämtliche relevanten Outputs werden jetzt auf dem Display ausgegeben.</p>
<pre><code class="language-c">
#include &lt;HTTPClient.h&gt;
#include &lt;NewPing.h&gt;
#include &lt;WiFi.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WiFiServer.h&gt;
#include &lt;WiFiUdp.h&gt;
#include &lt;Wire.h&gt;
#include "SSD1306.h"

const int triggerPin = 15;   // HC-SR04: Trigger Pin
const int echoPin = 4;       // HC-SR04: Echo Pin
const int sdaPin = 21;       // Display: SDA Pin
const int sclPin = 22;       // Display: SCL Pin
const int sensorRange = 280; // Reichweite (&lt; maximale Reichweite)

// HC-SR04
NewPing sonar(triggerPin, echoPin, sensorRange); // create NewPing instance

// Wifi
char ssid[] = "&lt;wlan_ssid&gt;";     // your network SSID (name)
char pass[] = "&lt;wlan_password&gt;"; // your network password
char host[] = "192.168.178.100"; // ip of service interface in SmartHomeNG
int port = 4321;                 // port of service interface in SmartHomeNG
char cm_item[] = "test.numeric";
int status = WL_IDLE_STATUS;
WiFiClient client;

// Display
SSD1306Wire display(0x3c, sdaPin, sclPin);

void setup() {
  Serial.begin(19200);
  // Init Display
  display.init();
  display.flipScreenVertically();
  // Init Wifi
  initialise_wifi();
}

void loop() {
  delay(50);
  unsigned int result = sonar.ping();
  float cm = sonar.convert_cm(result); //(result/2)/29.1; //

  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  if (cm &gt; 0) {
    if (client.connect(host, port)) {
      HTTPClient http;
      char portStr[12];
      sprintf(portStr, "%d", port);
      char url[128];
      sprintf(url, "http://%s:%s/rest/items/%s", host, portStr, cm_item);
      http.begin(url);
      http.addHeader("Content-Type", "application/json");
      char cmStr[12];
      char cmStrFull[24];
      sprintf(cmStr, "%f", cm);
      sprintf(cmStrFull, "%i cm", (int)cm);
      int httpCode = http.PUT(cmStr);
      String payload = http.getString();
      http.end();

      display.clear();
      display.setFont(ArialMT_Plain_16);
      display.drawString(0, 0, "Wasserstand:");
      display.setFont(ArialMT_Plain_24);
      display.drawString(0, 17, cmStrFull);
      display.display();
    }
  }
  // Wait 5 seconds and do next measurement
  delay(5000);
}

static void initialise_wifi(void) {
  display.setFont(ArialMT_Plain_10);
  display.drawString(0, 0, "Setting up wifi...");
  display.display();

  while (status != WL_CONNECTED) {
    display.drawString(0, 11, "Attempting to connect...");
    display.display();
    status = WiFi.begin(ssid, pass);
    delay(10000);
  }
  display.drawString(0, 22, "Connected to wifi!");
  display.display();
  printWifiStatus();
}

void printWifiStatus() {
  IPAddress ip = WiFi.localIP();
  String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
  display.drawString(0, 33, "IP: "+ipStr);
  display.display();
  long rssi = WiFi.RSSI();
  char rssiStr[255];
  sprintf(rssiStr, "RSSI: %d dBm", rssi);
  display.drawString(0, 44, rssiStr);
  display.display();
}</code></pre>
<p>Nach der Initialisierung des Displays in der Methode <code>setup</code>, kann mittels <code>display.drawString(...)</code> Text auf das Display gesendet werden. Der erste Parameter ist dabei die X-, der zweite die Y-Koordinate. Im dritten Parameter wird der String gesetzt. Mit <code>display.display();</code> werden alle zuvor eingesteuerten Operationen dann wirklich auf dem Display ausgegeben. Ein <code>display.clear();</code> leert die auf dem Display ausgegebenen Werte, damit neuer Text dargestellt werden kann. Wird kein <code>display.display();</code> aufgerufen, so wird immer mehr auf das Display geschrieben. Dies kann soweit führen, dass Text über bestehenden Text geschrieben wird.</p>
<p>Dies kann am Beispiel der WLAN-Initialisierung gut gesehen werden. Das Gehäuse ist dabei wieder von Thingiverse bezogen und via 3D Drucker gedruckt worden (<a href="https://www.thingiverse.com/thing:2176764" target="_blank" rel="noopener">https://www.thingiverse.com/thing:2176764</a>):</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0778-1.jpg" alt="" width="546" height="418" class="alignnone wp-image-1699" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0778-1.jpg 730w, https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0778-1-300x230.jpg 300w" sizes="(max-width: 546px) 100vw, 546px" /><br />
Nach der Initialisierung wird nun auf dem Display der Abstand angezeigt:</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0776.jpg" alt="" width="516" height="556" class="alignnone wp-image-1690" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0776.jpg 3024w, https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0776-278x300.jpg 278w, https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0776-768x827.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/05/IMAG0776-950x1024.jpg 950w" sizes="(max-width: 516px) 100vw, 516px" /></p>
<p>In Teil 3 folgt nun in Kürze noch ein Update zu meiner tatsächlichen Installation in der Zisterne und der Garage. Die Arbeiten sind bereits vollendet und die Werte werden via Kabel in die Garage auf den ESP32 übertragen. Mehr dazu aber in der nächsten Zeit&#8230;</p>
<p><em>(Die in diesem Artikel verwendeten Screenshots und Fotos wurden selber erstellt. Für den Schaltplan wurde das Tool<span> </span><a href="http://fritzing.org/home/" target="_blank" rel="noopener">Fritzing</a><span> </span>verwendet.)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Einbindung von Sensoren über WLAN mit ESP8266 unter Verwendung von ESPEasy</title>
		<link>https://www.smarthomeng.de/einbindung-von-sensoren-ueber-wlan-mit-esp8266-unter-verwendung-von-espeasy</link>
					<comments>https://www.smarthomeng.de/einbindung-von-sensoren-ueber-wlan-mit-esp8266-unter-verwendung-von-espeasy#comments</comments>
		
		<dc:creator><![CDATA[sisamiwe]]></dc:creator>
		<pubDate>Fri, 20 Apr 2018 14:27:55 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[DHT22]]></category>
		<category><![CDATA[ESP8266]]></category>
		<category><![CDATA[ESPEasy]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Webservices]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1471</guid>

					<description><![CDATA[Hallo, ich möchte Euch kurz vorstellen, wie man Sensoren schnell und einfach in shNG einbinden kann. Das Ganze basiert auf der Verwendung eines ESP8266 (bspw. Wemos D1 mini), der Firmware ESPEasy und des shNG Webservices-Plugins. Die Firmware ESPEasy bietet viele Konfigurationsmöglichkeiten, dies betrifft sowohl Sensoren also auch Kommunikationsschnittstellen. Teil 0: Allgemeine<a class="moretag" href="https://www.smarthomeng.de/einbindung-von-sensoren-ueber-wlan-mit-esp8266-unter-verwendung-von-espeasy"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Hallo,</p>
<p>ich möchte Euch kurz vorstellen, wie man Sensoren schnell und einfach in shNG einbinden kann. Das Ganze basiert auf der Verwendung eines ESP8266 (bspw. Wemos D1 mini), der Firmware ESPEasy und des shNG Webservices-Plugins.</p>
<p>Die Firmware ESPEasy bietet viele Konfigurationsmöglichkeiten, dies betrifft sowohl Sensoren also auch Kommunikationsschnittstellen.</p>
<p><span id="more-1471"></span></p>
<p><b>Teil 0: Allgemeine Informationen</b></p>
<ul>
<li>ESPEasy arbeitet auch im<span> </span><a href="https://github.com/letscontrolit/ESPEasy" target="_blank" rel="nofollow noopener">Github</a>.</li>
<li>Die Liste der unterstützten Sensoren gibt es <a href="https://letscontrolit.com/wiki/index.php/Devices">hier</a>.</li>
<li>Bei ESPEasy wird jede Nacht automatisch ein Release erzeugt. Diese sind<span> </span><a href="https://github.com/letscontrolit/ESPEasy/releases" target="_blank" rel="nofollow noopener">hier<span> </span></a>zu finden. Es gibt 2 Ausführungen der ESPEasy: A)<span> </span><a href="https://www.letscontrolit.com/wiki/index.php/ESPEasy" target="_blank" rel="nofollow noopener">Released<span> </span></a>aktuell in der Version 2.0 und B)<span> </span><a href="https://www.letscontrolit.com/wiki/index.php/ESPEasyMega" target="_blank" rel="nofollow noopener">Develop</a>. als mit mehr Plugins aber auch noch in der Testphase.</li>
</ul>
<p><b>Teil 1: Flashen der Firmware</b></p>
<ul>
<li>Download des letzten (Pre-)Releases der V2.0 von<span> </span><a href="https://github.com/letscontrolit/ESPEasy/releases" target="_blank" rel="nofollow noopener">hier<span> </span></a>als zip (heute wäre das<span> </span><a href="https://github.com/letscontrolit/ESPEasy/releases/download/v2.0-20180321/ESPEasy_v2.0-20180321.zip" target="_blank" rel="nofollow noopener">Release v2.0-20180321</a>)</li>
<li>Entpacken des ZIP. Darin sind diverse Binaries und das Flashtool selbst.<br />
Zu den Binaries: Hier gibt es 3 Ausbaustufen und das ganze für 2 SpeicherGrößen: normal &#8211; enthält nur die getesteten und freigegebenen Teile von ESPeasy; test &#8211; enthält zusätzlich noch die getesteten; dev &#8211; enthält zusätzlich noch die sich in Entwicklung befindlichen; Die Speichergrößen sind 1MB und 4MB. Der erwähnte WEMOS D1 mini hat 4MB Speicher.</li>
<li>Verbinde den ESP via USB mit einem Windows PC.</li>
<li>Firmware mit Hilfe des Flashtools auf dem ESP schreiben, dabei Serielle Schnittstelle (COM-Port) und das entsprechende Binary auswählen. Ich nutze immer die Dev-Version. Die COM Schnittstelle kann man auch über den Windows-Gerätemanager in Erfahrung bringen.<br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/5-300x155.jpg" alt="" class="alignnone wp-image-1485" width="688" height="355" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/5-300x155.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/5.jpg 766w" sizes="(max-width: 688px) 100vw, 688px" /><br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/6-300x155.jpg" alt="" class="alignnone wp-image-1486" width="437" height="226" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/6-300x155.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/6.jpg 404w" sizes="(max-width: 437px) 100vw, 437px" /></li>
<li>Neustart des ESP (Reset Taste).</li>
<li>Der ESP öffnet einen WLAN AccessPoint &#8222;ESP_Easy_0&#8220;; Passwort: configesp<br />
Wenn man nicht automatisch zur Anmeldeseite kommt, dann nach 192.168.4.1 browsen</li>
<li>In der Config seine eigenen WLAN-Daten eingeben und den ESP wieder neu starten. Nun sollte er sich in eigenen Netzwerk anmelden.<br />
(Über den Weg, das fertige Binary der Firmware zu flashen, muss man immer den Weg über den Hotspot zur Konfiguration und damit zu Einbindung in das eigene Netzwerk machen.)</li>
<li>Eine detaillierte Beschreibung ist<span> </span><a href="https://www.letscontrolit.com/wiki/index.php/Basics:_Connecting_and_flashing_the_ESP8266" target="_blank" rel="nofollow noopener">hier</a></li>
<li>Nun ist der ESP vorbereitet und kann konfiguriert werden</li>
</ul>
<p><b>Teil 2: Verbinden der Sensoren mit dem ESP8266 (Wemos D1 Mini)</b></p>
<ul>
<li>Der verwendetete Sensor DHT22 wird wie folgt mit dem Wemos D1 Mini verbunden:<br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/dht22.png" alt="" class="alignnone wp-image-1498" width="396" height="250" /><br />
Den verwendeten GPIO könnt ihr frei wählen. Er muss später in ESPEasy angegeben werden. Hier im Bild ist D0 (GPIO16) verwendet.</li>
</ul>
<p><b>Teil 3: Konfiguration in ESPEasy</b></p>
<ul>
<li>Mit dem Aufruf der IP des ESP kommt man zur Konfigurationsseite</li>
<li>Die Möglichkeiten der Konfiguration sind<span> </span><a href="https://www.letscontrolit.com/wiki/index.php/ESP_Easy_web_interface" target="_blank" rel="nofollow noopener">hier<span> </span></a>beschrieben.</li>
<li>Auf der Seite Devices muss der entsprechende Sensor konfiguriert werden. Dabei wird definiert, welcher Sensor an welchem Eingang angeschlossen wurde.<br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/1-768x141-1.jpg" alt="" class="alignnone size-full wp-image-1502" width="971" height="180" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/1-768x141-1.jpg 971w, https://www.smarthomeng.de/wp-content/uploads/2018/04/1-768x141-1-300x56.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/1-768x141-1-768x142.jpg 768w" sizes="(max-width: 971px) 100vw, 971px" /></li>
<li>In meinem Beispiel ist es ein DHT22 an GPIO16 (D0).<br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/2-1024x638.jpg" alt="" class="alignnone wp-image-1475 size-large" width="750" height="467" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/2-1024x638.jpg 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/04/2-300x187.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/2-768x478.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/2.jpg 1230w" sizes="(max-width: 750px) 100vw, 750px" /><br />
Im Beispiel sendet er seine Werte an den 3. definierten Controller mit einer Verzögerung von 30sec. Es werden 2 Werte übermittelt, Termperatur und Humidity, jeweils mit 1 Dezimalstelle.</li>
<li>Auf der Seite Controller wird die Schnittstelle konfiguriert.<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/3-1024x192.jpg" alt="" class="alignnone wp-image-1476 size-large" width="750" height="141" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/3-1024x192.jpg 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/04/3-300x56.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/3-768x144.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/3.jpg 1225w" sizes="(max-width: 750px) 100vw, 750px" /><br />
Im Beispiel sind 3 Controller (also Schnittstellen definiert), wobei nur die dritte aktiv ist.</li>
<li>Wir nutzen &#8222;Generic HTTP&#8220;, tragen als Controller IP die IP-Adresse von shNG ein und bei Controller Port den Port, den wir für das Webservices-Plugin nutzen.<br />
Bei Controller Publish setzen wir:<br />
<code>/shNG/ws/items/ESP_Easy.%sysname%.%tskname%.%valname%/%value%</code><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/4-1024x416.jpg" alt="" class="alignnone wp-image-1477 size-large" width="750" height="305" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/4-1024x416.jpg 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/04/4-300x122.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/4-768x312.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/4.jpg 1225w" sizes="(max-width: 750px) 100vw, 750px" /></li>
<li>Verwendet wird das einfachere &#8222;Simple Webservices&#8220; HTTP-Interface, bei dem der eigentliche Wert Teil der HTTP-Adresse ist (kein Payload).</li>
<li>Zur Erklärung von <code>/shNG/ws/items/ESP_Easy.%sysname%.%tskname%.%valname%/%value%:</code>
<ul>
<li><code>/shNG/</code>: wird von ESPEasy beim Versenden verschluckt und dient somit nur als &#8222;Futter&#8220;</li>
<li><code>/ws/items/</code>: Wird vom WebservicePlugin erwartet, um den Inhalt einem Item zuzuordnen</li>
<li><code>/ESP-Easy/</code>: verwende ich als &#8222;root&#8220; des Items, so dass alle folgenden Items Kinder von ESP-Easy sind.</li>
<li><code>%sysname%</code>: Name des ESP8266, definiert im Reiter &#8222;Config&#8220; unter &#8222;Unit Name&#8220;  (Im Beispiel: &#8222;Wemos_1&#8220;)</li>
<li><code>%tskname%</code>: Name des Sensors, definiert im Reiter &#8222;Devices&#8220; unter &#8222;Name&#8220; (Im Beispiel: &#8222;Umwelt&#8220;)</li>
<li><code>%valname%</code>: Name des Wertes des Sensors, definiert im Reiter &#8222;Devices&#8220; unter &#8222;Value&#8220; (Im Beispiel: &#8222;Temperature&#8220;)</li>
<li><code>%value%</code>: ist der eigentliche Wert<br />
Damit ergibt sich das Item: <code>ESP_Easy.Wemos_1.Umwelt.Temperature</code>. Der Wert selbst ist 17.36</li>
</ul>
</li>
</ul>
<p><b>Teil 4: Konfiguration shNG</b></p>
<ul>
<li>Damit wir in shNG auch etwas empfangen, muss das Webservices-Plugin aktiviert und konfiguriert werden. Man kann die Standardkonfiguration, wie in der <a href="https://www.smarthomeng.de/user/plugins/webservices/README.html">Anwenderdokumentation</a> beschrieben, verwenden, d.h. der Port ist 8384.</li>
<li>Dazu gibt es auch bereits einen <a href="https://www.smarthomeng.de/das-smarthomeng-webservices-plugin">Blog-Artikel</a>.</li>
<li>Nach der Aktivierung und Konfiguration des Plugins sowie einem Neustart müssten im Logfile bereits die Items und Werte sichtbar sein.<br />
Bspw.: <code>CP Server Thread-19 192.168.2.25 - - [18/Apr/2018:21:41:48] "GET /ws/items/ESP_Easy.Wemos_1.Umwelt.Humidity/64.0 HTTP/1.1" 200 80 "" ""</code></li>
<li>Nun noch die Items in einer yaml-Datei im Ordner<span> <code>/items/</code> </span>definieren: (Beispiel: ESP-Easy.Wemos_1.Umwelt.Temperatur) und shNG neu starten.
<pre><code class="language-yaml">
ESP_Easy:
    Wemos_1:
        Umwelt:
            Temperature:
                type: num 
            Humidity:
                type: num
</code></pre>
</li>
<li>Nun müssten über das &#8222;Simple Webservices&#8220; HTTP-Interface des Webservices-Plugins den Items die Werte zugwiesen werden.</li>
</ul>
<p>Viel Spaß beim Anwenden!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/einbindung-von-sensoren-ueber-wlan-mit-esp8266-unter-verwendung-von-espeasy/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Entfernungsmessung auf Basis eines ESP32 und SmartHomeNG</title>
		<link>https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng</link>
					<comments>https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng#comments</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Tue, 03 Apr 2018 17:01:26 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Entfernungsmessung]]></category>
		<category><![CDATA[ESP32]]></category>
		<category><![CDATA[HC-SR04]]></category>
		<category><![CDATA[Internet of Things]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Ultraschall]]></category>
		<category><![CDATA[Webservices]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1198</guid>

					<description><![CDATA[ESP32 Mikrocontroller stellen eine günstige, relativ performante, WLAN- und Bluetooth-fähige Basis für Internet of Things (IoT) &#8211; Implementierungen bereit. Sie lassen sich zudem relativ einfach mit SmartHomeNG nutzen. Das hier vorgestellte Beispiel, das u.a. für die Überwachung des Füllstands einer Zisterne verwendet werden kann, ist auf Basis eines Espressif ESP32<a class="moretag" href="https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>ESP32 Mikrocontroller stellen eine günstige, relativ performante, WLAN- und Bluetooth-fähige Basis für Internet of Things (IoT) &#8211; Implementierungen bereit. Sie lassen sich zudem relativ einfach mit SmartHomeNG nutzen.</p>
<p>Das hier vorgestellte Beispiel, das u.a. für die Überwachung des Füllstands einer Zisterne verwendet werden kann, ist auf Basis eines <a href="https://www.espressif.com/en/products/hardware/esp32/overview" target="_blank" rel="noopener">Espressif ESP32</a> entwickelt worden, der zum Zeitpunkt dieses Artikels für ca. 15 Euro zu haben ist. Dazu wird für die Entfernungsmessung ein <a href="http://www.mikrocontroller-elektronik.de/ultraschallsensor-hc-sr04/" target="_blank" rel="noopener">HC-SR04 Ultraschallsensor</a> verwendet, der für knapp 2 Euro erhältlich ist.</p>
<p>Die Daten werden dabei an ein Item übermittelt, das via Webservices-Plugin erreichbar ist. Mehr zu diesem Plugin ist unter <a href="https://www.smarthomeng.de/das-smarthomeng-webservices-plugin" target="_blank" rel="noopener">https://www.smarthomeng.de/das-smarthomeng-webservices-plugin</a> zu finden. Die korrekte Konfiguration des Items wird in diesem Artikel als Voraussetzung angenommen.</p>
<p><strong>Update:</strong> Inzwischen ist der zweite Teil zum Thema erschienen, bei dem ich erläutere, wie man die Entfernungsdaten auf ein OLED Display bringt. Direkteinstieg unter <a href="https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays" target="_blank" rel="noopener">Entfernungsmessung mit ESP32 und SmartHomeNG Teil 2: Anbindung eines SSD1306 OLED Displays</a>.</p>
<h1>Installation des Espressif ESP32 unter Windows</h1>
<p>Als erstes muss der ESP32 als USB Gerät erkannt werden. Dazu kann die Anleitung unter <a href="https://dl.espressif.com/doc/esp-idf/latest/get-started/establish-serial-connection.html" target="_blank" rel="noopener">https://dl.espressif.com/doc/esp-idf/latest/get-started/establish-serial-connection.html</a> befolgt werden. Eine alternative Anleitung für MacOS und Linux ist dort ebenfalls zu finden.</p>
<p>Zusammengefasst muss der Treiber für das ESP32 Core Board von <a href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" target="_blank" rel="noopener">https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers</a> installiert werden. Danach sollte das Gerät als COM3 auftauchen, wie in untenstehendem Bild zu sehen ist. In meinen Tests klappte dies nicht mit jedem Micro-USB-Kabel. Daher sind ggf. Kabel durchzuprobieren.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/system_esp32.png" alt="" class="alignnone size-full wp-image-1201" width="644" height="348" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/system_esp32.png 644w, https://www.smarthomeng.de/wp-content/uploads/2018/04/system_esp32-300x162.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></p>
<h1>Einrichtung der Arduino IDE</h1>
<p>Als nächstes muss die Arduino IDE installiert werden. Diese kann kostenlos über <a href="https://www.arduino.cc/en/main/software" target="_blank" rel="noopener">https://www.arduino.cc/en/main/software</a> oder bei Windows 10 den <a href="https://www.microsoft.com/de-de/store/p/arduino-ide/9nblggh4rsd8">Microsoft Store</a> bezogen werden.</p>
<p>Über &#8222;Werkzeuge&#8220; → &#8222;Board&#8220; muss dort nun das &#8222;ESP32 Dev Module&#8220; ausgewählt werden. Die weiteren Einstellungen sind ebenfalls im folgenden Bild zu sehen:</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_board.png" alt="" class="alignnone size-full wp-image-1202" width="1320" height="1276" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_board.png 1320w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_board-300x290.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_board-768x742.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_board-1024x990.png 1024w" sizes="(max-width: 1320px) 100vw, 1320px" /></p>
<p>Wird rechts unten noch ein &#8222;None auf COM3&#8220; angezeigt, so ist das nicht weiter dramatisch, sofern der ESP32 bereits im Geräte-Manager auf COM3 sichtbar ist.</p>
<h1>Versuchsaufbau: Espressif ESP32 mit HC-SR04 Ultraschallsensor</h1>
<p>Die Funktionsweise des <a href="http://www.mikrocontroller-elektronik.de/ultraschallsensor-hc-sr04/" target="_blank" rel="noopener">HC-SR04 Ultraschallsensors</a> ist schnell erklärt:</p>
<p>Der HC-SR04 hat einen Lautsprecher und ein Mikrofon verbaut. Über den Lautsprecher wird ein Ultraschall-Ton ausgegeben. Dieser wird von einem Objekt reflektiert und über das direkt neben dem Lautsprecher platzierte Mikrofon erfasst. Die Zeitdauer zwischen dem Senden des Signals und dem Empfang des Echos wird gemessen. Über die Schallgeschwindigkeit von 343,2 m/s bei 20° Celsius kann nun die Distanz zu demjenigen Objekt berechnet werden, an dem das Signal relektiert wird.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/HC-SR04.png" alt="" class="alignnone size-full wp-image-1284" width="300" height="330" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/HC-SR04.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/HC-SR04-273x300.png 273w" sizes="(max-width: 300px) 100vw, 300px" /><br />
Da der Sensor in Mikrosekunden misst, muss zur Bestimmung der Distanz der gemessene Wert erst halbiert (einfache Strecke) und dann mit 0,03432 multipliziert bzw. grob überschlagen durch 29.1 geteilt werden (1/29.1 = 0,03436).</p>
<p>Für den Versuchsaufbau muss der HC-SR04 an den ESP angeschlossen werden. Der HC-SR04 besitzt dabei die Anschlüsse &#8222;Gnd&#8220;, &#8222;Echo&#8220;, &#8222;Trig&#8220; und &#8222;Vcc&#8220;.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0706.jpg" alt="" class="alignnone size-full wp-image-1219" width="2284" height="1320" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0706.jpg 2284w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0706-300x173.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0706-768x444.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0706-1024x592.jpg 1024w" sizes="(max-width: 2284px) 100vw, 2284px" /></p>
<p>&#8222;Gnd&#8220; wird am ESP ebenfalls an &#8222;Gnd&#8220; angeschlossen. &#8222;Vcc&#8220; kommt an den &#8222;5V&#8220; Anschluss für die Stromversorgung. &#8222;Echo&#8220; und &#8222;Trig&#8220; werden an die jeweiligen GPIOs angeschlossen. Im Beispiel wird &#8222;Echo&#8220; auf &#8222;IO4&#8220; und &#8222;Trig&#8220; auf &#8222;IO15&#8220; gelegt. Diese sind später im Programmcode zu referenzieren.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/ESP32_GPIO.png" alt="" class="alignnone size-full wp-image-1273" width="1362" height="813" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/ESP32_GPIO.png 1362w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ESP32_GPIO-300x179.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ESP32_GPIO-768x458.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ESP32_GPIO-1024x611.png 1024w" sizes="(max-width: 1362px) 100vw, 1362px" /></p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/ultraschall_Steckplatine.png" alt="" class="alignnone size-full wp-image-1309" width="1755" height="1239" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/ultraschall_Steckplatine.png 1755w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ultraschall_Steckplatine-300x212.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ultraschall_Steckplatine-768x542.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/ultraschall_Steckplatine-1024x723.png 1024w" sizes="(max-width: 1755px) 100vw, 1755px" /><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0704.jpg" alt="" class="alignnone size-full wp-image-1218" width="2904" height="2740" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0704.jpg 2904w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0704-300x283.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0704-768x725.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0704-1024x966.jpg 1024w" sizes="(max-width: 2904px) 100vw, 2904px" /></p>
<h1>Programmierung des ESP32 via Arduino IDE und C-Code</h1>
<p>Als letztes ist nun der ESP32 via Arduino IDE zu programmieren.</p>
<p>Als Bibliotheken werden via &#8222;Sketch&#8220; → &#8222;Bibliothek einbinden&#8220; → &#8222;Bibliotheken verwalten&#8220; die &#8222;WiFi&#8220; Bibliothek (1.2.7) und die &#8222;Wire&#8220; Bibliothek (1.0.0) installiert. Erstere ist für den WiFi-Zugriff, zweitere für den Zugriff auf die GPIO&#8217;s.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/arduino_libs.png" alt="" class="alignnone size-full wp-image-1263" width="1993" height="847" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/arduino_libs.png 1993w, https://www.smarthomeng.de/wp-content/uploads/2018/04/arduino_libs-300x127.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/arduino_libs-768x326.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/arduino_libs-1024x435.png 1024w" sizes="(max-width: 1993px) 100vw, 1993px" /></p>
<p>Als Nächstes ist der Quellcode zu erstellen. Dabei sind im Wesentlichen die PINs für den Trigger (&#8222;Trig&#8220; → <code>triggerPin</code>) und den Echo-Anschluss (&#8222;Echo&#8220; → <code>echoPin</code>) des HC-SR04 Ultraschallsensors, die WiFi-SSID (<code>ssid[]</code>), das WiFi-Passwort (<code>pass[]</code>), die IP von SmartHomeNG (<code>host[]</code>) und der Port des Webservices Interfaces in SmartHomeNG (<code>port</code>) zu setzen. Weiterhin ist der Itempfad desjenigen Items zu setzen, dass die Entfernung in Zentimeter aufnehmen soll (<code>cm_item[]</code>). Im Beispiel hat dieses Item den Pfad <code>test.numeric</code>.</p>
<p>Das zugehörige Item ist bei aktiviertem Webservices-Plugin wie folgt konfiguriert:</p>
<pre><code class="language-yaml">
%YAML 1.1
---
test:

    numeric:
        type: num
        visu_acl: rw
        webservices_set: outside
        webservices_data: 'val'
</code></pre>
<p>Die Initialisierung der WiFi-Verbindung wird in der Methode <code>setup</code> aufgerufen. Des Weiteren werden dort die Input- und Output GPIO PINs gesetzt.</p>
<p>Die Methode <code>initialise_wifi</code> sorgt dafür, dass die WiFi Verbindung aufgebaut wird. Am Ende der Methode werden via <code>print_wifi_status</code> die Daten der Verbindung ausgegeben:</p>
<pre>Attempting to connect to SSID: 
&lt;wifi-name&gt;
Connected to wifi
SSID: &lt;wifi-name&gt;
IP Address: 192.168.178.23
signal strength (RSSI):-77 dBm
</pre>
<pre data-line="8-9, 12, 15-19, 34-35, 65, 69-76, 78, 82, 91-93" class="line-numbers"><code class="language-c">
#include &lt;WiFi.h&gt;
#include &lt;WiFiClient.h&gt;
#include &lt;WiFiServer.h&gt;
#include &lt;WiFiUdp.h&gt;
#include &lt;Wire.h&gt;

// PINs
const int triggerPin = 15;
const int echoPin = 4;

// VARs
const int runs = 3;

// Wifi
char ssid[] = "&lt;wlan_id&gt;";          // your network SSID (name)
char pass[] = "&lt;wlan_password&gt;";    // your network password
char host[] = "192.168.178.100";    // ip of service interface in SmartHomeNG
int port = 4321;                    // port of service interface in SmartHomeNG
char cm_item[] = "test.numeric";
int status = WL_IDLE_STATUS;
WiFiClient client;

void setup() {
  Serial.begin(19200);
  initialise_wifi();
 
  // PIN-Modes
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(triggerPin, HIGH);
}

void loop() {
  float distance = get_distance();
  float avg_distance = get_distance_avg();
 
  Serial.write("distance: ");
  Serial.print(distance) ;
  Serial.write(" , avg. distance: ");
  Serial.print(avg_distance) ;
  Serial.write(" cm\n");
 
  Serial.println("\nStarting connection to server...");
  // Wenn die Verbindung möglich ist, Verbindungsdaten an Serial zurückgeben.
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  if (client.connect(host, port)) {
    Serial.println("\nconnected to server");
    // HTTP Request gegen SmartHomeNG / das Webservices-Plugin durchführen
    char buffer[64];
    int ret = snprintf(buffer, sizeof buffer, "GET /ws/items/%s/%f HTTP/1.1", cm_item, avg_distance);
    Serial.println(buffer);
    client.println(buffer);
    client.println("Host: ");
    client.println();
  } 
  Serial.print("\n");
  // 1 Sekunde Warten
  delay(1000);
}

float get_distance() {
  float duration=0;
  float distance=0;
 
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2); 
  noInterrupts();
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW); 
  duration = pulseIn(echoPin, HIGH); // Erfassung - Dauer in Mikrosekunden 
  interrupts();

  distance = (duration / 2) / 29.1; // Distanz in CM
  return(distance);
}

float get_distance_avg() {
  float alt = 0;
  float avg;
  float dist;
  int i;

  delay(10);
  alt = get_distance();
  delay(10);
  for (i=0; i&lt;runs; i++) {
    dist = get_distance();
    avg = (0.8*alt) + (0.2*dist);
    alt = avg;
    delay(10);
  }
  return (avg);
}

static void initialise_wifi(void)
{
  // Versuche ins WiFi Netzwerk zu verbinden
  while (status != WL_CONNECTED) {
    Serial.println("");
    Serial.println("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Ins WPA/WPA2 Netzwerk verbinden. 
    status = WiFi.begin(ssid, pass);
    // 10 Sekunden auf die Verbindung warten:
    delay(10000); 
  }
  Serial.println("Connected to wifi");
  print_wifi_status();
}

void print_wifi_status() {
  // SSID des WiFi Netzwerkes ausgeben:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID()); 

  // WiFi IP Adresse des ESP32 ausgeben:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // WiFi Signalstärke ausgeben:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
</code></pre>
<p>In der Methode <code>loop</code> findet nun die konkrete Ermittlung des Abstands statt. In der dort aufgerufenen Methode <code>get_distance_avg()</code> werden mehrere Messungen (<code>runs</code>) durchgeführt, um Messfehler zu minimieren. <code>get_distance()</code> wird zum Vergleich ebenfalls einzeln aufgerufen.</p>
<p>In jedem <code>run</code> wird in der Methode <code>get_distance_avg()</code> nun ebenfalls <code>get_distance()</code> aufgerufen. Dort findet der technische Teil des Messung statt: Zuerst wird der Trigger auf LOW gesetzt: <code>digitalWrite(triggerPin, LOW);</code>. Danach wird 2 Mikrosekunden gewartet und der Trigger auf HIGH gesetzt (<code>digitalWrite(triggerPin, HIGH);</code>). Nach erneutem Warten von 10 Mikrosekunden (erst nach dieser Zeit sendet der Sensor Ultraschallwellen) wird der Trigger wieder auf LOW gesetzt (<code>digitalWrite(triggerPin, LOW);</code>) und via <code>duration = pulseIn(echoPin, HIGH);</code> die Dauer zwischen Puls und Empfang des Echos gemessen. Während der Zeitmessung sollten Interrupts zudem abgeschaltet werden (<code>noInterrupts();</code>).<br />
Zuletzt wird die Entfernung in Zentimetern, wie oben bereits erklärt, mit <code>distance = (duration / 2) / 29.1;</code> berechnet und zurückgegeben.</p>
<p>In <code>get_distance_avg()</code> wird dies nun mehrfach wiederholt und ein gleitender gewichteter Durchschnittswert (<code>avg = (0.8*alt) + (0.2*dist);</code>) gebildet. Werden dort trotzdem noch starke Abweichungen festgestellt, können bspw. die Anzahl der <code>runs</code> erhöht oder die Gewichtung verändert werden.</p>
<p>Das Ergebnis von <code>get_distance_avg()</code> wird dann via HTTP Get Request an das Webservices-Plugin (Simple Interface) und das konfigurierte Item übertragen. Auch diese Vorgänge werden im Code ausgegeben:</p>
<pre>distance: 17.41 , avg. distance: 17.42 cm

Starting connection to server...
HTTP/1.1 200 OK
Content-Length: 65
Server: CherryPy/14.0.1
Content-Type: application/json
Date: Tue, 03 Apr 2018 19:31:48 GMT

{"Success": "Item with item path test.numeric set to 17.419243."}
connected to server
GET /ws/items/test.numeric/17.419930 HTTP/1.1</pre>
<p>Wir das REST-Interface des Webservices-Plugins verwendet, so sieht der Codeblock zum Senden der Daten wie folgt aus:</p>
<pre><code class="language-c">#include &lt;HTTPClient.h&gt;<httpclient.h>
[...]
if (client.connect(host, port)) {
     HTTPClient http;    //Declare object of class HTTPClient
     char portStr[12];
     sprintf(portStr, "%d", port);
     char url[128];
     sprintf(url, "http://%s:%s/rest/items/%s", host, portStr, cm_item);
     http.begin(url);  //Specify request destination
     Serial.println(url);
     http.addHeader("Content-Type", "application/json");                //Specify content-type header
     char cmStr[12];
     sprintf(cmStr, "%f", cm);
     int httpCode = http.PUT(cmStr);                                    //Send the request
     String payload = http.getString();                                 //Get the response payload
     http.end();                                                        //Close connection
} 
</httpclient.h></code></pre>
<h1>Erster Programmstart und Test</h1>
<p>Ist der ESP32 via USB verbunden, so kann das Programm über das &#8222;Haken&#8220;-Icon links oben auf Syntaxfehler geprüft und kompiliert und mittels des &#8222;Pfeil&#8220;-Icons daneben auf den ESP32 übertragen werden.</p>
<p>Gleichzeitig sollte vor einer Übertragung (und damit dem Programmstart) über &#8222;Werkzeuge&#8220; → &#8222;Serieller Monitor&#8220; der Monitor für die Testausgaben geöffnet werden.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_debug.png" alt="" class="alignnone size-full wp-image-1223" width="1184" height="862" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_debug.png 1184w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_debug-300x218.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_debug-768x559.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/esp32_debug-1024x746.png 1024w" sizes="(max-width: 1184px) 100vw, 1184px" /></p>
<p><strong>Tipp:</strong> Plausible Distanzen kommen nur heraus, wenn der Sensor etwas erhöht, bspw. auf einer Kaffeetasse platziert wird. Anstonsten stören Reflektionen am Boden die Messwerte. Bei der Messung sollte daher generell beachtet werden, dass sich das Ultraschallsignal kegelförmig ausbreitet. Auf große Distanzen (&gt; 1m) muss der Sensor so genau wie möglich auf das Zielobjekt ausgerichtet werden. Man sollte zudem Acht geben, dass das emittierte Signal auf einer möglichst parallelen Fläche reflektiert wird. Als Oberfläche für den Abprall der Impulse kann testweise bspw. ein Buch platziert werden. Die im Beispiel gemessenen 12,6 cm sind dabei bis auf ca. 5 mm genau.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0707.jpg" alt="" class="alignnone size-full wp-image-1224" width="3420" height="2616" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0707.jpg 3420w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0707-300x229.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0707-768x587.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0707-1024x783.jpg 1024w" sizes="(max-width: 3420px) 100vw, 3420px" /></p>
<h1>Fazit</h1>
<p>Mit dem ESP32 und einem HC-SR04 lässt sich für unter 20 Euro eine relativ genaue Abstandsmessung implementieren, die sehr simpel via WLAN an SmartHomeNG Daten sendet. Als Anwendungsfall wird die Installation im Sommer in meiner Zisterne installiert werden. Dazu folgt ein separater Bericht in diesem Blog.</p>
<p>Als Gehäuse für den HC-SR04 dient eine Vorlage von <a href="https://www.thingiverse.com/thing:1708627" target="_blank" rel="noopener">Thingiverse</a>, die mittels 3D Drucker &#8222;gedruckt&#8220; wurde:<br />
<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0708.jpg" alt="" class="alignnone wp-image-1226" width="376" height="258" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0708.jpg 1880w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0708-300x206.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0708-768x528.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/04/IMAG0708-1024x704.jpg 1024w" sizes="(max-width: 376px) 100vw, 376px" /></p>
<p>Aber auch andere Sensoren lassen sich auf ähnliche Art und Weise kostengünstig und schnell verbauen und mit SmartHomeNG verbinden.</p>
<p>Für weniger versierte Programmierer bietet sich hier <a href="https://www.letscontrolit.com/wiki/index.php/ESPEasy" target="_blank" rel="noopener">ESPEasy</a> an, das Thema eines <a href="https://www.smarthomeng.de/einbindung-von-sensoren-ueber-wlan-mit-esp8266-unter-verwendung-von-espeasy" target="_blank" rel="noopener">anderen Artikels</a> ist.</p>
<p>Im zweiten Teil zum Thema wird erläutert, wie man die Entfernungsdaten auf ein OLED Display bringt. Direkteinstieg unter <a href="https://www.smarthomeng.de/entfernungsmessung-mit-esp32-und-smarthomeng-teil-2-anbindung-eines-ssd1306-oled-displays" target="_blank" rel="noopener">Entfernungsmessung mit ESP32 und SmartHomeNG Teil 2: Anbindung eines SSD1306 OLED Displays</a>.</p>
<p><em>(Die in diesem Artikel verwendeten Screenshots und Fotos wurden selber erstellt. Für den Schaltplan wurde das Tool <a href="http://fritzing.org/home/" target="_blank" rel="noopener">Fritzing</a> verwendet.)</em></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/entfernungsmessung-auf-basis-eines-esp32-und-smarthomeng/feed</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>SmartHomeNG on a Watch &#8211; Anbindung des Garmin ConnectIQ SSK an SmartHomeNG</title>
		<link>https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng</link>
					<comments>https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng#comments</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Sun, 25 Mar 2018 09:18:19 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[ConnectIQ]]></category>
		<category><![CDATA[Garmin]]></category>
		<category><![CDATA[Mobile Device]]></category>
		<category><![CDATA[Monkey C]]></category>
		<category><![CDATA[Proof of Concept]]></category>
		<category><![CDATA[SmartWatch]]></category>
		<category><![CDATA[Watch]]></category>
		<category><![CDATA[Webservices]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=364</guid>

					<description><![CDATA[Moderne Sportuhren der Firma Garmin sind mehr als nur ein Aufzeichnungsgerät für Laufstrecken. Neben vielzähligen Sensorwerten lässt sich auch mit überschaubarem Aufwand eine Anbindung an SmartHomeNG erreichen, so dass bspw. Temperaturwerte auf der Uhr dargestellt werden. Dieser Artikel beschreibt, wie man Itemwerte von SmartHomeNG als ConnectIQ App auf Garmin Sportuhren<a class="moretag" href="https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Moderne Sportuhren der Firma Garmin sind mehr als nur ein Aufzeichnungsgerät für Laufstrecken. Neben vielzähligen Sensorwerten lässt sich auch mit überschaubarem Aufwand eine Anbindung an SmartHomeNG erreichen, so dass bspw. Temperaturwerte auf der Uhr dargestellt werden.</p>
<p>Dieser Artikel beschreibt, wie man Itemwerte von SmartHomeNG als ConnectIQ App auf Garmin Sportuhren bringt. Das Beispiel wurde dazu auf einer Garmin Fenix<sup>®</sup> 5 erstellt und erprobt.</p>
<p>Weiterführend wäre auf die gleiche Art und Weise auch eine Steuerung von Hausfunktionen (bspw. Tor öffnen, wenn man vom Laufen zurück kommt) denkbar.</p>
<p>Die ConnectIQ App bedient sich dabei technisch der Garmin Connect App am Handy, um Anfragen auf Webservices von SmartHomeNG zu richten. Getestet wurde dies mit der <a href="https://play.google.com/store/apps/details?id=com.garmin.android.apps.connectmobile&amp;hl=de" target="_blank" rel="noopener">Android Version</a> dieser App.</p>
<h1>Einrichten der Entwicklungsumgebung:</h1>
<p>Als erstes muss die Entwicklungsumgebung aufgesetzt werden. Verwendet wird dabei die Software <a href="http://www.eclipse.org/downloads/" target="_blank" rel="noopener">Eclipse</a>, die im Bereich der Java Entwicklung sehr populär ist. Zum Stand dieses Artikel liegt sie in der Version Oxygen.3 Release (4.7.3) vor.</p>
<p>Nach erfolgter Installation, muss der ConnectIQ SDK von Garmin heruntergeladen und eingerichtet werden. Detaillierte Informationen dazu finden sich unter <a href="https://developer.garmin.com/connect-iq/programmers-guide/getting-started/" target="_blank" rel="noopener">https://developer.garmin.com/connect-iq/programmers-guide/getting-started/</a> bzw. <a href="https://developer.garmin.com/connect-iq/sdk/" target="_blank" rel="noopener">https://developer.garmin.com/connect-iq/sdk/</a>.</p>
<p>Die Installation in Eclipse geht dabei gemäß dem ersten Link wie folgt:</p>
<p>Zuerst muss das Eclipse Plugin installiert werden:</p>
<ol>
<li> Im installierten Eclipse auf das &#8222;Help&#8220; Menü klicken.</li>
<li>Dort &#8222;Install New Software&#8230;&#8220; auswählen und den Knopf &#8222;Add&#8230;&#8220; drücken.</li>
<li>Im nun folgenden Dialog die URL &#8222;<code>https://developer.garmin.com/downloads/connect-iq/eclipse/</code>&#8220; als Name und Location eintragen (siehe Screenshot) und mit &#8222;OK&#8220; bestätigen.<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/add_software.png" alt="" class="alignnone size-full wp-image-426" width="1275" height="942" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/add_software.png 1275w, https://www.smarthomeng.de/wp-content/uploads/2018/03/add_software-300x222.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/add_software-768x567.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/add_software-1024x757.png 1024w" sizes="(max-width: 1275px) 100vw, 1275px" /></li>
<li>Im nun folgenden Fenster die Checkbox direkt neben &#8222;Connect IQ&#8220; anhaken und auf &#8222;Next&#8220; klicken.</li>
<li>Den Lizenzbedingungen zustimmen und &#8222;Finish&#8220; anklicken<em>.</em></li>
<li>Eclipse neu starten</li>
</ol>
<p>Als nächstes muss das SDK heruntergeladen werden.</p>
<ol>
<li>Auf das nun sichtbare Menüitem &#8222;Connect IQ&#8220; klicken und &#8222;Open SDK Manager auswählen.</li>
<li>Dort nun das Ziel-Verzeichnis eintragen und beim jeweiligen SDK (idealerweise der aktuellste) den Knopf &#8222;Download&#8220; bestätigen. Dabei müssen ebenfalls die Lizenzbedingungen bestätigt werden.<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/sdk-download-1.png" alt="" class="alignnone size-full wp-image-368" width="1114" height="806" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/sdk-download-1.png 1114w, https://www.smarthomeng.de/wp-content/uploads/2018/03/sdk-download-1-300x217.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/sdk-download-1-768x556.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/sdk-download-1-1024x741.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" /></li>
<li>Sobald der Download erfolgt ist, &#8222;Yes&#8220; anklicken um die SDK Version als aktiven SDK zu verwenden. Im Nachhinein kann die SDK Version aber auch noch gewechselt werden. Im Beispiel wurde der aktuellste SDK (2.4.4) gewählt.</li>
<li>Ist dies erfolgt, kann der SDK Manager geschlossen werden.</li>
</ol>
<h1>Projekt erstellen</h1>
<p>Als nächstes muss über &#8222;File&#8220; -&gt; &#8222;New&#8220; -&gt; &#8222;Connect IQ Project&#8220; ein neues Projekt erstellt werden.</p>
<p>Diesem gibt man dann einen Namen, bspw. &#8222;SmartHomeNG_on_a_Watch&#8220; und bestätigt mit &#8222;Next&#8220;. Nun kann man den Project Type (hier: &#8222;Watch App&#8220;, die Version der App (hier: 0.0.0) und die minimale SDK Version setzen (hier: 2.4.x). Nach dem Bestätigen mit &#8222;Next&#8220; wählt man &#8222;Simple&#8220; als Template aus und bestätigt erneut.</p>
<p>Nun kommt die Wahl der unterstützten Geräte. Hier wird im Beispiel &#8222;Fenix<sup>®</sup> 5 / quatix<sup>®</sup> 5&#8243; selektiert.</p>
<p>Bevor man &#8222;Finish&#8220; klick sollte man noch über &#8222;Next&#8220; die Sprache wählen. Im Beispiel wird hier &#8222;English (eng)&#8220; selektiert.</p>
<p>Mit &#8222;Finish&#8220; wird nun das Projekt angelegt und taucht nun links im Project Explorer auf:</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/project_1-1.png" alt="" class="alignnone size-full wp-image-371" width="1191" height="820" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/project_1-1.png 1191w, https://www.smarthomeng.de/wp-content/uploads/2018/03/project_1-1-300x207.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/project_1-1-768x529.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/project_1-1-1024x705.png 1024w" sizes="(max-width: 1191px) 100vw, 1191px" /></p>
<h1>Das Programm ausführen</h1>
<p>Nun muss über Run -&gt; Run Configuration das Projekt für die Ausführung konfiguriert werden.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/run_configurations.png" alt="" class="alignnone size-full wp-image-372" width="1199" height="823" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/run_configurations.png 1199w, https://www.smarthomeng.de/wp-content/uploads/2018/03/run_configurations-300x206.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/run_configurations-768x527.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/run_configurations-1024x703.png 1024w" sizes="(max-width: 1199px) 100vw, 1199px" /></p>
<p>Dazu ist wie oben zu sehen ein aussagekräftiger Name zu wählen (&#8222;Fenix5 Configuration&#8220;). Die Projektzuordnung, das Target Device und die Target SDK Version sollten bereits stimmen. Mittels &#8222;Apply&#8220; werden die Einstellungen gespeichert. Danach via &#8222;Close&#8220; verlassen.</p>
<p>Nun muss noch der Simulator gestartet werden, entweder über das neue Icon in der oberen Iconleiste oder via &#8222;Connect IQ&#8220; -&gt; &#8222;Start Simulator&#8220;. Der Simulator startet als separates Fenster:<img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/simulator_1.png" alt="" class="alignnone size-full wp-image-373" width="1558" height="824" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/simulator_1.png 1558w, https://www.smarthomeng.de/wp-content/uploads/2018/03/simulator_1-300x159.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/simulator_1-768x406.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/simulator_1-1024x542.png 1024w" sizes="(max-width: 1558px) 100vw, 1558px" /></p>
<p>Über das bekannte Menü Run -&gt; Run Configuration kann nun die Fenix5 Configuration gewählt und mittels &#8222;Run&#8220; die Applikation gestartet werden.</p>
<p>Nach dem erfolgreichen Build ist nun die Dummy App auf dem Simulator zu sehen:</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/first_run-1.png" alt="" class="alignnone size-full wp-image-378" width="1527" height="807" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/first_run-1.png 1527w, https://www.smarthomeng.de/wp-content/uploads/2018/03/first_run-1-300x159.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/first_run-1-768x406.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/first_run-1-1024x541.png 1024w" sizes="(max-width: 1527px) 100vw, 1527px" /></p>
<h1>Anbindung von SmartHomeNG</h1>
<p>Um SmartHomeNG anzubinden, ist nun folgendes zu tun:</p>
<p>Zuerst sind die anzuzeigenden Items in SmartHomeNG über das Webservices Plugin als Itemset zu definieren. Hier wurde als Setname &#8222;1&#8220; gewählt. Details zum Webservices Plugin finden sich in diesem Artikel: <a href="https://www.smarthomeng.de/das-smarthomeng-webservices-plugin" target="_blank" rel="noopener">https://www.smarthomeng.de/das-smarthomeng-webservices-plugin</a>.</p>
<p>In diesem Set ist bspw. das Item <code>eta_pu.temperature_outside.value</code>. Um Übertragungszeit zu sparen, wurde hier <code>val</code> gesetzt:</p>
<pre data-line="10-11"><code class="language-yaml">
eta_pu:
    temperature_outside:
        eta_pu_uri: '40/10241/0/0/12197'
        type: num

        value:
            eta_pu_type: calc
            type: num
            database@mysqldb: init
            webservices_set: 1
            webservices_data: 'val'
</code></pre>
<p>Nach einen Restart von SmartHomeNG sollte das Set wie in <a href="https://www.smarthomeng.de/das-smarthomeng-webservices-plugin" target="_blank" rel="noopener">https://www.smarthomeng.de/das-smarthomeng-webservices-plugin</a> erklärt, verfügbar sein.</p>
<p>Da ConnectIQ über die Garmin Connect App nur Requests gegen Internet Endpunkte machen kann, wurde ein SmartHomeNG vorgeschalteter NGINX wie folgt angepasst.</p>
<p><strong>Tipp:</strong> Grundlegende Informationen zur Nutzung von NGINX als Reverse Proxy für SmartHomeNG und die smartVISU können unter <a href="https://www.smarthomeng.de/nginx-als-reverseproxy" target="_blank" rel="noopener">https://www.smarthomeng.de/nginx-als-reverseproxy</a> gefunden werden!</p>
<p>In der <code>/etc/nginx/.shng</code> sind dabei mit <code>htpasswd</code> ein Username und ein Passwort generiert worden. So steht der Endpunkt geschützt im Internet. Diese Daten müssen später in der ConnectIQ App eingetragen werden.</p>
<pre><code class="language-nginx">location /rest {
        auth_basic "Restricted Area: SmartHomeNG";
        auth_basic_user_file /etc/nginx/.shng;

        proxy_pass http://192.168.178.100:4321/rest;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
</code></pre>
<h1>Anpassung des ConnectIQ Programms</h1>
<p>Auf Site des zuvor angelegten ConnectIQ Programms müssen nun folgende Anpassungen gemacht werden.</p>
<h2>Berechtigung für Webservice Aufrufe setzen</h2>
<p>Damit die App berechtigt ist, Webservices aufzurufen, muss zuerst das Manifest File unter <code>/manifest.xml</code> editiert werden. Eclipse bietet dazu mit dem ConnectIQ Plugin einen Editor an. Ist die Datei geöffnet, so findet sich der entsprechende Menüpunkt im Reiter &#8222;Permissions&#8220; etwa in der Mitte des Fensters. Dort ist &#8222;Communications&#8220; anzuklicken und danach die Datei zu speichern.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/permissions.png" alt="" class="alignnone size-full wp-image-389" width="1268" height="960" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/permissions.png 1268w, https://www.smarthomeng.de/wp-content/uploads/2018/03/permissions-300x227.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/permissions-768x581.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/permissions-1024x775.png 1024w" sizes="(max-width: 1268px) 100vw, 1268px" /></p>
<h2>SmartHomeNG_on_a_WatchApp.mc</h2>
<p>Zuerst wird eine Konstante für den Internet Endpunkt angelegt, über den das Itemset erreichbar ist. In der Methode <code>getInitialView</code> wird ein &#8222;Loading&#8220; Text ergänzt.<br />
Der Zugriff gegen den REST Webservice wird in der Methode <code>makeRequest</code> gekapselt, die in der Methode <code>onStart</code> beim Start aufgerufen wird. <code>makeRequest</code> bekommt am ende <code>onReceive</code> als Callback mitgegeben. Hier findet das Parsen der JSON Antwort statt, welche danach an ein neues View übergeben wird. Der View schaltet direkt um (<code>Ui.SLIDE_IMMEDIATE</code>), so dass der Loading-Screen bei Antwort verschwindet.</p>
<p>&nbsp;</p>
<pre><code class="language-javascript">using Toybox.Application as App;
using Toybox.WatchUi as Ui;

<span style="color: #0000ff;">const URL = "https://<span style="color: #ff0000;">&lt;dyndnsurl&gt;</span>/rest/itemset/1";</span>

class SmartHomeNG_on_a_WatchApp extends App.AppBase {

    function initialize() {
        AppBase.initialize();
    }

    // onStart() is called on application start up
    function onStart(state) {
    	<span style="color: #0000ff;">makeRequest();</span>
    }

    // onStop() is called when your application is exiting
    function onStop(state) {
    }

    // Return the initial view of your application here
    function getInitialView() {
        return [ new SmartHomeNG_on_a_WatchView(<span style="color: #0000ff;">"Loading"</span>), new SmartHomeNG_on_a_WatchDelegate() ];
    }
    
<span style="color: #339966;"><span style="color: #0000ff;">    function onReceive(responseCode, data) {
       if (responseCode == 200){
           System.println("Request Successful, Data: "+data);                   // print success
           var tempValue = data["eta_unit.temperature_outside.value"];  
           var resultString = "Temperatur: "+tempValue.format("%.1f")+" °C\n";           
           var view = new SmartHomeNG_on_a_WatchView(resultString);
           var delegate = new SmartHomeNG_on_a_WatchDelegate();
           Ui.switchToView(view, delegate, Ui.SLIDE_IMMEDIATE);           
       }
       else {
           System.println("Response: " + responseCode + ", Data: "+data);            // print response code
       }
    }
   
    function makeRequest() {
       var url = URL;
       
       var params = null;
       
	   var headers = {
	   "Content-Type" =&gt; Communications.REQUEST_CONTENT_TYPE_JSON, 
	   "Authorization" =&gt; "Basic " + StringUtil.encodeBase64(Lang.format("$1$:$2$", [ "<span style="color: #ff0000;">&lt;user&gt;</span>", "</span><span style="color: #ff0000;">&lt;password&gt;</span><span style="color: #0000ff;">" ])),
	   "Accept" =&gt; "application/json"};
	   
       var options = {                                           
           :method =&gt; Communications.HTTP_REQUEST_METHOD_GET,  
           :headers =&gt; headers,                                                                 
           :responseType =&gt; Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
       };

       var responseCallback = method(:onReceive);                  // set responseCallback to 
                                                                   // onReceive() method
       // Make the Communications.makeWebRequest() call
       Communications.makeWebRequest(url, params, options, method(:onReceive));
    }</span></span>
}
</code></pre>
<h2>SmartHomeNG_on_a_WatchView.mc</h2>
<p>In der zugehörigen View-Datei, wird die Variable <code>_message</code> definiert, die den Text mit dem Temperaturwert aufnimmt. Dieser wird in <code>onLayout</code> gerendert.<br />
Damit dies geschehen kann, muss unter <code>/resources/layouts/layout.xml</code> zuerst ein Label mit ID <code>message</code> hinterlegt werden:</p>
<pre><code class="language-xml">
<span style="color: #0000ff;">&lt;layout id="MainLayout"&gt;
    &lt;label id="message" x="center" y="25" font="Gfx.FONT_XTINY" justification="Gfx.TEXT_JUSTIFY_CENTER"&gt;&lt;/label&gt;
&lt;/layout&gt;
</span></code></pre>
<p>Der Code in SmartHomeNG_on_a_WatchView.mc sieht dann wie folgt aus:</p>
<pre><code class="language-javascript">
using Toybox.WatchUi as Ui;

class SmartHomeNG_on_a_WatchView extends Ui.View {

<span style="color: #0000ff;">    hidden var _message;</span>
	
    function initialize(message) {
        View.initialize();
        <span style="color: #0000ff;">_message = message;
        System.println(message);</span>
    }

    // Load your resources here
    function onLayout(dc) {
        setLayout(Rez.Layouts.MainLayout(dc));
    	<span style="color: #0000ff;">View.findDrawableById("message").setText(_message);</span>
    }

    // Called when this View is brought to the foreground. Restore
    // the state of this View and prepare it to be shown. This includes
    // loading resources into memory.
    function onShow() {
    }

    // Update the view
    function onUpdate(dc) {
        // Call the parent onUpdate function to redraw the layout
        View.onUpdate(dc);
    }

    // Called when this View is removed from the screen. Save the
    // state of this View here. This includes freeing resources from
    // memory.
    function onHide() {
    }
}
</code></pre>
<h2>Ausführen des fertigen Programms</h2>
<p>Das Programm kann nun wie oben beschrieben über &#8222;Run -&gt; Run Configuration&#8220; als Fenix5 Configuration ausgeführt werden. Die Temperatur erscheint nun, sofern alles richtig gemacht wurde, im Emulator.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/temperature.png" alt="" class="alignnone size-full wp-image-390" width="1736" height="966" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/temperature.png 1736w, https://www.smarthomeng.de/wp-content/uploads/2018/03/temperature-300x167.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/temperature-768x427.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/temperature-1024x570.png 1024w" sizes="(max-width: 1736px) 100vw, 1736px" /></p>
<p>Wenn man die App auf die Uhr übertragen möchte, so geht dies über &#8222;Connect IQ&#8220; -&gt; &#8222;Build For Device Wizard..&#8220;. Mit einem entsprechenden Developer Key lässt sich nun eine Datei generieren, die auf der Uhr in das Verzeichns <code>\GARMIN\APPS</code> kopiert werden muss. Dies macht der Wizard gleich mit.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/wizard.png" alt="" class="alignnone size-full wp-image-392" width="1261" height="952" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/wizard.png 1261w, https://www.smarthomeng.de/wp-content/uploads/2018/03/wizard-300x226.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/wizard-768x580.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/wizard-1024x773.png 1024w" sizes="(max-width: 1261px) 100vw, 1261px" /></p>
<p>Zieht man danach die Uhr vom USB Port ab, kann die App gestartet werden.</p>
<p><img loading="lazy" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/03/IMAG0633-20180325-1117221.jpg" alt="" class="alignnone size-full wp-image-393" width="1989" height="1410" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/03/IMAG0633-20180325-1117221.jpg 1989w, https://www.smarthomeng.de/wp-content/uploads/2018/03/IMAG0633-20180325-1117221-300x213.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2018/03/IMAG0633-20180325-1117221-768x544.jpg 768w, https://www.smarthomeng.de/wp-content/uploads/2018/03/IMAG0633-20180325-1117221-1024x726.jpg 1024w" sizes="(max-width: 1989px) 100vw, 1989px" /></p>
<p>&nbsp;</p>
<p><em>(Die in diesem Artikel verwendeten Screenshots und Fotos wurden selber erstellt.)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/smarthomeng-on-a-watch-anbindung-des-garmin-connectiq-ssk-an-smarthomeng/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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>
