<?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>Dieter, Autor bei Smart home Ratgeber</title>
	<atom:link href="https://homeitems.de/author/hoitadmin/feed/" rel="self" type="application/rss+xml" />
	<link>https://homeitems.de/author/hoitadmin/</link>
	<description>Einfache Lösungen für zuhause mit Smart home items</description>
	<lastBuildDate>Mon, 18 May 2026 08:58:52 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://homeitems.de/wp-content/uploads/2020/10/cropped-wpicon_homeitems-32x32.jpg</url>
	<title>Dieter, Autor bei Smart home Ratgeber</title>
	<link>https://homeitems.de/author/hoitadmin/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Mit Node-RED auf die HMIP Home Control Unit (HCU) zugreifen Teil 1</title>
		<link>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/</link>
					<comments>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 17 May 2026 18:33:21 +0000</pubDate>
				<category><![CDATA[HCU]]></category>
		<category><![CDATA[Homematic IP]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4639</guid>

					<description><![CDATA[<p>Nach der Einführung der neuen HMIP-Zentrale HCU (Home Control Unit) hat eQ-3 eine API veröffentlicht, mit der man eigene Plugins erstellen und auf die HMIP-Daten zugreifen kann. Im Herbst 2025 wurde angekündigt, dass die auch von mir genutzte CCU3 vom eQ-3 nicht weiterentwickelt, sondern in dem freien Modell OpenCCU (ehemals Raspberrymatic) durch  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/">Mit Node-RED auf die HMIP Home Control Unit (HCU) zugreifen Teil 1</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-1"><p>Nach der Einführung der neuen HMIP-Zentrale HCU (Home Control Unit) hat eQ-3 eine API veröffentlicht, mit der man eigene Plugins erstellen und auf die HMIP-Daten zugreifen kann. Im Herbst 2025 wurde angekündigt, dass die auch von mir genutzte CCU3 vom eQ-3 nicht weiterentwickelt, sondern in dem freien Modell OpenCCU (ehemals Raspberrymatic) durch die Community weitergepflegt werden soll.</p>
<p>Ich habe auf der CCU3 viel programmiert und mit Node-RED auf die CCU3-Geräte zugegriffen. Jetzt will ich prüfen, wie gut man die HCU in Node-RED einbinden kann, um langfristig von der CCU auf die HCU zu wechseln.</p>
<p>Im ersten Schritt möchte ich eine Verbindung zwischen Node-RED und der HCU aufbauen und erste Daten von HMIP-Geräten empfangen. Ich nehme vorweg, das Ganze funktioniert einfacher als erwartet. In den folgenden Kapiteln beschreibe ich dazu detailliert die Vorgehensweise. Das wesenliche Dokument für alle folgenden Schritte ist dabei die <a href="https://github.com/homematicip/connect-api/releases/download/1.0.1/connect-api-documentation-1.0.1.html">Homematic IP Connect API Dokumentation</a>.</p>
<h2><strong>HCU Entwicklermodus freischalten</strong></h2>
<p>Damit die HCU API-Zugriffe akzeptiert, muss der Entwickler-Modus aktiviert werden. In diesem Modus kann man eigene Plugins direkt auf der HCU laden. Oder man kann mit Plugins auf anderen Systemen (z. B. Node-RED) über eine Websocket-Verbindung kommunizieren.</p>
<p>Die Vorgehensweise zur Freischaltung ist gut in der API-Dokumentation beschrieben, so dass ich nur auf folgendes hinweise:</p>
<ol>
<li>Aktiviere den Entwicklermodus und gebe sofort die Websockets frei (Häkchen setzen)</li>
<li>Warte mit der Erstellung des Aktivierungsschlüssels bis zum nächsten Schritt!</li>
</ol>
</div><div class="fusion-text fusion-text-2"><h2><strong>Authentication Token vereinbaren</strong></h2>
<p>Jedes Plugin braucht für die Kommunikation eine eindeutige ID.  eQ-3 empfiehlt zur Namensfindung die "Reverse Domain Name Notation". Ich habe diesen Namen für die folgenden Tests benutzt:</p>
<p><em>de.spike.grass.plugin.example1</em></p>
<p>Damit die Kommunikation zwischen der HCU und einem anderen Gerät sicher, aber einfach ist, brauche ich außerdem ein Token. Dieser Authentication Token ist wie ein Passwort. Zur Erstellung des Tokens muss man mit der HCU über API-Requests kommunizieren.</p>
<p>Ich empfehle das Tool <a href="https://www.postman.com/">Postman</a> zu verwenden, da es einfach zu bedienen ist.</p>
<p>Ich verweise hier auch auf die Anleitung in Kapitel 2.4 (Step 2) und ergänze noch ein paar Hinweise::</p>
<ul>
<li>Wähle in Postman die Methode "POST" aus. Trage dahinter als Adresse <em>https://hcu1-XXXX.local:6969/hmip/auth/requestConnectApiAuthToken ein </em>(Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Ergänze unter dem Tab "Headers" das Feld "VERSION" mit dem Wert "12"</li>
<li>Gehe nun zuerst zurück in den Entwicklermodus der HCU und generiere einen Aktivierungsschlüssel (dieser ist nur kurzzeitig gültig)</li>
<li>Kopiere in den Tab "body" den body-example Code aus Kapitel 2.4 Step 2</li>
<li>Tausche den Aktivierungsschlüssel gegen den soeben generierten Schlüssel aus</li>
<li>Tausche die plugin_id gegen die von dir gewählte ID aus (siehe oben)</li>
</ul>
<pre class="rouge highlight"><a href="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1.webp"><img fetchpriority="high" decoding="async" class="alignnone wp-image-4645 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1024x271.webp" alt="" width="1024" height="271" srcset="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-200x53.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-300x79.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-400x106.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-600x159.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-768x203.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-800x211.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1024x271.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1200x317.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU1-1536x406.webp 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></pre>
<p>Drücke auf Send und man sollte ein solches Feedback erhalten (Wert für spätere Verwendung speichern):<code data-lang="json"></code></p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-1 > .CodeMirror, .fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-1 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-1 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_1" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_1" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_1" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="application/json">{
    "authToken": "B23FB0DC7FDAA140CDF679D5F78F047C16CEF349691A3E9B425DE16E291E51DF"
}</textarea></div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Erscheint hier der Fehler "Could not generate response.  SSL Error: Self signed certificate", dann braucht man nur die angebotene Option "Disable SSL Verification" zu bestätigen und schon funktioniert es.</span></div></div><div class="fusion-text fusion-text-3"><p>Nun muss der Erhalt dieses Schlüssels noch bestätigt werden. Gehe dazu wie folgt in Postman vor:</p>
<ul>
<li>Drücke oben in der Tabzeile auf "New Request"</li>
<li>Ergänze unter dem Tab "Headers" das Feld "VERSION" mit dem Wert "12"</li>
<li>Wähle in Postman die Methode "POST" aus. Trage dahinter als Adresse <em>https://hcu1-XXXX.local:6969/hmip/auth/confirmConnectApiAuthToken</em> (Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Kopiere in den Tab "body" den body-example Code aus Kapitel 2.4 Step 3</li>
<li>Tausche den Aktivierungsschlüssel gegen den eben generierten aus</li>
<li>Tausche den authToken gegen den im vorigen Schritt erhaltenen authToken aus.</li>
</ul>
<p>Drücke auf Send und du solltest eine client_id in der folgenden Form erhalten (Wert für spätere Verwendung speichern):</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-2 > .CodeMirror, .fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-2 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-2 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_2" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_2" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_2" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="application/json">{
    "clientId": "9fa276c2-b410-456d-bfde-4202918e8ce4"
}</textarea></div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Wenn es bei einem der beiden Request-Aufrufe zu dem Fehler "Invalid Request" kommt, dann kann das daran liegen, dass der Aktivierungsschlüssel abgelaufen ist. Dann generiert einfach einen Neuen, tauscht diesen in den body-Bereich aus und für die Requests erneut durch.</span></div></div><div class="fusion-text fusion-text-4"><h2>Websocket Verbindung testen</h2>
<p>Nun kann getestet werden, ob eine Websocket-Verbindung zur HCU mit den gerade erzeugten Daten aufgebaut werden kann. Ich empfehle hierzu auch wieder das Tool Postman zu verwenden.</p>
<p>Hier gibt es allerdings mit der freien und unregistrierten Version eine Einschränkung: In dieser Version kann man keine Self-Signed-Socket Verbindungen aufbauen, die wir aber für die Kommunikation mit der HCU benötigen.</p>
<p>Man löst das Ganze, indem man sich einen (kostenlosen) Postman-Account erstellt und sich dann mit dem Account in der App anmeldet. Anschließend ist die Kommunikation mit den Self- Signed- Zertifikaten möglich.</p>
<p>Folgende Schritte sind anschließend in Postman durchzuführen:</p>
<ul>
<li>In der Adressleiste wird folgende Adresse eingetragen: wss://<em>hcu1-XXXX.local</em>:9001 (Setze anstelle von hcu1-XXXX den lokalen Netzwerknamen ein)</li>
<li>Auf das Plus-Zeichen links oben im Workspace drücken und "Websocket" auswählen.</li>
<li>Unter Headers wird ein neuer Key "authtoken" mit dem eben generierten Wert eingetragen.</li>
<li>Unter Headers wird ein weiterer neuer Key "plugin-id" mit der generierten Plugin-ID eingetragen.</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2.webp"><img decoding="async" class="alignnone wp-image-4651 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1024x295.webp" alt="" width="1024" height="295" srcset="https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-200x58.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-300x86.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-400x115.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-600x173.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-768x221.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-800x230.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1024x295.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2-1200x345.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Postman-HCU2.webp 1400w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Nach Betätigen von Connect sollte die Meldung "<em>connected to .local:9001</em>" erscheinen.</p>
<p>Und in der HCU im Plugins Menü sollte die Verbindung ebenfalls auftauchen!</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1.webp"><img decoding="async" class="alignnone wp-image-4652 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1024x384.webp" alt="" width="1024" height="384" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-200x75.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-300x113.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-400x150.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-600x225.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-768x288.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-800x300.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1024x384.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1200x451.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1-1536x577.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed1.webp 1614w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
</div><div class="fusion-text fusion-text-5"><h1>Mit Node-RED HCU-Daten abfragen</h1>
<p>Jetzt kann eine Websocket Verbindung zur HCU aus Node-RED aufgebaut werden. Die Sockets-Nodes in Node-RED unterstützen allerdings keine Self-Signed Zertifikate. Stattdessen verwende ich die Palette <a href="https://flows.nodered.org/node/node-red-contrib-dynamic-websocket">node-red-contrib-dynamic-websocket</a>, die ich in Node-RED installiert habe. Darin befindet sich ein Websocket-Node, der viel mehr Möglichkeiten als die Standard-Nodes bietet.</p>
</div><div class="fusion-alert alert notice alert-warning fusion-alert-left awb-alert-native-link-color" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="awb-icon-cog" aria-hidden="true"></i></span><span class="fusion-alert-content"><p>Für die Angabe von Serveradressen gibt es zwei Möglichkeiten.</p>
<ol>
<li>eQ3 verwendet https://hcu1-XXX.local:9001 oder wss://hcu1-XXXX.local:9001, wobei das XXXX durch die letzten 4 Zeichen der Seriennummer ersetzt werden.</li>
<li>Alternativ kann man https://192.177.156.43:9001 oder wss://192.177.156.43:9001 verwenden (d.h. man adressiert die HCU über die IP-Adresse und den Port)</li>
</ol>
<p>Ich habe in Node-Red immer die zweite Variante verwendet, da ich mit der Namensauflösung erheblich Schwierigkeiten hatte. Diese Variante funktioniert auch für alle vorherigen Schritte.</p></span></div></div><div class="fusion-text fusion-text-6"><p>In Node-RED wird nun der Dynamic-Websocket-Node eingefügt und in den Eigenschaften folgende Daten eingetragen:</p>
<ul>
<li>Default-Url "wss://"</li>
<li>"Allow Self Signed Certificates"-Häkchen setzen</li>
</ul>
<p>Unter Custom Headers wird anschließend folgender JSON-Eintrag ergänzt:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-3 > .CodeMirror, .fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-3 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-3 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_3" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_3" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_3" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">{
  "authtoken": "<das Authentication Token>",
  "plugin-id": "<die selbstgewählte Plugin ID (bei mir: de.spike.grass.plugin.example1)>",
  "hmip-system-events": "true"
}</textarea></div><div class="fusion-text fusion-text-7"><p>Im Code wird die eigene Plugin-ID sowie das eigene Authentication Token eingetragen. Mit der Zeile "hmip-system-events":"true" wird die HCU so eingestellt, dass alle Änderungen an HMIP-Zuständen (Basisstation, Geräte, Gruppen, etc.=) sofort an Node-Red übermittelt werden (siehe auch API-Dokumentation).</p>
<p><img decoding="async" class="alignnone wp-image-4668 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-1024x733.webp" alt="" width="1024" height="733" srcset="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-200x143.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-300x214.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-400x286.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-600x429.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-768x549.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-800x572.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755-1024x733.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-Websocket1-e1779039776755.webp 1188w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>Alle Websocket-Nachrichten können durch einen Debug-Node am ersten Ausgang des Websocket-Nodes im Debug-Fenster ausgegeben werden. Nach dem deployen des Flows sollte das Ergebnis wie folgt aussehen. In den Objekten sind bereits alle Informationen zu den HMIP-Geräte enthalten.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2.webp"><img decoding="async" class="alignnone wp-image-4666 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1024x206.webp" alt="" width="1024" height="206" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-200x40.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-300x60.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-400x80.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-600x121.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-768x155.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-800x161.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1024x206.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1200x241.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2-1536x309.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed2.webp 1630w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
</div><div class="fusion-text fusion-text-8"><h2>Weitere Funktionen ergänzen</h2>
<p>Ich erweitere den Flow jetzt noch um Funktionen, die bei den weiteren Tests hilfreich sind. Hierzu gehört auch, dass die HCU zwischenzeitlich abfragt, ob mein Plugin einsatzbnereit ist. Hierzu sendet die HCU an Node-Red unter payload.type einen "PLUGIN_STATE_REQUEST". Sobald ich diesen erhalte schicke ich eine PLUGIN_STATE_RESPOND Message zurück. Die Nodes, die ich ergänze sind in folgender Tabelle aufgeführt.</p>
</div>
<div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Node</strong></th>
<th align="left"><strong>Beschreibung</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Inject Node ("Close Connection")</td>
<td align="left">Mit diesem Node kann ich die Websocket-Verbindung schließen. Dazu braucht als Parameter nur in "msg.close" gleich "true" angegeben zu werden.</td>
</tr>
<tr>
<td align="left">Inject Node ("Open Connection")</td>
<td align="left">Mit diesem Node kann ich die Websocket-Verbindung wieder aufbauen. Dazu braucht als Parameter nur in "msg.url" als String die Serveradresse "wss://" angegeben zu werden.</td>
</tr>
<tr>
<td align="left">Switch Node ("Event Types unterscheiden")</td>
<td align="left">Hier löse ich die Event-Types auf, die von der HCU übermittelt werden (wird später noch weiter ausgebaut).</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1.webp"><img decoding="async" class="alignnone wp-image-4678 size-medium" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-300x221.webp" alt="" width="300" height="221" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-200x147.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-300x221.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-400x295.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1-600x442.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change1.webp 676w" sizes="(max-width: 300px) 100vw, 300px" /></a></td>
</tr>
<tr>
<td align="left">Switch Node ("PLUGIN_STATE_RESPONS Message")</td>
<td align="left">Über diesen Node erstelle ich die JSON-Nachricht, die ich per Websocket an die HCU schicke. In dem folgenden Screenshot müssen die PluginID sowie die ClientID durch die eigenen Werte ersetzt werden.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2.webp"><img decoding="async" class="alignnone wp-image-4679 size-medium" src="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-300x144.webp" alt="" width="300" height="144" srcset="https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-200x96.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-300x144.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-400x192.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-600x288.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-768x369.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2-800x385.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/HCU-NodeRed_Change2.webp 878w" sizes="(max-width: 300px) 100vw, 300px" /></a></td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-9"><p>Der Flow sieht anschließend wie folgt aus und bietet jetzt eine solide Basis für die Kommunikation mit der HCU.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1.webp"><img decoding="async" class="alignnone wp-image-4680 size-large" src="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1024x159.webp" alt="" width="1024" height="159" srcset="https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-200x31.webp 200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-300x47.webp 300w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-400x62.webp 400w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-600x93.webp 600w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-768x119.webp 768w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-800x124.webp 800w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1024x159.webp 1024w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1200x187.webp 1200w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1-1536x239.webp 1536w, https://homeitems.de/wp-content/uploads/2026/05/Node-Red-HCU-Flow1.webp 1904w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<p>Im nächsten Beitrag werde ich mir die Nachrichtenformate der HCU näher anschauen und entscheiden, wie ich diese am besten auswerte. Anregungen und Ergänzungen sind herzlich willkommen.</p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/">Mit Node-RED auf die HMIP Home Control Unit (HCU) zugreifen Teil 1</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/mit-node-red-auf-die-hmip-home-control-unit-hcu-zugreifen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aus Leistung den Zählerstand berechnen</title>
		<link>https://homeitems.de/aus-leistung-den-zaehlerstand-berechnen/</link>
					<comments>https://homeitems.de/aus-leistung-den-zaehlerstand-berechnen/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 17:23:34 +0000</pubDate>
				<category><![CDATA[influxdb]]></category>
		<category><![CDATA[Node-Red]]></category>
		<category><![CDATA[Photovoltaik]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4107</guid>

					<description><![CDATA[<p>Viele Wechselrichter oder Messsteckdosen liefern Momentanwerte der Leistung, beispielsweise 350 W. Ich benötige jedoch häufig nur die kumulierten Werte in Form von Zählerständen, d. h. die kumulierte Energie über einen bestimmten Zeitraum in Kilowattstunden. Dazu braucht man im Prinzip nur die Leistungswerte mit einem Zeitstempel. Im folgenden Artikel beschreibe ich, wie ich  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/aus-leistung-den-zaehlerstand-berechnen/">Aus Leistung den Zählerstand berechnen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-10"><p>Viele Wechselrichter oder Messsteckdosen liefern Momentanwerte der Leistung, beispielsweise 350 W. Ich benötige jedoch häufig nur die kumulierten Werte in Form von Zählerständen, d. h. die kumulierte Energie über einen bestimmten Zeitraum in Kilowattstunden.</p>
<p>Dazu braucht man im Prinzip nur die Leistungswerte mit einem Zeitstempel.</p>
<p>Im folgenden Artikel beschreibe ich, wie ich das mit Node-Red gelöst habe. Das Prinzip ist auf viele andere Geräte übertragbar, die keine Zählerstände liefern.</p>
<h2>Grundprinzip</h2>
<p>Ein Zendure-Hyper-2000-Wechselrichter liefert über die Cloud nur die erzeugte Leistung per MQTT zu einem bestimmten Zeitpunkt, nicht aber einen Zählerstand, anhand dessen ich die erzeugte Energie beispielsweise an einem Tag ablesen könnte.</p>
<p>Dabei lassen sich Energie und Zählerstand recht einfach aus der Leistung berechnen. Die dazu benötigten Werte lassen sich physikalisch wie folgt beschreiben (vereinfacht):</p>
<ul data-spread="false">
<li><strong>Leistung (Watt) </strong>= Spannung * Stromstärke (z.B. in Watt)</li>
<li><strong>Energie (kWh)</strong> = Leistung * Zeit in einem Zeitintervall (z.B. in Kilowattstunden)</li>
<li><strong>Zählerstand </strong>=  Summe der Energiewerte in Zeitintervallen (z.B. in Kilowattstunden)</li>
</ul>
<p>Eine Lampe, die eine Stunde lang eingeschaltet ist und 500 Watt benötigt, verbraucht somit eine Energie von 0,5 kWh. Wäre die Lampe dimmbar und würde sie nach einer halben Stunde auf 250 Watt gedimmt werden, würde sie in der ersten halben Stunde 0,25 kWh und in der zweiten halben Stunde 0,125 kWh, also insgesamt 0,375 kWh, verbrauchen.</p>
<p>Ein Wechselrichter produziert in relativ kurzen Zeitabständen unterschiedliche Leistungen, sodass ich die Energie für viele kleine Zeitintervalle berechnen und aufsummieren muss. Mathematisch entspricht dies einer Integralfunktion über ein Rechteck. Da jeder übermittelte Leistungswert einen Zeitstempel besitzt, können die erforderlichen Daten schnell ermittelt werden.</p>
</div><div class="fusion-text fusion-text-11"><h2>Voraussetzungen</h2>
<p>Ich realisiere die Berechnung in Node-Red und speichere die Zählerstände in eine InfluxDB-Datenbank. Grundsätzlich speichere ich nur die resultierenden Zählerstände in der Datenbank ab, indem ich die Energie des letzten Zeitraums hinzufüge.</p>
<p>Im Programm benutze ich einige Flow-Variablen, das heißt, diese speichern Werte zwischen, die beim nächsten Programmdurchlauf verwendet werden, wenn ein neuer Leistungswert geliefert wird. Diese Variablen sind:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">Variablenname in Node-Red</th>
<th align="left">Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">f_letzterZeitstempel</td>
<td align="left">In der Variablen wird der Zeitstempel der letzten Leistungsmessung gespeichert. Wenn eine neue Leistung gemessen wird, kann ich den Zeitraum für die Energieberechnung aus der Differenz der Zeitstempel ermitteln.</td>
</tr>
<tr>
<td align="left">f_letzteEnergeWh</td>
<td align="left">In dieser Variablen wird die letzte Leistung zwischengespeichert. Mein Wechselrichter liefert Wattstunden. Würden kWh geliefert, müssten diese mit 1000 multipliziert werden, um Wattstunden zu erhalten.</td>
</tr>
<tr>
<td align="left">f_LetzterZaehlerstand</td>
<td align="left">In dieser Variable speichere ich den letzten Zählerstand, sodass ich bei der Berechnung nicht jedes Mal die Datenbank abfragen muss. Eine Datenbankabfrage erfolgt nur, wenn die erste Leistung vorliegt, da der Wert sonst 0 ist.</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-info-circle fas" aria-hidden="true"></i></span><span class="fusion-alert-content"><p>Zum Thema Zeitstempel und Zeit habe ich noch folgende Hinweise:</p>
<p>Ich benutze keine Zeitstempel, die mir zusammen mit der Leistung geliefert werden (z. B. von MQTT). Stattdessen nutze ich die Systemzeit zum Zeitpunkt der Datenverarbeitung durch das Programm. Alternativ kann man auch die Zeitstempel des Geräts verwenden, welches die Leistung liefert.</p>
<p>Da die meisten Systeme eine Zeitauflösung im Millisekundenbereich liefern, ergibt die Differenz der verwendeten Zeitstempel ebenfalls Millisekunden. Um diese in Stunden umzurechnen, muss man sie durch 1000 (für Sekunden) und durch 3600 (für Stunden) dividieren.</p>
<p>Bei der Übermittlung von Leistungswerten über eine Cloud (wie bei der Zendure-Lösung) ist eine Zeitverzögerung durch die Laufzeit der Informationen sehr wahrscheinlich. Da diese Laufzeiten schwanken können, ist die Genauigkeit der Energieberechnung bei einer Cloudlösung nicht so hoch wie bei einer Direktabfrage über das lokale Netzwerk. Ich habe jedoch festgestellt, dass die Abweichungen für mich nicht groß genug sind, um die Berechnung zu verändern.</p></span></div></div><div class="fusion-text fusion-text-12"><h2>Flowbeschreibung</h2>
<p>Die Verarbeitung und Speicherung der Daten erfolgt durch einen Flow, dessen Struktur wie folgt ist:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-scaled.webp"><img decoding="async" class="alignnone wp-image-4427 size-medium" src="https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-300x40.webp" alt="" width="300" height="40" srcset="https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-200x27.webp 200w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-300x40.webp 300w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-400x53.webp 400w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-600x80.webp 600w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-768x102.webp 768w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-800x107.webp 800w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-1024x137.webp 1024w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-1200x160.webp 1200w, https://homeitems.de/wp-content/uploads/2025/12/NodeRed-Flow-Zaehlerstand_berechnen-1536x205.webp 1536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Von meinem Wechselrichter erhalte ich per MQTT-Abfrage eine Vielzahl von Werten als Input. Aus diesen extrahiere ich im nächsten Function-Node zuerst die aktuelle Leistung.</p>
<p>In der Funktion „Energie berechnen” ermittele ich die Energie im letzten Zeitintervall. Mit dem anschließenden Switch-Node teste ich, ob die Variable „f_Zaehlerstand” vorhanden ist (Bedingung für Ausgang 1: „ist nicht Null”, für Ausgang 2: „ansonsten”). Warum mache ich das?</p>
<p>Für die Zählerstandsermittlung hole ich mir initial immer den Zählerstand aus der Datenbank und rechne dann mit Flow-Variablen in Node-Red weiter. Dadurch spare ich mir bei jedem Durchlauf die Datenbankabfrage des letzten Zählerstandes, die nur Zeit kostet. Allerdings muss ich am Anfang (nach einem Neustart von Node-Red) den Zählerstand einmal in die Variable laden. Dies stelle ich mit dem Switch-Node fest, der einfach prüft, ob die Variable „f_Zaehlerstand” einen Wert größer 0 liefert. Falls nicht, führe ich eine Abfrage der InfluxDB-Datenbank mit dem „influxdb in“-Node „Letzten Zählerstand auslesen“ und dem Function Node „Letzten Zählerstand zwischenspeichern“ aus. In diesem speichere ich den letzten Zählerstand aus der Datenbankabfrage in der Variablen „f_Zaehlerstand”.</p>
<p>Liefert der Switch-Node das Ergebnis „&gt;0”, wurde eine korrekte Energieberechnung durchgeführt. Im nächsten Funktionsknoten „Zähler hochsetzen” addiere ich die beiden Variablen „f_letzterZaehlerstand” und „f_energiekWh” und erhalte somit den neuen Zählerstand, den ich im anschließenden „InfluxDB Out”-Knoten in die Datenbank schreibe.</p>
</div><div class="fusion-text fusion-text-13"><h2>Berechnung</h2>
<p>Im Folgenden ist die Vorgehensweise bei der Berechnung in dem Function-Node "Energie berechnen" kurz beschrieben:</p>
<ol>
<li>Zunächst wird die Leistung ausgelesen und ein Zeitstempel erzeugt.</li>
<li>Anschließend werden die Flow-Variablen ausgelesen und zwischengespeichert.</li>
<li>Nun erhalten die Flow-Variablen die aktuelle Leistung und den aktuellen Zeitstempel.</li>
<li>Danach wird geprüft, ob es sich um die erste Messung handelt. Dies kann mittler der Variablen f_Zaehlerstand erfolgen, die bei der ersten Messung noch nicht ermittelt ist (z. B. nach einem Neustart von Node-Red). Falls ja, wird die Funktion abgebrochen (die</li>
<li>Erläuterung erfolgt weiter hinten).</li>
<li>Anschließend wird die Zeitdifferenz zwischen dem letzten und dem aktuellen Zeitwert berechnet (auch in Stunden).</li>
<li>Schließlich kann die Energie in Wattstunden berechnet werden.</li>
<li>Das Ergebnis wird von der Funktion zurückgeliefert.</li>
</ol>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-4 > .CodeMirror, .fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-4 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-4 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_4" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_4" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_4" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">let leistung = msg.payload; // in Watt
let jetzt = Date.now(); // aktueller Zeitstempel in Millisekunden

let letzterZeitstempel = flow.get("f_letzterZeitstempel") || 0; //letzte Auslesung
let letzteEnergieWh=flow.get("f_letzteEnergieWh") || 0; //letzter Energiewert bei Auslesung

// Ausgelesene Leistung und Zeitstempel sofort speichern
flow.set("f_letzterZeitstempel", jetzt);
flow.set("f_letzteEnergieWh", leistung);

// Falls dies die erste Messung ist, dann Abbruch der Funktion
if (!letzterZeitstempel) {
    return msg;
}

let deltaMillis = jetzt - letzterZeitstempel;
let deltaStunden = deltaMillis / (1000 * 3600); // in Stunden

let energieWh = letzteEnergieWh * deltaStunden;

let energiekWh = energieWh/1000;

flow.set("f_EnergiekWh", energiekWh);

msg.payload = energiekWh;

return msg;</textarea></div><div class="fusion-text fusion-text-14"><p>Der gesamte Ablauf kann selbstverständlich noch vereinfacht werden. Ebenso sind Erweiterungen denkbar. So habe ich beispielsweise eine kleine Absicherung eingebaut, falls die Datenbank nicht beschrieben werden kann (z. B. aufgrund eines Connection-Errors). In diesem Fall werden die Energiewerte zwischengespeichert, bis ein erneutes Schreiben möglich ist.</p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/aus-leistung-den-zaehlerstand-berechnen/">Aus Leistung den Zählerstand berechnen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/aus-leistung-den-zaehlerstand-berechnen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Zendure Batteriespeicher mit Node-RED abfragen</title>
		<link>https://homeitems.de/zendure-batteriespeicher-mit-node-red-abfragen/</link>
					<comments>https://homeitems.de/zendure-batteriespeicher-mit-node-red-abfragen/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Thu, 11 Sep 2025 12:03:31 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Node-Red]]></category>
		<category><![CDATA[Photovoltaik]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=4221</guid>

					<description><![CDATA[<p>Neben den großen Batteriespeichern für fertige PV-Anlagen setzen sich zunehmend modulare Hybridsysteme mit AC/DC- und DC/AC-Wandlern durch. Diese ermöglichen das Laden mit Gleichstrom aus den Solarpanels sowie das Laden mit überschüssigem Wechselstrom aus dem Hausnetz. Damit kann der Strom aus alten Solaranlagen, die aus der Förderung fallen, ebenso wie der Strom aus  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/zendure-batteriespeicher-mit-node-red-abfragen/">Zendure Batteriespeicher mit Node-RED abfragen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-15"><p>Neben den großen Batteriespeichern für fertige PV-Anlagen setzen sich zunehmend modulare Hybridsysteme mit AC/DC- und DC/AC-Wandlern durch. Diese ermöglichen das Laden mit Gleichstrom aus den Solarpanels sowie das Laden mit überschüssigem Wechselstrom aus dem Hausnetz. Damit kann der Strom aus alten Solaranlagen, die aus der Förderung fallen, ebenso wie der Strom aus Balkonkraftwerken, der sonst meist kostenlos ins Netz geht, einfach für den Eigenverbrauch genutzt werden.</p>
<p>Ein großer und seit Jahren aktiver Hersteller ist die Firma<a href="https://www.zendure.de"> Zendure</a> aus dem Silicon Valley.</p>
<p>Für viele Speichermodelle bietet Zendure eine API an, mit der über die Hersteller-Cloud auf Daten des Speichers zugegriffen werden kann. Nach Aussagen des Herstellers funktioniert das für die folgenden Speichertypen</p>
<ul>
<li>SuperBase V (6400, 4600)</li>
<li>Satellite Battery (6400, 4600) und</li>
<li>SolarFlow (800, 800 Pro, 2400 AC, Hyper 2000) und</li>
<li>SuperBase V (6400, 4600).</li>
</ul>
<p>Wer möchte, kann die Cloud auch komplett aussperren. Dies ist beispielsweise in folgendem <a href="https://tbsch.de/post/2025-06-15-zendure-solarflow-lokal-%C3%BCber-mqtt-steuern/">Beitrag von Tobias Schulz</a> beschrieben. Dann hat man jedoch keinen Zugang zur gut gemachten App sowie zur KI-basierten Speicherverwaltung. In diesem Beitrag zeige ich wie ich einen Zendure Hyper 2000 mit Speicher über die Hersteller Cloud mit Node-RED abfrage. Zendure stellt hierzu eine kleine <a href="https://github.com/Zendure/developer-device-data-report?tab=readme-ov-file">Dokumentation</a> unter github zur Verfügung.</p>
</div><div class="fusion-text fusion-text-16"><h2>Cloud Verbindung herstellen</h2>
<p>Für die Inbetriebnahme eines Geräts (Wechselrichter und Batteriespeicher) ist das Anlegen eines Accounts in der Cloud des Herstellers und die Registrierung der Geräte erforderlich (<a href="https://www.zendure.de/account/register">Link</a>). Ebenso muss die Zendure-App installiert werden, um die Geräte anzumelden und notwendige Firmware-Updates auf Speicher und Wechselrichter einzuspielen. Darüber hinaus ermöglicht der Zugang über die App den Abruf sämtlicher Statusdaten und Statistiken der registrierten Geräte. Die App hat mittlerweile einen sehr guten Entwicklungsstand erreicht, der eine komfortable Steuerung und Auswertung der Leistungsdaten ermöglicht. Für weitere Informationen verweise ich auf die Webseite des Herstellers.</p>
<p>Nach der Registrierung und Inbetriebnahme des Hyper2000-Wechselrichters über die App kann durch Klicken auf das Zahnradsymbol oben rechts die Seriennummer des Geräts aufgerufen werden. Diese steht sowohl unter dem Gerätenamen als auch unter dem Menüpunkt „Gerätedaten“.</p>
<p>Grundsätzlich kommunizieren die Zendure Geräte über einen MQTT-Broker, der in meinem Fall in der Zendure-Cloud liegt. Für diesen brauche ich Zugangsdaten, damit ich Daten von meinen Geräten abfragen kann.  Mit der Seriennummer und dem Accountnamen kann nun ein Request an die Zendure-Cloud gesendet werden, um die Zugangsinformationen für eine sichere Abfrage aus Node-Red zu erhalten.</p>
<p>Die Abfrage kann beispielsweise mit einem cURL-Befehl durchgeführt werden. Ich verwende stattdessen eine Abfrage mit Node-RED.Hierzu benötige ich nur 3 Nodes.</p>
<p>Im inject-Node gebe ich als JSON-Objekt die Seriennummer sowie den Accountnamen wie folgt an:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-5 > .CodeMirror, .fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-5 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-5 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_5" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_5" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_5" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">{
    "snNumber": "PL1LIKTUN208476",
    "account": "&#x7a;&#101;n&#x64;&#117;&#114;&#x65;&#x40;&#104;o&#x6d;&#101;i&#x74;&#x65;&#109;s&#x2e;&#100;e"
}</textarea></div><div class="fusion-text fusion-text-17"><p>Diesen Inhalt schicke ich nun an einen HTTP-Request-Node, und zwar als POST-Befehl an die Adresse https://app.zendure.tech/eu/developer/api/apply.<br />
Für den Output verwende ich einen Debug-Node.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten.webp"><img decoding="async" class="alignnone wp-image-4231 size-medium" src="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-300x80.webp" alt="" width="300" height="80" srcset="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-200x54.webp 200w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-300x80.webp 300w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-400x107.webp 400w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-600x161.webp 600w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-768x206.webp 768w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-800x214.webp 800w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-1024x274.webp 1024w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten-1200x321.webp 1200w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Zugangsdaten.webp 1240w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nun erhälte ich im Node-RED Debug-Fenster einen String zurück, der wie folgt aussieht:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-6 > .CodeMirror, .fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-6 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><label for="fusion_syntax_highlighter_6" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_6" data-readOnly="nocursor" data-lineNumbers="" data-lineWrapping="1" data-theme="default" data-mode="text/txt">"{"code":200,"success":true,"data":{"appKey":"qTIo702u","secret":"450EF4C1D34B526D8493C2E723D51AD4","mqttUrl":"mqtt-eu.zen-iot.com","port":1883},"msg":"Successful operation"}"</textarea></div><div class="fusion-text fusion-text-18"><p>Hiervon sind folgende Teile wichtig:</p>
<ul>
<li><strong>appKey</strong>: Der Accountname für die Anmeldung in der Cloud</li>
<li><strong>secret</strong>: Das Passwort für die Anmeldung  in der Cloud</li>
<li><strong>mqttUrl</strong>: Die URL des MQTT-Servers für die Datanabfrage</li>
</ul>
<p>Nun sind alle Daten vorhanden, die man für eine weitere Abfrage benötigt.</p>
<p>von dem folgende Daten wichtig sind:</p>
</div><div class="fusion-text fusion-text-19"><h2>Daten abfragen</h2>
<p>Um die Daten für das Gerät aus der Zendure-Cloud empfangen zu können, muss eine Abfrage beim MQTT-Server von Zendure erfolgen.</p>
<p>Dazu verwendet man einen MQTT-In-Node, für den man zunächst eine Verbindung mit den folgenden Daten einrichtet:</p>
<ul>
<li>Name: beliebig</li>
<li>Server: mqtt-eu.zen-iot.com</li>
<li>Port: 1883</li>
<li>Connect automatically</li>
<li>Protokoll: MQTT V3.1.1</li>
<li>Bereinigte Sitzung verwenden</li>
</ul>
<p>Unter dem Reiter „Sicherheit” werden folgende Daten angegeben:</p>
<ul>
<li>Benutzername: appkey (Der Accountname, den man von Zendure erhalten hat</li>
<li>Passwort: secret (Das Passwort, was man von Zendure erhalten hat)</li>
</ul>
</div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Bitte aufpassen, dass man hier aus Versehen nicht die Anmeldedaten für den Zendure Cloudzugang eingibt</span></div></div><div class="fusion-text fusion-text-20"><p>Im MQTT-IN Node werden folgende Eigenschaften eingetragen:</p>
<ul>
<li>Action: Subscribe to single topic</li>
<li>Topic: <em>appkey</em>/#       <em>(z.B. rtP7zHkq/#)</em></li>
<li>QoS: 2</li>
<li>Ausgang: Auto-Erkennung (parsed JSON Objekt, string oder buffer)</li>
</ul>
</div><div class="fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color" style="--awb-background-color:#fcf8e3;--awb-accent-color:#808080;--awb-border-size:1px;--awb-border-top-left-radius:8px;--awb-border-top-right-radius:8px;--awb-border-bottom-left-radius:8px;--awb-border-bottom-right-radius:8px;" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="fa-exclamation-triangle fas" aria-hidden="true"></i></span><span class="fusion-alert-content">Bitte denkt unbedingt daran, für das Topic den appkey gefolgt von einem „/#“ anzugeben, damit alle Werte von einem Gerät gesendet werden. Ohne den Slash und den Hashtag liefert die Angabe des appkey keine Ergebnisse.</span></div></div><div class="fusion-text fusion-text-21"><p>Nun sollte der Empfang funktionieren und die ersten Wert per payload-Objekt geliefert werden.</p>
<h2>Daten auswerten</h2>
<p>Beim Auswerten der empfangenen Daten stellt man schnell fest, dass immer nur Daten empfangen werden, die sich seit dem letzten Mal verändert haben. Damit enthält die payload immer eine unbestimmte Zahl von Einträgen mit jeweils unterschiedlichen Attributen.  Ebenso kann es durch die Cloudabfrage auch einen Zeitverzug ergeben (der für mich aber irrelevant ist). Ich habe festgestellt, dass für eine Hyper2000 neben der Seriennummer folgende Daten übertragen werden:</p>
<ul>
<li>remainOutTime ( Remaining discharge time in min = verbleibende Entladezeit)</li>
<li>packInputPower (pack input power)</li>
<li>electricLevel (Device battery percentage = Ladezustand der Batterie)</li>
<li>solarPower1 (Solar1 Input Power in Watt = Leistung aus erstem Wechselrichter)</li>
<li>solarPower2 (Solar2 Input Power in Watt = Leistung aus zweiten Wechselrichter)</li>
<li>outputHomePower (output to home power in Watt = abgebene Leistung ins Hausnetz)</li>
<li>hyperTmp (hyperTmp</li>
<li>solarInputPower (solarInputPower = Leistung die gerade durch solarPanels in Speicher geladen wird)</li>
<li>packState (packState = Gibt an, ob in Batterie gerade nichts passiert (0), geladen(1) oder entladen(2) wird)</li>
</ul>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p>Das sind weniger Informationen, als in der App angeboten werden, so dass man ansonsten auf die Cloud-freie Lösung umschwenken muss.</p>
<p>Um die Daten auszuwerten kann man nun mit einer ganz einfache Lösung starten:</p>
</div>
<p>Für jeden Datentyp extrahiert jeweils ein Function Node die Daten aus der payload. Die kann wie folgt aussehen:</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-7 > .CodeMirror, .fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-7 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-7 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_7" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_7" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_7" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">msg.payload = msg.payload.remainOutTime
return msg;</textarea></div><div class="fusion-text fusion-text-22"><p>Da es möglich ist, dass der Wert gar nicht geliefert wurde, muss man in einem anschließenden Switch-Node prüfen, ob das Ergebnis NULL ist. Anschließend kann der Wert weiterverarbeitet werden (z. B. in InfluxDB etc.)</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung.webp"><img decoding="async" class="alignnone wp-image-4251 size-medium" src="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-300x106.webp" alt="" width="300" height="106" srcset="https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-200x71.webp 200w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-300x106.webp 300w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-400x141.webp 400w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-600x212.webp 600w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-768x271.webp 768w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-800x282.webp 800w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-1024x361.webp 1024w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung-1200x423.webp 1200w, https://homeitems.de/wp-content/uploads/2025/09/Node-Red-Zendure-Datenauswertung.webp 1356w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Dies ist eine sehr einfache Lösung für die Auswertung, die natürlich durch eine effizientere Lösung mit weniger Redundanz ersetzt werden kann.</p>
<p>Interessant ist, dass Zendure keinen Zähler übergibt, der die Menge des von einer direkt angeschlossenen Photovoltaikanlage erzeugten Stroms in kWh misst. In der App ist ein solcher Zähler allerdings vorhanden. Zendure liefert stattdessen die jeweilige Leistung der PV-Module. In einem nächsten Beitrag zeige ich, wie sich aus der Leistung trotzdem Zählerstände berechnen lassen.</p>
</div><div class="fusion-alert alert error alert-danger fusion-alert-center awb-alert-native-link-color" role="alert"><div class="fusion-alert-content-wrapper"><span class="alert-icon"><i class="awb-icon-exclamation-triangle" aria-hidden="true"></i></span><span class="fusion-alert-content"><p>Beim <strong>Solarflow 2400AC</strong> scheint die beschriebene Vorgehensweise mit dem MQTT-Server nicht zu funktionieren. Hier hat Martin stattdessen folgende Lösung gefunden:</p>
<div class="plain_line"><em>Wenn man im Browser: http://ipAdressedesdesSolarflow/properties/report eingibt, z.B.</em></div>
<div class="plain_line"></div>
<div class="plain_line"><em>http://192.168.177.96/properties/report</em></div>
<div class="plain_line"></div>
<div class="plain_line"><em>bekommt man einen schönen Datenstring auf den Bildschirm. </em><em>Diesen hole ich in Node-RED über einen http Request Node und "GET" rein und parse in einem Function-Node z.B. nach der Batteriekapazität, die heisst da "socLevel". Dessen Wert kann ich im Function-Node einem Ausgang zuführen. Das hilft mir für meine Anwendung weiter und der Weg über MQTT ist für mich dann überflüssig.</em></div>
<div class="plain_line"></div></span></div></div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/zendure-batteriespeicher-mit-node-red-abfragen/">Zendure Batteriespeicher mit Node-RED abfragen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/zendure-batteriespeicher-mit-node-red-abfragen/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>Velux Rollladen mit Somfy und Node-RED steuern</title>
		<link>https://homeitems.de/velux-solar-rollladen-mit-tahoma-und-nodered-steuern/</link>
					<comments>https://homeitems.de/velux-solar-rollladen-mit-tahoma-und-nodered-steuern/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sat, 03 May 2025 17:49:22 +0000</pubDate>
				<category><![CDATA[Node-Red]]></category>
		<category><![CDATA[Somfy / Tahoma]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=3705</guid>

					<description><![CDATA[<p>Seit vielen Jahren bietet Velux für seine Dachfensterlösungen die Nachrüstung von Rollläden an. Egal, ob man sich für Solarrollladen oder kabelgebundene Rollläden entscheidet, kann man diese in sein Smart Home einbinden. In vielen Fällen wird hierzu das KLF-200-Interface verwendet. Wer hingegen bereits eine Somfy-Basisstation (Tahoma Switch) besitzt, kann sich den Kauf des  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/velux-solar-rollladen-mit-tahoma-und-nodered-steuern/">Velux Rollladen mit Somfy und Node-RED steuern</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-23"><p>Seit vielen Jahren bietet Velux für seine Dachfensterlösungen die Nachrüstung von Rollläden an. Egal, ob man sich für Solarrollladen oder kabelgebundene Rollläden entscheidet, kann man diese in sein Smart Home einbinden. In vielen Fällen wird hierzu das KLF-200-Interface verwendet. Wer hingegen bereits eine Somfy-Basisstation (Tahoma Switch) besitzt, kann sich den Kauf des KLF 200 sparen. Im folgenden Artikel zeige ich, wie sich die Rollläden mit Somfy und Node-RED einfach in eine Smart-Home-Lösung integrieren lassen.</p>
<h2>Rollladen anlernen</h2>
<p>Zunächst wird der neue Velux-Rollladen über die Somfy-App angelernt. Hierzu ist keine Zusatzhardware von Velux oder Somfy erforderlich, sofern der Tahoma Switch vorhanden ist.</p>
<p>Dazu wählt man in der Somfy-App das Haussymbol und „Produkt hinzufügen“ aus. Anschließend wählt man „Fenster und Sonnenschutz“ und dann „Außensonnenschutz“ aus. Bei der Art des Außensonnenschutzes wird „Rollläden“ und bei der Fernbedienung „Wandsensor“ ausgewählt. Nun sollte der „Velux-Wandsensor“ erscheinen, den man anklickt.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1816.png"><img decoding="async" class="alignnone wp-image-3707 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1816.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1817.png"><img decoding="async" class="alignnone wp-image-3708 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1817.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1818.png"><img decoding="async" class="alignnone wp-image-3709 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1818.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1820.png"><img decoding="async" class="alignnone wp-image-3711 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1820.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1819.png"><img decoding="async" class="alignnone wp-image-3710 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1819.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a></p>
<p>Nun muss die SET-Taste des Velux-Wandsensors gedrückt werden. Am unteren Gehäuserand befinden sich zwei Öffnungen: Die linke ist mit einem Zahnrad versehen und stellt die SET-Taste dar, die rechte ist mit zwei übereinanderliegenden Fenstern versehen. Mit einem spitzen Gegenstand wird die linke Taste mit dem Zahnradsymbol so lange gedrückt, bis sich der Rollladen zu bewegen beginnt. Anschließend wird in der App auf „Weiter“ gedrückt. Die App sucht im Hintergrund nach dem VELUX-Empfänger und meldet nach kurzer Zeit, dass ein Rollladen gefunden wurde.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1821.png"><img decoding="async" class="alignnone wp-image-3712 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1821.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1823.png"><img decoding="async" class="alignnone wp-image-3714 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1823.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a><a href="https://homeitems.de/wp-content/uploads/2025/05/IMG_1824.png"><img decoding="async" class="alignnone wp-image-3715 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-138x300.png" alt="" width="138" height="300" srcset="https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-138x300.png 138w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-200x434.png 200w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-400x867.png 400w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-472x1024.png 472w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-600x1301.png 600w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-709x1536.png 709w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-768x1665.png 768w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-800x1734.png 800w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824-945x2048.png 945w, https://homeitems.de/wp-content/uploads/2025/05/IMG_1824.png 1179w" sizes="(max-width: 138px) 100vw, 138px" /></a></p>
<p>Der neue Rollladen ist jetzt in der Tahoma-App angelernt und kann darüber bedient werden. Die Option „Diskret“ reduziert das Geräusch der Rolladenbewegung durch langsameres Rollen. Ich empfehle dringend, dem Rollladen im folgenden Dialog noch einen sprechenden Namen zu geben, da wir diesen in Node-Red noch benötigen werden.</p>
<p>Ich nenne meinen Rollladen „DG Rollladen Mitte“.</p>
<p><em>Hinweis: In der Tahoma-App wird zwar der Name des Rollladen in der richtigen Länge angezeigt, bei der späteren Nutzung in Node-Red kann es aber sein, dass der Name nur gekürzt wiedergegeben wird.</em></p>
<h2>Mit Node-RED Gerätedaten auslesen</h2>
<p>Wie man den Tahoma Switch mit Node-Red ausliest, habe ich bereits im Beitrag <a href="https://homeitems.de/weinor-markisen-mit-nodered-und-somfy-api-steuern/">Weinor Markisen mit NodeRed und Somfy API steuern </a>beschrieben. Als Ergebnis des Beitrags erhalte ich neben der Adresse für den Switch auch den Token (Passwort), mit dem ich in den folgenden Schritten die Geräte abfragen kann.</p>
<p>Zunächst frage ich alle Geräte auf dem Tahoma Switch ab. Dazu muss ich den Befehl „Get Devices“ mit der Adresse der API des Tahoma Switches an die Zentrale schicken. Dies ist im oben genannten Artikel genau beschrieben. Ich habe mir diese Abfrage in Node-Red so eingerichtet, dass ich jederzeit alle Geräte abfragen kann. Nach dem Absetzen des GET-Befehls über einen „http-request“-Node erhalte ich im Debug-Fenster ein Objekt mit allen auf dem Tahoma Switch registrierten Geräten, deren Status und Befehlen. Bitte daran denken, den Bearer-Token immer neu einzugeben. Durch Aufklappen der Objektdetails kann ich nach meinem Rollladen „DG Rollladen Mitte“ suchen.</p>
<p>Da ich den Namen meines neuen Geräts kenne, fällt es mir nun leicht, es im Objektbaum zu finden. Kurz darunter steht die IO-Adresse, die ich zum Senden von Befehlen brauche. Im Array „Commands“ steht, dass ich die Befehle „up“, „close“ und „stop“ benutzen kann, um den Rollladen zu bewegen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux.webp"><img decoding="async" class="alignnone wp-image-3720 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-300x169.webp" alt="" width="300" height="169" srcset="https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-200x113.webp 200w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-300x169.webp 300w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-400x225.webp 400w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-600x338.webp 600w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-768x432.webp 768w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-800x450.webp 800w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-1024x576.webp 1024w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux-1200x675.webp 1200w, https://homeitems.de/wp-content/uploads/2025/05/Abfrage-NodeRed-Velux.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nun habe ich alle erforderlichen Details, um das Gerät zu steuern.</p>
<h3>Velux Rollladen steuern</h3>
<p>Um einen Steuerbefehl absetzen zu können, muss ich Daten als POST-Request an die API-Funktion „exec” schicken.</p>
<p>Die Befehlszeile dazu sieht wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-8 > .CodeMirror, .fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-8 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-8 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_8" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_8" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_8" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">https://gateway-2029-7239-2937:8443/enduser-mobile-web/1/enduserAPI/exec/apply</textarea></div><div class="fusion-text fusion-text-24"><p>Diese Befehlszeile, die ich mit einem HTTP-Request-Node absetze, benötigt als Input noch ein Datenobjekt, in dem ich angebe, welches Gerät ich mit welchem Befehl ansprechen möchte. Hier wird dann die IO-Adresse meines „DG Rollladen Mitte” verwendet.</p>
<p>Für das Runterfahren sieht das Datenobjekt wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-9 > .CodeMirror, .fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-9 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-9 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_9" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_9" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_9" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">{
    "label": "DG Rollladen Mit",
    "actions": [
        {
            "commands": [
                {
                    "name": "close"
                }
            ],
            "deviceURL": "io://2029-7239-2937/1749362"
        }
    ]
}</textarea></div><div class="fusion-text fusion-text-25"><p>Dabei besteht die IO-Adresse immer aus der Adresse des Tahoma Switches, gefolgt von der siebenstelligen Geräteadresse des eigentlichen Geräts. Der Name des Gerätes ist für den Befehl nicht wichtig, da das Gerät eindeutig durch seine IO-Adresse bestimmt wird.</p>
<p>In Node-RED sieht das dann wie folgt aus:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close.webp"><img decoding="async" class="alignnone wp-image-3722 size-medium" src="https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-300x29.webp" alt="" width="300" height="29" srcset="https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-200x20.webp 200w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-300x29.webp 300w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-400x39.webp 400w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-600x59.webp 600w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-768x75.webp 768w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-800x78.webp 800w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-1024x100.webp 1024w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close-1200x117.webp 1200w, https://homeitems.de/wp-content/uploads/2025/05/Nodered-Flow_Velux-close.webp 1414w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
</div><div class="fusion-text fusion-text-26"><p>Möchte man hingegen den Status abfragen, erhält man diesen mit einem Get-Befehl, der die API-Funktion /setup/devices/ aufruft. Bei der IO-Adresse muss man im Get- (oder Post-)Befehl daran denken, dass Sonderzeichen in HTML-UTF8-HEX-Zeichen umgewandelt werden müssen (d. h. aus :// wird %3A%2F%2F und aus / wird %2F).</p>
<p>Die Befehlszeile zur Abfrage des Status meines Rollladens lautet dann wie folgt:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-10 > .CodeMirror, .fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-10 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-10 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_10" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_10" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_10" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">https://gateway-2029-7239-2937:8443/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2F2029-7239-2937%2F1749362</textarea></div><div class="fusion-text fusion-text-27"><p>Zurück erhalte ich ein Objekt, in dem sich ausschließlich die Daten meines Rollladens befinden. Mithilfe dieses Objekts kann ich beispielsweise feststellen, wie weit der Rollladen heruntergefahren wurde.</p>
</div><div class="fusion-text fusion-text-28"><p><em>Nachtrag vom 14.5.25</em></p>
<h2>Bestimmte Position anfahren</h2>
<p>Für das Anfahren einer bestimmten Position findet man in der command-Liste des Gerätes den Befehl "setClosure". Als Parameter wird die Position in Prozent angegeben, wobei 0% eingefahren und 100% ausgefahren bedeutet. Das an den Befehl zu übergebende Datenobjekt sieht wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-11 > .CodeMirror, .fusion-syntax-highlighter-11 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-11 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-11 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-11 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_11" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_11" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_11" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">{
    "label": "DG Rollladen Mit",
    "actions": [
        {
            "commands": [
                {
                    "name": "setClosure",
                    "parameters": [
                        "50"
                    ]
                }
            ],
            "deviceURL": "io://2029-7239-2937/1749362"
        }
    ]
}</textarea></div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/velux-solar-rollladen-mit-tahoma-und-nodered-steuern/">Velux Rollladen mit Somfy und Node-RED steuern</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/velux-solar-rollladen-mit-tahoma-und-nodered-steuern/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>CO2-Sensor für Smarthome selber bauen</title>
		<link>https://homeitems.de/co2-sensor-selber-bauen-und-auswerten/</link>
					<comments>https://homeitems.de/co2-sensor-selber-bauen-und-auswerten/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 10 Nov 2024 18:57:59 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[Tasmota]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=3367</guid>

					<description><![CDATA[<p>Nicht erst seit Corona ist die Messung des CO2-Gehaltes in der Raumluft eine Möglichkeit festzustellen, ob genügend Frischluft (oder Sauerstoff) in einem Raum vorhanden ist. Ich war teilweise überrascht, wie teuer manche Sensorlösungen verkauft werden und habe mich daher entschlossen, einen eigenen Sensor zu bauen, der sich auch einfach in mein Smarthome  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/co2-sensor-selber-bauen-und-auswerten/">CO2-Sensor für Smarthome selber bauen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-5 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-29"><p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">N</span>icht erst seit Corona ist die Messung des CO2-Gehaltes in der Raumluft eine Möglichkeit festzustellen, ob genügend <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Frischluft</span> (oder Sauerstoff) in einem Raum vorhanden ist. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Ich <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">war</span> teilweise überrascht, wie teuer manche Sensorlösungen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">verkauft</span> werden und habe mich daher <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">entschlossen</span>, einen eigenen Sensor <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zu</span> bauen, der <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">sich</span> auch <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">einfach</span> in mein Smarthome <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">integrieren lässt</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Mit einer kleinen LED möchte ich anzeigen, ob ein vorgegebener Grenzwert überschritten wird. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">D</span>ie <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Daten des Sensors</span> sollen zyklisch <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">an</span> mein Smarthome-System <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gesendet</span> werden.</span></p>
<h2>Benötigte Hardware</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Als Sensor habe ich mich für einen CO2-<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Infrarotsensor</span> MH-Z 19C entschieden. </span><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Der</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Sensor</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">sendet</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">seine</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Informationen</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">über</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">eine</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">UART-Schnittstelle</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">(</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Tx</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">,</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Rx-Kanal</span><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">),</span></span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">besitzt</span> <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">zusätzlich</span></span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">einen</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Temperatursensor</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">und</span> <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">benötigt</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">eine</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Versorgungsspannung</span></span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">von</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">5</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">V</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">.</span> </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Mit diesen Anschlussmöglichkeiten eignet er sich hervorragend für <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">den</span> Anschluss an einen Wemos D1-Mini (8266 Chip), den ich <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">schon</span> in vielen meiner Projekte verwendet habe. Über <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">diese</span> kann ich dann auch alle Daten an einen MQTT-Broker <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">senden</span> und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">so</span> die Daten einfach in meinem Smarthome-System <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">weiterverarbeiten</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Den Sensor gibt es in verschiedenen Ausführungen, wobei ich mich für die Version mit den <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Stiftleisten</span> entschieden habe<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">, um den Anschluss zu vereinfachen</span>. </span></p>
<p><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">A</span></span>uf dem D1 Mini verwende ich die Tasmota Version 14.3.0. Um den CO2-<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Infrarotsensor</span> MH-Z 19C <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">an den</span> D1 Mini anschließen und auslesen zu können, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">benötige</span> ich die <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Tasmota Sensor</span> Version (alternativ kann man <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">den MH-Z19C</span> auch einfach in der Standardversion aktivieren und spart dadurch viel <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Speicherplatz</span> auf dem D1 Mini).</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Ich erstelle meine Programme <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gerne</span> mit der <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Skriptsprache</span> von Tasmota. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Da es <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">diese Funktion</span> in den <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">vorkompilierten</span> Versionen von Tasmota nicht gibt, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">kompiliere</span> ich mir <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">selbst</span> eine Version und flashe den D1-Mini <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">damit</span>. </span><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Dies</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">geht</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">sehr</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">einfach</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">und</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">ist</span> <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">im</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">folgenden</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">Artikel</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">von</span></span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">mir</span> <span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">beschrieben</span><span class="--l --r hover:dark:text-blue-next-300 hover:text-blue-next-500 lmt__words_highlight">:</span></span><a href="https://homeitems.de/tasmota-scripting-aktivieren/">Tasmota Scripting aktivieren</a></p>
<p>Ich empfehle, in der Konfiguration des D1-Mini neben dem WLAN auch direkt einen MQTT-Server anzugeben.</p>
<h2>CO2-Sensor anschließen</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">D</span>er Anschluss des CO2-Sensors ist recht einfach. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Als Ergänzung habe ich noch eine rote LED hinzugefügt, die <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">bei Überschreitung eines definierten Grenzwertes aufleuchten soll</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">D</span>ie gesamte Schaltung ist in <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">der folgenden Abbildung</span> dargestellt:</span></p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung.webp"><img decoding="async" class="alignnone wp-image-3382 size-medium" src="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-300x241.webp" alt="" width="300" height="241" srcset="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-177x142.webp 177w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-200x161.webp 200w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-300x241.webp 300w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-400x322.webp 400w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-600x483.webp 600w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-768x618.webp 768w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-800x644.webp 800w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-1024x824.webp 1024w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung-1200x966.webp 1200w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensorschaltung.webp 1435w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">N</span>un muss der Sensor in Tasmota <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">konfiguriert</span> werden. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Dies <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">geschieht</span> über die serielle Schnittstelle mit TX (Sendekanal) und RX (Empfangskanal<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">).</span></span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Unter Configure / Configuration Module wähle ich als Module Type "Generic(18)" (steht <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">meistens</span> ganz unten in der Liste) und speichere das. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">E</span>rst <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dann</span> kann ich <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">alle</span> meine GPIOs sehen und konfigurieren.</span></p>
<ul>
<li>GPIO1 (TX) wird auf "MHZ Tx (60)" (Sendekanal) gesetzt.</li>
<li>GPIO3 (RX) wird auf "MHZ Rx (61)" (Empfangskanal) gesetzt.</li>
</ul>
<p><em>(Tipp: In der langen Liste stehen die beiden Werte im unteren Dritttel).</em></p>
<p>Um die LED einschalten zu können, wird noch ein Relay benötigt, dass wie folgt definiert werden muss:</p>
<ul>
<li>GPIO5 (D1) wird auf "Relay 1" gesetzt.</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration.webp"><img decoding="async" class="alignnone wp-image-3383 size-medium" src="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-153x300.webp" alt="" width="153" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-153x300.webp 153w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-200x393.webp 200w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-400x786.webp 400w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-521x1024.webp 521w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-600x1180.webp 600w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-768x1510.webp 768w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-781x1536.webp 781w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration-800x1573.webp 800w, https://homeitems.de/wp-content/uploads/2024/11/CO2-Sensor-Tasmota-Configuration.webp 826w" sizes="(max-width: 153px) 100vw, 153px" /></a></p>
<p>Nach dem Speichern und dem automatischen Neustart sollten Temperatur und CO2 Gehalt wie folgt auf der Tasmota Oberfläche erscheinen:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor.jpg"><img decoding="async" class="alignnone wp-image-3384 size-medium" src="https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-194x300.jpg" alt="" width="194" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-194x300.jpg 194w, https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-200x309.jpg 200w, https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-400x618.jpg 400w, https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-600x927.jpg 600w, https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor-663x1024.jpg 663w, https://homeitems.de/wp-content/uploads/2024/11/Tasmota-CO2-Sensor.jpg 759w" sizes="(max-width: 194px) 100vw, 194px" /></a></p>
<p><em>Hinweis: Aufgrund der Vorheizzeit kann es bis zu einer Minute dauern, bevor der Sensor Werte liefert!</em></p>
<h2>Script für LED-Warnung erstellen</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">N</span>atürlich möchte ich, dass eine rote Lampe <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">aufleuchtet</span>, wenn ein Grenzwert überschritten wird. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">B</span>ezüglich</span> möglicher Grenzwerte verweise ich auf <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">den</span> folgenden</span> <a href="https://www.cik-solutions.com/branchen-anwendungen/co2-im-innenraum/">Artikel</a>. <span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">D</span>azu muss ich den Sensorwert auslesen und in einem kleinen Programm das <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Relais</span> immer dann einschalten, wenn der Grenzwert überschritten wird. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Bei</span> dieser Abfrage prüfe ich, ob die LED schon <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">an</span> ist, damit ich nicht <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">ständig</span> den Einschaltbefehl sende. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">N</span>atürlich schalte ich die LED <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">wieder</span> aus, wenn der Grenzwert unterschritten wird.</span></p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-12 > .CodeMirror, .fusion-syntax-highlighter-12 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-12 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-12 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-12 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_12" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_12" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_12" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">>D
tmp1=0
>T
tmp1=MHZ19B#CarbonDioxide
if tmp1>1000 and pwr[1]==0
then =>power1 1
endif
if tmp1<=1000 and pwr[1]==1 
then =>power1 0
endif</textarea></div><div class="fusion-text fusion-text-30"><p>Die Daten können nun vom MQTT-Broker "abgeholt"  und beispielsweise in InfluxDB gespeichert und ausgewertet werden. Wie das geht habe ich in folgenden Artikeln beschrieben</p>
<h2>Möglicher Anpassungen</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Ich versorge den Sensor <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">über ein</span> USB-Kabel mit Strom. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Theoretisch könnte man dies auch mit einer <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Akkulösung</span> realisieren. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Dazu</span> wird dann der Deepsleep-Modus verwendet</span> (siehe hierzu <a href="https://homeitems.de/fuellstandssensor-zisterne-fuer-hmip-selber-bauen/">Füllstandssensor (Zisterne) für HMIP selber bauen</a>). <span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_highlight"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar">W</span>ichtig ist, dass der Sensor eine Vorlaufzeit <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zur</span> Temperaturanpassung benötigt. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Daher sollte der Sensor frühestens nach 1 Minute wieder in <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">den DeepSleep-Modus gehen</span>.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Anstelle</span> einer LED <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">könnte man</span> auch eine mehrfarbige LED <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">verwenden</span>, die den jeweiligen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Zustand</span> anzeigt.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextLengthModification_body sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r word_anchor_highlight__with_key_writeTextLengthModification_body">I</span>nzwischen</span> habe <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">ich</span> den Sensor auf eine Platine gelötet und mir mit dem Drucker <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">ein passendes Gehäuse</span> gedruckt.</span></p>
</div></div></div><div class="fusion-layout-column fusion_builder_column fusion-builder-column-5 fusion_builder_column_1_1 1_1 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/co2-sensor-selber-bauen-und-auswerten/">CO2-Sensor für Smarthome selber bauen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/co2-sensor-selber-bauen-und-auswerten/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bodenfeuchtemessung über weite Strecken mit LoRaWAN</title>
		<link>https://homeitems.de/bodenfeuchtemessung-ueber-weite-strecken-mit-lorawan/</link>
					<comments>https://homeitems.de/bodenfeuchtemessung-ueber-weite-strecken-mit-lorawan/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 28 Jul 2024 14:09:58 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[LoRaWAN]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[Smart Garden]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=3204</guid>

					<description><![CDATA[<p>Eine Bodenfeuchtemessung im Garten ist hilfreich, wenn man Pflanzen oder Rasen rechtzeitig und ausreichend bewässern möchte. Wenn man einen größeren Garten oder z.B. einen Schrebergarten hat, ist oft kein WLAN an allen Stellen verfügbar. Als Alternative bietet sich dann das Versenden der Sensordaten über LoRaWAN an. Die Vorteile habe ich bereits in  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/bodenfeuchtemessung-ueber-weite-strecken-mit-lorawan/">Bodenfeuchtemessung über weite Strecken mit LoRaWAN</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-6 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-6 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-6 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-31"><p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Eine Bodenfeuchtemessung im Garten ist <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">hilfreich</span>, wenn man Pflanzen oder Rasen rechtzeitig und ausreichend <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">bewässern</span> möchte. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Wenn</span> man einen größeren Garten oder z.B. einen Schrebergarten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">hat,</span> ist <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">oft</span> kein WLAN an allen Stellen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">verfügbar</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Als Alternative bietet sich <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dann das Versenden der</span> Sensordaten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">über LoRaWAN an</span>.</span> Die Vorteile habe ich bereits in meinem Beitrag <a href="https://homeitems.de/lorawan/">LoRaWAN mit eigenem Gateway einrichten</a> genannt.</p>
<p>ELV hat hierzu ein interessantes Produkt für einen überschaubaren Preis im Programm. Dazu braucht man das  <a href="https://de.elv.com/p/elv-lorawan-interface-1-elv-lw-int1-P160149/?itemId=160149">LoRaWAN-Interfaces ELV-LW-INT1</a> und den  universellen <a href="https://de.elv.com/p/elv-universeller-bodenfeuchtesensor-somo1-ic-P157930/?itemId=157930">Bodenfeuchtesensor SoMo1, I²C</a>. Beide zusammen sind bei ELV für ca. 75 Euro zu erhalten.</p>
<p>Ich mit diesen Komponenten in einem größeren Garten die Bodenfeuchte und -temperatur gleichzeitig messen und halbstündlich an einen MQTT-Server übertragen. Ich habe dazu in der Nähe ein LoRaWAN-Gateway im TTN-Netz verfügbar.</p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">V</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">or</span> der Inbetriebnahme</span> muss <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">das System</span> konfiguriert werden. </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Da die Konfiguration viele Möglichkeiten anbietet und für den Laien nicht trivial erscheint beschreibe ich, wie man den Sensor für diesen Zweck in Betrieb nehmen kann.<br />
</span></p>
<h2>Installation der Hardware</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">A</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">uch</span> wenn die Platine als „Bausatz“ angeboten wird<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">,</span> sind <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">keine</span> Bestückungs- <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">oder</span> Lötarbeiten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">erforderlich</span>. <span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Das Interface besitzt neben 2 <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Mignon-Batterieslots</span> vom Typ LR6 (AA) auch 2 Sensoranschlüsse mit UART<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">-</span> oder I²<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">C-Schnittstelle</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Obwohl insgesamt nur eine Spannungsversorgung über die Batterien (Akkus) von 3V <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zur Verfügung steht</span>, können trotzdem 3,3 bzw. 5<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">V an die Sensoren</span> ausgegeben werden <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">(über</span> Transistoren). </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Dies ist wichtig, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">da</span> die meisten Sensoren die etwas höhere Spannung <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">für eine korrekte Messung</span> benötig</span>en. <span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">D</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">ie</span> Platine besitzt keine externe Spannungsversorgung und kann <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">daher</span> nur durch Bestückung mit den 2 Mignonzellen in Betrieb genommen werden. <span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Zur Befestigung <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">liegen</span> noch 2 Schrauben und eine Stiftleiste <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">bei</span>, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">über</span> die ein <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Firmware-Update</span> über <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">einen USB-UART-Konverter</span> UM2102N <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">durchgeführt werden kann</span>. Die richtige Firmware ist bereits <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">installiert</span>.</span><br />
</span></span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Der Feuchte- und Temperatursensor ist ebenfalls sofort <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">einsatzbereit</span>, kann Bodenfeuchte und -temperatur messen, besitzt einen AD/DA-Wandler und ist wasserdicht vergossen. Nach dem Einbau in eine Dose kann das Kabel des Sensors </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">über die gekennzeichneten 4 <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Drähte</span> an die Schnittstelle wie folgt angeschlossen werden: </span></p>
<ul>
<li><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">(braun) an +UB2<br />
</span></li>
<li>(schwarz) an GND</li>
<li>(blau) an SDA</li>
<li>(weiß) an SCL</li>
</ul>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Weitere <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Detailinformationen finden sich z.B.</span> in</span> folgendem <a href="https://de.elv.com/p/lorawan-interface-fuer-uart-und-i2c-sensoren-elv-lorawan-interface-1-elv-lw-int1-P254091/?itemId=254091">ELV-Journalartikel</a>.</p>
<p>Wer kein LoRaWAN-Gateway in der nähe hat findet im Artikel <a href="https://homeitems.de/lorawan/">LoRaWAN mit eigenem Gateway einrichten</a> weitere Hinweise zum TTN-Netzwerk oder der Gateway-Einrichtung.</p>
<p>Ich empfehle, die Batterien erst wie im nächsten Kapitel beschrieben einzulegen.</p>
<h2>Device und Applikation in TTN Netzwerk ergänzen</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">N</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">ach</span> dem Einloggen in das TTN-Netzwerk geht man auf den Reiter „Applications“. </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Als erstes erstelle ich</span> eine Application und gebe hier einen aussagekräftigen Namen „Loris-Bodenfeuchte1“ ein. </span></p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/07/Application.webp"><img decoding="async" class="alignnone wp-image-3251 size-medium" src="https://homeitems.de/wp-content/uploads/2024/07/Application-300x138.webp" alt="" width="300" height="138" srcset="https://homeitems.de/wp-content/uploads/2024/07/Application-66x30.webp 66w, https://homeitems.de/wp-content/uploads/2024/07/Application-177x82.webp 177w, https://homeitems.de/wp-content/uploads/2024/07/Application-200x92.webp 200w, https://homeitems.de/wp-content/uploads/2024/07/Application-300x138.webp 300w, https://homeitems.de/wp-content/uploads/2024/07/Application-320x147.webp 320w, https://homeitems.de/wp-content/uploads/2024/07/Application-400x184.webp 400w, https://homeitems.de/wp-content/uploads/2024/07/Application-460x212.webp 460w, https://homeitems.de/wp-content/uploads/2024/07/Application-540x249.webp 540w, https://homeitems.de/wp-content/uploads/2024/07/Application-600x276.webp 600w, https://homeitems.de/wp-content/uploads/2024/07/Application-669x308.webp 669w, https://homeitems.de/wp-content/uploads/2024/07/Application-700x322.webp 700w, https://homeitems.de/wp-content/uploads/2024/07/Application-768x354.webp 768w, https://homeitems.de/wp-content/uploads/2024/07/Application-800x369.webp 800w, https://homeitems.de/wp-content/uploads/2024/07/Application-940x433.webp 940w, https://homeitems.de/wp-content/uploads/2024/07/Application-1024x472.webp 1024w, https://homeitems.de/wp-content/uploads/2024/07/Application-1200x553.webp 1200w, https://homeitems.de/wp-content/uploads/2024/07/Application-1536x708.webp 1536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Anschließend <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">erstelle</span> ich ein neues Device<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">, indem ich</span> auf „New Device“ <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">klicke</span>.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Bei</span> „<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">End</span> device type“ kann man das <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Device</span> direkt im Repository <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">suchen</span> (Option 1<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">).</span> </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Dazu</span> wählt man ELV aus und findet <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dann</span> schon das LoRaWAN Interface 1. Als Frequency Plan wird SF9 gewählt und nach Eingabe der JoinEUI (<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">liegt dem</span> Interface als kleiner Aufkleber <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">bei</span>) kann man auf Confirm tippen. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Danach werden</span> noch die DevEUI <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">und der</span> AppKey <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">ergänzt</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Die End-Device ID wird automatisch <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">generiert</span> und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">man</span> kann <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">nun</span> „Register end device“ drücken. <em>(Update Juli 2025: Die End-Device ID wird mittlerweile nicht mehr automatisch generiert. Hier kann man beispielsweise auch die DevEUI in der Notation "eui...." eintragen). </em></span></p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/07/New-Device.webp"><img decoding="async" class="alignnone wp-image-3252 size-medium" src="https://homeitems.de/wp-content/uploads/2024/07/New-Device-260x300.webp" alt="" width="260" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/07/New-Device-66x76.webp 66w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-177x204.webp 177w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-200x230.webp 200w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-260x300.webp 260w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-300x346.webp 300w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-320x369.webp 320w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-400x461.webp 400w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-460x530.webp 460w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-540x622.webp 540w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-600x691.webp 600w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-669x771.webp 669w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-700x806.webp 700w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-768x885.webp 768w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-800x922.webp 800w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-889x1024.webp 889w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-940x1083.webp 940w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-1200x1382.webp 1200w, https://homeitems.de/wp-content/uploads/2024/07/New-Device-1333x1536.webp 1333w, https://homeitems.de/wp-content/uploads/2024/07/New-Device.webp 1520w" sizes="(max-width: 260px) 100vw, 260px" /></a></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Nach dem Einlegen der Batterien oder Akkus blinkt <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">das Board kurz</span> rot/<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gelb und wechselt dann</span> auf grün.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Jetzt</span> kann man unter „Live data“ beobachten<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">,</span> wie das Gerät Kontakt <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zum Netzwerk aufnimmt</span> und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Nutzdaten</span> sendet. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Zum Dekodieren der Daten benötigt man einen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Payload Parser</span> (ein kleiner Codeblock, der die vom Gerät <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">empfangenen hexadezimalen Bytewerte übersetzt</span>). </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Wenn man </span>das Gerät wie beschrieben aus dem Repository ausgewählt <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">hat</span>, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">wird der</span> Payload-Parser <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">automatisch</span> mitgeliefert. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Dieser befindet sich</span> unter <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dem</span> Device im Reiter "Payload Formatter" "Uplink". </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Hier sollte "Use device Repository formatters" stehen. Den Code von eQ3  kann man sehen (und editieren), wenn man die Device aufruft und im Menü (OBEN!) den Reiter "Payload-formatters" aufruft.</span></p>
<p>Alternativ kann man diesen Code auch auf der ELV-Seite unter Downloads unter dem Link „<a href="ELV-LW-INT1%20Payload-Parser">ELV-LW-INT1 Payload-Parser</a>“ herunterladen.</p>
</div><div class="fusion-text fusion-text-32"><h2>Sensor konfigurieren</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">W</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">er</span> die Installation bis <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">hierhin erfolgreich </span>durchgeführt hat<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">,</span> wird feststellen, dass nur Statusdaten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">der Schnittstelle</span> gesendet werden, aber keine Sensorwerte für Bodenfeuchte und Temperatur. </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Dies liegt daran, dass <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">die Messung</span> und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Übertragung der Werte von den</span> Sensoren erst aktiviert werden muss. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Das Interface hingegen ist so vorkonfiguriert, dass es alle 30 Minuten eine <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Statusmeldung sendet</span>.</span></p>
<h3>Grundlagen zur Sensorkonfiguration</h3>
<p>Die Befehle und Grundlagen für die Konfiguration der Sensoren und des Interfaces findet man in folgenden Dokumenten:</p>
<ul>
<li><a href="https://media.elv.com/file/160149_elv_lw_int1_tabellen.xlsx">Excel-Tabelle</a> auf zum Interface mit allen Details zu Befehlen, Parametern, etc.</li>
<li><a href="https://media.elv.com/file/160149_km.pdf">Bau- und Bedienungsanleitung</a> des Interfaces</li>
<li><a href="http://downloads.elv.com/downloads/journal/elvjournal_2024_02.pdf">ELV-Journal 2/2024</a> unter Bausätze</li>
</ul>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Grundsätzlich tauscht man Informationen mit <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dem Interface </span>und den Sensoren über <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">eine</span> Payload (eine Bytefolge von hexadezimalen Werten<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">) aus.</span> </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Befehle <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">werden</span> als Payload über einen Downlink-Kanal an ein Gerät <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gesendet</span>, Daten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">werden</span> über einen Uplink-Kanal <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">empfangen</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Kommandos</span> werden als "frame-type" bezeichnet. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">In einem "frame-type" werden Daten wie z.B. Kanal und Parameter <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">übertragen</span>.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Für die zu <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">übertragenden</span> Codes (Bytes) <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">müssen</span> Werte <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">berechnet werden</span>, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">wobei teilweise</span> zwischen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dezimalen</span>, <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">hexadezimalen</span> und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">binären Zahlenformaten gewechselt wird</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">ELV empfiehlt hierfür den folgenden einfachen <a href="https://www.simonv.fr/TypesConvert/?integers">Konverter</a>.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">In den folgenden Kapiteln werden einzelne Werte <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">auch</span> durch das Setzen von Bits ermittelt. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Dabei gilt<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">, dass</span> die Bits in einem Byte von 0 bis 7 <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gezählt</span> werden und rechts <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">begonnen wird</span>!</span></p>
<h4>Sensoren über Kanäle ansprechen</h4>
<p>Um die Sensoren und das Interface eindeutig anzusprechen benötigt man die Angabe einer Kanalnummer. Das Interface besitzt eine eigene Kanalnummer und neben dem gemeinsam verbauten Bodenfeuchte- und Temperatursensor wird auch ein <a href="https://de.elv.com/p/elv-ultraschall-distanzsensor-dus1-P160762/">Ultraschall-Disstanzsensor DUS1</a> unterstützt.</p>
<p>Folgende Kanalnummern stehen zur Verfügung:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">Gerätename</th>
<th align="left">Kanal (Hex-Wert)</th>
<th align="left">Erläuterung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Interface (device)</td>
<td align="left">0x00</td>
<td align="left">Dies ist das ELV-LW-INT1 Device</td>
</tr>
<tr>
<td align="left">DUS1</td>
<td align="left">0x01</td>
<td align="left">Dies ist der <a href="https://de.elv.com/p/elv-ultraschall-distanzsensor-dus1-P160762/?itemId=160762">ELV-Ultraschall Distanzsensor DUS1</a> (wenn er angeschlossen sein sollte)</td>
</tr>
<tr>
<td align="left">SoMo1-H</td>
<td align="left">0x02</td>
<td align="left">Das ist der Feuchtessensor des <a href="https://de.elv.com/p/elv-universeller-bodenfeuchtesensor-somo1-ic-P157930/?itemId=157930">SoMo1, I²C</a></td>
</tr>
<tr>
<td align="left">SoMo1-T</td>
<td align="left">0x03</td>
<td align="left">Das ist der Temperatursensor des <a href="https://de.elv.com/p/elv-universeller-bodenfeuchtesensor-somo1-ic-P157930/?itemId=157930">SoMo1, I²C</a></td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-33"><h3>Anzeige von Statusdaten</h3>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">T</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">heoretisch</span> kann jeder Sensor <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">eigene</span> Statusdaten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">senden</span>. </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Standardmäßig sendet</span> das Interface jede halbe Stunde eine <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Statusnachricht</span> und zusätzlich kann ich mir <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">die Statusinformation des Feuchtesensors und des Temperatursensors jeweils</span> in einem eigenen Zeitintervall <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">senden</span> lassen. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Ich möchte aber <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">insbesondere</span> die Feuchte- und <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Temperaturinformationen</span> immer zusammen erhalten und am liebsten noch zusammen mit <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">den Statusinformationen</span> des Interfaces (also insgesamt nur eine Nachricht mit allen Informationen jede halbe Stunde).</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Dies kann <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">ich</span> erreichen<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">,</span> indem ich Statusgruppen verwende, in denen ich <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">die</span> Statusinformationen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zusammenfasse</span> und diese <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zusammengefassten</span> Statusinformationen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dann in eine</span> Statusmeldung <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">einfüge</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">In meinem Fall werden die <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Statusinformationen</span> des <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Feuchtesensors</span> und des Temperatursensors <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">der</span> Statusgruppe 1 zugeordnet.</span> Ich werde für diese Sensoren nicht separat das Übermitteln von Statusinformationen aktivieren sondern werden das Interface so konfigurieren, dass es bei seiner halbstündlichen Statusinformation einfach die Gruppe 1 inkludieren soll. Damit wird die Statusmeldung auch die Informationen der Sensoren beinhalten.</p>
<h3>Befehl zur Konfiguration der Sensoren</h3>
<p>Zur Konfiguration verwende ich den "set single parameters" Befehl, dem ich beliebig viele Parameter übergeben kann. Mit diesem Befehl werden alle Parameteränderungen beginnen.</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Bytewert</strong></th>
<th align="left"><strong>Kommentar</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">0x00</td>
<td align="left">frame type 00 ("set single parameters" = Einzelne Parameter setzen)</td>
</tr>
<tr>
<td align="left">0x02</td>
<td align="left">Channel 2 (z.B. Kanal 2 für Feuchtesensor)</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-34"><h3>Feuchtesensor konfigurieren</h3>
<p>Hierfür gelten folgende Punkte:</p>
<ul>
<li><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Messungen müssen aktiviert werden, sonst <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">kann</span> der Feuchtesensor keine Daten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">senden</span>.</span></li>
<li>Man kann gleichzeitig auch das Messen der Temperatur aktivieren, so dass beide Werte synchron ermittelt werden!</li>
<li>Der Bodenfeuchtesensor liefert immer sogenannte Rohwerte im Bereich von 3000 bis 4000 zurück. Diese kann man selber in Prozentwerte umrechnen oder vom Sensor direkt umrechnen lassen. Dazu ist das Ablesen der Sensorwerte im trockenen Zustand sowie in nassem Zustand erforderlich. Die beiden Rohwerte werden dann dem Sensor als Untegrenze für 0% und Obergrenze für 100% mitgeteilt.</li>
</ul>
<p>Mit folgender Bytefolge konfiguriere ich den Feuchtesensor:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Bytewert</strong></th>
<th align="left"><strong>Kommentar</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">0x00</td>
<td align="left">frame type 00 ("set single parameters" = Einzelne Parameter setzen)</td>
</tr>
<tr>
<td align="left">0x02</td>
<td align="left">Kanal 2 (für den Feuchtesensor)</td>
</tr>
<tr>
<td align="left">0x03</td>
<td align="left">"measurment interval"-Parameter (zum Einstellen des zeitlichen Abstandes der Messungen)</td>
</tr>
<tr>
<td align="left">0x94</td>
<td align="left">20 Minuten (Um diesen Parameter auf Minuten einzustellen wird Bit 7 gesetzt. Mit den restlichen Bits werden die Minuten angegeben, in meinem Fall setze ich Bit 2 (Dezimalzahl 4) und Bit 4 (Dezimalzahl 16), was insgesamt 10010100 ergibt. Dies ergibt umgerechnet in Hexadezimal die Zahl 0x94.</td>
</tr>
<tr>
<td align="left">0x02</td>
<td align="left">"filter config"-Parameter (hierüber lässt sich die Temperaturmessung gleichzeitig mit der Feuchtemessung aktivieren, ohne den Temperatursensor separat konfigurieren zu müssen)</td>
</tr>
<tr>
<td align="left">0xC0</td>
<td align="left">Parameterwert:</p>
<p>Bit 7 wird gesetzt (Aktivieren der gleichzeitigen Temperaturmessung)</p>
<p>Bit 6 wird gesetzt (zur Kompensation eines möglichen Fehlers durch die Temperatur)</p>
<p>Dies ergibt die Binärzahl 11000000, die Hexadzeimalzahl 0xC0 ergibt.</td>
</tr>
<tr>
<td align="left">0x01</td>
<td align="left">"Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)</td>
</tr>
<tr>
<td align="left">0x81</td>
<td align="left">Parameterwert:</p>
<p>Bit 7 setzen ("cyclic interval" = fixes unabhängiges Intervall zur Statussendung (ich verwende hier immer die Voreinstellung))</p>
<p>Bit 0 setzen ("member group 1" = Statuswerte zur Statusgruppe 1 hinzufügen)</p>
<p>Dies ergibt die Binärzahl 10000001, was der Hexadzeimalzahl 0x81 entspricht.</td>
</tr>
<tr>
<td align="left">0x0B</td>
<td align="left">"ref value %0"-Parameter (gibt an, welcher raw-Wert als 0% Bodenfeuchte angesehen wird).</td>
</tr>
<tr>
<td align="left">0x0EC5</td>
<td align="left">Parameterwert:</p>
<p>Gemessener Raw-Wert bei Trockenheit; Dieser wird hier in Form von 2 Bytes angegeben, da er i.d.R. zwischen 3500 und 4000 liegt. Es wird empfohlen, dieses vorab durch Tests zu messen, z.B.  in Becher mit staubtrockener Erde. In meinem Beispiel liegt der Wert bei 3781, was Hexadezimal 0x0D1B ergibt</td>
</tr>
<tr>
<td align="left">0x0C</td>
<td align="left">"ref value %100"-Parameter (gibt an, welcher raw-Wert als 100% Bodenfeuchte angesehen wird).</td>
</tr>
<tr>
<td align="left">0x0D1B</td>
<td align="left">Parameterwert:</p>
<p>Gemessener Raw-Wert bei totaler Feuchtigkeit; Dieser wird hier in Form von 2 Bytes angegeben, da er i.d.R. zwischen 3000 und 3500 liegt. Es wird empfohlen, dieses vorab durch Tests zu messen, z.B.  in Becher mit ganz nasser Erde. In meinem Beispiel liegt der Wert bei 3355, was Hexadezimal 0x0D1B ergibt</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-35"><h3>Temperaturmessung konfigurieren</h3>
<p>Hierfür gelten folgende Punkte:</p>
<ul>
<li><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">D</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">ie</span> Temperaturmessung wurde bereits über die <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Bodenfeuchtemessung</span> aktiviert, so dass die Messzyklen für die Feuchtemessung <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">automatisch</span> gelten. </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Weitere</span> Einstellungen zur Messwerterfassung sind bei diesem Ansatz nicht erforderlich.</span></li>
</ul>
<p>Mit folgender Bytefolge konfiguriere ich den Temperatursensor:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Bytewert</strong></th>
<th align="left"><strong>Kommentar</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">0x00</td>
<td align="left">frame type 00 ("set single parameters" = Einzelne Parameter setzen)</td>
</tr>
<tr>
<td align="left">0x03</td>
<td align="left">Kanal 3 (für den Temperatursensor)</td>
</tr>
<tr>
<td align="left">0x01</td>
<td align="left">"Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)</td>
</tr>
<tr>
<td align="left">0x81</td>
<td align="left">Parameterwert:</p>
<p>Bit 7 setzen ("cyclic interval" = fixes unabhängiges Intervall zur Statussendung (ich verwende hier immer die Voreinstellung))</p>
<p>Bit 0 setzen ("member group 1" = Statuswerte zur Statusgruppe 1 hinzufügen)</p>
<p>Dies ergibt die Binärzahl 10000001, die Hexadzeimalzahl 0x81 ergibt.</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-36"><h3>Interface konfigurieren</h3>
<p>Hierfür gelten die folgenden Punkte:</p>
<ul>
<li><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Standardmäßig</span> sendet <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">das Interface </span>alle 30 Minuten <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">eine Statusmeldung</span>, so dass <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">dies</span> nicht <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gesondert</span> eingestellt werden muss.</span></span></li>
<li>Zusätzlich zu den eigenen Statusinformation sollen die Statusinformation des Feuchte- und Temperatursensors übermittelt werden.</li>
</ul>
<p>Mit folgender Bytefolge konfiguriere ich das Interface:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left"><strong>Bytewert</strong></th>
<th align="left"><strong>Kommentar</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">0x00</td>
<td align="left">frame type 00 ("set single parameters" = Einzelne Parameter setzen)</td>
</tr>
<tr>
<td align="left">0x00</td>
<td align="left">Kanal 0 (für das Interface "SoMo-1 Device")</td>
</tr>
<tr>
<td align="left">0x01</td>
<td align="left">"Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)</td>
</tr>
<tr>
<td align="left">0x88</td>
<td align="left">Parameterwert:</p>
<p>Bit 7 setzen (fixes unabhängiges Intervall zur Statussendung);</p>
<p>Bit 3 setzen ("include group 1" = zeige Gruppe 1 zusätzlich zu den Statusinformationen des devices an)</p>
<p>Dies ergibt die Binärzahl 10001000, die Hexadzeimalzahl 0x88 ergibt.</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-37"><h2>Konfigurationsänderung an das Gerät schicken</h2>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives sentence_anchor_highlight__with_key_writeTextInteraction_toolbar sentence_anchor_highlight__with_key_writeTextInteraction_wordAlternatives sentence_highlight"><span class="--l --r bg-blue-next-50 dark:bg-neutral-next-600 lmt__write_text_interaction_range_highlight py-&#091;3px&#093;"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_wordAlternatives"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_toolbar"><span class="--l --r word_anchor_highlight__with_key_writeTextInteraction_sentenceAlternatives"><span class="--l text-interaction-word-at-cursor-anchor">D</span></span></span></span><span class="--r text-interaction-word-at-cursor-anchor">azu</span></span> geht man im <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">TTN-Webinterface</span> unter "End devices" auf das SoMo1-INT1 Gert<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">,</span> wählt den Reiter "Messaging" und dort den Reiter "Downlink". </span></span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Als "FPort" muss nun "10" eingestellt werden. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Danach</span> kann man die in den <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">vorherigen</span> Kapiteln erstellten drei Bytefolgen (Payload) jeweils in das Payload-Feld eintragen (<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">bitte </span> ohne das führende 0x) und anschließend den Button "Schedule downlink" <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">drücken</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Das Kommando</span> wird beim nächsten Verbindungsaufbau <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">zum</span> Gerät <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">gesendet</span> (<span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">durch kurzes Drücken des Buttons an der Schnittstelle</span> kann die Zeit <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">verkürzt werden</span>).</span></p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink.webp"><img decoding="async" class="alignnone wp-image-3253 size-medium" src="https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-256x300.webp" alt="" width="256" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-66x77.webp 66w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-177x207.webp 177w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-200x234.webp 200w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-256x300.webp 256w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-300x351.webp 300w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-320x374.webp 320w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-400x468.webp 400w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-460x538.webp 460w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-540x632.webp 540w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-600x702.webp 600w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-669x783.webp 669w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-700x819.webp 700w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-768x899.webp 768w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-800x936.webp 800w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-875x1024.webp 875w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink-940x1100.webp 940w, https://homeitems.de/wp-content/uploads/2024/07/Schedule-downlink.webp 1188w" sizes="(max-width: 256px) 100vw, 256px" /></a></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Unter "Live data" kann man nun die <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Übertragung</span> der Befehle <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">beobachten</span>. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Wenn dort die "decode downlink data message" Meldung „No decoder defined for codec elv-lw-int1-codec“ <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">erscheint,</span> kann man <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">diese</span> ignorieren. </span><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Es</span> gibt aktuell keinen Payload-Decoder, der <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">in der Lage ist, die gesendete</span> Bytefolge wieder in Klartext <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">umzuwandeln</span>.</span></p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight">Es kann <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">einige Zeit</span> dauern, bis die Einstellungen vorgenommen <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">sind</span>, da normalerweise die eingestellten Sendeintervalle abgewartet werden müssen (in diesem Beispiel bis zu 1 Stunde).</span></p>
<p>Um die Daten an einen MQTT-Server zu schicken verweise ich auf die Erläuterungen in folgendem Beitrag <a href="https://homeitems.de/fuellstandsmessung-mit-lorawan/">Füllstandsmessung mit LoRaWAN</a>.</p>
<p><span class="--l --r lmt__write_highlight_sentence py-&#091;3px&#093; sentence_highlight"><span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">Wenn dann</span> eine Statusinformation gesendet <span class="--l --r border-b-2 border-green-next-100 dark:border-green-next-500 dark:text-green-next-300 lmt__write_highlight relative text-green-next-600">wird</span>, sollte das Ergebnis wie folgt aussehen:</span></p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/07/Statusinfo.webp"><img decoding="async" class="alignnone wp-image-3250 size-medium" src="https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-262x300.webp" alt="" width="262" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-66x76.webp 66w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-177x203.webp 177w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-200x229.webp 200w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-262x300.webp 262w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-300x344.webp 300w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-320x367.webp 320w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-400x458.webp 400w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-460x527.webp 460w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-540x619.webp 540w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-600x688.webp 600w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-669x767.webp 669w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-700x802.webp 700w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-768x880.webp 768w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-800x917.webp 800w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-893x1024.webp 893w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo-940x1077.webp 940w, https://homeitems.de/wp-content/uploads/2024/07/Statusinfo.webp 971w" sizes="(max-width: 262px) 100vw, 262px" /></a></p>
<p>Die Daten können dann z.B. in Node-Red weiterverarbeitet und zur Steuerung von Bewässerungssensoren verwendet werden.</p>
<p><em>HINWEIS: Die Bodentemperatur wird als Zeichenkette (String) geliefert und nicht wie der Feuchtewert als Zahl (float-Typ). Vor der Speicherung in einer Datenbank sollte der Wert daher vorher umgewandelt werden, damit man ihn grafisch darstellen kann.</em></p>
<h2>Optionale weitere Befehle</h2>
<p>In der folgenden Tabelle sind einige weitere Befehle zur Konfiguration der Sensoren aufgelistet:</p>
</div>
<div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left">Payload</th>
<th align="left">Erläuterung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">00 02 00 00</td>
<td align="left">Statusmeldungen des Bodenfeuchtesensors ausschalten</td>
</tr>
<tr>
<td align="left">00 03 00 00</td>
<td align="left">Statusmeldungen des Temperatursensors ausschalten</td>
</tr>
<tr>
<td align="left">00 02 01 05</td>
<td align="left">Statusmeldungen des Bodenfeuchtesensors alle 5 Minuten schicken</td>
</tr>
<tr>
<td align="left">00 03 01 0F</td>
<td align="left">Statusmeldungen des Temperatursensors alle 15 Minuten schicken</td>
</tr>
</tbody>
</table>
</div>
</div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/bodenfeuchtemessung-ueber-weite-strecken-mit-lorawan/">Bodenfeuchtemessung über weite Strecken mit LoRaWAN</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/bodenfeuchtemessung-ueber-weite-strecken-mit-lorawan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Stromüberschuss mit Klimaanlage nutzen</title>
		<link>https://homeitems.de/stromueberschuss-mit-klimaanlage-nutzen/</link>
					<comments>https://homeitems.de/stromueberschuss-mit-klimaanlage-nutzen/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Mon, 17 Jun 2024 13:06:26 +0000</pubDate>
				<category><![CDATA[Node-Red]]></category>
		<category><![CDATA[Photovoltaik]]></category>
		<category><![CDATA[Tado]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=3165</guid>

					<description><![CDATA[<p>Mit einer Photovoltaikanlage wird vor allem in den warmen Monaten mehr Strom erzeugt als gespeichert oder verbraucht werden kann. Da es sich kaum lohnt, den Strom zu verkaufen, ist es besser, ihn zu verbrauchen. Was liegt da näher, als die Räume im Sommer mit Klimaanlagen kostenlos zu kühlen. Der folgende Beitrag zeigt,  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/stromueberschuss-mit-klimaanlage-nutzen/">Stromüberschuss mit Klimaanlage nutzen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-7 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-7 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-7 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-38"><p>Mit einer Photovoltaikanlage wird vor allem in den warmen Monaten mehr Strom erzeugt als gespeichert oder verbraucht werden kann. Da es sich kaum lohnt, den Strom zu verkaufen, ist es besser, ihn zu verbrauchen. Was liegt da näher, als die Räume im Sommer mit Klimaanlagen kostenlos zu kühlen. Der folgende Beitrag zeigt, wie man mit einfachen Mitteln eine Split-Klimaanlage in das Smarthome-System Node-Red integrieren und den Stromüberschuss zum Kühlen nutzen kann.</p>
<h2>Klimaanlage extern steuern</h2>
<p>Die grundsätzliche Frage ist, wie eine Klimaanlage in ein Smarthome-System eingebunden werden kann. Sofern der Hersteller keine spezielle Schnittstelle zur Verfügung stellt (z.B. Modbus, etc.), ist die einfachste Möglichkeit, die Infrarotschnittstelle zur Fernbedienung des Klimagerätes zu nutzen. Die meisten Geräte verfügen über eine Infrarot-Fernbedienung, die bestimmte Infrarotsignale aussendet, um verschiedene Befehle an die Klimaanlage zu senden. Einige Fernbedienungen sind sogar bidirektional, d.h. sie können auch Statusinformationen von der Klimaanlage empfangen. In diesem Beispiel ist eine unidirektionale Fernbedienung ausreichend. Benötigt wird also ein Gerät, das  Signal der Klimaanlagen-Fernbedienung senden und über eine API von außen gesteuert werden kann. Mittlerweile gibt es eine Vielzahl von Geräten, die jedoch nicht mit allen Klimaanlagen funktionieren. Dazu habe ich einige Versuche unternommen.</p>
<h3>1. Versuch</h3>
<p>Als erstes Gerät habe ich den <a href="https://de.elv.com/elv-smart-home-bausatz-ir-sender-elv-sh-irs8-powered-by-homematic-ip-158404?fs=553251246">ELV Smart Home Bausatz IR-Sender ELV-SH-IRS8</a> getestet, da dieser direkt von einer HMIP-CCU angelernt werden kann. Leider stellte sich im Nachhinein heraus, dass meine Mitsubishi Heavy Industries Anlage nicht unterstützt wird. Außerdem muss man etwas Löterfahrung mitbringen, um das Gerät zusammenbauen zu können. Insgesamt ist die Auswahl der unterstützten Klimagerätehersteller überschaubar.</p>
<h3>2. Versuch</h3>
<p>Dann habe ich das <a href="https://www.amazon.de/Broadlink-Universal-Fernbedienung-Infrarot-Controller-Kompatibel/dp/B07DPHG521">BroadLink RM mini 3</a> getestet. Das Gerät heißt nicht nur so, sondern ist auch mini. Allerdings ist die Einrichtung ziemlich kompliziert. Um das WLAN einzurichten und die Klimaanlage anlernen zu können musste ich mehrere Apps benutzen, die teilweise nicht gut gepflegt waren. Die Anleitung selbst war nicht optimal und die blaue Status-LED am Gerät kaum erkennbar. Auch brach die WLAN-Verbindung zwischendurch immer wieder ab. Positiv war, dass eine große Anzahl von Klimaanlagen unterstützt wird. Allerdings habe ich keine brauchbare Node-Palette für Node-Red gefunden, mit der man das Gerät mit Node-Red steuern kann.</p>
<h3>3. tado bietet die bisher beste Lösung</h3>
<p>Schließlich bin ich bei tado gelandet. Diese bieten die <a href="https://www.tado.com/de-de/smarte-klimaanlagen-steuerung">Smarte Klimaanlagen Steuerung V3+</a> an. Um zu prüfen, ob mein Gerät überhaupt unterstützt wird, habe ich vor dem Kauf den Support (gelber Button unten rechts auf der Webseite) kontaktiert, da tado keine Kompatibilitätsliste veröffentlicht hat. Innerhalb kurzer Zeit hat jemand meine Angaben zur Fernbedienung und zum Hersteller der Klimaanlage aufgenommen und nach einem Tag hatte ich die Rückmeldung, dass meine Anlage unterstützt wird.  Die tado Lösung ist eine Cloud-Lösung, d.h. man muss auf jeden Fall einen Account anlegen und eine App installieren. Für Node-Red gibt es  zusätzliche Nodes, um dieses und andere Geräte steuern zu können.</p>
<p>tado legt großen Wert auf Design und einfache Bedienung, was man schon beim Auspacken merkt. Die Einrichtung ist komplett menügeführt und für den  Notfall gibt es auf der Webseite eine Anleitung. Folgende Tipps kann ich noch geben:</p>
<ul>
<li>Sowohl tado als auch broadlink wollen das Gerät mit dem 2,4 GHz WLAN verbinden. Wer sowohl ein 2,4 GHz als auch ein 5 GHz LAN mit dem gleichen Namen nutzt, dem empfehle ich das 5GHz LAN kurzzeitig zu deaktivieren, damit der Verbindungsaufbau fehlerfrei funktioniert.</li>
<li>Bei tado wollte mein Gerät nach Aufbau der WLAN-Verbindung ein Update installieren. Dies funktionierte aber nicht, das Gerät blieb ständig im Installationsmodus. Nach mehreren Stunden kontaktierte ich erneut die tado-Hotline (gelber Button), die aus der Ferne die Installation starten konnte.</li>
</ul>
<p>Danach konnte das Klimagerät mit einem einfachen Tastendruck auf der Fernbedienung identifiziert und automatisch eingerichtet werden. So sollte es sein!</p>
<p>Wer weitere einfach einzurichtende Verbindungen für Klimaanlage kennt, kann diese gerne hier posten!</p>
</div><div class="fusion-text fusion-text-39"><h2>Stromverbrauch auslesen</h2>
<p>Um die Klimaanlage nur bei Stromüberschuss einschalten zu können benötige ich zunächst den jeweils aktuellen Stand meines  Saldos aus Stromverbrauch und Stromerzeugung am Zähler. Wie das geht, habe ich in dem folgenden Artikel beschrieben: <a href="https://homeitems.de/smartmeter-mit-tasmota-auslesen/">SmartMeter mit Tasmota auslesen</a>. Dieser Wert wird automatisch an den MQTT-Broker gesendet. Diesen rufe ich mit Node-Red bei jeder Änderung ab und speichere ihn zwischen. Wie man die Daten von einem MQTT-Server abruft habe ich im folgenden Beitrag <a href="https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-2-2/">Mit Node-Red, InfluxDB und Grafana Daten auf einem Synology NAS sammeln und visualisieren (Teil 2/2)</a> im Kapitel <strong>MQTT-Nachrichten mit Node-Red auslesen und in influxDB speichern </strong>beschrieben.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern.webp"><img decoding="async" class="alignnone wp-image-3179 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-300x40.webp" alt="" width="300" height="40" srcset="https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-66x9.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-177x24.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-200x27.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-300x40.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-320x43.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-400x53.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-460x61.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-540x72.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-600x80.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-669x89.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-700x93.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-768x102.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-800x107.webp 800w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-940x125.webp 940w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-1024x137.webp 1024w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern-1200x160.webp 1200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed-Flow-SVerbrauch-speichern.webp 1229w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Der Code im Function-Node sieht wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-13 > .CodeMirror, .fusion-syntax-highlighter-13 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-13 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-13 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-13 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_13" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_13" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_13" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">msg.payload = msg.payload.MT175.Power_curr
flow.set('f_stromverbrauch', msg.payload);
return msg;</textarea></div><div class="fusion-text fusion-text-40"><p>Ich extrahiere den relevanten Wert aus dem MQTT-Objekt und speichere ihn in einer Flow-Variablen. So kann ich auf diesen Wert zugreifen, ohne den MQTT-Broker erneut zu fragen. Das Ergebnis gebe ich zur Kontrolle mit einem Debug-Node im Debug-Fenster aus.</p>
<h2>Anmelden bei tado</h2>
<p>Um das tado-Gerät von Node-Red aus steuern zu können, installiere ich die Erweiterung <a href="https://flows.nodered.org/node/node-red-contrib-tado-client">node-red-contrib-tado-client</a>. Ich rufe den neu installierten Tado-Node auf und gebe als erstes unter "Tado Config" meine Anmeldedaten für die Tado Cloud ein, da ich dort zuvor mein Gerät angelegt habe.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/tado-config-node.webp"><img decoding="async" class="alignnone wp-image-3185 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-300x193.webp" alt="" width="300" height="193" srcset="https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-66x42.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-177x114.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-200x129.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-300x193.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-320x206.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-400x257.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-460x296.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-540x347.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-600x386.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-669x430.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-700x450.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node-768x494.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/tado-config-node.webp 792w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2>Wichtige Ergänzung (Juni 2025)</h2>
<p>Tado hat mittlerweile die Authentifizierung geändert und nutzt nun das OAuth2-Verfahren, um einen Zugriff auf die Rest-API zu ermöglichen. Nähere Infos dazu findet man unter:</p>
<p><a href="https://support.tado.com/en/articles/8565472-how-do-i-authenticate-to-access-the-rest-api">https://support.tado.com/en/articles/8565472-how-do-i-authenticate-to-access-the-rest-api</a></p>
<p><a href="https://datatracker.ietf.org/doc/html/rfc6749#page-48">https://datatracker.ietf.org/doc/html/rfc6749#page-48</a></p>
<p>Wer die alte Version der Library noch installiert hat, muss mindestens auf die Version V1.1.4 updaten. Ich empfehle ebenfalls das Lesen der Library-Informationen bzgl. weiterer Neuerungen.</p>
<p>Zur Nutzung sollte der Beispielflow <a href="https://github.com/mattdavis90/node-red-contrib-tado-client/blob/master/examples/tado.json">tado.json</a> von der Library aus GitHub in NodeRed geladen werden, denn hier befinden sich auch weitere Erläuterungen zur Einrichtung.</p>
<p>Auf der Beispiel-Flow-Seite befinden sich nun drei Bereiche:  "Authentication Flow", "Persistent Auth" und "Testing".</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library.webp"><img decoding="async" class="alignnone wp-image-3941 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-300x153.webp" alt="" width="300" height="153" srcset="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-200x102.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-300x153.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-400x204.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-600x306.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-768x391.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-800x408.webp 800w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-1024x522.webp 1024w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-1200x612.webp 1200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado_Library-1536x783.webp 1536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Durch Drücken des „Inject“-Nodes im Authentication Flow wird ein Debug Output erzeugt. In diesem steht ein Link. Diesen ruft man in einen beliebigen Browser auf. Wenn man noch nicht bei tado angemeldet ist, dann gibt man zuerst seinen Login-Namen und sein Passwort an. Anschließend bestätigt man nur den angezeigten Code und tado meldet „Erfolgreich verbunden“. Nun steht im Debug-Fenster in NodeRed der "Refresh_Token", mit dem man die weiteren API-Aufrufe vornehmen kann (hierzu empfehle ich, das nächste Kapitel zu lesen).</p>
<p>Ein Refresh-Token ist allerdings maximal nur 300 Sekunden gültig, so dass man dann einen Neuen erzeugen müsste (dies wird z.B. auch durch einen Deploy in NodeRed ausgelöst, da der Token dann aus dem Speicher gelöscht wird.</p>
<p>Damit das nicht passiert und der Token erhalten bleibt bzw. automatisch erneuert wird hat der Autor der Library den Beispiel-Flow „Persistent Auth“ beigefügt.</p>
<p>Zur Nutzung werden die Nodes in dem Flow zuerst aktiviert. Anstelle des Nodes „unknown: tado-token“ wird der tado-Node eingetragen und verbunden. In diesem wird für die Eigenschaft "Tado-config" nur die Auswahl "Tado-config" getroffen. Für alle weiteren Abfragen verwende ich ab jetzt nur noch "Tado-config" und nicht mehr "Tado-Cloud" (die folgenden Bilder wurden noch mit der alten Authentifizierungsmethode erstellt).</p>
<p>Parallel dazu wird im NodeRed Data-Verzeichnis eine Datei /data/tado.json angelegt und dort im JSON-Format der letzte verwendete Refresh-Token eingetragen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication.webp"><img decoding="async" class="alignnone wp-image-3942 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-300x50.webp" alt="" width="300" height="50" srcset="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-200x33.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-300x50.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-400x67.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-600x100.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-768x129.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-800x134.webp 800w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-1024x172.webp 1024w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-1200x201.webp 1200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication-1536x257.webp 1536w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_tado_Persistent_Authentication.webp 1612w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Anschließend sollte der Flow ohne Probleme laufen. Dieser erneuert nun automatsch den Refresh-Token. Laut Angaben des Autors der Library wird der Refresh-Token maximal innerhalb von 30 Tage automatisch erneuert, wenn man nicht auf die API zugreift, bevor man einmal manuell eine Erneuerung auslösen muss. Alternativ reicht es aus, dass innerhalb von 30 Tagen einmal ein API-Zugriff erfolgt. Ich vermute, dass dies auch eine Sicherheitseinstellung von tado ist.</p>
<h2>tado Parameter auslesen</h2>
<p>Für die weiteren API-Aufrufe benötige ich meine Home ID. Diese erhalte ich, wenn ich den API-Aufruf "Get the current user" auswähle und den resultierenden Aufruf mit einem Inject-Node vorne und einem Debug Node hinten ergänze und ausführe. Als Ergebnis erhalte ich im Debug-Fenster ein Datenobjekt, das wie folgt aussieht:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1.webp"><img decoding="async" class="alignnone wp-image-3187 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-300x246.webp" alt="" width="300" height="246" srcset="https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-66x54.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-177x145.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-200x164.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-300x246.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-320x262.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-400x328.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-460x377.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-540x443.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-600x492.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-669x548.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-700x574.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-768x629.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-800x656.webp 800w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-940x770.webp 940w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1-1024x839.webp 1024w, https://homeitems.de/wp-content/uploads/2024/06/tado_Datenobjekt1.webp 1048w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Hier brauche ich nun die Zahl, die unter "homes" im Array[0] hinter "id" steht. 2359335 ist meine Home-ID, die ich für die weiteren API-Aufrufe benötige (das Objekt lässt sich durch Klicken auf die Pfeile auf- und zuklappen).</p>
<p>Zusätzlich frage ich noch die Zone ab, in der sich mein Gerät im Tado-Universum befindet (zur Erklärung von Zonen sollte man sich bei tado informieren).</p>
<p>Dazu öffne ich einen neuen tado-Node, wähle diesmal die API-Funktion "Get all zones" und gebe die eben gefundene Home-ID an. Mit Inject und Debug-Node erhalte ich wieder ein Datenobjekt, indem ich durch Aufklappen der Datenstruktur irgendwo den Namen meiner Klimaanlage finde, den ich beim Setup angegeben habe. Die Nummer hinter dem Feldnamen id des Objekteintrags darüber ist die Nummer, die ich brauche.</p>
<p>Wenn ihr nur eine Klimaanlage eingerichtet habt, werdet ihr höchstwahrscheinlich die Nummer "1" als Ergebnis erhalten.</p>
<p>Jetzt habe ich alles zusammen, um die Klimaanlage mit Node-Red ein- und auszuschalten.</p>
<h2>Klimaanlage mit Node-Red steuern</h2>
<p>Um die Klimaanlage einzuschalten, ruft man wieder einen Tado-Node auf und wählt die Funktion "Set a Zone's Overlay". Mit den folgenden Parametern schalte ich die Klimaanlage bei mir ein:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten.webp"><img decoding="async" class="alignnone wp-image-3189 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-199x300.webp" alt="" width="199" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-66x100.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-177x267.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-199x300.webp 199w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-200x302.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-300x453.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-320x483.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-400x604.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-460x695.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-540x815.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-600x906.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-669x1010.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-678x1024.webp 678w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-700x1057.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten-768x1160.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/NodeRed_Tado-Klimaanlage_einschalten.webp 798w" sizes="(max-width: 199px) 100vw, 199px" /></a></p>
<p><em>Hinweis: Da ich keine bidirektional sendende Fernbedienung habe, kann Tado nicht erkennen, ob ich die Klimaanlage manuell ein- oder ausgeschaltet habe. Ich kann die von Tado eingeschaltete Anlage zwar mit der Fernbedienung ausschalten, Tado hat intern aber immer noch den Status "ein" gespeichert. Auch die "Auto-"Funktion beim AC-Mode funktioniert bei mi nicht.  Ich gehe ebenfalls davon aus, dass dazu eine bidirektionale Fernbedienung erforderlich ist, die auch Temperaturwerte übermittelt. </em></p>
<p>Analog schalte ich die Klimaanlage aus, wenn ich in die Eigenschaft des Schalters "Heating On/Off" einfach auf "Off" stelle.</p>
</div><div class="fusion-text fusion-text-41"><p>Nun kann ich ein einfaches "Programm" in Node-Red erstellen, das in der folgenden Grafik zu sehen ist:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern.webp"><img decoding="async" class="alignnone wp-image-3191 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-300x91.webp" alt="" width="300" height="91" srcset="https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-66x20.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-177x54.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-200x61.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-300x91.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-320x97.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-400x121.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-460x139.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-540x164.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-600x182.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-669x203.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-700x212.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-768x233.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-800x243.webp 800w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-940x285.webp 940w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-1024x310.webp 1024w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-1200x364.webp 1200w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern-1536x466.webp 1536w, https://homeitems.de/wp-content/uploads/2024/06/Node-Red-Flow-Klimaanlage-steuern.webp 1801w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Oben habe ich bereits beschrieben, dass ich den aktuellen Zählerstand immer vom MQTT-Server hole und in einer Variablen zwischenspeichere. Nun füge ich nur noch einen Inject-Node hinzu und stelle dort ein, dass dieser in der Zeit von 8:00 bis 20:00 Uhr an jedem Tage und zu jeder Viertelstunde ein Ereignis auslöst.</p>
<p>Dann prüfe ich im nächsten Switch-Knoten, ob mein aktueller Stromverbrauch (Saldo) einen Überschuss von 400 Watt und mehr aufweist oder darunter liegt. Im ersten Fall schalte ich die Klimaanlage mit dem Tado-Node ein oder mit dem anderen Tado-Node aus. Der Inhalt des switch-Knotens sieht wie folgt aus:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage.webp"><img decoding="async" class="alignnone wp-image-3192 size-medium" src="https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-300x208.webp" alt="" width="300" height="208" srcset="https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-66x46.webp 66w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-177x123.webp 177w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-200x139.webp 200w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-300x208.webp 300w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-320x222.webp 320w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-400x277.webp 400w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-460x319.webp 460w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-540x374.webp 540w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-600x416.webp 600w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-669x464.webp 669w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-700x485.webp 700w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage-768x532.webp 768w, https://homeitems.de/wp-content/uploads/2024/06/Switch-Node-Klimaanlage.webp 782w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Dieses einfache Beispiel kann nun leicht erweitert werden, indem man weitere Klimaanlagen hinzufügt und z.B. die Temperatur vorher kontrolliert.</p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/stromueberschuss-mit-klimaanlage-nutzen/">Stromüberschuss mit Klimaanlage nutzen</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/stromueberschuss-mit-klimaanlage-nutzen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Strommessung mit Shelly Plus PM Mini und Node-RED</title>
		<link>https://homeitems.de/strommessung-mit-shelly-plus-pm-mini-und-node-red/</link>
					<comments>https://homeitems.de/strommessung-mit-shelly-plus-pm-mini-und-node-red/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 08:05:15 +0000</pubDate>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[MQTT]]></category>
		<category><![CDATA[Node-Red]]></category>
		<category><![CDATA[Shelly]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=2740</guid>

					<description><![CDATA[<p>Mit dem kleinen Shelly Plus PM Mini wird eine günstige Möglichkeit geboten, eine Leistungsmessung durchzuführen. Das Gerät ist nur ca. 28 x 32 x 16 mm (HxBxT) groß und passt in viele UP-Dosen z.B. hinter einer Steckdose. Das Gerät unterstützt dabei eine Messung bis zu 16A Leistung (ist leider nicht bei allen  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/strommessung-mit-shelly-plus-pm-mini-und-node-red/">Strommessung mit Shelly Plus PM Mini und Node-RED</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-8 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-8 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-42"><p>Mit dem kleinen Shelly Plus PM Mini wird eine günstige Möglichkeit geboten, eine Leistungsmessung durchzuführen. Das Gerät ist nur ca. 28 x 32 x 16 mm (HxBxT) groß und passt in viele UP-Dosen z.B. hinter einer Steckdose. Das Gerät unterstützt dabei eine Messung bis zu <strong>16A</strong> Leistung (ist leider nicht bei allen Shelly Geräten so), so dass man mit dem Gerät theoretisch die Leistung eines Balkonkraftwerks, von Lichtschaltern oder Steckdosen messen kann.</p>
<p>Im folgenden Beitrag beschreibe ich, wie man das PM Mini auch ohne Shelly-App über WLAN und MQTT einbinden und die Daten in Node-Red weiterverarbeiten kann.</p>
<p>Grundsätzlich erfolgt hier der Hinweise, dass das Arbeiten an Elektroleitungen immer nur von Fachleuten (Elektrikern) durchgeführt werden und immer die fünf Sicherheitsregeln der Elektrotechnik berücksichtigt werden sollten.</p>
<h2>Gerät ins Netzwerk einbinden</h2>
<p>Ich möchte auf die Shelly Cloud sowie das Einrichten der Shelly App verzichten, sondern nur eine lokale Nutzung mittels WLAN umsetzen. Nach der Stomversorgung spannt das PM Mini ein eigenes Netz auf (Access Point), mit dem man sich verbinden muss. Das WLAN erkennt man an dem Namen, der mit "ShellyPMMini..." beginnt. Um anschließend in den Shelly-WebAdmin-Oberfläche zu kommen, gibt man im Browser die Adresse "192.168.33.1" ein und schon sollte die administrative Weboberfläche  erscheinen. Bitte berücksichtigt, dass auch die Shelly-Geräte nur das 2,4 GHz WLAN unterstützen. Die Optionen und Anzeigen  in der WebAdmin-Oberfläche sind unter diesem <a href="https://kb.shelly.cloud/knowledge-base/shelly-plus-pm-mini">Link</a> super erklärt.</p>
<p>Nun geht man auf "Configure Wifi-Setting", wählt "Enable Wifi-network" und gibt die SSID (Name des WLANs) sowie das Passwort für das WLAN an und speichert die Einstellungen. Theoretisch kann man das Gerät nun neu starten und es sollte dann unter einer eigenen IP-Adresse in der Netzwerkliste des Routers erscheinen.</p>
<h2>Generelle Einstellungen</h2>
<p>Da es bei älteren Shelly-Firmwareversionen zu Problemen mit der korrekten Leistungsmessung kam, sollte unbedingt die aktuelle Firmware für das PM Mini aufgespielt werden.  Dazu geht man auf "Settings" und "Firmware". Shelly prüft nun automatisch, ob eine neue Version verfügbar ist und bietet an, diese online zu installieren.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small.webp"><img decoding="async" class="alignnone wp-image-3043 size-medium" src="https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-300x208.webp" alt="" width="300" height="208" srcset="https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-200x138.webp 200w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-300x208.webp 300w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-400x277.webp 400w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-600x415.webp 600w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-768x532.webp 768w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small-800x554.webp 800w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_Firmware_Update-small.webp 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nach dem Drücken von "Update" wird die Firmware aufgespielt und das Gerät neu gestartet. Nun sollten folgende Einstellungen vorgenommen werden:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">Menü</th>
<th align="left">Wert</th>
<th align="left">Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">"Settings" und "Device Name"</td>
<td align="left">Sprechender Name des Gerätes</td>
<td align="left">Hilft später bei der Identifikation im Netzwerk und ist gleichzeitig der Topic-Name für MQTT</td>
</tr>
<tr>
<td align="left">"Settings" und "Bluetooth"</td>
<td align="left">"Enable Bluetooth" und "Enable RPC": Haken entfernen</td>
<td align="left">Da nur das WLAN benötigt wird</td>
</tr>
<tr>
<td align="left">"Settings" "Eco"</td>
<td align="left">"Enable Eco Mode": Haken setzen</td>
<td align="left">Aktiviert den Eco-Modus</td>
</tr>
<tr>
<td align="left">"Setting" "Authentication"</td>
<td align="left">Eigenes Passwort setzen</td>
<td align="left">Sperrt den freien Zugang auf die Weboberfläche</td>
</tr>
<tr>
<td align="left">"Settings" und "Access Point"</td>
<td align="left">"Enable AP-Network": Haken entfernen</td>
<td align="left">Deaktiviert den Access Point</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-43"><h2>MQTT-Settings</h2>
<p>Für das erfolgreiche Senden von Nachrichten an einen MQTT-Broker müssen folgende Einstellungen vorgenommen werden:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table width="100%">
<thead>
<tr>
<th align="left">Menü</th>
<th align="left">Wert</th>
<th align="left">Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">"Settings" und "MQTT-Settings"</td>
<td align="left">
<ol>
<li>"Enable MQTT-Network": Haken setzen</li>
<li>"Connection Type" :  No-SSL</li>
<li>"Enable MQTT Control": Haken setzen</li>
<li>"Generic status updat over MQTT": Haken setzen</li>
<li>"Enable RPC over MQTT": Haken entfernen</li>
<li>"RPC Status notification over MQTT": Haken entfernen</li>
<li>"Server": "IP-Adresse des MQTT-Servers: 1883"</li>
</ol>
</td>
<td align="left">
<ol>
<li>MQTT aktivieren, damit Daten gesendet werden</li>
<li>Nur wenn man SSL nicht aktiviert hat, ansonsten das richtige Protokoll wählen</li>
<li>Gibt die Möglichkeit, per MQTT auch Befehle zu senden</li>
<li>Muss gesetzt werden, da sonst nichts vom PM Mini gesendet wird.</li>
</ol>
</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-44"><p><a href="https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small.webp"><img decoding="async" class="alignnone wp-image-3044 size-medium" src="https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-300x199.webp" alt="" width="300" height="199" srcset="https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-200x133.webp 200w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-300x199.webp 300w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-400x266.webp 400w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-600x398.webp 600w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-768x510.webp 768w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small-800x531.webp 800w, https://homeitems.de/wp-content/uploads/2024/04/Shelly_MQTT_Settings_small.webp 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nach dem Speichern der Settings ist das Gerät vollständig konfiguriert und kann über "Settings" "Reboot-Device" neu gestartet werden. Anschließend kann man z.B. mit dem <a href="http://mqtt-explorer.com/">MQTT-Explorer</a> prüfen, welche Informationen an den MQTT-Broker gesendet werden.</p>
<p><em>Tipp: Bei mir wurden zuerst keine Nachrichten gesendet. Erst als ich in den MQTT-Settings den Punkt „Generic Status update over MQTT“  enabled und dann wieder disabled habe, hat es funktioniert.</em></p>
<h2>Daten in Node-Red weiterverarbeiten</h2>
<p>Die Daten können jetzt in Node-Red weiterverarbeitet werden. In meinem Fall speichere ich diese direkt in einer InfluxDB ab.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow.webp"><img decoding="async" class="alignnone wp-image-3040 size-medium" src="https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-300x56.webp" alt="" width="300" height="56" srcset="https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-200x38.webp 200w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-300x56.webp 300w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-400x75.webp 400w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-600x113.webp 600w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-768x145.webp 768w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-800x151.webp 800w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-1024x193.webp 1024w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow-1200x226.webp 1200w, https://homeitems.de/wp-content/uploads/2024/04/Node-Red-Shelly-Flow.webp 1376w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Im mqtt-in-Node frage ich erst einmal das Topic vom MQTT-Server ab. Dieses findet man unter dem Namen, den man dem Shelly-Gerät  gegeben hat (siehe oben), gefolgt von einem "/pm1:0", also in meinem Fall heißt das Topic "EM-Licht/pm1:0". Als Ausgabe wird "Ein analysiertes (parsed) JSON-Objekt." gewählt.</p>
<p>Im Function-Node wird nun die Leistung aus dem JSON-Objekt extrahiert:</p>
<p>Der Code dazu lautet:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-14 > .CodeMirror, .fusion-syntax-highlighter-14 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-14 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-14 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-14 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_14" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_14" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_14" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">msg.payload=msg.payload.aenergy.total;
return msg;</textarea></div><div class="fusion-text fusion-text-45"><p>Das bedeutet, dass sich unter "aenergy.total" der benötigte Wert im payload-Objekt befindet.</p>
<p>Zuletzt speichere ich diesen Wert noch mit einem influxdb-out-Node in die Datenbank. Mit dieser Vorgehensweise kann man auch andere Shelly-Geräte ohne Shelly-App abfragen und deren Daten weiterverarbeiten.</p>
<p>Wie man Node-Red, MQTT und InfluxDB installiert und Daten austauscht steht unter anderem in meinen Beiträgen <a href="https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-1-2/">Mit Node-Red, InfluxDB und Grafana Daten auf einem Synology NAS sammeln und visualisieren (Teil 1/2)</a> und  <a href="https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-2-2/">Mit Node-Red, InfluxDB und Grafana Daten auf einem Synology NAS sammeln und visualisieren (Teil 2/2)</a></p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/strommessung-mit-shelly-plus-pm-mini-und-node-red/">Strommessung mit Shelly Plus PM Mini und Node-RED</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/strommessung-mit-shelly-plus-pm-mini-und-node-red/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Lohnt sich ein Batteriespeicher</title>
		<link>https://homeitems.de/lohnt-sich-ein-batteriespeicher/</link>
					<comments>https://homeitems.de/lohnt-sich-ein-batteriespeicher/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Sun, 18 Feb 2024 17:39:49 +0000</pubDate>
				<category><![CDATA[Grafana]]></category>
		<category><![CDATA[influxdb]]></category>
		<category><![CDATA[Photovoltaik]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=2580</guid>

					<description><![CDATA[<p>Die Nutzung von Solaranlagen und Balkonkraftwerken führt ja immer wieder zu der Frage, ob und wenn ja ab wann sich ein Batteriespeicher lohnt und in welcher Größe dieser sinnvoll ist. Im Netz und auf Youtube bekommt man dazu bereits eine Vielzahl von Informationen, aber manche Aussagen scheinen mir dann doch zu weit  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/lohnt-sich-ein-batteriespeicher/">Lohnt sich ein Batteriespeicher</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-9 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-9 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-9 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-46"><p>Die Nutzung von Solaranlagen und Balkonkraftwerken führt ja immer wieder zu der Frage, ob und wenn ja ab wann sich ein Batteriespeicher lohnt und in welcher Größe dieser sinnvoll ist. Im Netz und auf Youtube bekommt man dazu bereits eine Vielzahl von Informationen, aber manche Aussagen scheinen mir dann doch zu weit hergeholt. Auch die viele Formeln zur Berechnung lösen bei mir teilweise Misstrauen aus. In meinem Beitrag zeige ich, wie man mit InfluxDB und Grafana interaktiv verschiedene Szenarien durchspielen kann.</p>
<h2>Aufgabenstellung</h2>
<p>Für meine Berechnungsgrundlage verwende ich die protokollierten Ertragsdaten einer PV-Anlage (ohne Batteriespeicher) mit einer Größe von ca. 3,2 kWp. Diese Daten liegen in einer InfluxDB 2.x-Datenbank vor und die folgenden Auswertungen mache ich ausschließlich mit Grafana. Eine wesentliche, aber mir unbekannte Größe ist der nächtliche Verbrauch, denn den möchte ich natürlich mit einem Überschuss tagsüber abdecken. Der Gedanke, über mehrere Tage mit einem Speicher "überleben" zu können, ist zwar nett, erfordert aber einen sehr großen Speicher (mehrfacher Tagesbedarf) und somit einer großen Anzahl von PV-Modulen, die aus meiner Sicht auf privaten Hausdächern kaum unterzubringen ist.</p>
<p>Für meine Berechnungen möchte ich die Größe des Speichers und den Strompreis interaktiv verändern können, ebenso wie die Größe der Anlage, die den Strom produziert.</p>
<p>Als Ergebnisse meines Beispiels sollen</p>
<ul>
<li>der durchschnittlichen Nachtverbrauch</li>
<li>die Menge des gesparten Stroms</li>
<li>der ersparte Wert in Euro</li>
</ul>
<p>ermittelt werden und der Betrachtungszeitraum variabel sein.</p>
</div><div class="fusion-text fusion-text-47"><h2>Grafana Variabeln nutzen</h2>
<p>Für jede Größe eines Stromspeichern könnte ich eine eigene Visualisierung erstellen, aber das ist mir zu umständlich. Ich möchte gerne per Dropdown-Menü die Größe eines möglichen Stromspeichern auswählen und Grafana soll mir anzeigen, was das bringt.</p>
<p>Variabeln werden immer für ein Dashboard angelegt, so dass man diese auch für mehrere Visualisierungen auf dem Dashboard nutzen kann.</p>
<p>Um Variabeln nutzen zu können, muss man das Konfigurationsmenü für das Dashboard auswählen. Dies befindet sich in der oberen Leiste mit dem Dashboard-Name auf der rechten Seite hinter dem Zahnradsymbol.</p>
<p><img decoding="async" class="alignnone wp-image-2708 size-full" src="https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings.webp" alt="" width="1400" height="51" srcset="https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-200x7.webp 200w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-300x11.webp 300w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-400x15.webp 400w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-600x22.webp 600w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-768x28.webp 768w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-800x29.webp 800w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-1024x37.webp 1024w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings-1200x44.webp 1200w, https://homeitems.de/wp-content/uploads/2024/01/Grafana-Dashboard-Settings.webp 1400w" sizes="(max-width: 1400px) 100vw, 1400px" /></p>
<p>Unter "Settings" findet man nun auf der linken Seite den Menüpunkt "Variables".</p>
<p>Nach dem Drücken auf "New Variable" kann man die Variableneigenschaften näher definieren. Da ich eigene Werte zur Auswahl vorgeben möchte wähle ich unter "Variable type" "Custom" aus. Die Variable möchte ich unter dem <strong>Name</strong> "sinterval" in Grafana-Abfragen benutzen. Auf dem Dashboard soll als <strong>Label  </strong>"Speichergröße" erscheinen. Und unter <strong>Custom options</strong> trage ich durch Komma getrennt die Werte ein, die in meiner Dropdownliste erscheinen sollen. Sobald man diese Werte eingetragen hat sieht man die Ergebnisse bereits am untern Bildschirmrand.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings.webp"><img decoding="async" class="alignnone wp-image-2711 size-medium" src="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-267x300.webp" alt="" width="267" height="300" srcset="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-200x225.webp 200w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-267x300.webp 267w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-400x449.webp 400w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-600x674.webp 600w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-768x862.webp 768w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-800x898.webp 800w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-912x1024.webp 912w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-1200x1347.webp 1200w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings-1368x1536.webp 1368w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Variable-Settings.webp 1661w" sizes="(max-width: 267px) 100vw, 267px" /></a></p>
<p>Auf diese Weise lege ich drei Variablen an, die Erste für die Größe eines möglichen Batteriespeichers ("sbattery"), die Zweite zur Skalierung der Anlagengröße (und damit des Überschusses ("sscaler") und eine Dritte für den aktuellen Strompreis ("sprice").</p>
<p>Nach dem Anlegen der Variabeln sollte man nicht vergessen, das Dashboard zu speichern.</p>
</div><div class="fusion-text fusion-text-48"><h2>Durchschnittlichen Nachtverbrauch bestimmen</h2>
<p>Ein Batteriespeicher dient primär dazu, Überschuss zu speichern und den Strom dann zu liefern, wenn die Sonne keinen Strom produziert (z.B. nachts). Daher verwendet man häufig die in der Dunkelheit benötigte Menge Strom als Maßstab, um die Mindestgröße eines Batteriespeichers zu bestimmen.</p>
<p>Ich schaue mir also für einen bestimmten Zeitraum an, welche Menge an Strom ich nachts benötige und ermittele hieraus den Mittelwert. Dabei gehe ich davon aus, dass der Zeitraum von Frühjahr (März) bis Herbst (November) ideal für eine Betrachtung ist, da eine Photovoltaikanlage zwischen November und März kaum soviel Leistung erzeugt, dass man Überschüsse erwirtschaftet, die man speichern kann. Als Uhrzeit für den nächtlichen Zeitraum habe ich 21:00 Uhr abends bis 5:00 Uhr morgen definiert.</p>
<p>Die Abfrage für diese Mittelwert sieht wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-15 > .CodeMirror, .fusion-syntax-highlighter-15 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-15 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-15 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-15 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_15" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_15" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_15" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">import "date"
import "timezone"

option location =timezone.location(name: "Europe/Berlin")

from(bucket: "homeitems")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Verbrauch.Strom.Zaehlerstand")
  |> filter(fn: (r) => r["_field"] == "value")
  |> difference()
  |> hourSelection(start: 21, stop: 5,)
  |> aggregateWindow(every: 1d, fn: sum, createEmpty: false)</textarea></div><div class="fusion-text fusion-text-49"><p>Die "date"-Bibliothek braucht man für die hourSelection()-Funktion. Mittels der "timezone"-Bibliothek und der "location"-option löst man die Übersetzung der  UTC-Zeitangabe in die deutsche Zeit auf (im Winter UTC+1 sonst UTC+2 Stunden)</p>
<p>Den Verbrauch ermittele ich aus der Differenz der nächtlichen Zählerstände des Smartmeters. Wie man das macht findet ihr in folgendem Beitrag: <a href="https://homeitems.de/smartmeter-mit-tasmota-auslesen/">SmartMeter mit Tasmota auslesen</a></p>
<p>Nun schränke ich die ermittelten Differenzen auf die von mir ausgewählte tägliche Zeitspannen mittels der hourSelection()-Funktion ein. Dies erfolgt vor der Aggregat()-Funktion, mit der ich die Summe für die Zählerdifferenzen für jeweils einen Tag bilde.</p>
<p>Und abschließend wird mit der Mean()-Funktion der Mittelwert über alle Nachtverbräuche gebildet. Aus der Auswertung ergibt sich, dass im von mir gewählten Zeitraum (vom März bis Ende Oktober) durchschnittliche 4,1 kWh in der Uhrzeit von 21:00 Uhr bis 5:00 Uhr morgens verbraucht wurden.</p>
</div><div class="fusion-text fusion-text-50"><h2>Einsparung eines Batteriespeichers berechnen</h2>
<p>Im nächsten Schritt berechne ich mittels Grafana, wieviel kWh ich durch einen Batteriespeicher einsparen würde.  Die Werte kann man ebenfalls an einem Smartmeter auslesen, wenn dieser auch die ausgehende Leistung messen kann, die an den Netzbetreiber geliefert wird. Diese Zweirichtungsmessung bieten mittlerweile fast alle Geräte an, wenn man diese Daten für eine Protokollierung freigeschaltet hat.</p>
<p>Der Code hierzu lautet wie folgt:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-16 > .CodeMirror, .fusion-syntax-highlighter-16 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-16 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-16 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-16 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_16" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_16" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_16" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/javascript">import "date"
import "timezone"

option location =timezone.location(name: "Europe/Berlin")

from(bucket: "homeitems")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Erzeugung.Strom.Zaehlerstand")
  |> filter(fn: (r) => r["_field"] == "value")
  |> difference()
  |> aggregateWindow(every: 1d, fn: sum, timeSrc: "_start", createEmpty: false)
  |> map (fn: (r) => ({r with _value: 
     if r._value > ${sbattery} then 
        // Maximal die Kapazität des Batteriespeichers als Überschuss verwendbar
        float(v:${sbattery})
     else 
        // Überschuss komplett verwendbar, da kleiner als Kapzität des Batteriespeichers
     	r._value
  }))
  
  |> map(fn: (r) => ({ r with _value: r._value  *float(v:${sscaler})}))

|> sum(column: "_value")  </textarea></div><div class="fusion-text fusion-text-51"><p>Wie bei der Ermittlung der Verbräuche bilde ich die Differenzen der Zählerstände und addiere diese für jeden Tag mit der Aggregat()-Funktion.</p>
<p>Anschließend bearbeite ich die Werte mit der map()-Funktion und modifiziere die ermittelten Werte wie folgt:</p>
<p>Die Größe des Batteriespeichers gebe ich (wie oben beschrieben) durch den Wert in der Variabeln  "sinteraval" vor. Daraus ergibt sich, dass ich für alle Tage</p>
<ul>
<li>an denen der Überschuss größer als die Größe des Batteriespeichers in der Variabeln "sinterval" ist nur die Größe des Batteriespeichers</li>
<li>an denen der Überschuss kleiner der Größe des Batteriespeichers in der Variabeln "sinterval" ist den Überschuss des Tages</li>
</ul>
<p>weiterverwenden kann.</p>
<p>Bei der Berechnung muss ich den Wert in der Variabeln "sinterval" in einen float()-Typ umwandeln, da die Multiplikation sonst zum Typkonflikt führt.</p>
<p>Und mit der folgenden map()-Funktion baue ich noch einen Skalierungsfaktor ein, der "simuliert", wie groß mein Ertrag sein könnte, wenn die Anlage (und damit auch der Ertrag) um den Faktor "sscaler" größer wäre. Auch hier erfolgt eine Typumwandlung.</p>
<p>Ich habe noch ein zweites Panel erstellt, mit dem ich den Wert der Ersparnis in Euro ermittele. Dazu benutze ich die dritte Variable "sprice". Durch Austauschen der letzten Zeile in der vorigen Abfrage kann man diesen Wert in einem neuen Panel wie folgt ermitteln:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-17 > .CodeMirror, .fusion-syntax-highlighter-17 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-17 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-17 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-17 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:20px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_17" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_17" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_17" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">|> map(fn: (r) => ({ r with _value: r._value  *float(v:${sscaler})* float(v:${sprice})}))</textarea></div><div class="fusion-text fusion-text-52"><h2>Meine Auswertung</h2>
<p>Das Ergebnis der drei Panels sieht wie folgt aus:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung.webp"><img decoding="async" class="alignnone wp-image-2722 size-medium" src="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-300x115.webp" alt="" width="300" height="115" srcset="https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-200x77.webp 200w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-300x115.webp 300w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-400x154.webp 400w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-600x231.webp 600w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-768x295.webp 768w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-800x307.webp 800w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-1024x394.webp 1024w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung-1200x461.webp 1200w, https://homeitems.de/wp-content/uploads/2024/02/Grafana-Batteriespeicherauswertung.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Diese Daten liefern mit nun Anhaltspunkte für ein Kosten-/Nutzenverhältnis eines Batteriespeichers.  Dabei erhalte ich zuerst die Angabe, dass mein  Batteriespeicher größer ca. 5 kWh groß sein sollte, um den nächtlichen Verbrauch durch den Speicher abdecken zu können. Bei einem Preis von 40  Cent pro kWh würde ich ca. 228 € pro Jahr sparen. Gehe ich davon aus, dass ein Batteriespeicher mind. 2500 Euro kostet würde sich dieser rechnerich nach ca. 11 Jahren amortisieren. Ich gehe bei der Lebensdauer eines Batteriespeichers pessimistisch von 10 Jahren aus, so dass sich dies für den vorliegenden Fall wirtschaftlich nicht lohnen würde, sofern die Strompreise nicht durch die Decke gehen.</p>
<p>Würde ich die Anlage um 1,6 kWp erweitern, dann würde sich ein Batteriespeicher bereits nach 7,5 Jahren lohnen. Den passenden Wechslerichter habe ich hier noch nicht berücksichtigt.</p>
<p>Auch wenn das Modell  Faktoren außen vor lässt, bekommt man ein Gefühlt für die Wirtschaftlichkeit und ich kann die Angebote für diesen Fall jetzt deutlich besser einordnen. Viel Spaß bei den eigenen Berechnungen und Erweiterungen.</p>
</div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/lohnt-sich-ein-batteriespeicher/">Lohnt sich ein Batteriespeicher</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/lohnt-sich-ein-batteriespeicher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Zeitreihen in Influxdb 2.x ändern</title>
		<link>https://homeitems.de/zeitreihen-in-influxdb-2-x-aendern/</link>
					<comments>https://homeitems.de/zeitreihen-in-influxdb-2-x-aendern/#respond</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Fri, 26 Jan 2024 19:18:30 +0000</pubDate>
				<category><![CDATA[Grafana]]></category>
		<category><![CDATA[influxdb]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=2588</guid>

					<description><![CDATA[<p>Zu Beginn des neuen Jahres ist es spannend, Sensorenwerte des letzten Jahres zu analysieren. Dabei fiel mir ein Fehler bei einigen Zeitreihen auf, in denen zu bestimmten Zeitpunkten Sprünge vorhanden sind. So ein Sprung tritt beispielsweise auf, wenn ich Zählerstände protokolliere, die zwischenzeitlich durch einen Reset oder Stromausfall des Sensors wieder bei  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/zeitreihen-in-influxdb-2-x-aendern/">Zeitreihen in Influxdb 2.x ändern</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-10 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-10 fusion_builder_column_5_6 5_6 fusion-flex-column" style="--awb-bg-size:cover;--awb-width-large:83.3333333333%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.304%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:2.304%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-title title fusion-title-10 fusion-sep-none fusion-title-text fusion-title-size-one" style="--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-margin-top-small:0px;--awb-margin-right-small:0px;--awb-margin-bottom-small:20px;--awb-margin-left-small:0px;"><h1 class="fusion-title-heading title-heading-left fusion-responsive-typography-calculated" style="margin:0;--fontSize:32;line-height:1.1;">Dieter</h1></div><div class="fusion-separator fusion-full-width-sep" style="align-self: center;margin-left: auto;margin-right: auto;margin-top:40px;width:100%;"></div><div class="fusion-text fusion-text-53"><p>Zu Beginn des neuen Jahres ist es spannend, Sensorenwerte des letzten Jahres zu analysieren. Dabei fiel mir ein Fehler bei einigen Zeitreihen auf, in denen zu bestimmten Zeitpunkten Sprünge vorhanden sind. So ein Sprung tritt beispielsweise auf, wenn ich Zählerstände protokolliere, die zwischenzeitlich durch einen Reset oder Stromausfall des Sensors wieder bei Null beginnen. Für weitere Auswertungen führt das beispielsweise bei Differenzfunktionen zu fehlerhaften Berechnungen. Daher möchte ich diese Daten dauerhaft in influxdb korrigieren. Die folgende Vorgehensweise kann unabhängig von meinem Beispiel verwendet werden und zeigt die Korrektur durch einfache Nutzung der Flux-Sprache von InfluxDB 2.x auf.</p>
<h2>Lösungsansatz</h2>
<p>In meinem Beispiel habe ich Zählerstände eines Balkonkraftwerkes gespeichert. Diese erfasse ich mit einem einem eigenen Sensor (siehe mein Beitrag <a href="https://homeitems.de/leistung-eines-balkonkraftwerks-mit-homematic-ip-erfassen/">Leistung eines Balkonkraftwerks mit Homematic IP erfassen</a>).</p>
<p>Durch Konfigurationsänderungen musste ich diesen Zähler mehrmals außer Betrieb nehmen. Dabei wurde der Zähler immer wieder bei Null gestartet und entsprechend protokolliert. Hierdurch werden jetzt verschiedene Auswertungen verfälscht, die diesen Zeitraum betreffen.</p>
<p>Lösen kann ich das, wenn ich den alten Zählerstand als Offset auf die neuen Zählerstande addiere, sowohl für die historischen Daten als auch für die aktuelle Datenerfassung. Damit erzeuge ich wieder eine kontinuierliche Zeitreihe.</p>
<p>(Mittlerweile protokolliere ich übrigens nur noch die Differenzen von Zählerständen, so dass das Thema bei mir gar nicht mehr auftreten kann.)</p>
<h2>Zeitpunkt und Offset herausfinden</h2>
<p>Im ersten Schritt erstelle ich eine Abfrage im Data Explorer von influxdb 2.0, die die Daten für das betreffende Feld ermittelt. Dabei stelle ich die "AGGREGATE FUNCTION" auf "Custom" und deaktiviere alle Optionen. Die "WINDOW PERIOD" stelle ich ebenfalls auf "Custom",  um die reinen Datenwerte zu erhalten. Das Ergebnis sieht wie folgt aus:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1.webp"><img decoding="async" class="alignnone wp-image-2598 size-medium" src="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-300x204.webp" alt="" width="300" height="204" srcset="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-200x136.webp 200w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-300x204.webp 300w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-400x272.webp 400w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-600x408.webp 600w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-768x523.webp 768w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-800x545.webp 800w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-1024x697.webp 1024w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1-1200x817.webp 1200w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Daten_filtern1.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nun finde ich den Datenwert heraus, bevor der Zähler auf Null umsprint. Dies kann man sehr schöne über den Data-Explorer interaktiv machen, wobei ich die "view raw data" Option hierzu wähle. Der für mich relevante Zeitpunkt ist "2023-04-28T17:41:59.477Z", den ich mir aus der Tabellensicht einfach kopiere. Der letzte Zählerstand zu diesem Zeitpunkt betrug "153.7812" KWh. Diesen Wert bezeichne ich als Offset, den ich für alle neuen Zählerstände addieren muss.</p>
<p><em>Wichtig: Für ein Funktionieren müssen die UTC-Werte ebenso wie die englischen Zahlen-Werte verwendet werden (mit einem Punkt für die Nachkommastellen).</em></p>
<h2>Relevante Daten ermitteln</h2>
<p>Jetzt muss ich alle Datensätze herausfinden, die nach dem betreffenden Zeitpunkt liegen, da ich dort die Werte ändern möchte. Hierzu ziehe ich von dem Datum, an dem der letzte "alte" Zählerstand erfasst wurde das jeweilige Datum jedes Datensatzes ab. Diese Differenz ist größer Null, wenn es sich um Datensätze vor dem betreffenden Zeitpunkt und kleiner Null, wenn es sich um Datensätze dahinter handelt.</p>
<p>Da influxdb keine Berechnungen auf Datumsformaten unterstützt, wandele ich diese Datumsangaben in Integer-Werte um und subtrahiere diese voneinander (im Prinzip ist das die Umwandlung der Datum/Zeitangaben in Nanosekunden im UNIX-Format).</p>
<p><em>Tipp: In der Flux-Dokumentation wird die Umwandlung in das uint-Format empfohlen. Dieses hat aber den Nachteil, dass es nur positive Werte bei einer Berechnung zulässt. </em></p>
<p>Diese Differenz speichere ich zur späteren Kontrolle in einem Feld zu jedem Datensatz ab, indem ich folgende Codezeile einfüge:</p>
<div></div>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-18 > .CodeMirror, .fusion-syntax-highlighter-18 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-18 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-18 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-18 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_18" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_18" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_18" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh"> |> map (fn: (r) => ({r with Zeitdifferenz: int(v: 2023-04-28T17:41:59.477Z) - int(v: r["_time"])}))</textarea></div><div class="fusion-text fusion-text-54"><p>Im Data Explorer sieht das Ganze wie folgt aus:</p>
<h2><a href="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz.webp"><img decoding="async" class="alignnone wp-image-2599 size-medium" src="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-300x141.webp" alt="" width="300" height="141" srcset="https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-200x94.webp 200w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-300x141.webp 300w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-400x189.webp 400w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-600x283.webp 600w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-768x362.webp 768w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-800x377.webp 800w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-1024x483.webp 1024w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz-1200x566.webp 1200w, https://homeitems.de/wp-content/uploads/2024/01/InfluxDB_Zeitdifferenz.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></h2>
<h2>Daten verändern und speichern</h2>
<p>Für eine Anpassung habe ich jetzt alles zusammen. Ich addiere anschließend mit einer map()-Funktion für jeden Datensatz, bei dem die Zeitdifferenz kleiner oder gleich Null den Offset zum aktuellen Wert des Datensatzes für den Zähler.</p>
<p>ACHTUNG: Ich kann das zuvor erzeugte Feld "Zeitdifferenz" jetzt nicht nutzen, um die Wert einzusetzen, da die Pipe in Flux, die Werte tatsächlich erst nach einer Ausführung für den jeweiligen Datensatz verfügbar hat. Daher trage ich die Berechnung direkt in die map()-Funktion ein.</p>
<p>Der Code hierzu lautet:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-19 > .CodeMirror, .fusion-syntax-highlighter-19 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-19 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-19 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-19 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_19" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_19" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_19" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">|> map (fn: (r) => ({r with NeuerWert: if (int(v: 2023-04-28T17:41:59.477Z) - int(v: r["_time"]) < 0) then (r._value + 153.7812) else r._value}))</textarea></div><div class="fusion-text fusion-text-55"><p>Ein Testlauf sollte jetzt die richtigen neuen Werte ebenfalls als eigenes Feld anzeigen:</p>
<p><a href="https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2.webp"><img decoding="async" class="alignnone wp-image-2601 size-medium" src="https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-300x132.webp" alt="" width="300" height="132" srcset="https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-200x88.webp 200w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-300x132.webp 300w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-400x175.webp 400w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-600x263.webp 600w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-768x337.webp 768w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-800x351.webp 800w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-1024x449.webp 1024w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2-1200x526.webp 1200w, https://homeitems.de/wp-content/uploads/2024/01/Datenkorrektur2.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Ich empfehle, diese Änderungen so wie beschrieben zu kontrollieren und bei Bedarf Fehler zu korrigieren, damit nicht versehentlich auf den echten Daten falsche Werte geschrieben werden.</p>
<p>Sind alle Daten richtig, kann ich jetzt den Code so ändern, dass die Daten direkt in das _value-Feld der Datensätze geschrieben werden. Dazu ergänze ich ebenfalls noch die to()-Funktion, die die Daten final schreibt.</p>
<p>Der fertige Code für die Änderung sieht wie folgt aus:</p>
</div><style type="text/css" scopped="scopped">.fusion-syntax-highlighter-20 > .CodeMirror, .fusion-syntax-highlighter-20 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-20 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-20 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</style><div class="fusion-syntax-highlighter-container fusion-syntax-highlighter-20 fusion-syntax-highlighter-theme-light" style="opacity:0;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:14px;border-width:1px;border-style:solid;border-color:#e0dede;"><div class="syntax-highlighter-copy-code"><span class="syntax-highlighter-copy-code-title" data-id="fusion_syntax_highlighter_20" style="font-size:14px;">Copy to Clipboard</span></div><label for="fusion_syntax_highlighter_20" class="screen-reader-text">Syntax Highlighter</label><textarea class="fusion-syntax-highlighter-textarea" id="fusion_syntax_highlighter_20" data-readOnly="nocursor" data-lineNumbers="1" data-lineWrapping="" data-theme="default" data-mode="text/x-sh">from(bucket: "Test2")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Erzeugung.Garage.Strom.Zaehlerstand")
  |> filter(fn: (r) => r["_field"] == "value")
  // |> map (fn: (r) => ({r with Zeitdifferenz: int(v: 2023-04-28T17:41:59.477Z) - int(v: r["_time"])}))
  |> map (fn: (r) => ({r with _value: if (int(v: 2023-04-28T17:41:59.477Z) - int(v: r["_time"]) < 0) then (r._value + 153.7812) else r._value}))
  |> to(bucket: "Test2")</textarea></div><div class="fusion-text fusion-text-56"><p>Die Daten werden nun endgültig geschrieben.</p>
<p>Sofern es weitere Stellen gibt, die korrigiert werden müssen, kann man diese Korrekturen anschließend mit der gleichen Methode anpassen. Dabei muss mit jeder Datenkorrektur auch der Offset durch den neuen Offset erhöht werden.</p>
<p>Und wenn man weiter (wie in meinem Beispiel) Zählerstände in influxdb protokolliert, muss vor dem Speichern auf den jeweils aktuellen Zählerstand der letzte Offset addiert werden. Dabei empfehle ich, das Speichern neuer Zählerstände solange auszusetzen, bis die Datenkorrekturen abgeschlossen sind.</p>
</div><div class="fusion-sharing-box fusion-sharing-box-1 boxed-icons has-taglines layout-floated layout-medium-floated layout-small-stacked" style="background-color:#f6f6f6;border-color:#cccccc;--awb-separator-border-color:#cccccc;--awb-separator-border-sizes:0px;--awb-layout:row;--awb-alignment-small:space-between;--awb-stacked-align-small:center;" data-title="Autor: Dieter" data-description="Zu Beginn des neuen Jahres ist es spannend, Sensorenwerte des letzten Jahres zu analysieren. Dabei fiel mir ein Fehler bei einigen Zeitreihen auf, in denen zu bestimmten Zeitpunkten Sprünge vorhanden sind. So ein Sprung tritt beispielsweise auf, wenn ich Zählerstände protokolliere, die zwischenzeitlich durch einen Reset oder Stromausfall des Sensors wieder bei Null" data-link="https://homeitems.de/author/hoitadmin/"><h4 class="tagline" style="color:#858a9f;">Share This Story, Choose Your Platform!</h4><div class="fusion-social-networks sharingbox-shortcode-icon-wrapper sharingbox-shortcode-icon-wrapper-1 boxed-icons"><span><a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fhomeitems.de%2Fauthor%2Fhoitadmin%2F&amp;t=Autor%3A%20Dieter" target="_blank" rel="noreferrer" title="Facebook" aria-label="Facebook" data-placement="top" data-toggle="tooltip" data-title="Facebook"><i class="fusion-social-network-icon fusion-tooltip fusion-facebook awb-icon-facebook" style="color:#ffffff;background-color:#3b5998;border-color:#3b5998;border-radius:0px;" aria-hidden="true"></i></a></span><span><a href="https://x.com/intent/post?text=Autor%3A%20Dieter&amp;url=https%3A%2F%2Fhomeitems.de%2Fauthor%2Fhoitadmin%2F" target="_blank" rel="noopener noreferrer" title="X" aria-label="X" data-placement="top" data-toggle="tooltip" data-title="X"><i class="fusion-social-network-icon fusion-tooltip fusion-twitter awb-icon-twitter" style="color:#ffffff;background-color:#000000;border-color:#000000;border-radius:0px;" aria-hidden="true"></i></a></span><span><a href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3A%2F%2Fhomeitems.de%2Fauthor%2Fhoitadmin%2F&amp;title=Autor%3A%20Dieter&amp;summary=Zu%20Beginn%20des%20neuen%20Jahres%20ist%20es%20spannend%2C%20Sensorenwerte%20des%20letzten%20Jahres%20zu%20analysieren.%20Dabei%20fiel%20mir%20ein%20Fehler%20bei%20einigen%20Zeitreihen%20auf%2C%20in%20denen%20zu%20bestimmten%20Zeitpunkten%20Spr%C3%BCnge%20vorhanden%20sind.%20So%20ein%20Sprung%20tritt%20beispielsweise%20auf%2C%20wenn%20ich%20Z%C3%A4hlerst%C3%A4nde%20protokolliere%2C%20die%20zwischenzeitlich%20durch%20einen%20Reset%20oder%20Stromausfall%20des%20Sensors%20wieder%20bei%20Null" target="_blank" rel="noopener noreferrer" title="LinkedIn" aria-label="LinkedIn" data-placement="top" data-toggle="tooltip" data-title="LinkedIn"><i class="fusion-social-network-icon fusion-tooltip fusion-linkedin awb-icon-linkedin" style="color:#ffffff;background-color:#0077b5;border-color:#0077b5;border-radius:0px;" aria-hidden="true"></i></a></span></div></div></div></div></div></div>
<p>Der Beitrag <a href="https://homeitems.de/zeitreihen-in-influxdb-2-x-aendern/">Zeitreihen in Influxdb 2.x ändern</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/zeitreihen-in-influxdb-2-x-aendern/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
