<?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>Items &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/tag/items/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>Mon, 14 Feb 2022 21:19:04 +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>Items &#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>Nutzung von Szenen in SmartHomeNG</title>
		<link>https://www.smarthomeng.de/nutzung-von-szenen-in-smarthomeng</link>
					<comments>https://www.smarthomeng.de/nutzung-von-szenen-in-smarthomeng#comments</comments>
		
		<dc:creator><![CDATA[Martin Sinn]]></dc:creator>
		<pubDate>Mon, 25 May 2020 13:51:44 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[HUE]]></category>
		<category><![CDATA[hue2]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Szenen]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=2574</guid>

					<description><![CDATA[Die Implementierung von Szenen in SmartHomeNG orientiert sich an der Art wie Szenen in KNX implementiert sind. Da nicht jeder Nutzer von SmartHomeNG mit KNX-Szenen vertraut ist, fasse ich im Folgenden die Funktionsweise von KNX-Szenen kurz zusammen. Wer mit KNX-Szenen bereits vertraut ist, kann diesen Abschnitt überspringen und sich gleich<a class="moretag" href="https://www.smarthomeng.de/nutzung-von-szenen-in-smarthomeng"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Die Implementierung von Szenen in SmartHomeNG orientiert sich an der Art wie Szenen in KNX implementiert sind. Da nicht jeder Nutzer von SmartHomeNG mit KNX-Szenen vertraut ist, fasse ich im Folgenden die Funktionsweise von KNX-Szenen kurz zusammen. Wer mit KNX-Szenen bereits vertraut ist, kann diesen Abschnitt überspringen und sich gleich die Beispiel-Implementierung anschauen.</p>
<h3>Funktionsweise von KNX-Szenen</h3>
<p>Um Szenen in KNX nutzen zu können, müssen Aktoren verwendet werden, die Szenen unterstützen. Diese Aktoren verfügen über ein Kommunikationsobjekt, über welches Szenen angesteuert werden können. Szenen werden ausgelöst, indem auf die Gruppenadresse (GA) die mit diesem Kommunikationsobjekt verbunden ist, ein numerischer 8-Bit Wert gesendet wird. Gültige Werte sind hierfür 0 bis 63. Über eine Szene können also nur Aktoren angesteuert werden, die mit der selben Gruppenadresse verbunden sind.</p>
<p>Auf welche Werte (Szenennummern) der jeweilige Aktor reagiert, muss mit der ETS konfiguriert werden. In der ETS wird auch festgelegt, welchen Zustand der Aktor einnehmen soll, wenn über die Gruppenadresse eine Szene angesteuert wird.</p>
<p>Optional kann in der ETS eingestellt werden, dass Aktoren die Zustände die zu einer Szene gehören lernen kann. Das geschieht folgendermaßen: Die Aktoren werden manuell in den Zustand gebracht, den sie für eine Szene einnehmen sollen. Anschließend wird auf die Guppenadresse der Wert Szenennummer+128 (also 128 bis 191) gesendet. Dadurch werden die Aktoren, bei denen das &#8222;Lernen&#8220; aktiviert ist veranlasst, sich den aktuellen Zustand als Zustand für die entsprechende Szene zu merken.</p>
<h3>Ansteuerung von KNX-Szenen aus SmartHomeNG</h3>
<p>Um KNX-Szenen aus SmartHomeNG anzusteuern, muss ein numerisches Item angelegt werden und es muss den Wert auf die Gruppenadresse senden, die zur Szenensteuerung verwendet wird:</p>
<pre><code class="language-yaml">meine_items:
    knx_szenen:
        name: Beispiel für KNX-Szenen
        type: num
        enforce_updates: True
        knx_dpt: 5
        knx_send: 0/0/3
</code></pre>
<p><strong>enforce_updates</strong> muss auf True gesetzt werden, damit wenn mehrfach hintereinander die selbe Szene angesteuert werden soll, der Wert auch auf den KNX Bus geschrieben wird.<br />
Der <strong>knx_dpt</strong> Wert 5 (8 Bit 0-255) ist die ursprüngliche Art Szenen in KNX Anzusteuern. Hier werden die Szenen über Werte von 0 bis 63 angesteuert.</p>
<p>Es gibt inzwischen in KNX eigene DPT Werte um Szene anzusteuern (DPT 17 und 18). Bei diesen DPTs werden die Szenen von 1 bis 64 nummeriert. Es ist zu beachten, dass ganz alte KNX Aktoren diese DPTs eventuell nicht kennen (weshalb ich mir angewöhnt habe immer DPT 5 zu verwenden).</p>
<h3>Szenen in SmartHomeNG</h3>
<p>Szenen in SmartHomeNG funktionieren nach dem gleichen Prinzip wie KNX-Szenen. Damit SmartHomeNG erkennt, dass ein Item die Ansteuerung einer Szene bewirken soll, muss der Item-Type <strong>scene</strong> gewählt werden. Ein Szenen Item für SmartHomeNG Szenen sieht somit folgendermaßen aus:</p>
<pre><code class="language-yaml">meine_items:
    szenen:
        name: Beispiel für SmartHomeNG-Szenen
        type: scene
        enforce_updates: True
</code></pre>
<p>Die Festlegungen, welche Items auf die Szene reagieren sollen und welchen Zustand sie einnehmen sollen (was bei KNX in der ETS festgelegt wird), erfolgt im Verzeichnis <strong>../scenes</strong> in einer YAML Datei, die den Namen des Szenen-Items trägt. Im obigen Beispiel also <strong>meine_items.szenen.yaml</strong>. Detals zum Aufbau dieser Datei sind in der Anwender Dokumentation in der Beschreibung der <a href="http://www.smarthomeng.de/dev/user/konfiguration/konfigurationsdateien/scenes.html">Konfigurationsdateien</a> zu finiden.</p>
<p>Die Ansteuerung der Szenen erfolgt analog zur Ansteuerung von KNX-Szenen durch Zuweisung eines Wertes zwischen 0 und 63 zum Abruf (und 128 bis 191 zum speichern) von Szenen.</p>
<h3>Gemischte Szenen in SmartHomeNG und KNX</h3>
<p>Es ist auch möglich, Szenen zwischen SmartHomeNG und KNX zu mischen, ohne die Items der KNX Aktoren in die SmartHome Szenen Definition im <strong>../scenes</strong> Verzeichnis aufnehmen zu müssen. Es kann dabei auf die KNX Funktionalität zurück gegriffen werden. Dazu muss das Szenen Item einer SmartHomeNG Szene nur um die KNX Attribute erweitert werden:</p>
<pre><code class="language-yaml">meine_items:
    szenen:
        name: Beispiel für gemischte Szenen
        type: num
        enforce_updates: True
        knx_dpt: 5
        knx_send: 0/0/3
</code></pre>
<p>Wenn die Szenen Ansteuerung auch aus dem KNX Bus heraus erfolgen soll, also z.B. über einen Tastsensor der Szenen abruft oder speichert, muss das Beispiel nur noch um den KNX Listen-Befehl auf die Szenen-GA erweitert werden:</p>
<pre><code class="language-yaml">meine_items:
    szenen:
        name: Beispiel für gemischte Szenen
        type: num
        enforce_updates: True
        knx_dpt: 5
        knx_send: 0/0/3
        knx_listen: 0/0/3
</code></pre>
<p>Nun bewirkt ein Szenen Abruf durch einen KNX Taster, dass auch die Items der SmartHomeNG Szene mit angesteuert werden.</p>
<h3>Beispiel Implementierung</h3>
<p>Im folgenden wird die Implementierung der Lichtsteuerung gezeigt, bei der fast alle Leuchten über KNX-Szenen gesteuert werden. Allerdings soll eine Philips HUE Leuchte mit angesteuert werden, welche aus SmartHomeNG heraus mit dem hue Plugin gesteuert wird.</p>
<p>Das Szenen Item wird azu folgendermaßen definiert:</p>
<pre><code class="language-yaml">wohnung:
    buero:
        szenen_knx:
            comment: 0=aus, 1=Ambiente, 2=hell, 3=Putzen, 4=Party
            name: Beleuchtungsszenen Büro
            type: scene
            enforce_updates: 'on'
            knx_dpt: 5
            knx_send: 1/0/16
            knx_listen: 1/0/16
</code></pre>
<p>Die KNX Aktoren (Dimmer) sind entsprechend konfiguriert, dass sie auf der GA 1/0/16 auf die Szenennummern 0 bis 4 (gemäß KNX Definition Szenen 1 bis 5) reagieren und dass sie für die Szenennummern 1 und 2 das lernen zulassen.</p>
<p>Die SmartHomeNG Szene ist im Verzeichnis <strong>../scenes</strong> in der Datei <strong>wohnung.buero.szenen_knx.yaml</strong> folgendermaßen definiert:</p>
<pre><code class="language-yaml">
0:
    name: Aus
    # Leuchte Dreieckschrank ausschalten, falls die Schreibtischleuchte nicht eingeschaltet ist, sonst level 126 setzen
    actions:
        - {item: wohnung.buero.dreieckschrank.level, value: 0 if (sh.wohnung.buero.schreibtischleuchte.status() &lt; 2) else 126}
        - {item: wohnung.buero.dreieckschrank.ct, value: 345, learn: false}
        - {item: wohnung.buero.dreieckschrank.onoff, value: False if (sh.wohnung.buero.schreibtischleuchte.status() &lt; 2) else True}

1:
    name: Ambiente
    actions:
        - {item: wohnung.buero.dreieckschrank.level, value: sh...dreieckschrank.ambiente_level()+3, learn: false}
        - {item: wohnung.buero.dreieckschrank.ct, value: 345, learn: true}
        - {item: wohnung.buero.dreieckschrank.onoff, value: True, learn: true}

2:
    name: Hell
    actions:
        - {item: wohnung.buero.dreieckschrank.level, value: 126, learn: true}
        - {item: wohnung.buero.dreieckschrank.ct, value: 345, learn: true}

3:
    name: Putzen
    actions:
        - {item: wohnung.buero.dreieckschrank.onoff, value: True, learn: false}
        - {item: wohnung.buero.dreieckschrank.level, value: 255, learn: false}
        - {item: wohnung.buero.dreieckschrank.ct, value: 345, learn: false}

4:
    name: Party
    actions:
        - {item: wohnung.buero.dreieckschrank.level, value: 200, learn: false}
        - {item: wohnung.buero.dreieckschrank.hue, value: 59635, learn: false}
        - {item: wohnung.buero.dreieckschrank.sat, value: 230, learn: false}
        - {item: wohnung.buero.dreieckschrank.onoff, value: True, learn: false}
</code></pre>
<p>Zur Ansteuerung der Hue Leuchte über die Szene werden 3 Items gesteuert, welche die Leuchte ein- und ausschalten, den Dimmwert und die Farbe setzen.</p>
<p>Für jede der Szenen (0 bis 4) wird über <strong>value</strong> für diese Werte ein Wert gesetzt (der bei Abruf der Szene eingestellt werden soll) und über <strong>learn</strong> wird festgelegt, ob andere Werte gelernt werden können/dürfen. Für <strong>value</strong> können dabei nicht nur konstante Werte festgelegt werden, sondern auch <strong>eval Ausdrücke</strong>. Wenn ein eval Ausdruck angegeben wird, ist <strong>learn</strong> zwangsweise false. In diesem Fall können also keine Szenen Zustände gelernt werden.</p>
<p>Ein Beispiel für die Nutzung von eval Ausdrücken in Szenen ist bei Szene Nummer <strong>0</strong> zu finden, welche die Beleuchtung ausschalten soll. Falls im Büro die Schreibtisch Leuchte (die nicht Teil der Szenen ist) eingeschaltet ist, wird die HUE Leuchte jedoch nicht ausgeschaltet, sondern als Hintergrund Beleuchtung in einem gedimmten warmen Weiss eingeschaltet.</p>
<p>Bei Szene Nummer <strong>1</strong> wird eine andere eval Nutzung mit Anwendung relativer Item Adressierung gezeigt. Hier wird der Wert auf den Wert eines anderen Items plus 3 gesetzt. Hier kann nur der Weisston und Ein/Aus über die Szene gelernt werden.</p>
<p>Bei Szene Nummer <strong>4</strong> wird eine vorgewählte Farbe und Helligkeit der HUE Leuchte eingestellt, die bewusst nicht durch &#8222;Lernen&#8220; geändert werden kann.</p>
<h3>Ansteuerung der Szenen über smartVISU</h3>
<p>Die Ansteuerung der Szenen kann am besten über Buttons in der smartVISU erfolgen. Für das obige Beispiel wird die folgende Definition für die Autogenerierung verwendet:</p>
<p>&nbsp;</p>
<pre><code class="language-yaml">wohnung:
    buero:
        sv_page: room
        name: Büro
        sv_img: scene_office.svg

        visu:
            szenen_beleuchtung:
                name: Szenen Beleuchtung

                sv_widget: 'Szenen abrufen:
                    &lt;span data-role="controlgroup" data-type="horizontal"&gt;
                    {{ basic.button(''szenen_buero0'', ''wohnung.buero.szenen_knx'', ''Aus'', icon0~"control_standby.svg", ''0'', ''midi'') }}
                    {{ basic.button(''szenen_buero1'', ''wohnung.buero.szenen_knx'', ''Ambiente'', icon0~"light_light_dim_00.svg", ''1'', ''midi'') }}
                    {{ basic.button(''szenen_buero2'', ''wohnung.buero.szenen_knx'', ''Hell'', icon0~"light_ceiling_light.svg", ''2'', ''midi'') }}
                    {{ basic.button(''szenen_buero3'', ''wohnung.buero.szenen_knx'', ''Putzen'', icon0~"scene_cleaning.svg", ''3'', ''midi'') }}
                    {{ basic.button(''szenen_buero6'', ''wohnung.buero.szenen_knx'', ''Party'', icon0~"light_party.svg", ''4'', ''midi'') }}
                    &lt;/span&gt;&lt;br&gt;
                    &lt;div style="line-height: 30%;"&gt;
                         &lt;br&gt;br&gt;
                    &lt;/div&gt;
                    &lt;div&gt;Szenen speichern:&lt;br&gt;
                    &lt;span data-role="controlgroup" data-type="horizontal"&gt;
                    {{ basic.button(''szenen_bueroS0'', ''wohnung.buero.szenen_knx'', ''Aus'', icon0~''control_standby.svg'', ''128'', ''midi'', ''#4176a9'') }} 
                    {{ basic.button(''szenen_bueroS1'', ''wohnung.buero.szenen_knx'', ''Ambiente'', icon0~"light_light_dim_00.svg", ''129'', ''midi'', ''#4176a9'') }} 
                    {{ basic.button(''szenen_bueroS2'', ''wohnung.buero.szenen_knx'', ''Hell'', icon0~''light_ceiling_light.svg'', ''130'', ''midi'', ''#4176a9'') }} 
                    {{ basic.button(''szenen_bueroS3'', ''wohnung.buero.szenen_knx'', ''Putzen'', icon0~''scene_cleaning.svg'', ''131'', ''midi'', ''#4176a9'') }} 
                    {{ basic.button(''szenen_bueroS6'', ''wohnung.buero.szenen_knx'', ''Party'', icon0~''light_party.svg'', ''132'', ''midi'', ''#4176a9'') }} 
                    &lt;/span&gt;&lt;/div&gt;
</code></pre>
<p>Das erzeugt in der Visu:</p>
<ul>
<li>eine Seite &#8222;Büro&#8220; in der normalen Raum-Navigation.</li>
<li>auf dieser Seite einen Block mit dem Namen &#8218;Szenen Beleuchtung&#8216;</li>
<li>in diesem Block erzeuge ich zwei Button Reihen zur Szenen Steuerung: Der obere Block zum Abruf der Szenen, der untere Block zum Speichern von Szenen</li>
</ul>
<p>Das sieht dann so aus:</p>
<p><img fetchpriority="high" decoding="async" src="https://www.smarthomeng.de/wp-content/uploads/2020/05/smartVISU-Szenen-300x280.jpg" alt="" width="300" height="280" class="alignnone size-medium wp-image-2591" srcset="https://www.smarthomeng.de/wp-content/uploads/2020/05/smartVISU-Szenen-300x280.jpg 300w, https://www.smarthomeng.de/wp-content/uploads/2020/05/smartVISU-Szenen.jpg 398w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/nutzung-von-szenen-in-smarthomeng/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Extremwerte des Tages speichern</title>
		<link>https://www.smarthomeng.de/__trashed</link>
					<comments>https://www.smarthomeng.de/__trashed#comments</comments>
		
		<dc:creator><![CDATA[kex]]></dc:creator>
		<pubDate>Sun, 24 May 2020 19:59:01 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[Items]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=2546</guid>

					<description><![CDATA[Meine Aufgabenstellung war die folgende: Speichern des höchsten gemessenen Temperaturwertes eines Tages und diesen einmal pro Tag zurücksetzten. Das ursprüngliche Item dessen Maximalwert ich speichern hat folgenden Aufbau. Wetterstation: Temperatur: type: num visu_acl: ro Um jetzt zusätzlich zum aktuellen Messwert den maximalen Messwert zu speichern habe ich das Item etwas<a class="moretag" href="https://www.smarthomeng.de/__trashed"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Meine Aufgabenstellung war die folgende: Speichern des höchsten gemessenen Temperaturwertes eines Tages und diesen einmal pro Tag zurücksetzten.</p>
<p>Das ursprüngliche Item dessen Maximalwert ich speichern hat folgenden Aufbau.</p>
<pre class="line-numbers"><code class="language-yaml">
Wetterstation:
    Temperatur:
        type: num
        visu_acl: ro
</code></pre>
<p>Um jetzt zusätzlich zum aktuellen Messwert den maximalen Messwert zu speichern habe ich das Item etwas angepasst:</p>
<pre class="line-numbers"><code class="language-yaml">
Wetterstation:
    Temperatur:
        Aktuell:
            type: num
            visu_acl: ro
        Maximum_Heute:
            type: num
            visu_acl: ro
</code></pre>
<p>Für Wetterstation.Tempertatur.Maximum_Heute müssen jetzt noch folgende Dinge hinzufefügt werden:</p>
<ul>
<li><a href="#d1">Überprüfen auf Änderungen</a><br />
Immer wenn sich der Wert von <strong>Wetterstation.Temperatur.Aktuell</strong> ändert, soll überprüft werden, ob <strong>Wetterstation.Temperatur.Maximum_Heute</strong> aktualisiert werden muss.</li>
<li><a href="#d2">Aktualisieren des Wertes</a><br />
Wenn bei dieser Überprüfung der aktuelle Wert höher ist als der bisher in <strong>Wetterstation.Temperatur.Maxiumum_Heute</strong> gespeicherte Wert, soll der Wert aktualisiert werden.</li>
<li><a href="#d3">Zurücksetzen des Wertes</a><br />
Einmal am Tag muss <strong>Wetterstation.Temperatur.Maximum_Heute</strong> zurückgesetzt werden.</li>
</ul>
<h3 id="d1">Überprüfen auf Änderungen</h3>
<p>Das überprüfen, ob sich die aktuelle Temperatur ändert, geht ganz einfach indem man <strong>Wetterstation.Temperatur.Maximum_Heute</strong> einen eval_trigger auf das Item <strong>Wetterstation.Temperatur.Aktuell</strong> hinzufügt. Seit SmartHomeNG kann man das Item auch relativ angeben: ..Aktuell.<br />
es entsteht also folgender <strong>eval_trigger</strong>:</p>
<pre><code class="language-yaml">eval_trigger: ..Aktuell</code></pre>
<h3 id="d2">Aktualisieren des Wertes</h3>
<p>Wenn bei der Überprüfung der aktuelle Wert höher ist als der bisher in Wetterstation.Temperatur.Maxiumum_Heute gespeicherte Wert, soll der Wert aktualisiert werden.<br />
Das geht über ein <strong>eval</strong>:</p>
<pre><code class="language-yaml">eval: sh...Aktuell() if float(sh..self()) &gt; sh...Aktuell() else sh..self.property.value</code></pre>
<h3 id="d3">Zurücksetzen des Wertes</h3>
<p>Der Wert soll einmal pro Tag und bei einem Neustart zurückgesetzt werden. Das wird über ein <strong>crontab </strong>und ein <em>Magic Value</em> (99.9) erledigt. Es wird davon ausgegangen, dass ein Temperaturwert von 99.9 nie vorkommt und deshalb zum Zurücksetzen verwendet werden kann.</p>
<p>Verzögerung bei der Initialisierung: Meine Wetterstation liefert nur alle 5 Minuten (alle 300 Sekunden) einen neuen Temperaturwert. Das heisst nach einem Neustart von SmartHomeNG steht also für maximal 5 Minuten kein aktueller Messwert in <strong>Wetterstation.Temperatur.Aktuell</strong> sondern 0.0. Deshalb wird nach 5 Minuten und 10 Sekunden <strong>Wetterstation.Temperatur.Maximum_Heute</strong> auf die aktuelle Temperatur zurückgesetzt.</p>
<pre><code class="language-yaml">crontab:
 -init+310 = 99.9
 -0 0 * *  = 99.9
</code></pre>
<p>Auch der <strong>eval</strong> Ausdruck muss für das Zurücksetzen erweitert werden:</p>
<pre><code class="language-yaml">eval: sh...Aktuell() if <strong>value == 99.9 or</strong> float(sh..self()) &gt; sh...Aktuell() else sh..self.property.value
</code></pre>
<p>Natürlich kann dieses Prinzip Minimal-Werte angewendet werden. Dafür muss nur der Vergleich im <strong>eval</strong> Ausdruck angepasst werden.</p>
<p>Das endgültige Item sieht dann so aus:</p>
<pre class="line-numbers"><code class="language-yaml">
Wetterstation:
    Temperatur:
        Aktuell:
            type: num
            visu_acl: ro
        Maximum_Heute:
            type: num
            visu_acl: ro
            eval: sh...Aktuell() if value == 99.9 or float(sh..self()) &lt; sh...Aktuell() else sh..self.property.value
            eval_trigger: ..Aktuell
            # Reset am Ende des Tages durch "MagicValue" 99.9. Es wird angenommen, 
            # dass dieser Temperaturwert in der Praxis niemals auftritt. 
            crontab: 
             - 0 3 * * = 99.9
             # +310 weil die Wetterstation mindestens alle 300 Sekunden einen aktualisierten Temperatur Wert sendet
             # dadurch wird sichergestellt, dass nach einem Neustart von SmartHomeNG in ..Aktuell auf jeden Fall ein gültiger Wert steht. 
             - init+310 = 99.9
</code></pre>
<p>Wenn etwas anderes als Temperaturwerte gespeichert werden sollen, kann es auch sein, dass als <em>Magic Value</em> eine andere Zahl verwendet werden muss.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/__trashed/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Itemvorlagen nutzen (structs)</title>
		<link>https://www.smarthomeng.de/itemvorlagen-nutzen-structs</link>
					<comments>https://www.smarthomeng.de/itemvorlagen-nutzen-structs#comments</comments>
		
		<dc:creator><![CDATA[onkelandy]]></dc:creator>
		<pubDate>Thu, 30 May 2019 10:59:55 +0000</pubDate>
				<category><![CDATA[Beispiel-Implementierungen]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[struct]]></category>
		<category><![CDATA[Vorlagen]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=2381</guid>

					<description><![CDATA[Hinweis: Die hier beschriebene Funktion ist erst ab SmartHomeNG 1.6 verfügbar. Structs aus Plugins Die &#8222;struct&#8220; Vorlagen ermöglichen es zum einen, vorgegebene Item-Strukturen aus Plugins zu integrieren, zum anderen aber auch, eigene Vorlagen für immer wiederkehrende Item-Bäume bereitzustellen. Bei gleichen Gerätetypen ist die Struktur oft sehr ähnlich, was zu sehr<a class="moretag" href="https://www.smarthomeng.de/itemvorlagen-nutzen-structs"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p><strong>Hinweis</strong>: Die hier beschriebene Funktion ist erst ab <strong>SmartHomeNG 1.6</strong> verfügbar.</p>
<h5>Structs aus Plugins</h5>
<p>Die &#8222;struct&#8220; Vorlagen ermöglichen es zum einen, vorgegebene Item-Strukturen aus Plugins zu integrieren, zum anderen aber auch, eigene Vorlagen für immer wiederkehrende Item-Bäume bereitzustellen.</p>
<p>Bei gleichen Gerätetypen ist die Struktur oft sehr ähnlich, was zu sehr vielen gleich aufgebauten Item-Definitionen führt. Leuchten, Jalousien, Bewegungsmelder können dabei ähnlich leicht vereinfacht werden wie Sollwerte, Vorgaben für Zustände des stateengine Plugins und vieles mehr. Zuerst ein Beispiel, wie mit nur einer Zeile ein Zeitschalt-Unteritem aus dem UZSU Plugin eingefügt werden kann. Da diese Vorlage bereits mit dem Plugin mitgeliefert wird, ist nichts weiter zu tun, also mittels struct Attribug darauf zuzugreifen. Welche Vorlagen von welchen Plugins bereitgestellt werden, ist zum einen in den jeweiligen plugin.yaml Dateien, zum anderen im Admin Tool einzusehen.</p>
<pre><code class="language-yaml">
    # item.yaml
    item:
        struct: uzsu.child
</code></pre>
<p>Durch diese Angabe entsteht beim Start von SmartHomeNG folgende Struktur, die zuvor noch bei jedem Item, das die Zeitschaltuhr nutzt, manuell angegeben werden musste:</p>
<pre><code class="language-yaml">
  # item.yaml
  item:
        uzsu:
            type: dict
            uzsu_item: ..
            cache: True
            visu_acl: rw
            
            active:
                type: bool
                eval: sh...activate(value)
                visu_acl: rw
</code></pre>
<h5>Eigene Vorlagen</h5>
<p>Folgendes Beispiel zeigt, wie Vorlagen selbst in der Datei etc/struct.yaml hinterlegt werden können. Generell bedarf es keinerlei besonderer Syntax. Strukturen werden dort genauso angelegt wie normale Item-Bäume. Die jeweils oberste Hierarchieebene definiert den Namen der Vorlage. Und genau auf dieses Item wird dann in der eigentlichen item.yaml Datei durch das Attribut <em>struct</em> verwiesen. Zuerst der Inhalt der struct.yaml für ein dimmbares Licht mit einigen Zusatzfunktionen:</p>
<pre><code class="language-yaml">
    # struct.yaml
    dimmervorlage:
        name: Vorlage für dimmbare Leuchten
	knx_dpt: 1
	visu_acl: rw
	type: bool
        knx_send: 0/0/0
        knx_cache: 0/0/0

	bwm:
		knx_dpt: 1
		visu_acl: rw
		type: bool

	zwangvalue:
		knx_dpt: 5001
		visu_acl: rw
		type: num
		cache: True

		zwangsstellung:
			knx_dpt: 2
			visu_acl: rw
			type: list
			enforce_updates: yes

	dimmen:
		knx_dpt: 5001
		visu_acl: rw
		type: num
		database: yes
		influxdb: yes
		sim: track

		sollwert:
			knx_dpt: 5001
			visu_acl: rw
			type: num
			enforce_updates: yes
			cache: True
</code></pre>
<p>Und hier die Einbindung in die yaml Datei im items Verzeichnis für ein Licht mit separaten warm- und kaltweißen Leuchtmitteln:</p>
<pre><code class="language-yaml">
# item.yaml
licht1:
    warm:
        <strong>struct: dimmervorlage</strong>
	knx_send: 3/0/21
	knx_cache: 3/0/27

	bwm:
		knx_send: 3/3/67
		knx_cache: 3/3/67

	zwangvalue:
		zwangsstellung:
			knx_send: 3/0/50
			knx_cache: 3/0/50

	dimmen:
		knx_send: 3/0/23
		knx_cache: 3/0/28

		sollwert:
			knx_send: 3/3/53

    kalt:
        <strong>struct: dimmervorlage</strong>
	knx_send: 3/0/24
	knx_cache: 3/0/29

	bwm:
		knx_send: 3/3/68
		knx_cache: 3/3/68

	zwangvalue:
		zwangsstellung:
			knx_send: 3/0/51
			knx_cache: 3/0/51

	dimmen:
		knx_send: 3/0/26
		knx_cache: 3/0/30

		sollwert:
			knx_send: 3/3/54
</code></pre>
<p>Was passiert hier? Es wird jeweils zuerst die Vorlage geladen, in der die Grundinformationen zu den Items verankert ist. Also Infos zu Typ, Cache, KNX DPT, Visu, Datenbank, etc. Diese Vorlage wird nun im tatsächlichen Item nur noch durch die KNX Adressen ergänzt. Etwaige gleich benannte Attribute werden dabei überschrieben (im Beispiel knx_send: 0/0/0).</p>
<p>In der Version 1.6.0 ist zu beachten, dass auch tatsächlich alle bereits definierten Attribute überschrieben werden, also beispielsweise auch Listeneinträge für eval_trigger. Möchte man also verschiedene Vorlagen mit verschiedenen eval_trigger Einträgen miteinander kombinieren, muss das Attribut nach den struct Einträgen manuell mit allen gewünschten Listeneinträgen überschrieben werden.</p>
<p>Zum Abschluss noch ein weiteres Beispiel, das neben einer klassischen Schaltfunktion für das entsprechende Item auch die Einschaltdauer über die Datenbankeinträge evaluiert. Dank relativer Item-Angaben können somit komplexere Konfigurationsblöcke problemlos wiederverwendet werden. Zum einen erleichtert dieser Ansatz ein Aktualisieren und Erweitern von Itemconfigs ungemein, zum anderen bleibt in den yaml Files die Übersicht bewahrt (auch wenn Letzteres Dank Admin Tool zukünftig weniger Relevanz haben wird). Folgend zwei separate Vorlagen:</p>
<pre><code class="language-yaml">
#struct.yaml
schaltervorlage:
    name: einfache Vorlage für Schalter
    sa:
        knx_dpt: 1
        visu_acl: rw
        type: bool
        database: yes
        cache: yes

    sperren:
        knx_dpt: 1
        visu_acl: rw
        type: bool

laufzeitvorlage:
    name: Vorlage für Laufzeitmessung
    laufzeit_1w:
        type: num
        visu_acl: ro
        crontab: init
        eval: (sh...sa.db('on', '1w') or 0) * 10080
        eval_trigger:
          - ..sa

    laufzeit_24h:
        type: num
        visu_acl: ro
        crontab: init
        eval: (sh...sa.db('on', '24h') or 0) * 1440
        eval_trigger:
          - ..sa
</code></pre>
<p>Die tatsächlichen Items benötigen schließlich wieder nur eine Angabe der KNX Adressen, alle anderen Funktionalitäten und Definition werden über die Vorlage eingebunden:</p>
<pre><code class="language-yaml">
#item.yaml
schalter1:
    <strong>struct: schaltervorlage</strong>
    sa: 
        knx_send: 1/1/1
    sperren:
        knx_send: 1/1/2

schalter2:
    <strong>struct: 
      - schaltervorlage
      - laufzeitvorlage</strong>

    sa: 
        knx_send: 1/1/3

    sperren:
        knx_send: 1/1/4

    laufzeit_1w:
        eval_trigger:
          - ..sa
          - ..sperren

schalter3:
    <strong>struct: schaltervorlage</strong>

    laufzeit:
          <strong>struct: laufzeitvorlage</strong>
</code></pre>
<p>Schalter1 greift ledigilich auf eine Vorlage (schaltervorlage) zurück, während Schalter2 mehrere Vorlagen als Liste miteinander kombiniert. Für Schalter2 existieren also auch die Einträge laufzeit_1w und laufzeit_24h, die eben die Einschaltdauer während der letzten Woche bzw. 24 Stunden von der Datenbank auslesen. Die Triggerung der laufzeit_1w soll in diesem Fall auch vom Sperritem erfolgen, während dies bei Schalter3 lediglich durch das in der Vorlage angegebene Schaltitem geschieht. Da Schalter3 keine Angaben zu den KNX Gruppenadressen macht, handelt es sich hier auch nicht um einen KNX Schalter, sondern z.B. ein Item, das nur über eine Logik oder die Visu geschalten werden kann/soll. Das schalter3 Beispiel zeigt auch, dass die Structs auf jeder beliebigen Hierarchieebene eingebunden werden können.</p>
<h5>Limitierungen</h5>
<p>Aktuell (inkl. Version 1.9) ist es nicht möglich, structs beliebig zu verschachteln. Das Einbeziehen von anderen structs in einem selbst kreierten struct ist nur auf Rootebene möglich, also beispielsweise so:</p>
<pre><code class="language-yaml">
    # struct.yaml
    beispielstruct1:
        test1:
            type: bool
            initial_value: True

    beispielstruct2:
        test2:
            type: bool
            initial_value: False

    combinedstruct:
        struct:
          - beispielstruct1
          - beispielstruct2
</code></pre>
<h5>Debugging</h5>
<p>Im Admin Interface sind alle structs, sowohl die von den aktiven Plugins als auch die selbst erstellten einsehbar. Hier lässt sich somit auch prüfen, wie die Structs miteinander kombiniert wurden. Ob und wie der Merge mit Attributen aus den Items geklappt hat, lässt sich am besten im Item Baum nachvollziehen.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/itemvorlagen-nutzen-structs/feed</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Anzahl eingeschalteter Lampen ermitteln</title>
		<link>https://www.smarthomeng.de/anzahl-eingeschalteter-lampen-ermitteln</link>
					<comments>https://www.smarthomeng.de/anzahl-eingeschalteter-lampen-ermitteln#comments</comments>
		
		<dc:creator><![CDATA[Martin Sinn]]></dc:creator>
		<pubDate>Sun, 08 Apr 2018 10:08:56 +0000</pubDate>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Logiken]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1457</guid>

					<description><![CDATA[Ziel Anzahl und Position der eingeschalteten Lampen ermitteln und visualisieren. Logik Es werden alle Lichter gesucht, die nicht auf Taster oder Level enden und die nicht in Zentral definiert sind. Die eingeschalteten Lichter werden als Link zum Ausschalten gespeichert, so dass sie bequem später ausgeschaltet werden können. /usr/local/smarthome/logics/light.py #!/usr/bin/env python<a class="moretag" href="https://www.smarthomeng.de/anzahl-eingeschalteter-lampen-ermitteln"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h3>Ziel</h3>
<p>Anzahl und Position der eingeschalteten Lampen ermitteln und visualisieren.</p>
<h3>Logik</h3>
<p>Es werden alle Lichter gesucht, die nicht auf Taster oder Level enden und die nicht in Zentral definiert sind. Die eingeschalteten Lichter werden als Link zum Ausschalten gespeichert, so dass sie bequem später ausgeschaltet werden können.</p>
<h4>/usr/local/smarthome/logics/light.py</h4>
<pre><code class="language-python">#!/usr/bin/env python

counter = []

# finde alle Lichter, die eingeschaltet sind (und nicht auf taster oder level enden)
for item in sh.match_items('*.licht.*'):
	if item() and not item.id().endswith('taster') and not item.id().endswith('level') and not item.id().startswith('zentral') and not item.id().endswith('aussen'):
		counter.append(item)

# ermittle licht bool wert
if len(counter) &gt; 0:
	sh.zentral.zaehler.licht(1)
else:
	sh.zentral.zaehler.licht(0)

# setze licht anzahl wert
sh.zentral.zaehler.licht.anzahl(len(counter))
	
# ermittle Namen der Lichter, die eingeschaltet sind
namen = "&lt;ul class='logik_licht'&gt;"
for item in counter:
	parent_item = item.return_parent()
	namen += "&lt;li&gt;&lt;a href=\"#\" class=\"ui-link\" onclick=\"io.write(\'"+item.id()+"\',0);\"&gt;{0} {1}&lt;/a&gt;&lt;/li&gt;".format(str(parent_item), str(item))
	
namen += "&lt;/ul&gt;"
	
# setze Namen der eingeschalteten Lichter
sh.zentral.zaehler.licht.namen(namen.strip())
		
# Logging
logger.info("Es sind {0} Lichter an. ( {1})".format(str(sh.zentral.zaehler.licht.anzahl()), sh.zentral.zaehler.licht.namen()))</code></pre>
<p>Die Logik aktiviert man unter etc/logic.conf mit dem Eintrag von:</p>
<p>&nbsp;</p>
<h4>/usr/local/smarthome/etc/logic.yaml</h4>
<p>In der Zentral.conf habe ich Elemente definiert, die die ermittelten Werte aufnehmen.</p>
<pre><code class="language-yaml">lichter:
    filename: light.py
    watch_item: *.licht.*</code></pre>
<p>&nbsp;</p>
<h4>/usr/local/smarthome/items/Zentral.yaml</h4>
<pre><code class="language-yaml"># /usr/local/smarthome/items/Zentral.conf
zentral:
    name: Zentral

    zaehler:
        name: Zähler
        sv_page: room

        licht:
            name: Licht an
            type: bool
            visu: yes

            anzahl:
                name: Anzahl eingeschalteter Lichter
                type: num
                visu: yes

            namen:
                name: Eingeschaltete Lichter
                type: str
                visu: yes</code></pre>
<p>&nbsp;</p>
<h3>Items</h3>
<p>Folgende Items werden benötigt.</p>
<h4>/usr/local/smarthome/items/EG.yaml</h4>
<pre><code class="language-yaml">eg:
    name: Erdgeschoß

    flur:
        name: Flur
        sv_page: room
        sv_img: scene_hall.png

        licht:
            name: Flur

            decke:
                name: Dimmer
                type: bool
                visu: yes
                visu_acl: rw
                sv_img: light_ceiling_light.png

                level:
                    type: num
                    visu: yes
                    visu_acl: rw</code></pre>
<p>&nbsp;</p>
<h3>HTML-Seite</h3>
<p>Die ermittelten Werte können nun in einer HTML-Seite wie folgt angezeigt werden:</p>
<pre><code class="language-twig">Es sind &lt;strong&gt;{{ basic.value('zentral.zaehler.licht.anzahl.1', 'zentral.zaehler.licht.anzahl', '', '') }}&lt;/strong&gt; Lichter an
&lt;br/&gt;
( {{ basic.value('zentral.zaehler.licht.namen.1', 'zentral.zaehler.licht.namen', '', '') }} )</code></pre>
<p>&nbsp;</p>
<hr />
<p><small>15.02.2014: Original Wiki Beitrag von <strong>ReneHezser<br />
</strong></small><small>19.05.2015: Überarbeitung durch <strong>cstrassburg</strong> </small></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/anzahl-eingeschalteter-lampen-ermitteln/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Verarbeiten von JSON Messsages in Items</title>
		<link>https://www.smarthomeng.de/verarbeiten-von-json-messsages-in-items</link>
					<comments>https://www.smarthomeng.de/verarbeiten-von-json-messsages-in-items#respond</comments>
		
		<dc:creator><![CDATA[Martin Sinn]]></dc:creator>
		<pubDate>Fri, 06 Apr 2018 19:33:11 +0000</pubDate>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[mqtt1]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=1414</guid>

					<description><![CDATA[Verarbeiten von JSON Daten Eine Reihe von Devices liefert Antworten bzw. Stati in Form von JSON formatierten Daten zurück. Diese Daten können in Items verwendet werden, wenn sie in Items vom Typ dict oder vom Typ list eingelesen werden können. &#160; Einlesen von JSON Messages in dicts mit dem MQTT Plugin<a class="moretag" href="https://www.smarthomeng.de/verarbeiten-von-json-messsages-in-items"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h2>Verarbeiten von JSON Daten</h2>
<p>Eine Reihe von Devices liefert Antworten bzw. Stati in Form von JSON formatierten Daten zurück. Diese Daten können in Items verwendet werden, wenn sie in Items vom Typ <strong>dict</strong> oder vom Typ <strong>list</strong> eingelesen werden können.</p>
<p>&nbsp;</p>
<h3>Einlesen von JSON Messages in <strong>dict</strong>s mit dem MQTT Plugin</h3>
<p>Besonders einfach ist das Einlesen von Daten in Items der Typs <strong>dict</strong>, wenn man MQTT Messages mit dem aktuellen MQTT Plugin empfängt. Das MQTT Protokoll bis zur Version 3.1x unterstützt keine Datentypen. Die Payload, also die übertragenen Daten, werden immer als Array of Byte übertragen.</p>
<p>Das aktuelle MQTT Plugin unterstützt das Casting in den Datentyp des Items. Wenn also z.B. das Item vom Typ <strong>str</strong> ist, wird beim Empfang das Array of Byte in einen String gewandelt.</p>
<p>Wenn man in der Payload der MQTT Message JSON formatierte Daten in ein Item vom Typ <strong>dict</strong> empfängt, werden die Daten in Form eines <strong>Python dict</strong> gespeichert und können in Logiken und eval-Ausdrücken entsprechend weiter verarbeitet werden.</p>
<p>Bei komplexen JSON Strukturen ist die Weiterverarbeitung mit einer Logik zu empfehlen. Bei einfacheren Strukturen kann die Weiterverarbeitung jedoch auch sehr gut in Items mit Hilfe von <strong>eval</strong> oder <strong>on_change</strong> erfolgen.</p>
<p>&nbsp;</p>
<h4>Ein einfaches JSON Beispiel</h4>
<p>Wenn eine MQTT Message z.B. folgende Daten liefert:</p>
<pre><code class="language-json">{  
   "key1":"value1",
   "key2":"value2",
   "key3":"value3"
}</code></pre>
<p>und Du nur den Wert von <strong>key2</strong> benötigst, kannst Du das über ein Hilfs-Item lösen, in dem Du die MQTT Payload einliest und den entsprechenden Wert in das Ziel-Item schreibst. Dazu musst Du die Items folgendermaßen definieren:</p>
<pre><code class="language-yaml">
test:
    hilfs_item:
        type: dict
        mqtt_topic_in: <mark>test/test</mark>
        on_change: ..ziel_item = value['key2']

    ziel_item:
        type: str</code></pre>
<p>Das MQTT Topic musst Du durch einen sinnvollen Wert ersetzen. Natürlich kann im <strong>on_change</strong> Attribut anstelle der relativen Item Adressierung auch die absolute Adressierung (<strong>test.ziel_item</strong>) verwendet werden.</p>
<p>&nbsp;</p>
<p>Alternativ kannst Du das auch mit <strong>eval</strong> / <strong>eval_trigger</strong> lösen:</p>
<pre><code class="language-yaml">test:
    hilfs_item:
        type: dict
        mqtt_topic_in: <mark>test/test</mark>

    ziel_item:
        type: str
        eval: sh.test.hilfs_item()['key2']
        eval_trigger: test.hilfs_item</code></pre>
<p>Diese Variante kannst Du natürlich auch mit relativer Item-Adressierung realisieren.</p>
<p>&nbsp;</p>
<h3>Einlesen von JSON Messages in <strong>list</strong>s mit dem MQTT Plugin</h3>
<p>Wenn man in der Payload der MQTT Message JSON formatierte Daten in ein Item vom Typ <strong>list</strong> empfängt, werden die Daten in Form eines <strong>Python list</strong> gespeichert und können in Logiken und eval-Ausdrücken entsprechend weiter verarbeitet werden.</p>
<p>&nbsp;</p>
<h4>Ein einfaches JSON Beispiel</h4>
<p>Wenn eine MQTT Message z.B. folgende Daten liefert:</p>
<pre><code class="language-json">[  
   "value1",
   "value2",
   "value3"
]</code></pre>
<p>und Du nur den zweiten Wert von benötigst, kannst Du das über ein Hilfs-Item lösen, in dem Du die MQTT Payload einliest und den entsprechenden Wert in das Ziel-Item schreibst.</p>
<p>Listen sind so definiert, dass das ersten Element den Index 0 hat. Um den zweiten Wert zu adressieren, musst Du den Index 1 verwenden. Dazu musst Du die Items folgendermaßen definieren:</p>
<pre><code class="language-yaml">
test:
    hilfs_item:
        type: list
        mqtt_topic_in: <mark>test/test</mark>
        on_change: ..ziel_item = value[1]

    ziel_item:
        type: str</code></pre>
<p>&nbsp;</p>
<h3>Auswertung komplexerer Datenstrukturen</h3>
<p>Ein <strong>dict</strong> oder eine <strong>list</strong> kann statt einfacher Daten auch <strong>dict</strong>s oder <strong>list</strong>s enthalten. Auch diese Daten lassen sich auswerten und es können Einzelwerte dieser Datenstruktur in Items gespeichert werden.</p>
<p>Wenn eine MQTT Message z.B. folgende Daten liefert:</p>
<pre><code class="language-json">{  
   "key1":"value1",
   "key2":[  
      "value21",
      "value22",
      "value23"
   ],
   "key3":{  
      "key31":"value31",
      "key32":"value32",
      "key33":"value33"
   }
}</code></pre>
<p>&nbsp;</p>
<p>kannst Du folgendermaßen auf den <strong>value22</strong> oder den <strong>value33</strong> zugreifen:</p>
<pre><code class="language-yaml">
test:
    hilfs_item:
        type: dict
        mqtt_topic_in: <mark>test/test</mark>
        on_change: 
          - ..ziel_item1 = value['key2'][0]
          - ..ziel_item2 = value['key3']['key33']

    ziel_item1:
        type: str

    ziel_item2:
        type: str
</code></pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/verarbeiten-von-json-messsages-in-items/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Scheduler Änderungen funktionieren nicht mehr nach 1.4.x Umstellung</title>
		<link>https://www.smarthomeng.de/sh-trigger-funktioniert-nicht-mehr-nach-1-4-2-umstellung</link>
					<comments>https://www.smarthomeng.de/sh-trigger-funktioniert-nicht-mehr-nach-1-4-2-umstellung#comments</comments>
		
		<dc:creator><![CDATA[Martin Sinn]]></dc:creator>
		<pubDate>Fri, 30 Mar 2018 14:03:20 +0000</pubDate>
				<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Logiken]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Scheduler]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=926</guid>

					<description><![CDATA[Um Namenskonflikte innerhalb von SmartHomeNG zu vermeiden, sind mit der Version 1.4.x von SmartHomeNG für Scheduler mehrere separate Namensräume eingeführt worden. Es gibt jeweils einen eigenen Namensraum für Scheduler, die durch Items Logiken Scheduler erzeugt wurden. Die Scheduler sind im Backend auf unterschiedlichen Reitern auf der Seite Scheduler zu sehen.<a class="moretag" href="https://www.smarthomeng.de/sh-trigger-funktioniert-nicht-mehr-nach-1-4-2-umstellung"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Um Namenskonflikte innerhalb von SmartHomeNG zu vermeiden, sind mit der Version 1.4.x von SmartHomeNG für Scheduler mehrere separate Namensräume eingeführt worden.</p>
<p>Es gibt jeweils einen eigenen Namensraum für Scheduler, die durch</p>
<ul>
<li>Items</li>
<li>Logiken</li>
<li>Scheduler</li>
</ul>
<p>erzeugt wurden. Die Scheduler sind im Backend auf unterschiedlichen Reitern auf der Seite <strong>Scheduler</strong> zu sehen. Auf einem vierten Reiter sind die Scheduler zu sehen, die nicht in diese drei Namensräume fallen.</p>
<p>Das erweiterte API um diese Scheduler sauber anzusprechen ist noch auf der To Do Liste.</p>
<p>Zur Zeit können diese Scheduler über die bisherigen Scheduler Methoden angesprochen werden. Den Namen muss dabei jeweils ein Präfix vorangestellt werden.</p>
<p>Für:</p>
<ul>
<li>items   -&gt;   items.&lt;scheduler name&gt;</li>
<li>Logiken   -&gt;   logics.&lt;scheduler name&gt;</li>
<li>Plugins   -&gt;   plugins.&lt;scheduler name&gt;</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/sh-trigger-funktioniert-nicht-mehr-nach-1-4-2-umstellung/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Wie funktionieren eval und eval_trigger</title>
		<link>https://www.smarthomeng.de/wie-funktionieren-eval-und-eval_trigger</link>
					<comments>https://www.smarthomeng.de/wie-funktionieren-eval-und-eval_trigger#respond</comments>
		
		<dc:creator><![CDATA[Bernd Meiners]]></dc:creator>
		<pubDate>Wed, 25 Oct 2017 00:35:59 +0000</pubDate>
				<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Items]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=358</guid>

					<description><![CDATA[eval und eval_trigger Ein Attribut eval enthält eine Zeile Python die genau einen Wert zurückliefert. Es ist quasi eine Einzeilenfunktion. Der Syntax entspricht einer Python conditional expression. Wenn in dieser Funktion Werte von Items genutzt werden sollen, dann müssen die Aufrufe die Form sh&#8230;.&#60;Item-Name&#62;() haben. Sollte man sh. am Anfang<a class="moretag" href="https://www.smarthomeng.de/wie-funktionieren-eval-und-eval_trigger"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h2>eval und eval_trigger</h2>
<p>Ein Attribut <strong>eval</strong> enthält eine Zeile Python die genau einen Wert zurückliefert. Es ist quasi eine Einzeilenfunktion. Der Syntax entspricht einer Python <a href="https://www.python.org/dev/peps/pep-0308/">conditional expression</a>.</p>
<p>Wenn in dieser Funktion Werte von Items genutzt werden sollen, dann müssen die Aufrufe die Form sh&#8230;.&lt;Item-Name&gt;() haben. Sollte man sh. am Anfang vergessen funktioniert es genauso wenig, wie wenn man die Klammern am Ende wegläßt.</p>
<p>Ein Attribut <strong>eval_trigger</strong> ist nur eine Auflistung von Itemnamen, diese werden jedoch ohne sh. am Anfang aufgeführt.</p>
<p>&nbsp;</p>
<h3>eval Syntax</h3>
<p>Ein Beispiel für einen eval Ausdruck:</p>
<p style="padding-left: 30px;"><span>eval=value if value&gt;0 else 0</span></p>
<p><strong>Achtung</strong>: Ein if-Statement in einem eval-Ausdruck muss auch einen else-Zweig haben.</p>
<p>&nbsp;</p>
<h3>Beispiele</h3>
<p><strong>Richtig</strong>:</p>
<pre><code class="language-yaml">
myitem:
    eval: sh.my.value<mark>()</mark></code>
    eval_trigger: my.value|my.other.value
</code></pre>
<p>&nbsp;<br />
<strong>Falsch</strong>: </p>
<pre><code class="language-yaml">
myitem:
    eval: sh.my.value
    eval_trigger: <mark>sh.</mark>my.value|<mark>sh.</mark>my.other.value)
</code></pre>
<hr />
<p><small>08.04.2018: Ergänzt um Informationen aus einem Wiki Beitrag von <strong>henfri</strong>.</small></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/wie-funktionieren-eval-und-eval_trigger/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Namensvergabe bei Items</title>
		<link>https://www.smarthomeng.de/namensvergabe-bei-items</link>
					<comments>https://www.smarthomeng.de/namensvergabe-bei-items#respond</comments>
		
		<dc:creator><![CDATA[Martin Sinn]]></dc:creator>
		<pubDate>Sun, 26 Feb 2017 00:27:09 +0000</pubDate>
				<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Plugins]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=356</guid>

					<description><![CDATA[Item Namensvergabe Bei der Wahl von Itemnamen ist folgendes zu beachten: Plugin-Instanzen und Items der obersten Ebene (Top-Level) teilen sich den Namensraum. Es sollte vermieden werden, Top-Level Items einen Namen zu geben, der in ../etc/plugin.yaml (bzw. ../etc/plugin.conf) bereits für eine Plugin-Instanz gewählt wurde. Dieses kann zu unvorhergesehenen Problemen führen. (z.B.: Wenn<a class="moretag" href="https://www.smarthomeng.de/namensvergabe-bei-items"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h1>Item Namensvergabe</h1>
<p>Bei der Wahl von Itemnamen ist folgendes zu beachten: Plugin-Instanzen und Items der obersten Ebene (Top-Level) teilen sich den Namensraum.</p>
<p>Es sollte vermieden werden, Top-Level Items einen Namen zu geben, der in <strong>../etc/plugin.yaml</strong> (bzw. ../etc/plugin.conf) bereits für eine Plugin-Instanz gewählt wurde. Dieses kann zu unvorhergesehenen Problemen führen. (z.B.: Wenn ein Plugin Funktionen implementiert hat, wird dies beim Aufruf dieser Funktionen zu Problemen führen, da SmartHomeNG dann versucht auf eine (nicht existierende) Methode des Items zuzugreifen, statt auf das Plugin.)</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/namensvergabe-bei-items/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Min- u. Max-Werte von Temperaturen</title>
		<link>https://www.smarthomeng.de/min-u-max-werte-von-temperaturen</link>
					<comments>https://www.smarthomeng.de/min-u-max-werte-von-temperaturen#comments</comments>
		
		<dc:creator><![CDATA[Bernd Meiners]]></dc:creator>
		<pubDate>Sun, 01 Nov 2015 11:32:57 +0000</pubDate>
				<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Items]]></category>
		<category><![CDATA[Plugins]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=988</guid>

					<description><![CDATA[Möchte man die Min und Max-Werte zu einem Item bestimmen, ist dies mit smarthome.py einfach möglich. Vorraussetzung ist, dass die Werte zu dem Item aufgezeichnet werden. Dazu wird ein Eintrag in der Datei /etc/plugin.yaml benötigt: sql: plugin_name: database Anschliessend wird im Item die Aufzeichnung aktiviert mit &#8218;database: yes&#8216; bzw. &#8218;database:<a class="moretag" href="https://www.smarthomeng.de/min-u-max-werte-von-temperaturen"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Möchte man die Min und Max-Werte zu einem Item bestimmen, ist dies mit smarthome.py einfach möglich. Vorraussetzung ist, dass die Werte zu dem Item aufgezeichnet werden. Dazu wird ein Eintrag in der Datei /etc/plugin.yaml benötigt:</p>
<pre><code class="language-yaml">sql:
    plugin_name: database
</code></pre>
<p>Anschliessend wird im Item die Aufzeichnung aktiviert mit &#8218;database: yes&#8216; bzw. &#8218;database: init&#8216;. Nun können weitere Items angelegt werden, die mit Hilfe einer Funktion, die das database-Plugin bereitstellt, die benötigten Werte erhalten.</p>
<p>Das ganze sieht dann in etwa wie folgt aus:</p>
<pre><code class="language-yaml">sensor:
    carport:
        temp:
            type: num   
            knx_dpt: 9  
            knx_send: 3/4/11  
            knx_reply: 3/4/11
            ow_addr: '28.52F1AA030000'
            ow_sensor: T 
            database: init  # Aufzeichnung der Daten aktivieren
            min:
                type: num
                knx_dpt: 9
                knx_send: 3/4/14
                knx_reply: 3/4/14
                eval: "sh.sensor.carport.temp.db('min', '28h')"  # Mimium über die letzten 28h berechnen
                eval_trigger: sensor.carport.temp  # Änderungen der Temperatur triggern die Neuberechnung
            max:
                type: num
                knx_dpt: 9
                knx_send: 3/4/15
                knx_reply: 3/4/15
                eval: "sh.sensor.carport.temp.db('max', '28h')"  # Maximum über die letzten 28h berechnen
                eval_trigger: sensor.carport.temp   # Änderungen der Temperatur triggern die Neuberechnung
</code></pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/min-u-max-werte-von-temperaturen/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
