<?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>Windstärke &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/tag/windstaerke/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>Fri, 02 Nov 2018 14:57:52 +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>Windstärke &#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>Vom Winde verweht</title>
		<link>https://www.smarthomeng.de/vom-winde-verweht</link>
					<comments>https://www.smarthomeng.de/vom-winde-verweht#comments</comments>
		
		<dc:creator><![CDATA[Marc René Frieß]]></dc:creator>
		<pubDate>Thu, 19 Apr 2018 17:55:38 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Beaufort]]></category>
		<category><![CDATA[Logik]]></category>
		<category><![CDATA[smartVISU]]></category>
		<category><![CDATA[Windrichtung]]></category>
		<category><![CDATA[Windstärke]]></category>
		<category><![CDATA[Wundergrund]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1516</guid>

					<description><![CDATA[Dieser Artikel beschäftigt sich mit dem Thema Wind und was sich daraus alles über Plugins und Logiken am Ende in der smartVISU realisieren lässt. Anmerkung: mittlerweile sind die API Keys für Wundergrund leider nicht mehr kostenlos! Die Anleitung muss also mit einem alternativen Plugin wie Darksky oder OpenWeatherMap durchgeführt werden!<a class="moretag" href="https://www.smarthomeng.de/vom-winde-verweht"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Dieser Artikel beschäftigt sich mit dem Thema Wind und was sich daraus alles über Plugins und Logiken am Ende in der smartVISU realisieren lässt.</p>
<p><strong>Anmerkung:</strong> mittlerweile sind die API Keys für Wundergrund leider nicht mehr kostenlos! Die Anleitung muss also mit einem alternativen Plugin wie <a href="https://github.com/smarthomeNG/plugins/tree/master/darksky" target="_blank" rel="noopener">Darksky</a> oder <a href="https://github.com/smarthomeNG/plugins/tree/develop/openweathermap" target="_blank" rel="noopener">OpenWeatherMap</a> durchgeführt werden!</p>
<p>Basis des Artikels sind Daten zu Windrichtung und Windgeschwindigkeit über das Wundergrund Plugin. Es lassen sich aber bspw. auch Daten der KNX Wetterstation verwenden, sofern vorhanden.</p>
<h1>Das Wundergrund Plugin konfigurieren</h1>
<p>Die automatisch generierte Doku zum Wundergrund Plugin findet sich unter <a href="https://www.smarthomeng.de/user/plugins_doc/config/wunderground.html" target="_blank" rel="noopener">https://www.smarthomeng.de/user/plugins_doc/config/wunderground.html</a>.</p>
<p>Das Plugin liegt auf Github unter <a href="https://github.com/smarthomeNG/plugins/tree/master/wunderground" target="_blank" rel="noopener">https://github.com/smarthomeNG/plugins/tree/master/wunderground</a>.</p>
<p>Als Erstes muss das Plugin in der <code>etc/plugin.yaml</code> eingetragen werden. Der <code>apikey</code> kann kostenlos <span style="color: #ff0000;">(Update: leider sind die API Keys inzwischen nicht mehr kostenlos!)</span> über <a href="https://www.wunderground.com/weather/api/d/pricing.html" target="_blank" rel="noopener">https://www.wunderground.com/weather/api/d/pricing.html</a> beantragt werden. Es ist darauf zu achten, dass das Updateintervall eine bestimmte Zeitdauer nicht überschreitet, speziell, wenn man Wundergrund auch direkt in der smartVISU nutzt. Das Limit sind 500 Calls pro Tag bzw. 10 Calls pro Minute. Das Default-Updateintervall für das Plugin sind 600 Sekunden, also einmal in 10 Minuten. Per <code>cycle</code> Attribut ließe sich dieses in der <code>plugin.yaml</code> anpassen.</p>
<p>Als <code>location</code> setzt man bspw. seinen Ort, es sind hier neben dem Namen aber auch Geokoordinaten möglich.</p>
<pre><code class="language-yaml">
wundergrund_wetter:
    class_name: Wunderground
    class_path: plugins.wunderground
    apikey: 'xxxxyyyyxxxxyyyy'
    language: 'de'
    location: 'Germany/Hamburg'
    item_subtree: weather.wundergrund
    # cycle: 600
</code></pre>
<p><code>item_subtree</code> ist der Ast im Itemtree, unter dem die Wundergrund-relevanten Items liegen. Im Beispiel ist es <code>weather.wundergrund</code>.<br />
Die notwendigen Items sehen wie folgt aus:</p>
<pre><code class="language-yaml">
%YAML 1.1
---
# items/wetter.yaml
weather:

    wundergrund:

        windrichtung:
            type: str
            wug_matchstring: current_observation/wind_dir

        windrichtung_grad:
            type: num
            wug_matchstring: current_observation/wind_degrees

        windgeschwindigkeit:
            type: num
            value: -9999
            wug_matchstring: current_observation/wind_kph
            wug_datatype: positive

            ms:
                type: num
                eval: (sh.weather.wundergrund.windgeschwindigkeit()/3.6)
                eval_trigger: weather.wundergrund.windgeschwindigkeit

            beaufort:
                type: num

            string:
                type: str
               
        windboeen:
            type: num
            value: -9999
            wug_matchstring: current_observation/wind_gust_kph
            wug_datatype: positive
</code></pre>
<p><strong>Tipp:</strong> Neben dem Wind gibt es über Wundergrund noch viele weitere Wetterdaten.</p>
<h1>Anzeige der Windrichtung in der smartVISU</h1>
<p>Die Windrichtung lässt sich nun in der smartVISU 2.9 sehr einfach ausgeben:</p>
<pre><code class="language-twig">
{{ icon.compass('weather.wundergrund.windrichtung_compass', '', 'weather.wundergrund.windrichtung_grad',  '0', '360', '') }}
{{ basic.print('weather.wundergrund.windrichtung', 'weather.wundergrund.windrichtung', 'text') }}
</code></pre>
<p>Das Ergebnis ist eine sehr schöne Darstellung der Windrichtung:</p>
<p><img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/windrichtung.jpg" alt="" class="alignnone size-full wp-image-1521" width="124" height="66" /></p>
<h1>Windstärke auswerten und in der smartVISU anzeigen</h1>
<p>Als nächstes soll die Windstärke ausgewertet werden. Dafür dient die nach Sir Francis Beaufort benannte Beaufortskala, die Windstärken in 13 Bereichte von 0 (Windstille) bis 12 (Orkan) klassifiziert.</p>
<p>Für diese Skala ist der Wert im Item <code>weather.wundergrund.windgeschwindigkeit.ms</code> notwendig, das via Eval-Ausdruck die Windgeschwindigkeit von Kilometer pro Stunde in Meter pro Sekunde umrechnet (<code>sh.weather.wundergrund.windgeschwindigkeit()/3.6</code>). Die Umrechnung triggert jedes Mal, wenn sich <code>weather.wundergrund.windgeschwindigkeit</code> verändert.</p>
<p>Für die Auswertung der Windstärke muss unter <code>logics/wind.py</code> eine neue Logik erstellt werden, die die Items <code>weather.wundergrund.windgeschwindigkeit.string</code> und <code>weather.wundergrund.windgeschwindigkeit.beaufort</code> befüllt:<br />
Der Eintrag in der <code>etc/logic.yaml</code> sieht wie folgt aus:</p>
<pre><code class="language-yaml">
WindLogic:
    crontab: init
    filename: wind.py
    watch_item: weather.wundergrund.windgeschwindigkeit.ms
</code></pre>
<p>Die Logik löst also jedes Mal aus, wenn sich <code>weather.wundergrund.windgeschwindigkeit.ms</code> ändert.</p>
<p>Der Code der Logik in der Datei <code>logics/wind.py</code> mappt nun die Windgeschwindigkeit in Meter pro Sekunde auf die Beaufortskala:</p>
<pre><code class="language-python">
if sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 0.3:
    sh.weather.wundergrund.windgeschwindigkeit.string("Windstille")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(0)
elif 0.3 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 1.6:
    sh.weather.wundergrund.windgeschwindigkeit.string("leiser Zug")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(1)
elif 1.6 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 3.4:
    sh.weather.wundergrund.windgeschwindigkeit.string("leichte Brise")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(2)
elif 3.4 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 5.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("schwacher Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(3)
elif 5.5 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 8.0:
    sh.weather.wundergrund.windgeschwindigkeit.string("mäßiger Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(4)
elif 8.0 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 10.8:
    sh.weather.wundergrund.windgeschwindigkeit.string("frischer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(5)
elif 10.8 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 13.9:
    sh.weather.wundergrund.windgeschwindigkeit.string("starker Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(6)
elif 13.9 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 17.2:
    sh.weather.wundergrund.windgeschwindigkeit.string("steifer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(7)
elif 17.2 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 20.8:
    sh.weather.wundergrund.windgeschwindigkeit.string("stürmischer Wind")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(8)
elif 20.8 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 24.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(9)
elif 24.5 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 28.5:
    sh.weather.wundergrund.windgeschwindigkeit.string("schwerer Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(10)
elif 28.5 &lt;= sh.weather.wundergrund.windgeschwindigkeit.ms() &lt; 32.7:
    sh.weather.wundergrund.windgeschwindigkeit.ms.string("orkanartiger Sturm")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(11)
else:
    sh.weather.wundergrund.windgeschwindigkeit.string("Orkan")
    sh.weather.wundergrund.windgeschwindigkeit.beaufort(12)
</code></pre>
<p>Damit die Logik effektiv wird, muss SmartHomeNG neu gestartet oder die Logik via Backend-Plugin aktiviert werden.</p>
<p>Sinnvollerweise kann diese Logik auch in einer Funktion gekapselt werden. Dies ist an einem Alternativansatz, der mit einer Lookup-Tabelle arbeitet, im Folgenden dargestellt:</p>
<pre><code class="language-python"><span class="pl-c">#!/usr/bin/env python3</span>
<span class="pl-c"># beaufort3.py</span>

<span class="pl-k">def</span> <span class="pl-en">get_beaufort</span>(<span class="pl-smi">speed</span>):
    <span class="pl-s"><span class="pl-pds">"""</span></span>
<span class="pl-s">    :parameter speed: windspeed in meter per second</span>
<span class="pl-s">    :return: a tuple of a string with the (german) description and an integer with beaufort speed</span>
<span class="pl-s">    <span class="pl-pds">"""</span></span>
    table <span class="pl-k">=</span> [ 
        (  <span class="pl-c1">0.3</span>, <span class="pl-s"><span class="pl-pds">"</span>Windstille<span class="pl-pds">"</span></span>,<span class="pl-c1">0</span>),
        (  <span class="pl-c1">1.6</span>, <span class="pl-s"><span class="pl-pds">"</span>leiser Zug<span class="pl-pds">"</span></span>,<span class="pl-c1">1</span>),
        (  <span class="pl-c1">3.4</span>, <span class="pl-s"><span class="pl-pds">"</span>leichte Brise<span class="pl-pds">"</span></span>,<span class="pl-c1">2</span>),
        (  <span class="pl-c1">5.5</span>, <span class="pl-s"><span class="pl-pds">"</span>schwacher Wind<span class="pl-pds">"</span></span>,<span class="pl-c1">3</span>),
        (  <span class="pl-c1">8.0</span>, <span class="pl-s"><span class="pl-pds">"</span>mäßiger Wind<span class="pl-pds">"</span></span>,<span class="pl-c1">4</span>),
        ( <span class="pl-c1">10.8</span>, <span class="pl-s"><span class="pl-pds">"</span>frischer Wind <span class="pl-pds">"</span></span>,<span class="pl-c1">5</span>),
        ( <span class="pl-c1">13.9</span>, <span class="pl-s"><span class="pl-pds">"</span>starker Wind<span class="pl-pds">"</span></span>,<span class="pl-c1">6</span>),
        ( <span class="pl-c1">17.2</span>, <span class="pl-s"><span class="pl-pds">"</span>steifer Wind<span class="pl-pds">"</span></span>,<span class="pl-c1">7</span>),
        ( <span class="pl-c1">20.8</span>, <span class="pl-s"><span class="pl-pds">"</span>stürmischer Wind<span class="pl-pds">"</span></span>,<span class="pl-c1">8</span>),
        ( <span class="pl-c1">24.5</span>, <span class="pl-s"><span class="pl-pds">"</span>Sturm<span class="pl-pds">"</span></span>,<span class="pl-c1">9</span>),
        ( <span class="pl-c1">28.5</span>, <span class="pl-s"><span class="pl-pds">"</span>schwerer Sturm<span class="pl-pds">"</span></span>,<span class="pl-c1">10</span>),
        ( <span class="pl-c1">32.7</span>, <span class="pl-s"><span class="pl-pds">"</span>orkanartiger Sturm<span class="pl-pds">"</span></span>,<span class="pl-c1">11</span>),
        ( <span class="pl-c1">999</span>,  <span class="pl-s"><span class="pl-pds">"</span>Orkan<span class="pl-pds">"</span></span>,<span class="pl-c1">12</span>) ]
    
    <span class="pl-k">try</span>:
        description <span class="pl-k">=</span> <span class="pl-c1">min</span>(<span class="pl-c1">filter</span>(<span class="pl-k">lambda</span> <span class="pl-smi">x</span>: x[<span class="pl-c1">0</span>] <span class="pl-k">&gt;=</span> speed, table))[<span class="pl-c1">1</span>]
        bft <span class="pl-k">=</span> <span class="pl-c1">min</span>(<span class="pl-c1">filter</span>(<span class="pl-k">lambda</span> <span class="pl-smi">x</span>: x[<span class="pl-c1">0</span>] <span class="pl-k">&gt;=</span> speed, table))[<span class="pl-c1">2</span>]
        <span class="pl-k">return</span> description,bft
    <span class="pl-k">except</span> <span class="pl-c1">ValueError</span>:
        <span class="pl-k">return</span> <span class="pl-c1">None</span>, <span class="pl-c1">None</span>

decription, bft <span class="pl-k">=</span> get_beaufort(sh.weather.wundergrund.windgeschwindigkeit.ms())
sh.weather.wundergrund.windgeschwindigkeit.string(description)
sh.weather.wundergrund.windgeschwindigkeit.beaufort(bft)
</code></pre>
<p>&nbsp;</p>
<p>In der smartVISU können diese Werte nun wie folgt angezeigt werden:</p>
<pre><code class="language-twig">
{{ basic.symbol('', '', '', 'weather_wind_speed_bft') }}                       
Bft: {{ basic.print('wind_weatherstation_bfvalue', 'knx.weather.wind.beaufort') }}, 
{{ basic.print('wind_weatherstation_string', 'knx.weather.wind.string', 'text') }}
</code></pre>
<p>Das Ergebnis:</p>
<p><img decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2018/04/beaufort.jpg" alt="" class="alignnone size-full wp-image-1544" width="180" height="55" /></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/vom-winde-verweht/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
