<?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>Snippet &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/category/snippet/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Sun, 30 Apr 2017 09:48:22 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Feinstaub messen &#8211; Auswertungen und Graph</title>
		<link>https://www.bubuxblog.de/feinstaub-messen-auswertungen-und-graph/</link>
					<comments>https://www.bubuxblog.de/feinstaub-messen-auswertungen-und-graph/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 30 Apr 2017 09:46:09 +0000</pubDate>
				<category><![CDATA[Snippet]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1417</guid>

					<description><![CDATA[In dem ursprünglichen Artikel zum Thema Feinstaub ist die Auswertung der aufgezeichneten Daten etwa zu kurz gekommen. Daher hier ein paar Infos wie die Auswertungen und der Graph bei folgendem Screenshot zustande gekommen sind: Tabellenstruktur Die Tabellenstruktur zur Speicherung der Werte in der Datenbank ist wie immer einfach gehalten. Hier das Create-Table-Script: [cc lang=&#8220;sql&#8220; escaped=&#8220;true&#8220;] [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In dem ursprünglichen Artikel zum <a href="http://blog.bubux.de/feinstaub-messen-nodemcu-und-sds011/">Thema Feinstaub</a> ist die Auswertung der aufgezeichneten Daten etwa zu kurz gekommen. Daher hier ein paar Infos wie die Auswertungen und der Graph bei folgendem Screenshot zustande gekommen sind:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2017/02/feinstaub_webseite.png"><img fetchpriority="high" decoding="async" src="http://blog.bubux.de/wp-content/uploads/2017/02/feinstaub_webseite-1024x497.png" alt="" width="768" height="373" class="alignnone size-large wp-image-1336" srcset="https://www.bubuxblog.de/wp-content/uploads/2017/02/feinstaub_webseite-1024x497.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2017/02/feinstaub_webseite-300x145.png 300w, https://www.bubuxblog.de/wp-content/uploads/2017/02/feinstaub_webseite-768x372.png 768w" sizes="(max-width: 768px) 100vw, 768px" /></a><br />
<span id="more-1417"></span></p>
<h2>Tabellenstruktur</h2>
<p>Die Tabellenstruktur zur Speicherung der Werte in der Datenbank ist wie immer einfach gehalten. Hier das Create-Table-Script:</p>
<p>[cc lang=&#8220;sql&#8220; escaped=&#8220;true&#8220;]<br />
CREATE TABLE &#8218;feinstaub&#8216; (<br />
  &#8218;timestamp&#8216; datetime NOT NULL,<br />
  &#8218;ppm25&#8216; float NOT NULL,<br />
  &#8218;ppm10&#8216; float NOT NULL<br />
)<br />
[/cc]</p>
<h2>Auswertung</h2>
<p>Die folgenden SQL-Querys sind Beispiele zur Abfrage von MySQL-Datenbanken.</p>
<p>Die aktuell gespeicherten Sensorwerte werden wie folgt ausgelesen:<br />
[cc lang=&#8220;sql&#8220; escaped=&#8220;true&#8220;]<br />
SELECT DATE_FORMAT(timestamp, &#8218;%d.%m.%Y %H:%i:%s&#8216;),ppm25,ppm10 FROM feinstaub ORDER BY timestamp DESC LIMIT 1<br />
[/cc]</p>
<p>Die Werte für das Jahresmittel selektieren:<br />
[cc lang=&#8220;sql&#8220; escaped=&#8220;true&#8220;]<br />
SELECT avg(ppm25),avg(ppm10) FROM feinstaub WHERE YEAR(timestamp) = YEAR( CURDATE())<br />
[/cc]</p>
<p>Die Werte für das Tagesmittel selektieren:<br />
[cc lang=&#8220;sql&#8220; escaped=&#8220;true&#8220;]<br />
SELECT avg(ppm25),avg(ppm10) FROM feinstaub WHERE DATE(timestamp) = CURDATE()<br />
[/cc]</p>
<h2>Graph</h2>
<p>Hier ein PHP-Code-Beispiel für das Zeichnen des Graphen mit dem Verlauf beider Feinstaubwerte der letzten 96 Stunden. Dazu nutze ich, wie meistens, pChart <a href="http://www.pchart.net/" target="_blank">http://www.pchart.net/</a>). Die Datenbankabfrage ist noch mit dem inzwischen in PHP 5.7 veralteten Funktion <em>mysql_connect</em> realisiert. Das sollte auf <a href="https://secure.php.net/manual/de/function.mysql-connect.php" target="_blank">mysqli_connect</a> umgestellt werden (ich habe dafür bei meiner Anwendung aber aktuell keine Muse zu&#8230;):</p>
<pre class="lang:default decode:true " >&lt;?
include("../class/pData.class.php");
include("../class/pDraw.class.php");
include("../class/pImage.class.php");

$connection=mysql_connect("<host>","<benutzer>","<passwort>") or die ("Verbindungsversuch fehlgeschlagen");
$mysqldb="<db>";
mysql_select_db($mysqldb,$connection) or die("Konnte die Datenbank nicht waehlen.");
$sql = "SELECT ppm25,ppm10, hour(timestamp) FROM feinstaub WHERE DATE_ADD(timestamp, INTERVAL 96 HOUR) &gt;= NOW()";
$query = mysql_query($sql) or die("Anfrage 1 nicht erfolgreich");
while ($wert = mysql_fetch_array($query)) {
	$pm25[]=$wert[0];
	$pm10[]=$wert[1];
	if ($zeit_tmp==$wert[2]) {
		$zeit_tmp=NULL;
	} else {
		$zeit_tmp=$wert[2];
	}
	$zeit[]=$zeit_tmp;
}

//Graph für Feinstaubwerte
$MyData = new pData();
$MyData-&gt;addPoints($pm25,"PM2,5");
$MyData-&gt;addPoints($pm10,"PM10");
$MyData-&gt;setAxisName(0,"Feinstaub &amp;micro;m/m&amp;sup3;");
$MyData-&gt;addPoints($zeit,"Labels");
$serieSettings = array("R"=&gt;229,"G"=&gt;11,"B"=&gt;11,"Alpha"=&gt;100);
$MyData-&gt;setPalette("PM2,5",$serieSettings);
$serieSettings = array("R"=&gt;129,"G"=&gt;111,"B"=&gt;211,"Alpha"=&gt;100);
$MyData-&gt;setPalette("PM10",$serieSettings);
$MyData-&gt;setSerieDescription("Labels","Uhrzeit");
$MyData-&gt;setAbscissa("Labels");
$myPicture = new pImage(1025,380,$MyData);
$myPicture-&gt;Antialias = TRUE;
$myPicture-&gt;setFontProperties(array("FontName"=&gt;"../heizung/fonts/verdana.ttf","FontSize"=&gt;10));
$myPicture-&gt;setGraphArea(50,30,1010,355);
$labelSkip = round(count($zeit)/48);
$scaleSettings = array("XMargin"=&gt;10,"YMargin"=&gt;10,"Floating"=&gt;TRUE,"GridR"=&gt;200,"GridG"=&gt;200,"GridB"=&gt;200,"DrawSubTicks"=&gt;FALSE,"CycleBackground"=&gt;TRUE,"LabelSkip"=&gt;$labelSkip);
$myPicture-&gt;drawScale($scaleSettings);
$myPicture-&gt;Antialias = FALSE;
$myPicture-&gt;setShadow(TRUE,array("X"=&gt;1,"Y"=&gt;1,"R"=&gt;0,"G"=&gt;0,"B"=&gt;0,"Alpha"=&gt;10));
$myPicture-&gt;drawSplineChart();
$BoundsSettings = array("MaxDisplayR"=&gt;237,"MaxDisplayG"=&gt;23,"MaxDisplayB"=&gt;48, "MinDisplayR"=&gt;23,"MinDisplayG"=&gt;144,"MinDisplayB"=&gt;237);
$myPicture-&gt;writeBounds(BOUND_BOTH,$BoundsSettings);
$myPicture-&gt;drawLegend(650,20,array("Style"=&gt;LEGEND_NOBORDER,"Mode"=&gt;LEGEND_HORIZONTAL));
$Settings = array("R"=&gt;229,"G"=&gt;11,"B"=&gt;11,"Align"=&gt;TEXT_ALIGN_BOTTOMLEFT);
$myPicture-&gt;drawText(800,35,"Max : ".ceil($MyData-&gt;getMax("PM2,5")),$Settings);
$myPicture-&gt;drawText(880,35,"Min : ".ceil($MyData-&gt;getMin("PM2,5")),$Settings);
$myPicture-&gt;drawText(940,38,"Avg : ".ceil($MyData-&gt;getSerieAverage("PM2,5")),$Settings);
$Settings = array("R"=&gt;129,"G"=&gt;111,"B"=&gt;211,"Align"=&gt;TEXT_ALIGN_BOTTOMLEFT);
$myPicture-&gt;drawText(800,20,"Max : ".ceil($MyData-&gt;getMax("PM10")),$Settings);
$myPicture-&gt;drawText(880,20,"Min : ".ceil($MyData-&gt;getMin("PM10")),$Settings);
$myPicture-&gt;drawText(940,23,"Avg : ".ceil($MyData-&gt;getSerieAverage("PM10")),$Settings);
$myPicture-&gt;Render("feinstaub.png");
?&gt;</pre>
<p>Viel Spaß beim Auswerten der Daten!</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/feinstaub-messen-auswertungen-und-graph/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Amazon Kindle als Statusdisplay &#8211; Update</title>
		<link>https://www.bubuxblog.de/amazon-kindle-als-statusdisplay-update/</link>
					<comments>https://www.bubuxblog.de/amazon-kindle-als-statusdisplay-update/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Fri, 25 Mar 2016 18:37:36 +0000</pubDate>
				<category><![CDATA[Eigenbau]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Snippet]]></category>
		<category><![CDATA[FHEM]]></category>
		<category><![CDATA[Infodisplay]]></category>
		<category><![CDATA[Kindle]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<category><![CDATA[Statusdisplay]]></category>
		<category><![CDATA[Wetteranzeige]]></category>
		<category><![CDATA[Wetterdisplay]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1164</guid>

					<description><![CDATA[Nachdem das Statusdisplay für Wetter- und Temperaturdaten sowie weitere Informationen auf dem Kindle nun ein paar Tage in Betrieb ist und soweit gut funktioniert, habe ich noch ein paar Veränderungen vorgenommen. Grundlage dafür sind die Arbeiten aus dem vorherigen Artikel. Anpassungen am Kindle als Statusdisplay WLAN aktivieren/deaktivieren Um die Laufzeit der Batterie des Kindle zu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nachdem das Statusdisplay für Wetter- und Temperaturdaten sowie weitere Informationen auf dem Kindle nun ein paar Tage in Betrieb ist und soweit gut funktioniert, habe ich noch ein paar Veränderungen vorgenommen. Grundlage dafür sind die Arbeiten aus dem <a href="http://blog.bubux.de/kindle-status-display/">vorherigen Artikel</a>.</p>
<h1>Anpassungen am Kindle als Statusdisplay</h1>
<h3>WLAN aktivieren/deaktivieren</h3>
<p>Um die Laufzeit der Batterie des Kindle zu verlängern, schalte ich das WLAN in dem Script <em>zeige_daten.sh</em> zum holen des Statusbild am Beginn des Scriptes ein und am Ende wieder aus. Nachteil an der Sache ist, das man sich per SSH nicht mehr mit dem Kindle verbinden kann, da das Kindle UI-Framework beim Booten mit dem Aufruf des Scriptes <em>init_daten.sh</em> deaktiviert wird und der Kindle nicht mehr auf irgendwelche Tastendrücke reagiert. D.h der automatische Aufruf dieses Scriptes beim Booten muss wieder deaktiviert werden (Stichwort &#8222;Kite -&gt; onboot&#8220;). Nach einem Reboot des Kindle (~40 Sek. auf den Knopf an der Unterseite drücken) kann man dann wieder per SSH über WLAN zugreifen. Dann besteht die Verbindung solange der Cron nicht das Script <em>zeige_daten.sh</em> aufruft. Bei längeren Arbeiten muss daher der Cron auskommentiert, oder <em>ifdown wlan0</em> im Script <em>zeige_daten.sh</em> auskommentiert werden. Das Script <em>init_daten.sh</em> rufe ich dann manuell auf bevor ich die SSH-Sitzung beende.</p>
<p>Hier mein aktuelles <em>zeige_daten.sh</em> Script. Die Änderungen gegenüber der vorherigen Version sind in Zeile 3, 4 und 18 zu finden:</p>
<pre class="">#!/bin/sh

ifup wlan0
sleep 30

cd "$(dirname "$0")"

rm daten_output.png
eips -c
eips -c

if wget http://raspberry/kindle/daten_output.png; then
    eips -g daten_output.png
else
    eips -g daten_error.png
fi

ifdown wlan0</pre>
<p>&nbsp;</p>
<h3>Uhrzeit stellen</h3>
<p>Da der Kindle bei mir nicht am Internet hängt und auch kein Amazon-Konto konfiguriert ist, wurde die Uhrzeit nicht synchronisiert bzw. lief immer aus dem Ruder. Daher erstmal Uhrzeit kontrollieren und ggf. manuell einstellen:</p>
<pre class="">date</pre>
<pre class="">date MMDDHHMMYYYY
date 250317572016</pre>
<p>Anschliessend die neue Uhrzeit/Datum in die Hardware-Uhr schreiben:</p>
<pre class="">hwclock -w</pre>
<p>Dann noch in folgender Datei anstelle des NTP-Servers von Amazon den von meiner <a href="http://avm.de/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/336_Zeitsynchronisation-NTP-fuer-FRITZ-Box-und-Netzwerkgeraete-einrichten/" target="_blank">Fritzbox</a> (in der Regel <em>fritz.box</em>) eintragen:</p>
<pre class="">vi /etc/sysconfig/ntp</pre>
<p>&nbsp;</p>
<h3>Batterieanzeige des Kindle</h3>
<p>Während der Anzeige des Statusbild gibt es keine Möglichkeit mehr den Ladezustand der Batterie des Kindle zu sehen. Mittels SSH kann man den Ladezustand der Batterie (in %) mit dem Befehl:</p>
<pre class="">gasgauge-info -s</pre>
<p>abfragen. (Dieser Befehl kann übrigens noch verschiedene anderer Werte der Batterie des Kindle abfragen).</p>
<p>Um diese Information auch im Statusbild verfügbar zu machen, nutze ich das Tool <em>eips</em> welches im Kindle zum Löschen des Bildschirmes, dem Schreiben von Zeichen, dem Scrollen der Anzeige und der Anzeige von PNG-Bildern genutzt werden kann. Also einfach ein kleines Shell-Script mit folgendem Inhalt erstellt und per Cron (<em>vi /etc/crontab/root</em>) alle 5 Minuten ausgeführt.</p>
<pre class="">#!/bin/sh
gasgauge-info -s | xargs /usr/sbin/eips 47 39 > /dev/null;</pre>
<p>Der Ladezustand des Kindle-Akkus wird dann in der rechten unteren Ecke angezeigt. Beim aktualisieren des Statusbild wird die Information erstmal wieder überschrieben, dann nach 5 Minuten durch Starten des obigen Scriptes durch den Cron jedoch wieder angezeigt.</p>
<p>Mit <em>eips</em> kann das %-Zeichen der Ausgabe nicht geschrieben werden. Es erscheint eine entsprechende Fehlermeldung. Diese wird nach <em>/dev/null</em> geleitet. 47 und 39 sind die Zeilen- und Spaltennummer zur Ausgabe des Textes.</p>
<p>Im Ergebnis schaut es dann mit 42% Akkustand wie im folgendemn Bild aus. Das mit der <a href="https://de.wikipedia.org/wiki/42_%28Antwort%29" target="_blank">42</a> war Zufall <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_batteriestand.jpg" rel="attachment wp-att-1173"><img decoding="async" class="alignnone wp-image-1173 size-medium" src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_batteriestand-e1458926069954-300x258.jpg" alt="kindle_batteriestand" width="300" height="258" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batteriestand-e1458926069954-300x258.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batteriestand-e1458926069954-768x660.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batteriestand-e1458926069954-1024x881.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batteriestand-e1458926069954.jpg 1620w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h1>Anpassungen an der Serverkomponente</h1>
<p>Neben den Änderungen am Kindle habe ich auch noch einige Anpassungen des Python-Scriptes bzgl. der Anzeige weiterer Daten vorgenommen. Dazu habe ich auch ein paar zusätzliche SVG erstellt. Im Python-Script werden auf Basis verschiedene IF-Abfragen unterschiedliche SVG-Templates geladen. Das aktualisierte Python-Script ist am Ende des Artikels zu finden.</p>
<h3>Batterieanzeige der Fensterkontakte</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_batterie.jpg" rel="attachment wp-att-1169"><img decoding="async" class="wp-image-1169 size-medium alignleft" src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_batterie-225x300.jpg" alt="kindle_batterie" width="225" height="300" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batterie-225x300.jpg 225w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batterie-768x1024.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_batterie.jpg 1944w" sizes="(max-width: 225px) 100vw, 225px" /></a> Der Batteriezustand der <a href="http://blog.bubux.de/raspberry-pi-heimautomatisierung-mit-coc-und-fhem/" target="_blank">Homematic-Fensterkontakte</a> kann über FHEM abgefragt werden.</p>
<p>Zum Thema Batteriestatus von Homematic-Geräten gibt es übrigens auch einen netten Artikel in <a href="http://www.meintechblog.de/2015/08/fhem-rechtzeitige-benachrichtigung-bei-leeren-batterien/#more-9307" target="_blank">meintechblog.de</a>.</p>
<p>Jedenfalls werden im Python-Script die Statis der Batterien aller Homematic-Fensterkontakte abgefragt. Alle Namen der Fensterkontakte die den Status &#8222;low&#8220; melden, werden aneinandergereiht in eine Variable geschrieben. Ist diese Variable ungleich &#8222;leer&#8220;, wird anstelle des Statusbild mit den Temperaturen etc. ein entsprechender Hinweis mit der Liste aller Batterie-schwächelnder Fensterkontakte angezeigt. Und das so lange, bis die Batterien gewechselt wurden. Im linken Bild ist der Hinweis über zwei leere Batterien zu sehen. Für diese Anzeige gibt es ein eigenes <a href="http://blog.bubux.de/wp-content/uploads/2016/03/batterie_preprocess.svg" rel="">SVG</a>.</p>
<h3>Temperatur Warmwasserspeicher</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_puffertemp.jpg" rel="attachment wp-att-1165"><img loading="lazy" decoding="async" class="wp-image-1165 size-medium alignleft" src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_puffertemp-225x300.jpg" alt="kindle_puffertemp" width="225" height="300" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_puffertemp-225x300.jpg 225w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_puffertemp-768x1024.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_puffertemp.jpg 1944w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a>Die Anzeige des Luftdruckes und der Windgeschwindigkeit ist nett, für mich aber nicht wirklich informativ. Wie schon im <a href="http://blog.bubux.de/kindle-status-display/" target="_blank">vorherigen Artikel</a> angedeutet ist die Temperatur des Warmwasserspeicher wesentlich hilfreicher. Diese Daten <a href="http://blog.bubux.de/viessmann-heizung-auslesen/" target="_blank">lese ich schon seit längerem aus</a> und schreibe sie in eine Snapshot-Tabelle. Übersteigt die untere Temperatur im Pufferspeicher die Marke von 28°C, wird anstelle des Luftdruck/Wind die oberer und untere Temperatur des Warmwasserspeicher angezeigt.<br />
In der Praxis sehe ich so morgens den Luftdruck und nach Anfeuern des Kamins oder Aufheizen der Solarpanel irgendwann die Puffertemperatur. Auch für diese Anzeige gibt es ein eigenes <a href="http://blog.bubux.de/wp-content/uploads/2016/03/daten_script_preprocess_lfw.svg" target="_blank" rel="">SVG</a>.</p>
<p>&nbsp;</p>
<h3>Status der Heizung</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_heizung.jpg" rel="attachment wp-att-1170"><img loading="lazy" decoding="async" class="wp-image-1170 size-medium alignleft" src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_heizung-225x300.jpg" alt="kindle_heizung" width="225" height="300" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_heizung-225x300.jpg 225w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_heizung-768x1024.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_heizung.jpg 1944w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a>Zum guten Schluss noch eine weiteres <a href="http://blog.bubux.de/wp-content/uploads/2016/03/fehler_preprocess.svg" target="_blank" rel="">SVG</a> welches zur Anzeige kommt, sobald die Viessmann-Gastherme einen anderen Status als &#8222;<em>kein Fehler</em>&#8220; meldet. Dies kann neben echten Fehlern in der Anlage z.B. auch eine anstehende Wartung sein. Auch diese Anzeige wird solange angezeigt bis der Status der Heizung wieder OK ist.<br />
Während ich das hier schreibe kommt mir gerade der Gedanke, das die Anzeige der Wartung ggf. relativ lange angezeigt wird da der Heizungsbauer die nächsten 5 Monate keinen Termin frei hat. Hier muss noch ein Reset-Mechanismus her&#8230;</p>
<p>Da ich keinen echten Fehler der Heizung als Beispiel für das Bild provozieren konnte, habe ich im Python-Script die Abfragen nach &#8222;kein Fehler&#8220; testweise so verändert, das die Gut-Meldung der Heizung angezeigt wird. Diese ist auch im Bild zu sehen.<br />
&nbsp;</p>
<h3>Abgeändertes Python-Script</h3>
<p>Hier noch das versprochene Python-Script in der neuen Version. Neben den oben besprochenen Punkten habe ich das Auslesen der Fensterkontakte (für &#8222;Offen/Geschlossen&#8220;- und den Batteriestatus) noch in eine While-Schleife gepackt die über eine Liste aller Fensterkontakte läuft. Diese Copy&#038;Paste-Faulheit wie beim ersten Anlauf rächt sich irgendwann immer&#8230;</p>
<pre class="lang:python theme:twilight">
#!/usr/bin/python2
# -*- coding: utf-8 -*-

import codecs
import telnetlib
import MySQLdb
from datetime import datetime, time


################
# Hole FHEM data
################
tnet_host= "localhost"
tnet_port= 7072
def fhem_task(fcmd):
    tc= telnetlib.Telnet(tnet_host,tnet_port)
    tc.write(fcmd)
    erg= tc.read_until( "\n" )
    tc.close()
    return erg

# Abwesenheit pruefen
if "off" in fhem_task("list ABWESENHEIT STATE\r\n"):
    abwesenheit="nicht gesetzt"
if "on" in fhem_task("list ABWESENHEIT STATE\r\n"):
    abwesenheit="gesetzt"

# Liste Fensterkontakte
listFensterkontakte = ['FensterHeizung', 'FensterKeller', 'FensterGaestezimmer1', 'FensterGaestezimmer2', 'FensterBuero1', 'FensterBuero2', 'FensterWohnen1', 'FensterWohnen2', 'FensterWohnen3', 'FensterWohnen4', 'FensterGaestebad', 'FensterSpind', 'FensterBad1']

# Fensterkontakte
anz_fenster_offen=0;
for Fensterkontakt in listFensterkontakte:
    if "open" in fhem_task("get "+ Fensterkontakt +" param STATE\r\n"):
        anz_fenster_offen += 1

# Garagenkontakt
if "open" in fhem_task("get Garagentor param STATE\r\n"):
    stat_garage="offen"
else:
    stat_garage="geschlossen"

# Batteriestatus Fensterkontakte
kontakt_batterie_low=""
for Fensterkontakt in listFensterkontakte:
    if "low" in fhem_task("get "+ Fensterkontakt +" param battery\r\n"):
        kontakt_batterie_low += Fensterkontakt + ", "

# Wetter
try:
    condition=str.split(fhem_task("get MeinWetter condition\r\n"))
    if len(condition)==5:
        wetter_icon=condition[3] + " " + condition[4]
    else:
        wetter_icon=condition[3]
except:
    wetter_icon="Fehler"

luftdruck=str.split(fhem_task("get MeinWetter pressure\r\n"))
tendenz=str.split(fhem_task("get MeinWetter pressure_trend_txt\r\n"))
wind=str.split(fhem_task("get MeinWetter wind_speed\r\n"))

######################
# Datenbanken auslesen
######################
db = MySQLdb.connect(host="localhost", user="<benutzer>", passwd="<passwort>", db="<dbname>")
cur = db.cursor()
cur.execute("SELECT MIN(aussentemperatur), MAX(aussentemperatur) FROM temperaturen WHERE timestamp >= DATE(NOW()) ORDER BY timestamp")
for row in cur.fetchall():
    mintemp=round(row[0],2)
    maxtemp=round(row[1],2)

cur = db.cursor()
cur.execute("SELECT warmwasser, speicher_unten, error0 FROM snapshot")
for row in cur.fetchall():
    speicher_oben=round(row[0],2)
    speicher_unten=round(row[1],2)
    fehlerspeicher=row[2].replace(" ","\r",2)

db.close()


################
# Preprocess SVG
################
now = datetime.now()
now_time = now.time()
if time(5,50) <= now.time() <= time(22,50):
    # Wenn eine der Batterien der Fensterkontakte leer ist
    if kontakt_batterie_low!="":
        output = codecs.open('batterie_preprocess.svg', 'r', encoding='utf-8').read()
    # Wenn die Heizung einen Fehler anzeigt
    elif 'kein Fehler' not in fehlerspeicher:
        output = codecs.open('fehler_preprocess.svg', 'r', encoding='utf-8').read()
    # ansonsten abhaengig von speicher_unten ein SVG mit Luftdruck und Wind anzeigen. Ansonsten Puffertemperaturen
    elif speicher_unten<=28:
        output = codecs.open('daten_script_preprocess_lfw.svg', 'r', encoding='utf-8').read()
    else:
        output = codecs.open('daten_script_preprocess.svg', 'r', encoding='utf-8').read()
        
    # Platzhalter mit Daten ersetzen
    output = output.replace('ICON_ONE',wetter_icon.decode("utf-8"))
    output = output.replace('WETTER_BESCHR',wetter_icon.decode("utf-8"))
    output = output.replace('TEMP_A',fhem_task("get Aussenthermometer param temperature\r\n"))
    output = output.replace('LUFT_A',fhem_task("get Aussenthermometer param humidity\r\n"))
    output = output.replace('MIN_TEMP',str(mintemp))
    output = output.replace('MAX_TEMP',str(maxtemp))
    output = output.replace('PS_O',str(speicher_oben))
    output = output.replace('PS_U',str(speicher_unten))
    output = output.replace('DRUCK_A',luftdruck[3])
    output = output.replace('TENDENZ',tendenz[3])
    output = output.replace('WIND_A',wind[3])
    output = output.replace('ANZ_FENSTER',str(anz_fenster_offen))
    output = output.replace('STAT_ABWESENHEIT',abwesenheit)
    output = output.replace('STAT_GARAGE',stat_garage)
    output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S'))
    output = output.replace('FEHLERSPEICHER',fehlerspeicher)
    output = output.replace('BATTERIE',kontakt_batterie_low.replace(", ","\r"))
    # neues SVG schreiben
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
else:
    # Platzhalter mit Daten ersetzen
    output = codecs.open('sleep_preprocess.svg', 'r', encoding='utf-8').read()
    output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S'))
    # neues SVG schreiben
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
</pre>
<p>Viel Spaß mit den neuen Ideen, SVGs und dem Script. Falls ihr noch weitere Ideen habt den Kindle als Statusdisplay zu nutzen, lasst es mich wissen.</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/amazon-kindle-als-statusdisplay-update/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Gaszähler auslesen &#8211; Darstellung der Daten</title>
		<link>https://www.bubuxblog.de/gaszaehler/</link>
					<comments>https://www.bubuxblog.de/gaszaehler/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Tue, 19 Jan 2016 20:46:35 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Snippet]]></category>
		<category><![CDATA[Gaszähler]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1035</guid>

					<description><![CDATA[Jedes Jahr im Januar ist es wieder soweit &#8211; die Daten des Gaszähler müssen an den Lieferanten übermittelt werden. Dabei ist mir aufgefallen, das meine Darstellung der Daten aus der MySQL-Datenbank noch verbesserungswürdig sind. So hatte ich z.B. nur den Verbrauch der letzten 7 Tage wie im Artikel http://blog.bubux.de/gaszaehler-auslesen/ beschrieben ausgewertet. Da fehlt doch noch [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Jedes Jahr im Januar ist es wieder soweit &#8211; die Daten des Gaszähler müssen an den Lieferanten übermittelt werden. Dabei ist mir aufgefallen, das meine Darstellung der Daten aus der MySQL-Datenbank noch verbesserungswürdig sind. So hatte ich z.B. nur den Verbrauch der letzten 7 Tage wie im Artikel <a href="http://blog.bubux.de/gaszaehler-auslesen/" target="_blank">http://blog.bubux.de/gaszaehler-auslesen/</a> beschrieben ausgewertet. Da fehlt doch noch eine monatliche und jährliche Übersicht!</p>
<p>Nochmal zur Erinnerung: Ich speichere jede gezählte Umdrehung des Gaszählers als separate Zeile in einer MySQL-Datenbank.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/gaszaehler_mysql.png" rel="attachment wp-att-1042"><img loading="lazy" decoding="async" class="alignnone wp-image-1042 size-full" src="http://blog.bubux.de/wp-content/uploads/2016/01/gaszaehler_mysql.png" alt="Gaszaehler mySQL Datenbank" width="625" height="161" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_mysql.png 625w, https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_mysql-300x77.png 300w" sizes="auto, (max-width: 625px) 100vw, 625px" /></a></p>
<p>Daher müssen die einzelnen Zeilen nach den jeweiligen Kriterien gruppiert und dann das Ergebnis der Spalte &#8222;zaehlerstand&#8220; summiert werden. Beim <a href="http://blog.bubux.de/raspberry-pi-ehz-auslesen/" target="_blank">Stromzähler </a> wird hingegen immer der aktuelle Gesamtverbrauch in die Datenbank geschrieben und aus den Datenbankeinträgen für die Tages-, Monats- und Jahresverbräuche die Differenz gebildet um entsprechende Auswertungen zu erzeugen.</p>
<h3>Auswertung der letzten 12 Monate</h3>
<p>Folgendes SQL-Statement ermittelt aus den einzelnen Datenbankeinträgen die Summe gruppiert nach Jahr und Monat. Dabei werden die letzten 12 Monate mittels &#8222;INTERVAL&#8220; betrachtet.</p>
<pre class="">SELECT
     CASE DATE_FORMAT(timestamp,'%m')
          WHEN 1 THEN 'Jan'
          WHEN 2 THEN 'Feb'
          WHEN 3 THEN 'Mär'
          WHEN 4 THEN 'Apr'
          WHEN 5 THEN 'Mai'
          WHEN 6 THEN 'Jun'
          WHEN 7 THEN 'Jul'
          WHEN 8 THEN 'Aug'
          WHEN 9 THEN 'Sep'
          WHEN 10 THEN 'Okt'
          WHEN 11 THEN 'Nov'
          WHEN 12 THEN 'Dez'
     ELSE 'fehler' END as Monat,
     year(timestamp), sum(zaehlerstand)
FROM gaszaehler WHERE year(timestamp) >= YEAR(CURRENT_DATE - INTERVAL 12 MONTH) AND  month(timestamp) >= month(CURRENT_DATE - INTERVAL 12 MONTH)
GROUP BY month(timestamp), year(timestamp) ORDER BY timestamp;
</pre>
<h3>Auswertung der Jahresverbräuche</h3>
<p>Fehlt noch der jährliche Verbrauch. Das SQL-Statement ist einfacher aufgebaut als vorheriges und summiert den Verbrauch pro Jahr für alle in der Datenbank enthaltenen Daten an.</p>
<pre class="">SELECT 
     year(timestamp), sum(zaehlerstand) 
FROM gaszaehler
GROUP BY year(timestamp) ORDER BY timestamp;
</pre>
<p>Im Ergebnis sieht das Ganze dann wie folgt aus. Die Grafik zur Anzeige der Daten der letzten 12 Monate erstelle ich wie in <a href="http://blog.bubux.de/viessmann-heizung-auslesen/" target="_blank">diesem Artikel</a> beschrieben</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/gaszaehler_uebersicht.png" rel="attachment wp-att-1036"><img loading="lazy" decoding="async" class="alignnone wp-image-1036 size-large" src="http://blog.bubux.de/wp-content/uploads/2016/01/gaszaehler_uebersicht-1024x661.png" alt="Gaszaehler Uebersicht" width="768" height="496" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_uebersicht-1024x661.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_uebersicht-300x194.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_uebersicht-768x495.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/01/gaszaehler_uebersicht.png 1217w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Viel Spaß bei der Kontrolle des Gasverbrauchs <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Gruß</p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/gaszaehler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Snippet &#8211; Daten vom internen Netz zum Strato Webspace</title>
		<link>https://www.bubuxblog.de/snippet-daten-vom-internen-netz-zum-strato-webspace/</link>
					<comments>https://www.bubuxblog.de/snippet-daten-vom-internen-netz-zum-strato-webspace/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Thu, 06 Aug 2015 14:01:18 +0000</pubDate>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Snippet]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=947</guid>

					<description><![CDATA[Nach langer Zeit Stillstand im Blog nochmal ein kleines Snippet. Problemstellung war, Daten vom Raspberry aus meinem lokalen Netz auf den Webspace von Strato zu bekommen. Ich wollte die aktuelle Temperatur und Luftfeuchte die meine Homematic-Sensoren regelmäßig in der lokalen Datenbank auf dem Raspberry speichern auch hier im Blog anzeigen. Nichts leichter als das dachte [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nach langer Zeit Stillstand im Blog nochmal ein kleines Snippet. Problemstellung war, Daten vom Raspberry aus meinem lokalen Netz auf den Webspace von Strato zu bekommen. Ich wollte die aktuelle Temperatur und Luftfeuchte die meine Homematic-Sensoren regelmäßig in der lokalen Datenbank auf dem Raspberry speichern auch hier im Blog anzeigen.</p>
<p>Nichts leichter als das dachte ich, und richtete eine Datenbankverbindung zur MySQL-Datenbank auf dem Strato-Webspace auf dem Raspberry ein. Leider unterbindet Strato den Zugriff auf die Datenbanken wenn dieser nicht vom Strato-Webspace geschieht. Das ist unschön da ich mir was anderes einfallen lassen musste, aber bzgl. der Sicherheit geht das in Ordnung.</p>
<p>Der nun vorgestellte zweite Ansatz ist eine zweigeteilte Lösung mit einer Komponente auf dem Strato-Webserver (PHP-Script) und einem Aufruf dieses Scriptes auf dem Raspberry mittels Shell-Script etc. oder wie in meinem Beispiel mittels PHP-Script welches regelmäßig per Cron aufgerufen wird. Das ist die simpelste Art eines &#8222;Webservices&#8220; ohne REST und SOAP und für meine Zwecke völlig ausreichend.</p>
<h2>Serverkomponente</h2>
<p>Der PHP-Teil auf dem Webspace sieht folgendermaßen aus: Nach der Prüfung eines übergebenen Hashwertes werden die beiden ebenfalls in der URL übergebenen Messwerte (Außentemperatur und Luftfeuchte) auf Vorhandensein geprüft. Hier können und sollten natürlich noch weitere Prüfungen vorgenommen werden ob diese Werte z.B. numerisch sind etc. Da dieses Script auf dem Webspace liegt und durch jeden aufgerufen werden kann, dient der Hashwert als Passwort für den Aufruf.</p>
<p>Ist mit den übergebenen Argumenten alles in Ordnung, werden die Messwerte mittels Prepared-Statement in die auf dem Strato-Webserver angelegte Datenbank-Tabelle &#8222;temperaturfuehler&#8220; gespeichert.</p>
<p>Da ich die Messwerte in einer lokalen Datenbank schon historisiere, wird in der Tabelle im Webspace nur eine Zeile mittels &#8222;UPDATE&#8220; aktualisiert. Hier muss darauf geachtet werden, dass mindestens einmal vor dem ersten Update ein &#8222;INSERT&#8220; in dieser Tabelle vorgenommen werden muss. Das hatte ich über die MySQL-Admin-Oberfläche von Strato gemacht.</p>
<pre class="lang:php theme:twilight">
<?
//insert.php

//Einstellungen aus externer Datei einlesen
require_once 'config.php';

//Uebergebenen Hashwert pruefen
if (isset($_GET["hashwert"]) &#038;&#038; $_GET["hashwert"]==HASHWERT) {
	//Temperatur- und Luftfeuchtedaten speichern
	if (isset($_GET["temperatur"]) &#038;&#038; isset($_GET["luftfeuchte"])) {
		try {
			$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_DATABASE);
			$stmt = $mysqli->prepare("UPDATE temperaturfuehler SET temperatur=?,luftfeuchte=?");
			$stmt->bind_param("dd",number_format($_GET["temperatur"],1),number_format($_GET["luftfeuchte"],1));
			$stmt->execute();
			$stmt->close();
		} catch (Exception $e) {
			echo 'Fehler: ', $e->getMessage(), "\n";
		}
	}
	
} else {
	//echo "Fehler: Hashwert falsch\n";
}
?>
</pre>
<p>Hier die im obigen Script eingebundene Datei mit den Einstellungen:</p>
<pre class="lang:php theme:twilight">
<?
//config.php

define('DB_USER', "<datenbank_benutzer>");
define('DB_PASSWORD', "<datenbank_passwort>");
define('DB_DATABASE', "<datenbank_name>");
define('DB_SERVER', "<datenbank_server>");
define('HASHWERT', "<der_hashwert_der_beim_get_uebergeben_werden_muss>");
?>
</pre>
<h2>Lokale Komponente</h2>
<p>Jetzt zu dem Teil der auf dem Raspberry lokal läuft. Hier wird obiges Script einfach z.B. per GET aus einem weiteren PHP- oder Shell-Script etc. mit den entsprechenden Argumenten aufgerufen. Wichtig ist, dass die Namen der übergebenen Argumente mit denen aus dem <em>insert.php</em> Script übereinstimmen.</p>
<pre class="lang:php theme:twilight">
exec("GET \"http://www.deine_url.de/beliebiger_pfad/insert.php?temperatur=$temp&luftfeuchte=$luft&hashwert=der_hashwert_der_beim_get_uebergeben_werden_muss\"");
</pre>
<p>Obiges Script und der Aufruf können natürlich um beliebig viele Übergabeparameter erweitert werden. Die so an die Strato-Datenbank übergebenen Werte können dann z.B. im WordPress mittels PHP-Plugin aus der Datenbank abgefragt und angezeigt werden. Hier im Blog ist das oben rechts zu sehen.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/08/temperatur.png"><img loading="lazy" decoding="async" src="http://blog.bubux.de/wp-content/uploads/2015/08/temperatur.png" alt="temperatur" width="264" height="255" class="alignnone size-full wp-image-964" /></a></p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/snippet-daten-vom-internen-netz-zum-strato-webspace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Snippet &#8211; FHEM mit PHP über Telnet abfragen</title>
		<link>https://www.bubuxblog.de/snippet-fhem-mit-php-ueber-telnet-abfragen/</link>
					<comments>https://www.bubuxblog.de/snippet-fhem-mit-php-ueber-telnet-abfragen/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 08 Mar 2014 09:01:07 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Snippet]]></category>
		<category><![CDATA[FHEM]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homematic]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=384</guid>

					<description><![CDATA[Für alle die den Status Ihrer Homemmatic-Geräte anstelle der FHEM-Webseite in einer eigenen Webseite darstellen wollen, gibt es diesmal einen einfachen Schnippsel PHP-Code um den Status eines Homematic-Fensterkontaktes hm-sec-sc per Telnet abzufragen. Hierfür bietet sich das list-Kommando von FHEM an. Die Syntax ist sehr einfach: list [devspec] [value] Wobei [devspec] der Name des Homematic-Gerätes ist, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Für alle die den Status Ihrer Homemmatic-Geräte anstelle der FHEM-Webseite in einer eigenen Webseite darstellen wollen, gibt es diesmal einen einfachen Schnippsel PHP-Code um den Status eines Homematic-Fensterkontaktes <em>hm-sec-sc</em> per Telnet abzufragen.<br />
Hierfür bietet sich das <em>list</em>-Kommando von FHEM an. Die Syntax ist sehr einfach:</p>
<pre>list [devspec] [value]</pre>
<p>Wobei <em>[devspec]</em> der Name des Homematic-Gerätes ist, wie es in der FHEM-Einstellungen konfiguriert ist. Für <em>[value]</em> wird <em>STATE</em> als eines der Attribute des Fensterkontaktes abgefragt. STATE gibt neben dem Gerätenamen den aktuellen Zustand <em>closed</em> oder <em>open</em> aus.</p>
<p>Folgendes Script setzt ein entsprechendes Telnet-Kommando ab und parst das Ergebnis:</p>
<p>[cclN_php]<br />
//Hostname und Telnet-Port des FHEM-Servers<br />
$fhemhost = &#8222;localhost&#8220;;<br />
$fhemport = 7072;</p>
<p>//Socket öffnen<br />
$fhemsock = fsockopen($fhemhost, $fhemport, $errno, $errstr, 30);<br />
//FHEM Kommando definieren (Name des Homematic-Gerätes eintragen)<br />
$fhemcmd = &#8222;list <name_des_hm_geraetes> STATE\r\nquit\r\n&#8220;;<br />
fwrite($fhemsock, $fhemcmd);<br />
while(!feof($fhemsock)) {<br />
    $ergebnis=fgets($fhemsock, 128);<br />
    $zustand=explode(&#8218; &#8218;,$ergebnis);<br />
    switch (trim($zustand[1])) {<br />
        case &#8222;closed&#8220;:<br />
            $zustand=&#8220;geschlossen&#8220;;<br />
            break;<br />
        case &#8222;open&#8220;:<br />
            $zustand=&#8220;offen&#8220;;<br />
            break;<br />
        default:<br />
            $zustand=$ergebnis[1];<br />
            break;<br />
        }<br />
        if ($ergebnis[1]!=&#8220;&#8220;) {<br />
            print &#8222;<name_des_hm_geraetes>:&#8220;.$zustand;<br />
        }<br />
}<br />
[/cclN_php]</p>
<p>In einer Webseite kann das dann z.B. folgendermaßen implementiert werden:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/03/fenstersensoren.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-391" alt="fenstersensoren" src="http://blog.bubux.de/wp-content/uploads/2014/03/fenstersensoren-1024x828.png" width="604" height="488" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/03/fenstersensoren-1024x828.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/03/fenstersensoren-300x242.png 300w, https://www.bubuxblog.de/wp-content/uploads/2014/03/fenstersensoren.png 1040w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p>Ich lasse dann auch jeden Abend um 21 Uhr per Cron-Script prüfen ob alle Fenster geschlossen sind. Wenn nicht, wird eine Mail versendet.</p>
<p>Viel Spaß mit den Schnippsel<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/snippet-fhem-mit-php-ueber-telnet-abfragen/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Snippet &#8211; MySQL Datenbank sichern</title>
		<link>https://www.bubuxblog.de/snippet-mysql-datenbank-sichern/</link>
					<comments>https://www.bubuxblog.de/snippet-mysql-datenbank-sichern/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 22 Feb 2014 10:55:29 +0000</pubDate>
				<category><![CDATA[Snippet]]></category>
		<category><![CDATA[Datenbanksicherung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=322</guid>

					<description><![CDATA[Da der Raspberry PI ab und an die schlechte Angewohnheit hat, z.B. bei einem Stromausfall das Filessystem auf der SD-Karte zu schreddern weil z.B. noch Schreiboperationen liefen, musste eine Möglichkeit der automatisierten Sicherung der MySQL Datenbanken her. Datenbank sichern Hierzu habe ich mysqldump genutzt. Gesichert werden alle Datenbanken (&#8211;all-databases) inkl. deren Struktur und Daten des [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Da der Raspberry PI ab und an die schlechte Angewohnheit hat, z.B. bei einem Stromausfall das Filessystem auf der SD-Karte zu schreddern weil z.B. noch Schreiboperationen liefen, musste eine Möglichkeit der automatisierten Sicherung der MySQL Datenbanken her.</p>
<h4>Datenbank sichern</h4>
<p>Hierzu habe ich <strong><em>mysqldump</em></strong> genutzt. Gesichert werden alle Datenbanken (<em>&#8211;all-databases</em>) inkl. deren Struktur und Daten des entsprechenden Benutzers (<em>&#8211;user</em>). Das Ergebnis des Dumps wird in eine Datei geschrieben und mit gzip komprimiert. Bei mir landet die Datei auf einem NAS welches unter /media gemountet ist.</p>
<p>Im Dateiname wird mittels <em>`date +%Y%m%d` </em>immer das aktuelle Datum eingemischt damit die Sicherung vom Vortag nicht überschrieben wird.</p>
<p>Das Shell-Script sieht dann folgendermaßen aus:</p>
<pre>#!/bin/bash
sudo mysqldump --user=&lt;benutzer&gt; --password=&lt;passwort&gt; --all-databases | gzip &gt; /media/nas/db_sicherung_`date +%Y%m%d`.sql.gz
exit 0</pre>
<p>Das Script rufe ich dann täglich mittels Cron auf. In meinem Fall immer um 21:15 Uhr. Ausgaben des Scripts (<strong>auch Fehler!</strong>) schreibe ich nach /dev/null.</p>
<p>Also <em>crontab -e</em> aufrufen und folgende Zeile hinzufügen:</p>
<pre>15 21 * * * sudo /usr/local/bin/sicherung.sh &amp;&gt; /dev/null</pre>
<h4><span id="more-322"></span></h4>
<h4>Sicherung zurückspielen</h4>
<p>In der Weboberfläche von phpmyadmin kann der Dump bei Bedarf über den Menüpunkt &#8222;Importieren&#8220; wieder zurückgesichert werden. Es kann direkt die gzip kompromierte Datei über &#8222;Durchsuchen&#8220; ausgewählt mit Klick auf &#8222;OK&#8220; wieder hergestellt werden.<a href="http://blog.bubux.de/wp-content/uploads/2014/02/mysqlrestore.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-327" alt="mysqlrestore" src="http://blog.bubux.de/wp-content/uploads/2014/02/mysqlrestore.png" width="911" height="501" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/02/mysqlrestore.png 911w, https://www.bubuxblog.de/wp-content/uploads/2014/02/mysqlrestore-300x164.png 300w" sizes="auto, (max-width: 911px) 100vw, 911px" /></a></p>
<h4>Aufräumen</h4>
<p>Damit nicht unendlich viele Sicherungen auf dem NAS vorgehalten werden, lösche ich mittels <em>find </em>und<em> rm </em>alle Sicherungsdateien die älter als 10 Tage sind. Folgender Befehl kann in ein eigenes vom Cron aufgerufenes Shell-Script oder auch in das Sicherungsscript von oben.</p>
<pre>find /media/nas/ -mtime +10 -exec rm {} \;</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/snippet-mysql-datenbank-sichern/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
