<?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>onkelandy &#8211; SmartHomeNG | smarthome knx homematic mqtt hue 1wire home automation</title>
	<atom:link href="https://www.smarthomeng.de/author/onkelandy/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, 05 Aug 2024 13:18:36 +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>onkelandy &#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>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>Nutzen des UZSU Plugins für eine detaillierte Lichtkurvensteuerung</title>
		<link>https://www.smarthomeng.de/using-the-uzsu-plugin-for-advanced-light-control</link>
					<comments>https://www.smarthomeng.de/using-the-uzsu-plugin-for-advanced-light-control#respond</comments>
		
		<dc:creator><![CDATA[onkelandy]]></dc:creator>
		<pubDate>Tue, 11 Sep 2018 11:49:55 +0000</pubDate>
				<category><![CDATA[develop]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Automatik]]></category>
		<category><![CDATA[Licht]]></category>
		<category><![CDATA[Lichtkurven]]></category>
		<category><![CDATA[light]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[uzsu]]></category>
		<category><![CDATA[Zeitplan]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=2081</guid>

					<description><![CDATA[Für eine einfache Einführung in das Plugin lesen Sie bitte den anderen Blogartikel über die Steuerung von Rollläden. Ab UZSU Plugin Version 1.5.2 und smartVISU 2.9 Commit 5d15a36 (Stand Ende August 2018) gibt es eine neue Funktion im Universal Time Scheduler Plugin, mit der man eine Interpolation zwischen den angegebenen<a class="moretag" href="https://www.smarthomeng.de/using-the-uzsu-plugin-for-advanced-light-control"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<p>Für eine einfache Einführung in das Plugin lesen Sie bitte den anderen Blogartikel über die <a href="https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds">Steuerung von Rollläden</a>.</p>
<p>Ab UZSU Plugin Version 1.5.2 und smartVISU 2.9 Commit 5d15a36 (Stand Ende August 2018) gibt es eine neue Funktion im Universal Time Scheduler Plugin, mit der man eine Interpolation zwischen den angegebenen Zeitpunkten einstellen kann. Dies ist besonders nützlich, wenn Sie circadiane Lichtkurven für warmweißes und kaltweißes Licht programmieren möchten, kann aber auch für RGB-LEDs nützlich sein.</p>
<p><strong>Hinweis</strong>: Bei aktivierter Interpolation interpoliert das Plugin ständig und sendet Werte im angegebenen Intervall, auch über Mitternacht. Wenn Sie Ihr Licht z.B. nur zwischen 20 Uhr (0%) und 21 Uhr (100%) dimmen wollen, müssen Sie einen zusätzlichen Wert um 21.01 Uhr (0%) einstellen. Andernfalls wird das Licht zwischen heute 21 Uhr und morgen 20 Uhr nur langsam gedimmt.</p>
<p>Unten sehen Sie ein Beispiel, wie das Widget von Stefan Widmer in smartVISU aussieht:</p>
<div id="attachment_2083" style="width: 760px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-2083" src="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light-1024x505.png" alt="UZSU Graph" width="750" height="370" class="size-large wp-image-2083" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light-1024x505.png 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light-300x148.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light-768x379.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light.png 1800w" sizes="(max-width: 750px) 100vw, 750px" /><p id="caption-attachment-2083" class="wp-caption-text">UZSU Graph widget mit Lichtkurven</p></div>
<p>Die obere rote Kurve zeigt den Verlauf des warmweißen Lichts über einen Tag (24 Stunden). Es gibt mehrere Punkte, die durch einfaches Anklicken der spezifischen x,y-Koordinaten im Diagramm festgelegt werden können. Die blauen Punkte sind &#8222;Standard&#8220;-Zeiteinstellungen um ca. Mitternacht, 5 Uhr, 8 Uhr, 18 Uhr und 21 Uhr. Der gelbe Punkt bezieht sich auf den Sonnenaufgang, der orangefarbene auf den Sonnenuntergang. Mit den Griffen neben diesen Punkten können Sie die &#8222;frühesten&#8220; und &#8222;spätesten&#8220; Werte durch Ziehen ändern.</p>
<p>Die untere blaue Kurve zeigt die Werte für das kalte weiße Licht. Die Punkte sind fast zu den gleichen Zeitpunkten gesetzt wie für das warmweiße Licht, allerdings mit Spitzenwerten am Morgen und am frühen Abend. Beide Kurven sind im Moment auf kubische Interpolation eingestellt. Sie können die Interpolation jedoch in der oberen rechten Ecke auf keine oder lineare Interpolation ändern. Um alle UZSU-Einstellungen für ein Element zu deaktivieren, klicken Sie auf das Kontrollkästchen in der oberen linken Ecke. Um einige Werte separat zu deaktivieren, klicken Sie auf diese und deaktivieren Sie die Schaltfläche &#8222;Akt/Act&#8220; (siehe unten). Inaktive Einträge werden in der Grafik als Rauten dargestellt, inaktive Elemente sind ausgegraut.</p>
<p>Um bestehende Einstellungen zu ändern, können Sie einfach die entsprechenden Punkte im Diagramm ziehen. Wenn Sie auf einen bestehenden Punkt klicken, können Sie weitere Details für sonnenabhängige Zeiten ändern oder die Einstellung nur für bestimmte Wochentage gelten lassen. Wenn Sie dies tun, wird das Diagramm wie unten dargestellt aktualisiert, wobei am Wochenende das Licht während der Nacht heller bleibt:</p>
<div id="attachment_2086" style="width: 760px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-2086" src="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_week-1024x249.png" alt="UZSU Graph" width="750" height="182" class="size-large wp-image-2086" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_week-1024x249.png 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_week-300x73.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_week-768x187.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_week.png 1646w" sizes="(max-width: 750px) 100vw, 750px" /><p id="caption-attachment-2086" class="wp-caption-text">UZSU Graph widget mit Lichtkurven für die ganze Woche</p></div>
<p>Das Einfügen des Diagramm-Widgets in Ihre smartVISU ist ziemlich einfach:</p>
<pre><code class="language-twig">
{{ device.uzsugraph('graph', 'coldwhite.uzsu', 'cold white', 1, 'num', [0, 255, 5]) }}</code></pre>
<p>Natürlich ist es auch möglich, das uzsuicon-Widget zu verwenden, um die Timings auf eine weniger grafische Weise zu konfigurieren. Implementieren Sie das als:</p>
<pre><code class="language-twig">
{{ device.uzsuicon('icon', 'coldwhite.uzsu', 'cold white', '', '', 'num') }}</code></pre>
<p>Wenn Sie auf das Symbol klicken, öffnet sich ein Popup-Fenster (siehe unten):</p>
<div id="attachment_2088" style="width: 562px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-2088" src="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_popup-1024x939.png" alt="uzsu_popup" width="552" height="506" class=" wp-image-2088" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_popup-1024x939.png 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_popup-300x275.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_popup-768x704.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_light_popup.png 1342w" sizes="(max-width: 552px) 100vw, 552px" /><p id="caption-attachment-2088" class="wp-caption-text">UZSU Graph widget popup für Lichter</p></div>
<p>Die Funktionsweise dieses Widgets wird in der smartVISU-Dokumentation und im Blogeintrag über die <a href="https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds">Verwendung der UZSU zur Rolladensteuerung</a> näher beschrieben. In diesem Blogeintrag wird auch die Funktion &#8222;Zurück in der Zeit&#8220;, die Sie unten links sehen, näher erläutert. Außerdem sehen Sie in diesem Artikel, wie Sie Ihre Einträge für das UZSU-Plugin einrichten.</p>
<p>Um einen UZSU-Eintrag über die Logik zu aktualisieren, können Sie die folgenden Funktionen verwenden:</p>
<pre><code class="python">
# query the next scheduled value and time
sh.coldwhite.uzsu.planned()

# query the interpolation settings
sh.coldwhite.uzsu.interpolation()

# query whether the uzsu is set active or not
sh.coldwhite.uzsu.activate()

# set the uzsu active or inactive
sh.coldwhite.uzsu.activate(True/False)

# set interpolation options
sh.coldwhite.uzsu.interpolation(type='linear/none/cubic', interval=5, backintime=0)

# clear your settings of the uzsu item. BE CAREFUL!
sh.coldwhite.uzsu.clear(True)
</code></pre>
<p>Diese Funktionen können auch für einige einfache Logiken wie in diesem Beispiel verwendet werden:</p>
<p>Sie möchten ein bestimmtes Licht (z.B. Weihnachtsdekoration) zu einer bestimmten Zeit einschalten. Wenn Sie das Haus verlassen, möchten Sie dieses Licht ausschalten. Bei der Rückkehr nach Hause soll es (nur) dann wieder eingeschaltet werden, wenn die UZSU es in der Zwischenzeit nicht ausgeschaltet hätte:</p>
<pre><code class="python">
uzsustatus = sh.light.uzsu.planned()
if (uzsustatus['value'] == 0) and (sh.light.uzsu.activate() == True):
    sh.light(1)
</code></pre>
<p>Seit smarthomgeNG 1.6.1 kann dies noch einfacher mit der Funktion lastvalue() erreicht werden:</p>
<pre><code class="python">
sh.light(sh.light.uzsu.lastvalue())<span style="color: #3c4858;font-family: Roboto, Helvetica, Arial, sans-serif"><span>
</span></span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/using-the-uzsu-plugin-for-advanced-light-control/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nutzen des UZSU Plugins zum automatischen Schalten von Rollläden</title>
		<link>https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds</link>
					<comments>https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds#comments</comments>
		
		<dc:creator><![CDATA[onkelandy]]></dc:creator>
		<pubDate>Sat, 08 Sep 2018 09:09:33 +0000</pubDate>
				<category><![CDATA[develop]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Automatik]]></category>
		<category><![CDATA[blinds]]></category>
		<category><![CDATA[Jalousien]]></category>
		<category><![CDATA[Rolladen]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[uzsu]]></category>
		<category><![CDATA[Zeitplan]]></category>
		<category><![CDATA[Zeitreihen]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=2062</guid>

					<description><![CDATA[Einleitung Das UZSU-Plugin ist nützlich, um bestimmte Werte für Ihre Artikel zu bestimmten Zeiten einzustellen. Durch die Möglichkeit, auch Sonnenauf- und -untergangsberechnungen einzubeziehen, können Sie zum Beispiel eine ganz einfache Steuerung Ihrer Jalousien erstellen. Die Konfiguration des Plugins ist sehr einfach, da es keine spezifischen Parameter zu setzen gibt. Dennoch<a class="moretag" href="https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h5>Einleitung</h5>
<p>Das UZSU-Plugin ist nützlich, um bestimmte Werte für Ihre Artikel zu bestimmten Zeiten einzustellen. Durch die Möglichkeit, auch Sonnenauf- und -untergangsberechnungen einzubeziehen, können Sie zum Beispiel eine ganz einfache Steuerung Ihrer <strong>Jalousien</strong> erstellen.</p>
<p>Die Konfiguration des Plugins ist sehr einfach, da es keine spezifischen Parameter zu setzen gibt. Dennoch müssen Sie ein Element erstellen, in dem Ihr automatischer Zeitplan im Cache gespeichert werden soll. Der einfachste Weg, dies zu tun, ist die Erstellung eines untergeordneten Objekts mit relativer Referenzierung wie unten dargestellt. So können Sie dieses Objekt einfach in alle Objekte kopieren, die den UZSU verwenden sollen. Dieses Element muss auch ein uzsu_item-Attribut haben, das definiert, welches Element geändert werden soll. Sie können auch einfach die neue struct-Funktion verwenden und auf struct verweisen: <strong>uzsu.child</strong></p>
<pre><code class="language-yaml">
# items/my.yaml
someroom:

    blind1:
        type: num

        uzsu:
            type: dict
            uzsu_item: ..
            cache: 'True'
   blind2:
        type: num
        struct: uzsu.child
</code></pre>
<h5>smartVISU</h5>
<p>Sie können Ihre Zeiten und Werte mit Hilfe einer Logik einstellen (siehe <a href="https://www.smarthomeng.de/user/plugins/uzsu/user_doc.html">UZSU Doku</a>), aber es ist viel bequemer, das UZSU-Widget in smartVISU (2.9 oder neuer) zu verwenden.</p>
<p>Fügen Sie einfach ein Icon zu Ihrem Visu hinzu. Wenn Sie auf das Icon klicken, öffnet sich ein Popup, mit dem Sie Ihre universelle Zeitschaltuhr konfigurieren können.</p>
<pre><code class="language-twig">
{{ device.uzsuicon('uzsu_example', 'someroom.blind1.uzsu', 'Markise', '', '', 'num') }}
</code></pre>
<p>&nbsp;</p>
<div id="attachment_2064" style="width: 760px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2064" src="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_markise-1024x953.png" alt="uszu_blinds" width="750" height="698" class="size-large wp-image-2064" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_markise-1024x953.png 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_markise-300x279.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_markise-768x715.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_markise.png 1332w" sizes="(max-width: 750px) 100vw, 750px" /><p id="caption-attachment-2064" class="wp-caption-text">VISU Widget Screenshot, der das Einstellen von automatisierten Rollläden zeigt</p></div>
<p>Schauen wir uns an, was mit dem obigen (leicht gephotoshoppten) Konfigurations-Popup passiert:</p>
<p>Während der Woche:</p>
<ul>
<li>Die Jalousien öffnen sich (Wert 0) 30 Minuten nach Sonnenaufgang, aber nie vor 7.00 Uhr und nie später als 8.00 Uhr.</li>
<li>Die Jalousien werden bei Sonnenuntergang geschlossen (Wert 100), jedoch nie vor 20.00 Uhr und nie später als 22.00 Uhr.</li>
</ul>
<p>An Wochenenden:</p>
<ul>
<li>Die Jalousien werden um 8.00 Uhr morgens geöffnet (Wert 0).</li>
<li>Die Jalousien können um 21.00 Uhr fast geschlossen werden (Wert 80), sobald die Schaltfläche &#8222;Akt&#8220; (aktiv) neben der Zeile aktiviert ist.</li>
<li>Abends um 23 Uhr werden die Jalousien geschlossen (Wert 100).</li>
</ul>
<h5>Nachholen von verpassten UZSU-Einträgen</h5>
<p><strong>Hinweis</strong>: Die in diesem Abschnitt beschriebene &#8222;Zurück in der Zeit&#8220; bzw. &#8222;back in time&#8220;-Funktionalität ist erst seit der SmartHomeNG-Version v1.6 verfügbar.</p>
<p>Ein Nachteil der UZSU, insbesondere im Vergleich zum Autoblind-Plugin, ist, dass ein Wert möglicherweise nicht gesetzt wird, wenn smarthomeNG in diesem Zeitraum nicht verfügbar ist. Wenn Sie z.B. an einem Wochenende um 7.59 Uhr neu starten, bleiben die Jalousien unten, da der UZSU-Eintrag für 8.00 Uhr höchstwahrscheinlich nicht ausgelöst wird. An dieser Stelle kommt die Funktion &#8222;Zurück in der Zeit&#8220; ins Spiel. Hier können Sie einen Zeitrahmen in Minuten festlegen, in dem das Plugin bei der Initialisierung zurückgehen soll, um einen Auslöser zu finden. Im vorliegenden Beispiel würde ein Wert von 10 Minuten ausreichen, um den Auslöser &#8222;0&#8220; zu finden, der um 8 Uhr morgens gesetzt worden wäre. Bei einer so einfachen Einrichtung könnten Sie die &#8222;Rückwärtszeit&#8220; auf mehrere Stunden erhöhen (z. B. 240 Minuten), aber beachten Sie, dass die Funktion in einer komplexeren Situation mit Bewertungen, Auslösern usw. zu seltsamen Situationen führen könnte.</p>
<h5>Nächste Schritte&#8230;</h5>
<p>Wenn Sie weiter gehen und Sonnenverfolgung, Wetterinformationen usw. einbeziehen möchten, empfiehlt sich die Verwendung des Plugins <a href="https://www.smarthomeng.de/starting-with-state-machine-automation-autoblind-plugin">autoblind/stateengine</a>. Sie können aber auch beide Plugins kombinieren.</p>
<p>Ein Beispiel wäre, das Licht tagsüber nach einer bestimmten Lichtkurve einzustellen (siehe Interpolationsfunktion), es aber nachts auf einen konstant niedrigen Wert zu ändern, sobald alle im Bett sind.</p>
<p>Ein anderes Beispiel wäre, die min_time und max_time aus dem Zustand des Autoblind-Plugins durch ein boolsches Element zu ersetzen (z.B. activate_state_x) und die UZSU zu verwenden, um dieses Element aktiv oder nicht aktiv zu setzen. Dies ist einfach ein bequemer und visueller Weg, um die minimale und maximale Zeit für Ihre Zustände festzulegen.</p>
<p>Schauen Sie sich das viel ausführlichere Beispiel zur <a href="https://www.smarthomeng.de/using-the-uzsu-plugin-for-advanced-light-control">Automatisierung Ihrer Beleuchtung mit der UZSU</a> an.</p>
<p>In SmarthomeNG 1.9, Plugin Version 1.6 wird eine neue Funktion namens &#8222;Zeitreihen&#8220; eingeführt. Damit können Sie wiederkehrende Einstellungen von Werten basierend auf von &#8211; bis Zeiteinstellungen oder einer bestimmten Anzahl von Wiederholungen festlegen. Bei der Angabe von Wiederholungen werden immer die nächsten 24 Stunden ab der Startzeit herangezogen. Zusätzlich sind sonnenbasierte Zeitreihen möglich. Es wird dringend empfohlen, das smartVISU Widget dafür zu verwenden, wie im Screenshot unten zu sehen.</p>
<div id="attachment_2749" style="width: 760px" class="wp-caption aligncenter"><a href="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2749" src="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries-1024x508.png" alt="" width="750" height="372" class="size-large wp-image-2749" srcset="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries-1024x508.png 1024w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries-300x149.png 300w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries-768x381.png 768w, https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries.png 1330w" sizes="(max-width: 750px) 100vw, 750px" /></a><p id="caption-attachment-2749" class="wp-caption-text">VISU Beispiel für Zeitreihen<span style="font-size: 18px"></span></p></div>
<p><a href="https://www.smarthomeng.de/wp-content/uploads/2018/09/uzsu_timeseries.png"></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/using-the-uzsu-plugin-to-automate-blinds/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Starthilfe für das Stateengine Plugin</title>
		<link>https://www.smarthomeng.de/starthilfe-fuer-das-stateengine-plugin</link>
					<comments>https://www.smarthomeng.de/starthilfe-fuer-das-stateengine-plugin#comments</comments>
		
		<dc:creator><![CDATA[onkelandy]]></dc:creator>
		<pubDate>Mon, 02 Apr 2018 06:59:07 +0000</pubDate>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[autoblind]]></category>
		<category><![CDATA[State Machine]]></category>
		<category><![CDATA[stateengine]]></category>
		<category><![CDATA[Zustandsmaschine]]></category>
		<guid isPermaLink="false">https://www.smarthomeng.de/?p=963</guid>

					<description><![CDATA[Einleitung Hinweis: Diese Erklärung basiert auf dem StateEngine Plugin im offiziellen Master &#62;= 1.6 Plugins Repository. Das Plugin war früher unter dem Namen AutoBlind bekannt, das noch auf der Github-Seite des Autors verfügbar AutoBlind 1.4.0 ist. Alle Konfigurationsattribute, die mit se_ (stateengine) beginnen, waren ursprünglich as_ (autostate)! So mal ganz<a class="moretag" href="https://www.smarthomeng.de/starthilfe-fuer-das-stateengine-plugin"> Weiterlesen&#8230;</a>]]></description>
										<content:encoded><![CDATA[<h5>Einleitung</h5>
<p><strong>Hinweis</strong>: Diese Erklärung basiert auf dem StateEngine Plugin im offiziellen Master &gt;= 1.6 Plugins Repository. Das Plugin war früher unter dem Namen AutoBlind bekannt, das noch auf der Github-Seite des Autors verfügbar <a href="https://github.com/i-am-offline/smarthome.plugin.autoblind/tree/Version_1.4.0">AutoBlind 1.4.0 </a>ist. Alle Konfigurationsattribute, die mit se_ (stateengine) beginnen, waren ursprünglich as_ (autostate)!</p>
<p>So mal ganz zu Beginn.. was ist überhaupt eine State Engine..!? Es gibt mehrere Möglichkeiten, eine solche zu definieren. Das Stateengine Plugin arbeitet dabei mit einer Hierarchie von &#8222;States&#8220;, also Zuständen, die nacheinander abgearbeitet werden. Jeder Zustand besteht dabei aus zwei Teilen.</p>
<ul>
<li>&#8222;Conditions&#8220;: Voraussetzungen/Bedingungen, die erfüllt sein müssen, um den Zustand einzunehmen und somit die damit verbundenen Aktionen auszuführen. Genau genommen werden diese Voraussetzungen als &#8222;Condition Sets&#8220; deklariert, also als Gruppe von Voraussetzungen. Nur wenn alle Voraussetzungen einer Gruppe erfüllt sind, wird der Zustand eingenommen. Beispiel: Der Zustand &#8222;Heiß&#8220; soll nur dann eingenommen werden, wenn es draußen entsprechend heiß ist (z.b. Temperatur &gt; 22 Grad) UND die Sonne beim Fenster rein scheint (z.b. Winkel der Sonne liegt zwischen zwei Werten).</li>
<li>&#8222;Actions&#8220;: Aktionen, die ausgeführt werden sollen, wenn ein Zustand eingenommen wird. Im Beispiel &#8222;Heiß&#8220; könnten also zB Jalousien geschlossen werden. Außerdem könnte die Klimaanlage aktiviert werden. Im Normalfall werden immer alle Aktionen eines Zustands der Reihe nach ausgeführt.</li>
</ul>
<p>Sind die Voraussetzungen für einen Zustand nicht erfüllt, wird hierarchisch der nächste Zustand gecheckt. Sind auch dort nicht alle Voraussetzungen erfüllt, geht es zum Zustand darunter, usw. Für die Beschattung könnten die Zustände im einfachsten Fall, wie im unteren Beispiel, aus dem Zustand &#8222;Heiß&#8220; (Schließen) und &#8222;Normal&#8220; (Öffnen) bestehen. Möchte man es etwas flexibler gestalten, fügt man noch z.B. einen Zustand für manuellen Betrieb ein, der es ermöglicht, die Jalousien mittels Schalter trotzdem (für eine bestimmte Zeit) manuell zu fahren. Dazu braucht es dann also einen &#8222;Suspend&#8220; Zustand, der hierarchisch ganz oben (also im yaml File als erstes) definiert werden muss. Dieser Zustand hätte beispielsweise als Voraussetzung, dass innerhalb der letzten x Stunden ein Schalter betätigt wurde. Sobald dann z.B. die Zeit für diesen manuellen Modus abgelaufen ist, kann der Zustand nicht mehr eingenommen werden. Ist es dann immer noch heiß, wird der &#8222;Heiß&#8220; Zustand eingenommen. Ist es inzwischen kühler, wird der Normalzustand eingenommen.</p>
<p>Es gibt nun zwei Strategien, wie diese Zustandsmaschine eingesetzt werden kann:</p>
<ul>
<li>global/generell: Man könnte ein eigenes Item mit den Regeln erstellen, das sich einfach mal um Temperatur und Sonnenstand kümmert. Das ist bei einem Haus aber nicht sonderlich sinnvoll, da ja nicht immer alle Jalousien geschlossen werden sollen, sondern nur die, wo die Sonne auch herein scheint. Insofern wäre ein individueller Einsatz (nächster Punkt) sinnvoller. Wenn es aber beispielsweise um eine Gartenbewässerung geht, muss vielleicht nicht jeder Sprinkler oder Tropfschlauch individuell geschaltet werden, sondern alles soll gleichzeitig aktiviert werden, sobald die Erde trocken ist. Hier könnte man also ein Item namens &#8222;Bewässerung&#8220; erstellen, unter dem dann das Regelwerk mit zwei Zuständen (an und aus oder trocken/nass, wie auch immer man sie nennen will) definiert wird.</li>
<li>individuell: Hierbei wird für jedes Gerät/Item, das individuell gesteuert werden soll, ein eigenes Regelwerk definiert. Im &#8222;Heiß&#8220; Szenario würde man also unterhalb jeder Jalousie oder Jalousiegruppe mit entsprechender Himmelsrichtung ein Regelwerk erstellen. Die Klimaanlage würde ebenfalls ein eigenes Regelwerk erhalten, da sie beispielsweise nur auf die Innentemperatur reagieren sollte und nicht auf die Sonneneinstrahlung.</li>
</ul>
<p>Wir beginnen mit einer einfachen Jalousie, für die wir eine Sonnenverfolgung (z.B. Temperatur ist hoch und Sonne strahlt auf Jalousie -&gt; Jalousie wird geschlossen) und einen Standardzustand (Sonne scheint nicht auf Jalousie oder ist nicht stark genug -&gt; Jalousie bleibt offen) erstellen wollen:</p>
<pre><code class="language-yaml">
blinds:
    type: foo

    room:
        type: foo
        name: Blinds in Room XYZ

        blind_height: # standard item to set the height
            knx_send: 2/1/14
            knx_dpt: 5001
            visu: 'yes'
            type: num
            knx_cache: 2/1/20

        blind_lamella: # standard item to set the lamella angle
            knx_send: 2/1/15
            knx_dpt: 5001
            visu: 'yes'
            type: num
            knx_cache: 2/1/21

        stateengine: # everything below contains relevant items for the stateengine
            type: foo


            rules: # Here are the rules for the different states.
                type: bool
                se_plugin: active # activates the plugin for this item

</code></pre>
<p>Bis jetzt passiert noch gar nichts. Zum einen sind keine Regeln/Zustände definiert, zum anderen wird die Evaluierung der Zustandsmaschine auch gar nie getriggert. Fügen wir also ein &#8222;eval_trigger&#8220; im Item &#8222;rules&#8220; ein, um die Auswertung der Regeln auszulösen:</p>
<pre><code class="language-yaml">
            rules: 
                eval: True
                eval_trigger:
                  - blinds.triggeritem # an item that might trigger every 2 minutes using cycle: 120 = 1
</code></pre>
<p>Nun werden die Zustände ausgewertet, sobald das Item blinds.triggeritem seinen Wert ändert. Idealerweise setzt man für dieses ein cycle Attribut, damit es regelmäßig die Evaluierung der Stateengine anstößt. Da noch keine Regeln definiert sind, wird allerdings immer noch nichts passieren <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Fügen wir also einen einfachen Zustand namens suntracking und einen Zustand namens &#8222;standard&#8220; hinzu. Am Ende sollte immer ein Zustand ohne Bedingungen als &#8222;Standard&#8220;-Zustand vorhanden sein.</p>
<pre><code class="language-yaml">
            rules: 
                suntrack:

                    enter_temperature: # This is our condition set. It needs to be called "enter". You can add a _name if want. If you need multiple condition sets, you HAVE to add different _name(s) 
                        # if all three conditions are true the state will be entered
                        se_min_sun_altitude: 20 # if altitude is at least 20 degrees.
                        se_max_sun_altitude: 120 # if altitude is max 120 degrees.
                        se_min_temperature: 22 # if temperature is at least 22 degrees.

                    on_enter_or_stay: # these actions will get triggered every time the enter-conditions are met.
                        se_action_height: # action for the item "height" that has to be defined in the rules section
                          - 'function: set' # The height item will get set to a specific value
                          - 'to: 100' # The value the height item is set to

                standard: # this has no conditions. So if no state defined before is entered, this will be entered

                    on_enter_or_stay:
                        se_action_height: # the blind height gets set to 0
                          - 'function: set'
                          - 'to: 0'
                          - 'order: 1'
</code></pre>
<p>Die se_action_ Angaben definieren Aktionen, die mit den entsprechenden Items ausgeführt werden sollen. Es ist notwendig, die passenden Items (für die Jalousienhöhe) unter &#8222;rules&#8220; zu definieren, sonst weiß das Plugin nicht, welche Items zu ändern sind.</p>
<pre><code class="language-yaml">
            rules:
                se_item_height: ...blind_height # height item, defined relatively, you can also use absolute definitions of course

</code></pre>
<p>Das Gleiche gilt für die Items, die ausgewertet werden, um in den Zustand einzutreten, in unserem Beispiel sind das Sonnenstand und Temperatur:</p>
<pre><code class="language-yaml">
            rules:
                se_item_sun_altitude: weather.sun.altitude # refer to an item updated by a weather station or weather plugin
                se_item_temperature: weather.temperature # refer to an item updated by a weather station or weather plugin
</code></pre>
<p>Bis hierhin sollte klar sein, dass alle Elemente, auf die in den Zustandsdefinitionen verwiesen wird, am Anfang des Regelabschnitts durch &#8222;se_item_&#8220; und einen möglichst sinnvollen Namen definiert werden müssen. In den Aktionen selbst verweisen wir wieder auf diese Namen, aber diesmal nicht mit &#8222;se_item_&#8220;, sondern mit &#8222;se_action_&#8220;.</p>
<p>Ähnlich verhält es sich mit den Items, die für den Eintritt in einen Zustand relevant sind. So muss die Temperatur als &#8222;se_item_temperature&#8220; definiert werden. Für die Zustandsauswertung ersetzen wir den &#8222;item&#8220;-Teil durch eine Bedingung wie &#8222;min&#8220;, &#8222;max&#8220;, &#8222;agemin&#8220;, &#8222;agemax&#8220;, etc. Genaueres dazu steht in der <a href="https://www.smarthomeng.de/user/plugins/stateengine/user_doc/05_bedingungen.html">Dokumentation des Plugins</a>.</p>
<p>Zusammengefasst sieht der Code wie folgt aus:</p>
<pre><code class="language-yaml">
blinds:
    triggeritem:
        type: bool
        name: Trigger
        cycle: 120 = 1
        enforce_updates: True

    room:
        name: Blinds in Room XYZ

        blind_height:
            knx_send: 2/1/14
            knx_dpt: 5001
            visu: 'yes'
            type: num
            knx_cache: 2/1/20

        blind_lamella:
            knx_send: 2/1/15
            knx_dpt: 5001
            visu: 'yes'
            type: num
            knx_cache: 2/1/21

        stateengine:

            rules:
                type: bool
                se_plugin: active
                se_item_height: ...blind_height
                se_item_lamella: ...blind_lamella
                se_item_altitude: weather.sun.altitude
                se_item_temperature: weather.temperature
                eval: True
                eval_trigger:
                  - blinds.triggeritem

                suntrack:

                    enter:
                        type: foo
                        se_min_sun_altitude: 20 
                        se_max_sun_altitude: 120 
                        se_min_temperature: 22 

                    on_enter_or_stay: 
                        se_action_height:
                          - 'function: set'
                          - 'to: 100'

                standard:

                    on_enter_or_stay:
                        se_action_height: 
                          - 'function: set'
                          - 'to: 0'
</code></pre>
<p>Nachdem wir das Plugin in der plugin.yaml aktiviert haben, haben wir nun eine Jalousie, die sich schließt, wenn die Temperatur über 22 Grad liegt und die Sonne eine bestimmte Höhe hat. Andernfalls werden die Jalousien geöffnet.</p>
<h5>Stateengine Definitionen wiederverwerten</h5>
<p>In der Regel möchten wir einige Zustandsdefinitionen für mehr als ein Item verwenden. Beispielsweise sollen Zustände für manuelle Bedienung oder Sperrfunktionen (Es werden keine Evaluierungen durchgeführt) für alle Items/Geräte gleich genutzt werden. Außerdem wollen wir die Bedingungen zur Sonnenhöhe und Temperatur für alle Jalousien im Haus heranziehen. Wir möchten dann lediglich noch individuell auf die Himmelsrichtung eingehen. Aus diesem Grund können wir Zustände auf globaler Basis definieren und diese Zustände im Abschnitt &#8222;rules&#8220; entweder mittels &#8222;se_use&#8220; oder &#8222;struct&#8220; (seit SmarthomeNG 1.6) referenzieren. Das Stateengine-Plugin stellt standardmäßig einige allgemein nützliche Zustände zur Verfügung, die auf die folgende Weise einfach implementiert werden können.</p>
<pre><code class="language-yaml">
blinds:
    room:
        blind_height:
            type: num

        stateengine:
            remark: &gt;-
                With "general" some relevant standard definitions are created. The release, lock and suspend states are 
                useful states provided by the plugin, too. The last two are defined in the etc/struct.yaml file manually.
            struct:
                - stateengine.general
                - stateengine.state_release
                - stateengine.state_lock
                - stateengine.state_suspend
                - se_suntrack
                - se_standard

            manuell:
                remark: You have to setup the manual item based on your items (e.g. blind_height, etc.). This is important to evaluate the "suspend" state.
                type: bool
                name: manuelle bedienung
                eval_trigger: 
                  - ...blind_height
                se_manual_invert: True

            rules:
                se_item_height: ...blind_height
                remark: The previous structs already define some useful eval_triggers. If you want to add additional ones, don't forget the first line and define your trigger as a list!
                eval_trigger:
                  - merge_unique*
                  - weather.temperature

</code></pre>
<p>Vor smarthomeNG 1.7 musste der eval_trigger für jedes Item überschrieben werden, da die Attributliste nicht kombiniert wurde. Der eval_trigger hätte wie folgt ausgesehen:</p>
<pre><code class="language-yaml">
            rules:
                se_item_height: ...blind_height
                eval_trigger:
                  - ..lock
                  - ..manuell
                  - ..release
                  - ..retrigger
                  - weather.temperature

</code></pre>
<h5>Nützliche Zustände dank Plugin-Structs</h5>
<p>Was hat es nun mit state_release, state_lock und state_suspend auf sich..!? Das sind drei Zustände, die wie erwähnt normalerweise für alle Zustandsmaschinen relevant sind.</p>
<ul>
<li>release: Wird das Item &#8222;release&#8220; unter dem stateengine Item (also im Beispiel blinds.room.stateengine.release) aktiviert (auf True gesetzt), wird der aktuelle Zustand verlassen und eine erneute Evaluierung der Zustandsmaschine forciert. Dies ist beispielsweise sinnvoll, wenn man frühzeitig ein manuelles Aussetzen abbrechen möchte (z.B. wenn man mittels Taster die Jalousie gesteuert hat, nun aber doch die Jalousie in einen anderen Zustand versetzen will)</li>
<li>lock: Durch Aktivieren des Items &#8222;lock&#8220; unter dem stateengine Item (also blinds.room.stateengine.lock) wird die Evaluierung ausgesetzt. Es könnten nun also Bedingungen für Zustände erfüllt sein, aber es wird nichts passieren &#8211; die Jalousien machen einfach nichts bzw. lassen sich normal über Schalter steuern &#8211; bis das &#8222;lock&#8220; Item wieder deaktiviert, also auf False gesetzt wird.</li>
<li>suspend: Alle Items, die im eval_trigger des &#8222;manuell&#8220; Items gelistet sind, können dafür sorgen, dass ein manueller Pause-Modus aktiviert wird. Dieser wird für eine bestimmte Zeit beibehalten, die über ein entsprechendes Item eingestellt werden kann. Nach Ablauf der Zeit wird der Zustand verlassen und die Zustandsmaschine neu evaluiert.</li>
</ul>
<p>Die Vorlagen für suntrack und standard States müssen nicht als Items (items/&lt;xyz&gt;.yaml), sondern können in structs/global_structs.yaml definiert und eben mittels struct: eingebunden werden. Die structs se_suntrack und se_standard haben dabei 1:1 die gleichen Einträge wie im obigen Beispiel.</p>
<h5>Der konkrete Ablauf</h5>
<p>Das folgende Diagramm zeigt die hierarchische Auswertung der Zustände. Eine ähnliche Visualisierung bietet auch die Weboberfläche des Plugins &#8211; einfach ausprobieren!</p>
<div id="attachment_2404" style="width: 867px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2404" src="https://www.smarthomeng.de/wp-content/uploads/2019/07/Stateengine_Blinds_Simple.png" alt="" width="857" height="1388" class="wp-image-2404 size-full" srcset="https://www.smarthomeng.de/wp-content/uploads/2019/07/Stateengine_Blinds_Simple.png 857w, https://www.smarthomeng.de/wp-content/uploads/2019/07/Stateengine_Blinds_Simple-185x300.png 185w, https://www.smarthomeng.de/wp-content/uploads/2019/07/Stateengine_Blinds_Simple-768x1244.png 768w, https://www.smarthomeng.de/wp-content/uploads/2019/07/Stateengine_Blinds_Simple-632x1024.png 632w" sizes="(max-width: 857px) 100vw, 857px" /><p id="caption-attachment-2404" class="wp-caption-text">Stateengine Ablaufdiagramm</p></div>
<p>Was bedeutet das nun genau..!?!?</p>
<p>Wir können jederzeit die Zustandsevaluierung stoppen, indem das &#8222;lock&#8220; Item auf True gesetzt wird. Möchten wir weitermachen, setzen wir es wieder auf False. Immer, wenn wir das Item blind_height ändern (z.B. über einen KNX Taster oder die Visu), sind wir im manuellen Modus, der für eine bestimmte Zeit beibehalten wird &#8211; es kann also noch so heiß oder kalt werden, die Jalousie bleibt bis zum Ablauf der &#8222;suspend_time&#8220; (eigenes Item) auf der manuell definierten Höhe. Hier ist eine kleine Eigenheit zu beachten, wenn z.B. ein Jalousieaktor immer seinen aktuellen Wert sendet, sobald die Jalousie gefahren wurde (also auch durch eine Aktion in einem Zustand) &#8211; dazu mehr in der Dokumentation des Plugins! Ist weder Sperren, noch Pausieren aktiv, könnte die Jalousie zufahren, wenn die Sonne eine bestimmte Höhe und die Temperatur einen gewissen Mindestwert haben. Wenn nicht, fährt die Jalousie auf.</p>
<h5>Individualisieren von Zuständen</h5>
<p>Soweit, so gut. Jetzt haben wir aber noch nicht die Thematik der Himmelsrichtung besprochen. Wie einleitend erwähnt, sollen ja z.B. die Jalousien nur dann zufahren, wenn die Sonne einen bestimmten Azimut-Wert hat, also von der passenden Himmelsrichtung her kommt. Jalousien im Osten sollen also am Vormittag reagieren, die im Westen erst am Abend. Dies können wir auf zwei Arten angehen:</p>
<ul>
<li>Nutzen der vielen Zusatzfunktionen des Plugins: Damit wird es richtig komplex. Man könnte Templates, Variablen, eval-Funktionen, etc. in die Zustände einbinden, um flexibel auf verschiedene Bedingungen zu reagieren. Dadurch wäre es sogar möglich, eine einzige globale Zustandsmaschine zu definieren, also nicht für jedes Item (jede Jalousie) selbst. Aber das wird richtig wild, daher lassen wir das mal <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
<li>Ergänzen von Zuständen mittels se_use. Hierbei kann auf ein anderes Item oder ein struct referenziert werden, wobei immer auf den Zustand selbst verwiesen werden muss, beispielsweise struct:se_suntrack.rules.suntrack. Problematisch wird es, wenn die struct-Vorlage nicht nur Regeln beinhaltet, sondern auch zusätzliche Items (wie z.B. zum Setzen des Sperrzustands) &#8211; diese werden bei se_use nicht übernommen, da eben nur das Regelwerk selbst eingebunden wird und nichts aus höheren Hierarchieebenen.</li>
<li>Erweitern von structs. Diese Herangehensweise ermöglicht das komplette Einbinden von Vorlagen inkl. Definitionen und Items oberhalb des &#8222;rules&#8220; Items. Wichtig sind hierbei aber zwei Dinge. Zum einen muss die Ergänzung VOR dem Einbinden des structs definiert werden, zum anderen muss das Attribut se_stateorder genutzt werden, damit klar ist, an welcher hierarchischen Stelle die Regel eingebunden sein sollte. In unserem Fall wäre das nach release, lock, suspend, also Nr. 4.</li>
</ul>
<p>Im folgenden Beispiel ergänzen wir die in structs/global_stucts.yaml erstellte Vorlage namens se_suntrack mit zwei Zeilen zur Sonnenrichtung.</p>
<pre><code class="language-yaml">
blinds:
    room_east:
        blind_height:
            type: num
        stateengine:
            rules:
                suntrack:
                    se_stateorder: 4
                    enter:
                        se_min_sun_azimut: 20 
                        se_max_sun_azimut: 120
            struct:
                - stateengine.general
                - stateengine.state_release
                - stateengine.state_lock
                - stateengine.state_suspend
                - se_suntrack
                - se_standard
 
    room_west:
        blind_height:
            type: num
        stateengine:
            rules:
                suntrack:
                    se_stateorder: 4
                    enter:
                        se_min_sun_azimut: 220 
                        se_max_sun_azimut: 300
            struct:
                - stateengine.general
                - stateengine.state_release
                - stateengine.state_lock
                - stateengine.state_suspend
                - se_suntrack
                - se_standard
</code></pre>
<p>Auf diese Weise werden sämtliche Bedingungen unseres structs &#8222;se_suntrack.rules.suntrack&#8220; durch die zwei zusätzlichen Zeilen ergänzt und somit individualisiert.</p>
<h5>Gratulation!</h5>
<p>Wir haben nun eine grundlegende Zustandsmaschine für Jalousien erstellt und diese individuell erweitert. Nach dem gleichen Muster lassen sich nun noch viele Ergänzungen angehen. Beispielsweise möchte man vermutlich auch Hysteresen umsetzen. So soll der &#8222;Heiß&#8220; Zustand nicht gleich bei 21.9 Grad wieder verlassen werden, sondern erst, wenn die Temperatur längere Zeit unter 22 bleibt. Eventuell möchte man auch noch weitere Bedingungsgruppen definieren, sodass nicht nur die Kombination von Sonnenstand und Temperatur beachtet wird, sondern vielleicht auch die Helligkeit außen und innen, die Raumtemperatur, etc. Dann hätten wir nicht nur einen &#8222;enter&#8220;-Eintrag, sondern ein &#8222;enter_aussentemp&#8220; und &#8222;enter_innentemp&#8220; oder ähnlich. Vielleicht möchten wir den Sonnenschutz auch nur in den Sommermonaten aktivieren, dann könnten wir die Bedingungsgruppen mit einer Abfrage zum aktuellen Monat ergänzen und den Zustand nur einnehmen, wenn es zwischen März und September ist.</p>
<p>Natürlich machen gerade für Jalousien auch weitere Zustände Sinn, beispielsweise sollen sie am Abend halb runter fahren und/oder die Lamellen halb öffnen, in der Nacht immer ganz zu fahren, etc. Aber was bedeutet Nacht? Immer wenn es dunkel ist? Sollen die Jalousien auch zufahren, obwohl ich gerade auf der Terrasse sitze? Womöglich nicht &#8211; dann müsste man einen weiteren Zustand &#8222;SperrMichNichtAus&#8220; definieren, der beispielsweise eingenommen wird, wenn die Türe offen ist und der Bewegungsmelder auf der Terrasse innerhalb der letzten 10 Minuten aktiv war..? Wie ist es bei Wind? Hier ist die Empfehlung natürlich, das Sicherheitsobjekt der KNX Aktoren zu nutzen. Aber diese Funktionen sind meist recht limitiert, sodass man zumindest das Verlassen des Sicherheitsmodus über einen entsprechenden Zustand definieren und ergänzen möchte (wieder Stichwort Hysterese).</p>
<h5>The sky is the limit!</h5>
<p>Natürlich lassen sich auch viele andere Dinge sinnvoll über State Machines steuern und optimieren. Vieles ist prinzipiell auch über Logiken machbar und im Endeffekt ist das Plugin auch nicht so viel anders als ein Set an Logiken und Regeln. Nur anstelle von Hunderten if/else Abfragen lässt sich hier alles komfortabel über eine Item-Hierarchie anlegen und individualisieren. Lichtszenen können sich am Verhalten der Anwesenden orientieren, Musik-Playlisten werden abhängig von Uhrzeit, Geburtstagen, Weihnachtszeit, etc. individuell geladen, Elektronikgeräte schalten je nach Situation in verschiedene Modi, die Heizung steuert sich abhängig vom Ertrag der PV-Anlage, dem Wetterbericht, der Temperatur, Anwesenheit, und und und. The sky is (not) the limit!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smarthomeng.de/starthilfe-fuer-das-stateengine-plugin/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
