<?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>Grafana Archive - Smart home Ratgeber</title>
	<atom:link href="https://homeitems.de/category/grafana/feed/" rel="self" type="application/rss+xml" />
	<link>https://homeitems.de/category/grafana/</link>
	<description>Einfache Lösungen für zuhause mit Smart home items</description>
	<lastBuildDate>Sat, 17 Aug 2024 18:41:16 +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>Grafana Archive - Smart home Ratgeber</title>
	<link>https://homeitems.de/category/grafana/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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-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;">Grafana</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>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-2"><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 fetchpriority="high" 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-3"><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-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="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-4"><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-5"><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-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="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-6"><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-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/x-sh">|> map(fn: (r) => ({ r with _value: r._value  *float(v:${sscaler})* float(v:${sprice})}))</textarea></div><div class="fusion-text fusion-text-7"><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-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;">Grafana</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-8"><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-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: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_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/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-9"><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-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: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_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/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-10"><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-6 > .CodeMirror, .fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters {background-color:var(--awb-color1);}.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-gutters { background-color: var(--awb-color2); }.fusion-syntax-highlighter-6 > .CodeMirror .CodeMirror-linenumber { color: var(--awb-color8); }</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: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_6" style="font-size:14px;">Copy to Clipboard</span></div><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="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-11"><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="Kategorie: Grafana" 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/category/grafana/"><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://m.facebook.com/sharer.php?u=https://homeitems.de/category/grafana/" 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=Kategorie%3A%20Grafana&amp;url=https%3A%2F%2Fhomeitems.de%2Fcategory%2Fgrafana%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%2Fcategory%2Fgrafana%2F&amp;title=Kategorie%3A%20Grafana&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>
		<item>
		<title>Daten in InfluxDB verändern</title>
		<link>https://homeitems.de/daten-in-influxdb-veraendern/</link>
					<comments>https://homeitems.de/daten-in-influxdb-veraendern/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Mon, 28 Aug 2023 18:00:10 +0000</pubDate>
				<category><![CDATA[Grafana]]></category>
		<category><![CDATA[influxdb]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=2317</guid>

					<description><![CDATA[<p>Ich nutze zum Speichern von Daten die InfluxDB ab Version 2.x. Immer wieder passiert es, dass von einem der Sensoren ein falscher Wert oder im schlimmsten Fall ein ganzer Zeitraum mit falschen Werten geliefert und gespeichert wird. Um bei späteren Auswertungen z.B. mit Grafana keine komischen Grafiken zu erhalten möchte ich diese  [...]</p>
<p>Der Beitrag <a href="https://homeitems.de/daten-in-influxdb-veraendern/">Daten in InfluxDB verä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-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;">Grafana</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-12"><p>Ich nutze zum Speichern von Daten die InfluxDB ab Version 2.x. Immer wieder passiert es, dass von einem der Sensoren ein falscher Wert oder im schlimmsten Fall ein ganzer Zeitraum mit falschen Werten geliefert und gespeichert wird. Um bei späteren Auswertungen z.B. mit Grafana keine komischen Grafiken zu erhalten möchte ich diese Werte korrigieren. Im folgenden Beitrag zeige ich, wie man das machen kann.</p>
<h2>Fehlerhafte Daten identifizieren</h2>
<p>Im ersten Schritt muss man herausfinden, wo die fehlerhaften Daten sind. Ich verwende hierzu die InfluxDB UI. Alternativ kann man das auch über Grafana machen.</p>
<p>Dazu wähle ich im Data-Explorer für mein Bucket als erstes das Measurement und das Feld im Query Builder aus. Wichtig ist, dass man anschließend in den Script Editor wechselt und dort die Aggregate-Zeile löscht. Denn sonst erhält man aggregierte Werte über den voreingestellten Zeitraum.</p>
<p>In der anschließenden Grafik sieht man sehr deutlich Ausreißer, die man nun durch Klicken, Festhalten und Ziehen der linken Maustaste im Grafikfenster  näher eingrenzen kann.</p>
<p>Durch Klicken auf den Zeitbereich und dort auf "Custom Time Range" kann man den Zeitraum dann exakt einstellen, der jetzt von Interesse ist.</p>
<p>Alternativ kann man auch einfach eine zusätzliche Filterfunktion angeben. In meinem Beispiel habe ich nach Werten gesucht die kleiner Null sind.</p>
<p>Das Script sieht dann beispielsweise wie folgt aus:</p>
</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/txt">from(bucket: "nodered")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "Erzeugung.HDach.Strom.Zaehlerstand")
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn:(r) =>  r._value <= 0)</textarea></div><div class="fusion-text fusion-text-13"><p>Nun schalte ich um auf die RAW-Data Ansicht und erhalte den Datenpunkt mit allen Details, der fehlerhaft ist.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB.webp"><img decoding="async" class="alignnone wp-image-2322 size-medium" src="https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-300x87.webp" alt="" width="300" height="87" srcset="https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-200x58.webp 200w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-300x87.webp 300w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-400x115.webp 400w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-600x173.webp 600w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-768x222.webp 768w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-800x231.webp 800w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-1024x295.webp 1024w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB-1200x346.webp 1200w, https://homeitems.de/wp-content/uploads/2023/08/Fehlerhafter-Wert-InfluxDB.webp 1400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h2>Wert ändern</h2>
<p>Wenn ich den Wert  nur ändern möchte, dann nutze ich die Möglichkeit der InfluxDB-UI, Werte einfach überschreiben zu können.</p>
<p>Hierzu benötigt man</p>
<ul>
<li>den Namen des Measurements</li>
<li>den Namen des Fields sowie den neuen Wert</li>
<li>den exakten Timestamp im UNIX-Form mit Millisekunden (ich speichere alle Werte immer nur maximal mit Millisekunden ab).</li>
</ul>
<p>All diese Daten sind verfügbar, einzig die Zeitangabe für den fehlerhaften Wert muss umgerechnet werden. Dazu verwendet man z.B, die Webseite <a href="https://it-tools.tech/date-converter">https://it-tools.tech/date-converter</a>. Mein falsche Zählerstand wurde am "2023-08-03T15:45:06.018Z" (_Time-Spalte) gespeichert. Umgerechnet ins UNIX-Format mit Millisekunden  erhalte ich die Zahl "1691077506018" (bitte Timestamp Feld des Konverters mit den Millisekunden verwenden und nicht das Unix-Feld).</p>
<p>Nun geht man in der InfluxDB-UI auf den Menüpunkt "Load Data / Sources" und wählt dort "Line Protocol" aus. Hier wählt man den Bucket, in dem sich das Measurement befindet, anschließend die Option "Enter manually" und stellt die Zeitangabe auf "precision milliseconds" (wer hier andere Genauigkeiten verwendet, stellt das entsprechend anders ein und rehnet dann auch die Zeit mit anderen Genauigkeiten um).</p>
<p>Jetzt kann ich den folgenden Befehl eingeben, um die falsche Daten zu korrigieren und drücke anschließend "Write Data":</p>
<p><em>"Erzeugung.HDach.Strom.Zaehlerstand value=875.5 1691077506018"</em></p>
<p>Es sollte im Anschluss eine grüne Erfolgsmeldung erscheinen und der Wert in der InfluxDB für diesen Zeitstempel wurde den Wert 875.5 geändert</p>
<h2>Wert löschen</h2>
<p>Alternativ kann ich den Wert auch löschen. Dies geht beispielsweise mit dem curl-Befehl.  Sofern man Windows nutzt, kann man das curl-Kommandozeilen-Tool über den Link <a href="https://curl.se/windows/">https://curl.se/windows/</a>  installieren. Der Befehl, um einenDatensatz mittels curl-Befehl zu löschen 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/x-sh">curl -X POST \
--data '{
    "predicate": "_measurement=\"<Measurement Name>\",
	"start": "<Startzeit>",
    "stop": "<Stopzeit>",
}' \
-H 'Authorization: Token <hier kommt der Token String rein>' \
-H 'Content-Type: application/json' \
'<IP-Adresse des Influx-Severs>:8086/api/v2/delete?org=<Meine Organisation>&bucket=<Mein Bucketname>'  </textarea></div><div class="fusion-text fusion-text-14"><p>Alternativ kann man auch über die influxdb-Konsole einen Löschbefehl ausführen. Ich rufe z.B. in dem Docker Container, in dem influxdb läuft eine bash-Console auf und gebe einfach den folgenden Befehl ein:</p>
<p><em>influx delete --token --org --bucket nodered --start 2023-08-03T15:45:06.018Z --stop 2023-08-03T15:45:06.018Z --predicate '_measurement="Erzeugung.HDach.Strom.Zaehlerstand"'</em></p>
<p>In beiden Fällen würde der Eintrag aus der Datenbank gelöscht.</p>
<h2>Ergebnis</h2>
<p>Ich habe mittlerweile ganze Zeitreihen angepasst, in dem ich über Excel ganz viele Befehlszeilen generiert, in den Line-Protocol-Konsole geladen und anschließend ausgeführt habe.  Die Vorgehensweise ist immer die gleiche, egal ob man einen oder mehrere Werte anpasst.</p>
</div><div class="fusion-sharing-box fusion-sharing-box-2 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="Kategorie: Grafana" data-description="Ich nutze zum Speichern von Daten die InfluxDB ab Version 2.x. Immer wieder passiert es, dass von einem der Sensoren ein falscher Wert oder im schlimmsten Fall ein ganzer Zeitraum mit falschen Werten geliefert und gespeichert wird. Um bei späteren Auswertungen z.B. mit Grafana keine komischen Grafiken zu erhalten möchte ich diese Werte" data-link="https://homeitems.de/category/grafana/"><h4 class="tagline" style="color:#858a9f;">Teile diesen Beitrag</h4><div class="fusion-social-networks sharingbox-shortcode-icon-wrapper sharingbox-shortcode-icon-wrapper-2 boxed-icons"><span><a href="https://m.facebook.com/sharer.php?u=https://homeitems.de/category/grafana/" 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=Kategorie%3A%20Grafana&amp;url=https%3A%2F%2Fhomeitems.de%2Fcategory%2Fgrafana%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%2Fcategory%2Fgrafana%2F&amp;title=Kategorie%3A%20Grafana&amp;summary=Ich%20nutze%20zum%20Speichern%20von%20Daten%20die%20InfluxDB%20ab%20Version%202.x.%20Immer%20wieder%20passiert%20es%2C%20dass%20von%20einem%20der%20Sensoren%20ein%20falscher%20Wert%20oder%20im%20schlimmsten%20Fall%20ein%20ganzer%20Zeitraum%20mit%20falschen%20Werten%20geliefert%20und%20gespeichert%20wird.%20Um%20bei%20sp%C3%A4teren%20Auswertungen%20z.B.%20mit%20Grafana%20keine%20komischen%20Grafiken%20zu%20erhalten%20m%C3%B6chte%20ich%20diese%20Werte" 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/daten-in-influxdb-veraendern/">Daten in InfluxDB verändern</a> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/daten-in-influxdb-veraendern/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>Mit Node-Red, InfluxDB und Grafana Daten auf einem Synology NAS sammeln und visualisieren (Teil 2/2)</title>
		<link>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-2-2/</link>
					<comments>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-2-2/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Tue, 16 Aug 2022 15:45:50 +0000</pubDate>
				<category><![CDATA[Grafana]]></category>
		<category><![CDATA[influxdb]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=1837</guid>

					<description><![CDATA[<p>Im zweiten Teil geht es nun um die Installation von Node-Red, Grafana und die Visualisierung erster Daten von einem MQTT-Server. Node-Red Container installieren Image herunterladen Wie im ersten Teil beschrieben wird als erstes das "nodered/node-red"- Paket heruntergeladen. Unter dem Verzeichnis Docker reicht es diesmal aus, das Verzeichnis "nodered" und "nodered/data" anzulegen. Ich  [...]</p>
<p>Der 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> 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;">Grafana</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>Im zweiten Teil geht es nun um die Installation von Node-Red, Grafana und die Visualisierung erster Daten von einem MQTT-Server.</p>
<h2>Node-Red Container installieren</h2>
<h3>Image herunterladen</h3>
<p>Wie im ersten Teil beschrieben wird als erstes das "nodered/node-red"- Paket heruntergeladen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/nodered_regis.jpg"><img decoding="async" class="alignnone wp-image-1838 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-300x120.jpg" alt="" width="300" height="120" srcset="https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-200x80.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-300x120.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-400x160.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-600x239.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-768x307.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-800x319.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-1024x409.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-1200x479.jpg 1200w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis-1536x613.jpg 1536w, https://homeitems.de/wp-content/uploads/2022/08/nodered_regis.jpg 1874w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Unter dem Verzeichnis Docker reicht es diesmal aus, das Verzeichnis "nodered" und "nodered/data" anzulegen. Ich empfehle hierzu, den DSM 7.x Filemanager zu nutzen.</p>
<p>Auf diesem Verzeichnis muss eine zusätzliche Berechtigung für das Schreiben und Lesen  eingerichtet werden. Dies liegt daran, dass hier z.B. weitere Nodes installiert und gespeichert werden müssen. Dies passiert normalerweise über den in Node-Red angelegt Nutzer (mit der UID 1000). Dieser ist aber im Synology NAS nicht bekannt. Daher wird auf dem NAS am einfachsten für "Everyone" ein Lesen und Schreiben ermöglicht.</p>
<p>Dazu geht man über Filemanager  auf das "/docker/nodered"-Verzeichnis, drückt die rechte Maustaste und wählt das Menü "Einstellungen" aus. Über den Reiter "Berechtigungen" wählt man die Gruppe "Everyone" und gibt dieser diesen die vollständigen Rechte auf das "/data"-Verzeichnis.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen.jpg"><img decoding="async" class="alignnone wp-image-1839 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-257x300.jpg" alt="" width="257" height="300" srcset="https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-200x234.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-257x300.jpg 257w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-400x467.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-600x701.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-768x897.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-800x935.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen-876x1024.jpg 876w, https://homeitems.de/wp-content/uploads/2022/08/nodered_Berechtigungen.jpg 1104w" sizes="(max-width: 257px) 100vw, 257px" /></a></p>
<p>Nun müssen für den Container nur noch folgende Daten angegeben werden:</p>
<ul>
<li>Beliebiger Name für den Container</li>
<li>Netzwerk: bridge</li>
<li>Automatischen Neustart aktivieren</li>
<li>Lokaler Port 1882 und Container Port 1880, TCP</li>
<li>Lokaler Port 2062 und Container Port 2062, TCP (nur notwendig, wenn man eine CCU ansprechen möchte)</li>
<li>Lokaler Port 2063 und Container Port 2063, TCP (nur notwendig, wenn man eine CCU ansprechen möchte)</li>
</ul>
<p>Die Pfade werden wie folgt gesetzt:</p>
</div>
<div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left">Datei/Ordner</th>
<th align="left">Mount-Pfad</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">/docker/nodered/data</td>
<td align="left">/data</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-16"><p>In den Umgebungsvariabeln habe ich die Timezone (Parameter TZ) manuell auf Europe/Berlin als Umgebungsvariable gesetzt, da ich festgestellt habe, dass die TimeZone nicht von Synology DSM 7.x Betriebssystem übernommen wurde und stattdessen eine UTC Zeit eingestellt war, die 2 Stunden zurückliegt.</p>
<p>Nach dem Starten des Containers kann Node-Red über die IP-Adresse der Synology NAS gefolgt von der Portangabe aufgerufen werden (z.B. 192.168.178.135:1882).</p>
<p>Ich empfehle, noch die Bibliotheken (Nodes) zu installieren, mit denen man InfluxDB und eine CCU ansprechen kann (für andere Systeme gibt es auch andere Nodes, MQTT ist hingegen schon im Standard vorhanden). Dazu geht man oben rechts in Node-Red auf den Menüpunkt "Palette verwalten". Unter dem Reiter "Installation" kann man nun die folgenden Zusatzpakete installieren:</p>
<ul>
<li>node-red-contrib-ccu</li>
<li>node-red-contrib-influxdb</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/nodered-palette.jpg"><img decoding="async" class="alignnone wp-image-1843 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-300x207.jpg" alt="" width="300" height="207" srcset="https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-200x138.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-300x207.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-400x276.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-600x414.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-768x531.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-800x553.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-1024x707.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette-1200x829.jpg 1200w, https://homeitems.de/wp-content/uploads/2022/08/nodered-palette.jpg 1271w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
</div><div class="fusion-text fusion-text-17"><h2>Grafana installieren</h2>
<p>Auch Grafana lässt sich wie Node-Red und InfluxDB einfach als Docker Container erstellen. Wie in den vorigen Kapiteln beschrieben braucht man hierzu nur das Abbild "grafana/grafana" und die "latest" Version herunterladen.</p>
<p>Für Grafana wird ebenfalls ein Verzeichnis unterhalb von Docker angelegt: "/docker/grafana".</p>
<p>Wie für die Node-Red Installation beschrieben, wird auch hierauf für "Everyone" die volle Berechtigung erteilt.</p>
<p>Für die Installation und das Starten des Containers sollten folgende Parameter angegeben werden:</p>
<ul>
<li>Beliebiger Name für den Container</li>
<li>Netzwerk: bridge</li>
<li>Automatischen Neustart aktivieren</li>
<li>Lokaler Port 3000 und Container Port 3000, TCP</li>
</ul>
<p>Die Pfade werden wie folgt angegeben:</p>
</div>
<div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left">Datei/Ordner</th>
<th align="left">Mount-Pfad</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">/docker/grafana</td>
<td align="left">/var/lib/grafana</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-18"><p>In den Umgebungsvariabeln habe ich ebenfalls die Timezone (Parameter TZ) manuell auf Europe/Berlin als Umgebungsvariable gesetzt, da ich festgestellt habe, dass die TimeZone nicht von Synology DSM 7.x Betriebssystem übernommen wurde und stattdessen eine UTC Zeit eingestellt war, die 2 Stunden zurückliegt.</p>
<p>Nach dem Starten des Containers kann Grafana über die IP-Adresse der Synology NAS gefolgt vom Grafana Port aufgerufen (z.B. 1192.168.178.135:3000) und ein Nutzer erstellt werden.</p>
</div><div class="fusion-text fusion-text-19"><h2>Authentication Key in InfluxDB erzeugen</h2>
<p>Um mit InfluxDB kommunizieren zu können ist neben der Organization und dem Bucket auch ein Token erforderlich.</p>
<p>Auf der Synology DSM 7.x Version geht man mit einem Doppeklick auf den  laufenden InfluxDB Container. Neben den Einstellungen zu diesem Container findet man am oberen Bildschirmrand den Menüpunkt "Terminal".</p>
<p>Hier klickt man oben links auf den Menüpunt "Erstellen". Anschließend erscheint in der Liste der Terminals auf der linken Seite der Eintrag "bash". Auf diesen Eintrag wird geklickt und auf der rechten Seite öfnet sich nun das bash-Terminal mit einer Eingabezeile.</p>
<p>Hier wird nun folgender Befehl eingegeben werden (USERNAME bitte durch denLoginnamen ersetzen, der bei der Erstellung des Containers angegeben wurde):</p>
<p><em>influx auth list -user USERNAME -hide-headers | cut -f 3</em></p>
<p>TIPP: Im ersten Moment sieht es so aus, als könnte man mit STRG-V keinen Text in das Fenster kopieren. Wenn man aber vorher STRG-A drückt und dann STR-V wird der Text aus der Zwischenablage auch in das bash-Terminal eingefügt.</p>
<p>Anschließend erscheint ein ganz langer Code, der als Token für den Zugriff auf InfluxDB aus Node-Red und Grafana verwendet wird.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/influx-token.jpg"><img decoding="async" class="alignnone wp-image-1851 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/influx-token-300x179.jpg" alt="" width="300" height="179" srcset="https://homeitems.de/wp-content/uploads/2022/08/influx-token-200x119.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influx-token-300x179.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influx-token-400x239.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influx-token-600x358.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influx-token-768x458.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influx-token-800x477.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influx-token.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
</div><div class="fusion-text fusion-text-20"><h2>MQTT-Nachrichten mit Node-Red auslesen und in influxDB speichern</h2>
<p>Unter Node-Red zieht man einen "MQTT in"-Node auf das Arbeitsblatt und klickt doppelt darauf.</p>
<p>Im anschließenden Fenster klickt man auf das Stiftsymbol neben "SERVER" und legt als erstes eine MQTT-Serververbindung an (heißt in Node-Red auch Konfiguration-Node, den man für alle anderen MQTT-Abrufe verwenden kann).</p>
<p>Hier habe ich nun folgende Daten eingestellt:</p>
<ul>
<li>Name: "Beliebiger Name für den MQTT Konfiguration-Node"</li>
<li>Server: "Meine MQTT-Server IP-Adresse"</li>
<li>Port: "Meinen MQTT-Server Port"</li>
<li>Protokoll: "MQTT V3.1 legacy"</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered.jpg"><img decoding="async" class="alignnone wp-image-1855 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-300x185.jpg" alt="" width="300" height="185" srcset="https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-200x123.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-300x185.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-400x246.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-600x370.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-768x473.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered-800x493.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/MQTT-Server-nodered.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Sobald die Daten für den Server erfasst wurden, muss nur noch der "mqtt in"-Node richtig konfiguriert werden. Hier habe ich den Default Parameter bei Ausgang auf "Ein analysiertes (parsed) JSON Objekt" geändert.</p>
<p>Nun wird noch das richtige Topic angegeben, unter dem die Daten auf dem MQTT-Server gespeichert werden und dann kann man sich über einen Debug-Node das payload-Objekt mit den Daten zur Prüfung ausgeben lassen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings.jpg"><img decoding="async" class="alignnone wp-image-1857 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-300x260.jpg" alt="" width="300" height="260" srcset="https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-200x173.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-300x260.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-400x346.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-600x520.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-768x665.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings-800x693.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/mqtt-in-settings.jpg 979w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nun möchte ich aus dem erhaltenen payload-Objekt einen Sensorwert (in meinem Beispiel die verbrauchte Stromleistung) in InfluxDB speichern. Da ich einen Objekt mit vielen Werte vom MQTT-Server erhalte, muss ich vor der Weitergabe an InfluxDB den Wert herausfiltern, den ich haben möchte. Dazu verwende ich einen "function"-Node in dem ich per Script nur den Wert, den ich brauche im payload-Objekt speichere (Man findet die Info, wie der Wert genau heißt und wie die Hierarchie ist, im MQTT-Objekt, welches man sich über den Debug-Node ausgeben kann).</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/Function-Node.jpg"><img decoding="async" class="alignnone wp-image-1862 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/Function-Node-300x131.jpg" alt="" width="300" height="131" srcset="https://homeitems.de/wp-content/uploads/2022/08/Function-Node-200x88.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-300x131.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-400x175.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-600x263.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-768x336.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-800x350.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-1024x448.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-1200x525.jpg 1200w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node-1536x672.jpg 1536w, https://homeitems.de/wp-content/uploads/2022/08/Function-Node.jpg 1796w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Zur Speicherung dieses Werte ziehe ich nun einen "influxDB out"-Node auf das Arbeitsblatt und verbinde dieses mit dem "function"- Node. Nach einem Doppelklick auf den "influxDB out"-Node muss wie bei der Verbindung zu einem MQTT-Server als erstes eine Server-Verbindung zum InfluxDB-Server angelegt werden. Dazu klickt man hinter der SERVER-Zeile auf das Stiftsymbol.</p>
<p>Hier werden nun folgende Parameter angeben:</p>
<ul>
<li>Name: "Beliebiger Name für den InfluxDB Konfiguration-Node"</li>
<li>InfluxDB-Version: 2.0 (hiermit ermögliche ich das Speichern von Daten über Abonnements und Bucket).</li>
<li>URL: "Meine InfluxDB-Server IP-Adresse (entspricht der IP-Adresse des Docker Containers)"</li>
<li>Token "Das im vorigen Kapitel erzeugte InfluxDB Token"</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered.jpg"><img decoding="async" class="alignnone wp-image-1863 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-300x93.jpg" alt="" width="300" height="93" srcset="https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-200x62.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-300x93.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-400x125.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-600x187.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-768x239.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-800x249.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-1024x319.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-1200x374.jpg 1200w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-Server-nodered-1536x478.jpg 1536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nun brauche ich nur noch zu spezifizieren, unter welchem Namen die Daten in der InfluxDB gespeichert werden sollen. Folgende Parameter müssen angegeben werden:</p>
<ul>
<li>bucket: "Den Bucketnamen, der bei der Erstellung des InfluxDB-Containers vergeben wurde"</li>
<li>Organization: "Die Organization, die bei der Erstellung des InfluxDB-Containers vergeben wurde"</li>
<li>Measurement: "Den Feldnamen, unter dem in InfluxDB die Werte gespeichert werden sollen".</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings.jpg"><img decoding="async" class="alignnone wp-image-1861 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-300x246.jpg" alt="" width="300" height="246" srcset="https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-200x164.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-300x246.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-400x328.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-600x492.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-768x629.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings-800x656.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-out-settings.jpg 908w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Das wars. Nun sollten die Werte kontinuierlich in der InfluxDB gespeichert werden.</p>
</div><div class="fusion-text fusion-text-21"><h2>Daten mit Grafana visualisieren</h2>
<h3>Verbindung zu InfluxDB erstellen</h3>
<p>Nach dem Einloggen in Grafana wird als erstes eine Verbindung zu InfluxDB erstellt. Über den Menüpunkt "Configuration" wird über das Klicken auf "add data source" die dazu notwendige Konfigurationsseite geöffnet.</p>
<p>Wichtig ist, dass im anschließenden Fenster als Query Language "Flux" angegeben, wird. Nur dann können Daten über Organization und Bucket abgerufen werden. Flux funktioniert in Grafana mittlerweile sehr sicher und hat bei der Verarbeitung von Daten durchaus Vorteile. Zusätzlich werden folgende Parameter angebeben:</p>
<ul>
<li>Name: "Beliebiger Name für die Data Source"</li>
<li>URL: "Meine InfluxDB-Server IP-Adresse (hier die Adresse des Docker Containers)"</li>
<li>Organization: "Der bei der Einrichtung von InfluxDB angegebene Organization Name"</li>
<li>Default Bucket: "Der bei der Einrichtung von InfluxDB angegebene Bucket Name"</li>
<li>Token: "Das im obigen Kapitel für den Zugriff auf InfluxDB erzeugte Token"</li>
</ul>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana.jpg"><img decoding="async" class="alignnone wp-image-1868 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-171x300.jpg" alt="" width="171" height="300" srcset="https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-171x300.jpg 171w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-200x351.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-400x703.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-583x1024.jpg 583w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-600x1054.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-768x1349.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-800x1406.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana-874x1536.jpg 874w, https://homeitems.de/wp-content/uploads/2022/08/InfluxDB-Data-Source-Grafana.jpg 1053w" sizes="(max-width: 171px) 100vw, 171px" /></a></p>
<p>Nach Drücken auf "Save &amp; test" sollte Grafana das Funktionieren der Verbindung bestätigen.</p>
<h3>Dashboard mit Auswertung erstellen</h3>
<p>Nun kann ein Dashboard angelegt und dort ein Panel erzeugt werden. Hier muss nun der Flux-Code angegeben werden, um die Daten abzufragen.</p>
<p>Da Grafana noch keinen eigenen Query Builder für Flux mitbringt, empfehle ich folgende Lösung. Man loggt sich in die InfluxDB Oberfläche ein. Hier kann nun über den Menüpunkt "Data Explorer" sehr einfach mit dem Query-Builder von InfluxDB eine Abfrage von Daten (auch sehr komplexe Konstrukte) erzeugt werden. Nach Auswahl der Datenfelder, Filer und Funktioen generiert der Query-Builder bereits eine erste Grafik. Durch Klicken auf "Script Editor" kan man den Code für diese Abfrage einfach kopieren, in Grafana einfügen und dort weiterbearbeiten.</p>
<p>Ich habe nach kurzer Zeit festgestellt, wie einfach aber mächtig dieser Query Builder ist und wie Flux insgesamt funktioniert. Da Grafana deutlich besser visualisiert und umfangreiche Optionen für Anpassungen der Auswertungen besitzt ist, ist dies die einfachste Möglichkeit, schnell voran zu kommen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-scaled.jpg"><img decoding="async" class="alignnone wp-image-1869 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-300x163.jpg" alt="" width="300" height="163" srcset="https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-200x109.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-300x163.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-400x217.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-600x326.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-768x418.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-800x435.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-1024x557.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-1200x652.jpg 1200w, https://homeitems.de/wp-content/uploads/2022/08/Grafana-Beispiel-1536x835.jpg 1536w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
</div><div class="fusion-text fusion-text-22"><h1>Links</h1>
<p>Wer eine CCU mit Node-Red ansprechen möchte findet im folgenden Link erste Tipps:</p>
<div class="video-shortcode"><iframe title="NodeRed mit CCU3 verbinden" width="1170" height="658" src="https://www.youtube.com/embed/qLkt2p6mVdU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<p>Für die Installation und Nutzung von Grafana können die folgenden Links hilfreich sein:</p>
<p><a href="https://mariushosting.com/how-to-install-grafana-on-your-synology-nas/">https://mariushosting.com/how-to-install-grafana-on-your-synology-nas/</a></p>
<div class="video-shortcode"><iframe title="How to build a time-series graph in Grafana &#091;Grafana Tutorial for Beginners&#093;" width="1170" height="658" src="https://www.youtube.com/embed/uRgKwcL6lDQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<div class="video-shortcode"><iframe title="Verbrauchsdaten mit Grafana visualisieren | haus-automatisierung.com &#091;4K&#093;" width="1170" height="658" src="https://www.youtube.com/embed/BpLTo7ohqEU?start=729&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<div class="video-shortcode"><iframe title="Grafana Stromverbrauch über 7 Tage" width="1170" height="658" src="https://www.youtube.com/embed/OxvmerRIN5c?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<p>Bei der Installation von Node-Red können folgende Links unterstützen:</p>
<div class="video-shortcode"><iframe title="NodeRed 2.1 im Docker auf einem Synology NAS installieren" width="1170" height="658" src="https://www.youtube.com/embed/w9M4aj4PQc8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<div class="video-shortcode"><iframe title="Install Node-Red on Synology NAS in Docker | NodeRed" width="1170" height="658" src="https://www.youtube.com/embed/_2TTj_G9soU?start=192&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<p>Und für die Nutzung des Query Builders von InfluxDB ist folgender Link hilfreich:</p>
<div class="video-shortcode"><iframe title="How to Use the Flux Window and Aggregate Functions" width="1170" height="658" src="https://www.youtube.com/embed/JXdfN5s034w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
</div></div></div></div></div>
<p>Der 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> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-2-2/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>Mit Node-Red, InfluxDB und Grafana Daten auf einem Synology NAS sammeln und visualisieren (Teil 1/2)</title>
		<link>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-1-2/</link>
					<comments>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-1-2/#comments</comments>
		
		<dc:creator><![CDATA[Dieter]]></dc:creator>
		<pubDate>Mon, 08 Aug 2022 10:52:46 +0000</pubDate>
				<category><![CDATA[Grafana]]></category>
		<category><![CDATA[influxdb]]></category>
		<category><![CDATA[Node-Red]]></category>
		<guid isPermaLink="false">https://homeitems.de/?p=1810</guid>

					<description><![CDATA[<p>Wer Smarthome-Komponenten im Einsatz hat weiß, dass diese unglaublich viele Daten liefern können. Diese Daten sind auch im Heimbereich Gold Wert und sollten systematisch protokolliert werden. Aus den Daten ist dann z.B. herleitbar, wie sich z.B. Energiekosten wie Strom, Gas, Wasser senken lassen. Dazu müssen diese Daten möglichst aus verschiedenen Systemen gesammelt  [...]</p>
<p>Der Beitrag <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> 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;">Grafana</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>Wer Smarthome-Komponenten im Einsatz hat weiß, dass diese unglaublich viele Daten liefern können. Diese Daten sind auch im Heimbereich Gold Wert und sollten systematisch protokolliert werden. Aus den Daten ist dann z.B. herleitbar, wie sich z.B. Energiekosten wie Strom, Gas, Wasser senken lassen. Dazu müssen diese Daten möglichst aus verschiedenen Systemen gesammelt und so aufbereitet werden, dass man hieraus das Verhalten eines Systems sowie Verbesserungen ableiten kann.</p>
<h2>Aufgabenstellung</h2>
<p>Ich möchte ein möglichst einfaches System aus bewährten Software-Komponenten aufbauen, mit dem ich beliebige Inputdaten in eine Datenbank speichern und möglichst vielfältig auswerten kann. Da ich viele Homematic-IP Produkte einsetze und auch verschiedene Sensoren über MQTT kommunizieren lasse, soll das System mindestens diese Inputdaten verarbeiten können. Idealerweise soll der Installations- und Betriebsaufwand möglichst einfach und stabil sein.</p>
<h2>Lösungsansatz</h2>
<p>Für das Sammeln und Aufbereiten der Daten von verschiedenen Smarthome-Komponenten habe ich mich für <a href="https://nodered.org/">Node-Red</a> entschieden. Im Prinzip ist Node-Red eine visuelle Programmierumgebung, die die Kommunikation zwischen vielen IOT Devices ermöglicht. Daneben gibt es auch eine einfache grafische Oberfläche um die Bedienung und Visualisierung von IoT-Devices zu ermöglichen. Für die CCU gibt es bereits ein fertiges Paket <a href="https://www.homematic-inside.de/software/redmatic">Redmatic</a>, mit dem alle Komponenten auf einer CCU eingerichtet werden. Ich möchte allerdings auf der CCU keine zusätzliche Last haben, so dass ich die normale Node-Red Version woanders installiere und dort die notwendigen Pakete ergänzen möchte.</p>
<p>Da relative viele zeitabhängige Daten entstehen (sogenannte Zeitreihen) habe ich mich für ein System entschieden, welches hier eine platzsparende Speicherung sowie einen schnellen Zugriff ermöglicht, nämlich <a href="https://www.influxdata.com/">InfluxDB</a>. Dabei wähle ich die 2.x Version von InfluxDB und möchte die Scriptsprache FLUX benutzen (ihr werdet sehen, dass dies einfach ist). Mittlerweile bietet InfluxDB auch eine super Weboberfläche mit Dashboards, Data Exxplorer und Tasks an. Für einfache Aufgaben wird hier schon viel geboten.</p>
<p>Als Visualisierungstool gibt es für mich aber keine Alternative zu <a href="https://grafana.com/">Grafana</a>. Mit Grafana kann man beliebige System und Datenbanken anbinden und die grafischen Auswertungsmöglichkeiten lassen kaum Wünsche übrig. Dabei ist das Ganze sehr einfach über ein Webfrontend bedienbar.</p>
<p>Alle Systeme sind frei verfügbar und auf verschiedenen Zielsysteme z.B. auf einem Raspberry PI installierbar. Ich habe mich entschieden, die Systeme als Docker-Versionen jeweils in einer virtuellen Umgebung laufen zu lassen. Dazu nutze ich ein Synology NAS mit einer DSM 7.x Version. Diese Container kann ich recht einfach webbasiert einrichten und immer wieder auf einen neuen Stand bringen, ohne jeweils Daten hin- und her konvertieren zu müssen. Ich setze voraus, dass Docker bereits auf einer Synology DSM installiert ist.</p>
<p>Ich nehme vorweg, dass die Installation aller Pakete sehr einfach war und sich erste Erfolge schnell ergeben haben.</p>
<p>Folgende Links haben mir ebenfalls weitergeholfen:</p>
<p><a href="https://docs.influxdata.com/influxdb/v1.7/introduction/installation/">https://docs.influxdata.com/influxdb/v1.7/introduction/installation/</a></p>
<div class="video-shortcode"><iframe title="Node-Red Logging in InfluxDB 2 (Docker-Container auf Synology NAS)" width="1170" height="658" src="https://www.youtube.com/embed/NyUHmD-049s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<h2></h2>
<h2>InfluxDB Container installieren</h2>
<h3>Image herunterladen</h3>
<p>Im folgenden Kapitel beschreibe ich die Konfiguration eines Docker Containers über die Menüführung etwas ausführlicher. Für Node-Red und Grafana ist die Vorgehensweise die gleiche, nur das andere Daten verwendet werden, so dass ich diese Installationen im nächsten Beitrag etwas kompakter beschreiben werde. .</p>
<p>Unter Docker auf dem Synology DSM wir als erstes über den Menüpunkt "Registrierung" das Paket influxdb für die Installation gesucht.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/influx_regis.jpg"><img decoding="async" class="alignnone wp-image-1812 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/influx_regis-300x160.jpg" alt="" width="300" height="160" srcset="https://homeitems.de/wp-content/uploads/2022/08/influx_regis-200x106.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis-300x160.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis-400x213.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis-600x319.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis-768x409.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis-800x426.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influx_regis.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Um zu prüfen, ob es sich um das offiziele Docker-Paket von influxdata handelt kann man den Link hinter dem Namen anklicken. Dort sind dann auch sämtliche Installationsinformationen für sämtliche Zielsysteme vorhanden (siehe <a href="https://registry.hub.docker.com/_/influxdb/">Link</a>). Bei der Version empfehle ich immer "Latest" auszuwählen, so dass man das offiziell aktuellste Paket erhält.</p>
<h3>Container Parameter einstellen</h3>
<p>Nach dem Herunterladen gilt es, den Container mit den richtigen Parametern zu versehen.</p>
<p>Hierzu geht man auf den Menüpunkt "Image", markiert das neue Image und drückt "Starten".</p>
<p>Im folgenden Fenster empfehle ich als Netzwerk "bridge" zu wählen, da man so die Ports nach außen und im Docker Image frei wählen kann.</p>
<p>Im folgenden Fenster vergibt man einen freien Namen und aktiviert die Option "Automatischen Neustart aktivieren", da somit bei einem ungeplanten Herunterfahren der Conmtainer automatisch neu gestartet wird.</p>
<p>Unter "Erweiterte Einstellungen" werden nun die für InfluxDB notwendigen Daten eingegeben. Diese sind:</p>
</div>
<div class="table-1" style="--awb-margin-bottom:20px;">
<table style="height: 52px;" width="1144">
<thead>
<tr>
<th align="left">Variable</th>
<th align="left">Wert</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">DOCKER_INFLUXDB_INIT_USERNAME</td>
<td align="left">'beliebiger Name'</td>
</tr>
<tr>
<td align="left">DOCKER_INFLUXDB_INIT_PASSWORD</td>
<td align="left">'beliebiges Passwort'</td>
</tr>
<tr>
<td align="left">DOCKER_INFLUXDB_INIT_ORG</td>
<td align="left">'beliebiger Organisationsname'</td>
</tr>
<tr>
<td align="left">DOCKER_INFLUXDB_INIT_BUCKET</td>
<td align="left">'beliebiger Bucketname'</td>
</tr>
<tr>
<td align="left">DOCKER_INFLUXDB_INIT_MODE</td>
<td align="left">setup</td>
</tr>
<tr>
<td align="left">TZ</td>
<td align="left">Europe/Berlin</td>
</tr>
</tbody>
</table>
</div>
<div class="fusion-text fusion-text-24"><p>Ich habe hier die Timezone (Parameter TZ) manuell auf Europe/Berlin gesetzt, da ich festgestellt habe, dass die TimeZone nicht von Synology DSM 7.x Betriebssystem übernommen wurde und stattdessen eine UTC Zeit eingestellt war, die 2 Stunden zurückliegt.</p>
<p>Merkt Euch Username und Passwort, da diese später auch zum Anmelden erforderlich sind.</p>
<p>Nach dem Speichern drückt Ihr auf "Weiter".  Nun muss noch der Port 8086 für den Zugriff auf InfluxDB angegeben werden. Dies erfolgt auf beiden Seiten in der Tabelle  (ihr könnt auch eine eigene Portnummer setzen, wenn dieser belegt sein sollte). Wichtig ist, dass auf der linken Seitene nicht mehr "automatisch" steht, da  sonst influxdb von außen nicht mehr erreicht werden kann.</p>
<p><img decoding="async" class="alignnone size-medium wp-image-1815" src="https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-300x252.jpg" alt="" width="300" height="252" srcset="https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-200x168.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-300x252.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-400x336.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-600x505.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-768x646.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-800x673.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports-1024x861.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-ports.jpg 1082w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Nach dem Klicken auf "Weiter" werden nun die Mountpfade eingegeben. Wählt hier nun "Ordner hinzufügen" aus. Legt anschließend über den Button "Ordner erstellen" den Ordner "influxdb" unterhalb des Ordners "docker" an. Unterhalb von Docker legt Ihr ebenfalls über "Ordner hinzufügen" die beiden Ordner "config" und "data" an.</p>
<p>Wählt nun einzeln die beiden Ordner über "Ordner hinzufügen" aus und ordnet sie den folgenden Mount-Pfaden zu:</p>
</div><div class="fusion-text fusion-text-25 fusion-text-no-margin" style="--awb-margin-bottom:20px;"><div class="table-1">
<table width="100%">
<thead>
<tr>
<th align="left">Datei/Ordner</th>
<th align="left">Mount-Pfad</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">docker/influxdb/data</td>
<td align="left">/var/lib/influxdb2</td>
</tr>
<tr>
<td align="left">docker/influxdb/config</td>
<td align="left">/etc/influxdb2</td>
</tr>
</tbody>
</table>
</div>
</div><div class="fusion-text fusion-text-26"><p><a href="https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath.jpg"><img decoding="async" class="alignnone wp-image-1818 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-300x256.jpg" alt="" width="300" height="256" srcset="https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-200x171.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-300x256.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-400x341.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-600x512.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-768x655.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-800x683.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath-1024x874.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/infludb-Mountpath.jpg 1071w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Nach dem Drücken des Button "Weiter" werden alle Daten für den Container nochmal zusammengefasst. Durch Betätigen von "Fertig" wird der Container nun gestartet.</p>
<p>Sollte irgendetwas nicht funktionieren (weil man etwas vergessen oder falsch geschrieben hat) ist das kein Problem. Geht auf den Menüpunkt "Container", wählt den gerade erstellten Container aus und drückt im Menüpunkt "Aktion" auf "Stop". Der Container wird nun gestoppt und Ihr könnt über  den Menüpunkt "Bearbeiten" erneut die Einstellungen für den Container aufrufen.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen.jpg"><img decoding="async" class="alignnone wp-image-1813 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-300x241.jpg" alt="" width="300" height="241" srcset="https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-177x142.jpg 177w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-200x160.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-300x241.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-400x321.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-600x481.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-768x616.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-800x642.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen-1024x822.jpg 1024w, https://homeitems.de/wp-content/uploads/2022/08/docker-einstellungen.jpg 1159w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Unter dem Reiter Port-Einstellungen findet Ihr die Angaben zu den Ports, unter Volume-Einstellungen Angaben zu den Mount-Pfaden und unter dem Button "Erweiterte Einstellungen" die Angaben zu den Umgebungsvariabeln. Speichert anschließend die Änderungen und startet über "Aktion" und "Start" den Container neu.</p>
<h2>InfluxDB aufrufen</h2>
<p>Über die IP-Adresse des NAS (Docker Host) gefolgt von dem Port sollte nun InfluxDB erreichbar sein (z.B. 192.168.178.135:8086). Nach Eingabe des Benuternamens und des Passworts, die oben bei den Umgebungsvariabeln angelegt wurden kommt man auf die schicke und nützliche neue InfluxDB Oberfläche.</p>
<p><a href="https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen.jpg"><img decoding="async" class="alignnone wp-image-1828 size-medium" src="https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-300x158.jpg" alt="" width="300" height="158" srcset="https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-200x105.jpg 200w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-300x158.jpg 300w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-400x210.jpg 400w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-600x315.jpg 600w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-768x404.jpg 768w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen-800x420.jpg 800w, https://homeitems.de/wp-content/uploads/2022/08/influxdb-startscreen.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Im nächsten Teil werden Node-Red und Grafana installiert sowie Daten gesammelt und ausgewertet.</p>
</div></div></div></div></div>
<p>Der Beitrag <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> erschien zuerst auf <a href="https://homeitems.de">Smart home Ratgeber</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homeitems.de/mit-node-red-influxdb-und-grafana-daten-auf-einem-synology-nas-sammeln-und-visualisieren-teil-1-2/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
