<?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>RaspberryPI &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/tag/raspberrypi/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Sun, 06 Oct 2019 09:57:49 +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>Netzwerkweit Werbung blockieren mit Pi-hole</title>
		<link>https://www.bubuxblog.de/werbung-blockieren-mit-pi-hole/</link>
					<comments>https://www.bubuxblog.de/werbung-blockieren-mit-pi-hole/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 06 Oct 2019 12:37:52 +0000</pubDate>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Odroid]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Adblocker]]></category>
		<category><![CDATA[Pi-hole]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<category><![CDATA[Werbung]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1199</guid>

					<description><![CDATA[Habt ihr genug von flackernden Werbebannern die mehr Raum einnehmen als der eigentliche Seiteninhalt oder gefühlte 100 Ad-Server die beim Öffnen einer einzigen Webseite kontaktiert werden? Adblock &#38; Co. sind eine gute Sache, allerdings auf den Webbrowser beschränkt auf dem das Plugin installiert ist. Android oder iOS waren da meistens außen vor. Auf der Suche [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_logo.png"><img fetchpriority="high" decoding="async" class="size-full wp-image-1222 alignleft" src="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_logo.png" alt="pihole_logo" width="240" height="240" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_logo.png 240w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_logo-150x150.png 150w" sizes="(max-width: 240px) 100vw, 240px" /></a>Habt ihr genug von flackernden Werbebannern die mehr Raum einnehmen als der eigentliche Seiteninhalt oder gefühlte 100 Ad-Server die beim Öffnen einer einzigen Webseite kontaktiert werden? Adblock &amp; Co. sind eine gute Sache, allerdings auf den Webbrowser beschränkt auf dem das Plugin installiert ist. Android oder iOS waren da meistens außen vor. Auf der Suche nach einem weiteren Beschäftigungsfeld für meinen Raspberry Pi bin ich auf ein nettes Projekt gestoßen!</p>
<p><span style="color: #ff6600;"><strong>Das ist ein Update des ursprünglichen Artikels da sich ein paar wichtige Dinge geändert haben und ich auch einen DNS-Loop eingebaut hatte&#8230;<br />
</strong></span></p>
<h1>Installation</h1>
<p>Mit einer Zeile ist er auf dem Raspberry Pi installiert: der <a href="https://pi-hole.net/" target="_blank" rel="noopener noreferrer">Werbeblocker Pi-hole</a></p>
<h1><span style="color: #0000ff;">curl -L https://install.pi-hole.net | bash</span><span id="more-1199"></span></h1>
<p><!--more-->Während der Installation wird die Konfiguration von Pi-hole durch eine grafische Oberfläche erleichtert. Die meisten Voreinstellungen kann man ohne Änderung abnicken.</p>
<p>Nach erfolgreicher Installation ist die Weboberfläche des Pi-hole unter der Adresse <em>http://&lt;servername&gt;:&lt;port&gt;/admin</em> zu erreichen.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/05/pihole1.png"><img decoding="async" class="alignnone size-full wp-image-1207" src="http://blog.bubux.de/wp-content/uploads/2016/05/pihole1.png" alt="" width="820" height="577" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/05/pihole1.png 820w, https://www.bubuxblog.de/wp-content/uploads/2016/05/pihole1-300x211.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/05/pihole1-768x540.png 768w" sizes="(max-width: 820px) 100vw, 820px" /></a></p>
<h1>&nbsp;</h1>
<h1>Wichtige Einstellungen</h1>
<p>Unter anderem ist als DNS-Server der von Google voreingestellt. Diese Einstellung kann nach Abschluss der Installation nachträglich in der Pi-hole-Oberfläche angepasst werden. Dazu dort einloggen und unter <em>Settings -&gt; DNS</em> einen anderen voreingestellten DNS auswählen oder auf der rechten Seite einen frei wählbaren DNS-Server eintragen. Natürlich kann die Einstellung auch auf dem Google-DNS belassen werden.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_DNS_server.png"><img decoding="async" class="alignnone size-large wp-image-1823" src="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_DNS_server-1024x685.png" alt="" width="768" height="514" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_DNS_server-1024x685.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_DNS_server-300x201.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_DNS_server-768x514.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_DNS_server.png 1992w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<p>Neben der Weboberfläche können die Einstellungen auch über die Konsole in der Konfigurationsdatei mit</p>
<pre class="">sudo vim /etc/dnsmasq.d/01-pihole.conf</pre>
<p>angepasst werden.</p>
<h1>&nbsp;</h1>
<h1>Pi-hole als DNS im eigenen Netzwerk nutzen</h1>
<p>Damit nun der Pi-hole auch netzwerkweit als DNS genutzt wird, muss z.B. in der FritzBox unter &#8222;<em>Internet-&gt; Zugangsdaten</em>&#8220; im Reiter &#8222;<em>DNS-Server</em>&#8220; noch die IP des Pi-hole-Rechners als lokaler DNS-Server eintragen werden. Hier im Bild für IPv4 und IPv6 dargestellt. Die IPv6-Adresse des Pi-hole findet ihr u.a. auf der Weboberfläche unter <em>Settings</em> im Reiter <em>&#8222;System</em>&#8222;.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2019/10/fritzbox_dns.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1826" src="http://blog.bubux.de/wp-content/uploads/2019/10/fritzbox_dns-1024x499.png" alt="" width="768" height="374" srcset="https://www.bubuxblog.de/wp-content/uploads/2019/10/fritzbox_dns-1024x499.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2019/10/fritzbox_dns-300x146.png 300w, https://www.bubuxblog.de/wp-content/uploads/2019/10/fritzbox_dns-768x375.png 768w, https://www.bubuxblog.de/wp-content/uploads/2019/10/fritzbox_dns.png 1105w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h1>&nbsp;</h1>
<h1>Lokale Namensauflösung</h1>
<p>Die meisten werden Pi-hole nicht als DHCP-Server nutzen, sondern DHCP dem DSL-Router überlassen. Damit der Pi-hole auch die Namensauflösung im lokalen Netzwerk kennt, muss der lokale Router unter <em>Settings-&gt;DNS</em> im Breich &#8222;<em>Conditional Forwarding</em>&#8220; eingetragen werden. Im Bild ist die entsprechende Konfiguration für eine FritzBox zu sehen. Nun sollte auch die Namensauflösung im lokalen Netzwerk wieder funktionieren.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1822" src="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding-1024x292.png" alt="" width="768" height="219" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding-1024x292.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding-300x85.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding-768x219.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_conditiional_forwarding.png 1930w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h1>&nbsp;</h1>
<h1>Geschafft!</h1>
<p>Soviel zur Installation und Konfiguration von Pi-hole! Es kann ein paar Minuten dauern bis die Hostnamen im lokalen Netz wieder aufgelöst werden. Ab nun laufen die DNS-Anfragen aller im Heimnetz eingebundenen Geräte (LAN oder WLAN) über den Pi-hole und alles ist werbefrei!</p>
<h1>&nbsp;</h1>
<h1>Portkonflikt</h1>
<p>Die Weboberfläche von Pi-hole erreicht man standardmäßig über den HTTP-Port 80. Da bei mir auf dem Raspberry aber parallel noch ein Apache werkelt, konnt der lighttpd nicht auf Port 80 gestartet werden. Eine entsprechende Fehlermeldung kam am Ende der Installation. Daher musste ich den Port des lighttpd noch ändern. Dazu die Konfiguration des lighttpd mit</p>
<pre class="">sudo vim /etc/lighttpd/lighttpd.conf</pre>
<p>editieren (nach &#8222;80&#8220; suchen und den Wert hinter <em>server.port</em> auf den gewünschten Port stellen). Anschliessend den lighttpd-Service mit folgendem Befehl neu starten:</p>
<pre class="">sudo service lighttpd restart</pre>
<p>Leider muss diese Änderung aktuell nach jedem Update gemacht werden da die Konfiguration standardmäßig wieder den Port 80 nutzt.</p>
<h1>&nbsp;</h1>
<h1>Daten per JSON abfragen</h1>
<p>Verschiedene der in der Adminoberfläche angezeigten Information können auch sehr einfach über eine JSON-Schnittstelle abgefragt werden. Die Adresse ist http://&lt;servername&gt;:&lt;port&gt;/admin/api.php. Hier ein kurzes Beispiel um diese Abfrage in PHP zu realsieren und ein Screenshot der Implementierung in meiner Hausübersicht (links unten).</p>
<p>&nbsp;</p>
<pre class="">$json = file_get_contents('http://&lt;servername&gt;:&lt;port&gt;/admin/api.php');
$data = json_decode($json);
print "Domains blockiert: ".$data-&gt;{'domains_being_blocked'};
print "DNS-Abfragen: ".$data-&gt;{'dns_queries_today'};
print "Blockierte Werbung: ".$data-&gt;{'ads_blocked_today'};
print "Prozentuale Werbung: ".$data-&gt;{'ads_percentage_today'};</pre>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_heimnetz.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1230" src="http://blog.bubux.de/wp-content/uploads/2016/08/pihole_heimnetz-1024x635.png" alt="pihole_heimnetz" width="768" height="476" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_heimnetz-1024x635.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_heimnetz-300x186.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_heimnetz-768x476.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/08/pihole_heimnetz.png 1053w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h1>&nbsp;</h1>
<h1>Konsole anstatt Weboberfläche</h1>
<p>Neben der Weboberfläche kann man auch auf der Konsole mittels <em>pihole [option]</em> verschiedene Funktionen aufrufen.</p>
<p>So kann zum Beispiel die Liste der Werbe-Domains aktualisiert werden:</p>
<pre class="">pihole -g</pre>
<p>Update des Pi-hole:</p>
<pre class="">pihole -up</pre>
<p class="">Zeigt alle möglichen Optionen:</p>
<pre class="">pihole -h</pre>
<p>&nbsp;</p>
<p>So, und nun viel Spaß mit einem größtenteil werbefreien Internet!</p>
<p>&nbsp;</p>
<p>Gruß</p>
<p>Chris</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/werbung-blockieren-mit-pi-hole/feed/</wfw:commentRss>
			<slash:comments>1</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 loading="lazy" 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="auto, (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 loading="lazy" 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="auto, (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>Amazon Kindle als Statusdisplay</title>
		<link>https://www.bubuxblog.de/kindle-status-display/</link>
					<comments>https://www.bubuxblog.de/kindle-status-display/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Wed, 16 Mar 2016 20:33:06 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[FHEM]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[Kindle]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<category><![CDATA[Snippet]]></category>
		<category><![CDATA[Statusdisplay]]></category>
		<category><![CDATA[Wetter]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1123</guid>

					<description><![CDATA[Die Anzeige aller im Haus gesammelter Daten über eine Webseite ist nett (siehe Screenshot), benötigt aber einen Rechner, Handy, Tablet etc. wo diese Seite im Browser anzeigt wird. Unschön dabei ist, das wenn man schnell die Außentemperatur wissen will, immer erst das Gerät anschalten oder aufwecken muss, einen Webbrowser öffnen muss, die Webseite aufruft und [&#8230;]]]></description>
										<content:encoded><![CDATA[<figure id="attachment_1137" aria-describedby="caption-attachment-1137" style="width: 351px" class="wp-caption alignright"><a href="http://blog.bubux.de/wp-content/uploads/2016/03/startseite_intranet.png" rel="attachment wp-att-1137"><img loading="lazy" decoding="async" class="wp-image-1137" src="http://blog.bubux.de/wp-content/uploads/2016/03/startseite_intranet-1024x525.png" alt="startseite_intranet" width="351" height="180" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/startseite_intranet-1024x525.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/03/startseite_intranet-300x154.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/03/startseite_intranet-768x394.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/startseite_intranet.png 1029w" sizes="auto, (max-width: 351px) 100vw, 351px" /></a><figcaption id="caption-attachment-1137" class="wp-caption-text">Webseite &#8211; Übersicht</figcaption></figure>
<p>Die Anzeige aller im Haus gesammelter Daten über eine Webseite ist nett (siehe Screenshot), benötigt aber einen Rechner, Handy, Tablet etc. wo diese Seite im Browser anzeigt wird. Unschön dabei ist, das wenn man schnell die Außentemperatur wissen will, immer erst das Gerät anschalten oder aufwecken muss, einen Webbrowser öffnen muss, die Webseite aufruft und wartet bis die Seite geöffnet wird. Das ist für einen kurzen Blick auf die Temperatur eher unpraktisch.</p>
<p>Es musste eine Anzeigemöglichkeit für die wichtigsten Daten her, welche immer angeschaltet ist. Nach kurzer Recherche im Internet stellte sich ein Amazon Kindle als Statusdisplay aufgrund des E-Paper-Displays als stromsparender Anwärter auf diesen Job heraus. Also schnell einen Kindle 4 (kein Touch) im Internet für ~ 30€ besorgt (da ich bisher keinen besaß).</p>
<h3>Lösungsansätze</h3>
<p>Es gibt verschiedene Ansätze den Kindle als Statusdisplay (z.B. für Wetterinformationen) zu nutzen. Es gibt Lösungen wie <a href="http://www.mobiflip.de/kindl-eink-info-display/" target="_blank">hier</a> beschrieben die den Browser des Kindle nutzen. Besser gefielen mir aber die Lösungen die den Bildschirmschoner des Kindle zur Anzeige eines Statusbildes nutzen. Das macht unter anderem die <a href="http://www.fhemwiki.de/wiki/Kindle_Display" target="_blank">Lösung für FHEM</a>, als auch die Lösung von <a href="https://mpetroff.net/2012/09/kindle-weather-display/" target="_blank">Matthew Petroff</a> (von dem die FHEM-Lösung wahrscheinlich auch abgeleitet ist). Basierend auf dieser Lösung ist ausserdem <a href="http://www.shatteredhaven.com/2012/11/1347365-kindle-weather-display.html" target="_blank">diese hier</a> mit weiterführenden Erklärungen der nötigen Schritte.<br />
Ich bevorzuge anstelle der FHEM-Lösung die ursprüngliche Version, da ich nicht nur Daten aus FHEM anzeigen will, sondern auch Daten aus meiner MySQL-Datenbank und zusätzliche Informationen die direkt aus dem Internet stammen.</p>
<p>Den Kindle habe ich übrigens mittels <a href="http://avm.de/ratgeber/sicherheit/rundum-geschuetzt-mit-der-kindersicherung/" target="_blank">&#8222;Kindersicherung&#8220; der FritzBox</a> vom Internet gekappt falls Amazon auf komische Gedanken kommt und mir mit einem gutgemeinten Online-Update irgendwas zerschießt.</p>
<p>Die Lösung, den Bildschirmschoner des Kindle mit einem im Netzwerk bereitgestelltem Bild zu nutzen, benötigt verschiedene Anpassungen des Kindle als auch einige Komponenten die auf einem Server bereit gestellt werden müssen (bei mir der Raspberry PI).</p>
<h3>Beschreibung</h3>
<p>Die Beschreibung der nötigen Schritte und die benötigte Software sind <a href="https://mpetroff.net/2012/09/kindle-weather-display/" target="_blank">hier</a> (<em>ursprüngliche Idee</em>), <a href="http://www.shatteredhaven.com/2012/11/1347365-kindle-weather-display.html" target="_blank">hier</a> (<em>erweiterte Anleitung</em>) und <a href="http://fnordig.de/2015/05/14/using-a-kindle-for-status-information/" target="_blank">hier</a> (<em>ausführliche Anleitung</em>) erklärt. Aus diesem Grund liste ich die nötigen Arbeitsschritte hier nur Stichpunktartig auf:</p>
<p><em><strong>Kindle:</strong></em></p>
<ul>
<ul>
<li><a href="http://wiki.mobileread.com/wiki/Kindle4NTHacking" target="_blank">Jailbreak</a> des Kindle damit man damit auch anständig arbeiten kann</li>
<li>SSH für Kindle (<a href="http://www.mobileread.com/forums/showthread.php?t=88004" target="_blank">USBNetwork Hacks</a>)
<ul>
<li><a href="https://www.sven.de/kindle/" target="_blank">Root-Passwort</a> für den Kindle ermitteln</li>
</ul>
</li>
<li>Kite <a href="http://www.mobileread.com/forums/showthread.php?t=168270" target="_blank">installieren</a> um nach dem Starten des Kindle das Init-Script (<em>init_daten.sh</em>) ausführen zu lassen
<ul>
<li>Stoppen von <em>powerd</em>
<ul>
<li>das ist nötig, da im Sleep-Mode der Cronjob nicht ausgeführt wird</li>
<li>(&#8222;@reboot&#8220; in crontab funktioniert leider auf dem Kindle nicht)</li>
</ul>
</li>
<li>Stoppen von <em>framework</em></li>
</ul>
</li>
<li>Cronjob einrichten um alle x Minuten/Stunden ein aktualisiertes Bild per wget zu laden
<ul>
<li><em>vi /etc/crontab/root</em></li>
<li><em>*/10 5-22 * * * /mnt/us/anzeige/zeige_daten.sh</em> (alle 10 Minuten zwischen 5 und 22 Uhr</li>
</ul>
</li>
</ul>
</ul>
<p><em><strong>Server:</strong></em></p>
<ul>
<ul>
<ul>
<li>Python-Script anpassen
<ul>
<li>Das Python-Script sammelt die Daten, ersetzt die Platzhalter im SVG und erstellt daraus das PNG mittels <em>rsvg-convert</em> und <em>pngcrush</em></li>
</ul>
</li>
<li>Cronjob zur Ausführung des Python-Script anlegen
<ul>
<li><em>*/3 * * * * /var/www/kindle/daten-script.sh &amp;&gt; /dev/null</em></li>
</ul>
</li>
<li>SVG-Template anpassen (mit Editor und/oder <a href="https://inkscape.org/de/" target="_blank">Inkscape</a>)
<ul>
<li><a href="http://blog.bubux.de/wp-content/uploads/2016/03/daten_script_preprocess.svg" target="_blank">hier</a> mein SVG für die Datenanzeige und</li>
<li><a href="http://blog.bubux.de/wp-content/uploads/2016/03/sleep_preprocess.svg" target="_blank">hier</a> für zwischen 23 und 5 Uhr</li>
<li><em>bei Änderungen mit Inkscape nicht im &#8222;Inkscape-Format&#8220; abspeichern sondern als &#8222;Normales SVG&#8220;</em></li>
</ul>
</li>
<li><a href="http://developer.gnome.org/rsvg/stable/" target="_blank">rsvg-convert</a> installieren (<em>sudo apt-get install librsvg2-bin</em>)</li>
<li><a href="http://en.wikipedia.org/wiki/Pngcrush" target="_blank">pngcrush</a> installieren (<em>sudo apt-get install pngcrush</em>)</li>
</ul>
</ul>
</ul>
<p>(Achtung! Die Dateinamen der Scripte in den Cron-Beispielen und die Dateinamen der SVG´s sind anders als in den oben verlinkten Anleitungen)</p>
<h3>Python-Script</h3>
<p>Das ursprüngliche Python-Script holt das Wetter von einer Webseite aus den USA. Das Wetter dort hat mich nicht wirklich interessiert und so habe ich das Script etwas angepaßt und verschiedene Wetterdaten und Statusinformationen aus meinen eigenen Quellen (FHEM und MySQL) gezogen.<br />
Zur Anzeige der Wettericons nutze ich teilweise die Bilder aus dem ursprünglichen SVG. Einige habe ich allerdings gelöscht da ich hier z.B. keinen Blizzard erwarte. Die Werte für den Luftdruck und die Windstärke sowie die Auswahl des aktuellen Wetter-Icon erfolgt über die &#8222;condition&#8220; des <a href="http://www.fhemwiki.de/wiki/Weather" target="_blank">FHEM-Yahoo-Wetter-Moduls</a>.</p>
<p>Mein Pythonscript sieht wie folgt aus:</p>
<p><strong>Bitte das Update im <a href="http://blog.bubux.de/amazon-kindle-als-statusdisplay-update/">nachfolgendem Artikel</a> beachten!!</strong></p>
<pre class="lang:python theme:twilight">
#!/usr/bin/python2

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
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"

# Fenster
anz_fenster_offen=0;
if "open" in fhem_task("get FensterHeizung param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterKeller param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterGaestezimmer1 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterGaestezimmer2 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterBuero1 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterBuero2 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterWohnen1 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterWohnen2 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterWohnen3 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterWohnen4 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterGaestebad param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterSpind param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get FensterBad1 param STATE\r\n"):
    anz_fenster_offen += 1
if "open" in fhem_task("get Garagentor param STATE\r\n"):
    stat_garage="offen"
else:
    stat_garage="geschlossen"

# 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"))

####################
# Datenbank auslesen
####################
db = MySQLdb.connect(host="localhost", user="<benutzer>", passwd="<password>", 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)

db.close()


################
# Preprocess SVG
################
now = datetime.now()
now_time = now.time()
if time(5,50) <= now.time() <= time(22,50):  
    # Open SVG to process
    output = codecs.open('daten_script_preprocess.svg', 'r', encoding='utf-8').read()
    # Insert icons and temperatures
    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('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'))
    # Write output
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
else:
    # Open SVG to process
    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'))
    # Write output
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
</pre>
<p>Es werden verschiedene Information aus FHEM mittels Telnet abgefragt und Daten aus einer MySQL-Datenbank (min/max-Werte) ermittelt. Neben Temperaturwerten zeige ich z.B. auch noch den Status der Fenster, des Garagentores und der Abwesenheitssteuerung an. Zwischen 5:50 und 22:50 Uhr wird alle 10 Minuten ein aktualisiertes Bild der Statusinformationen angezeigt, in der anderen Zeit ein Bild eines schlafenden Männchens. In dieser Zeit fragt der Kindle auch kein neues Bild per <em>wget</em> ab.</p>
<h3>Ergebnis</h3>
<p>Im Ergebnis schaut es dann so aus:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_statusdisplay-e1457800839248.jpg" rel="attachment wp-att-1125"><img loading="lazy" decoding="async" class="alignnone wp-image-1125" src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_statusdisplay-e1457800839248-768x1024.jpg" alt="kindle_statusdisplay" width="610" height="813" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay-e1457800839248-768x1024.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay-e1457800839248-225x300.jpg 225w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay-e1457800839248.jpg 1944w" sizes="auto, (max-width: 610px) 100vw, 610px" /></a></p>
<p>Und hier die Anzeige für Nachts:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_statusdisplay2.jpg" rel="attachment wp-att-1152"><img loading="lazy" decoding="async" class="alignnone wp-image-1152 " src="http://blog.bubux.de/wp-content/uploads/2016/03/kindle_statusdisplay2-e1458156959657-768x1024.jpg" alt="kindle_statusdisplay2" width="610" height="813" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay2-e1458156959657-768x1024.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay2-e1458156959657-225x300.jpg 225w, https://www.bubuxblog.de/wp-content/uploads/2016/03/kindle_statusdisplay2-e1458156959657.jpg 1944w" sizes="auto, (max-width: 610px) 100vw, 610px" /></a></p>
<p>Als Erweiterung werde ich evtl. noch während der Heizperiode mit dem Kachelofen oder abhängig der Puffertemperatur, die obere und untere Temperatur des Pufferspeichers anstelle des Luftdruckes und der Windinformation anzeigen. Die Puffertemperatur ist in der Regel unser Maßstab ob Holz nachgelegt werden muss oder nicht.</p>
<p>Es könnte z.B. auch eine Display füllende Information ausgegeben werden wenn eine der Batterien der Fensterkontakte leer ist oder ein Warnhinweis falls die Heizung eine Störung oder anstehende Wartung anzeigt. Im Python-Script würde ich dann analog dem "Schlaf-Bild" ein spezielles PNG aus einem weiteren SVG erzeugen.<br />
&nbsp;</p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/kindle-status-display/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>Vor- und Rücklauf vom Kachelofen mittels 1-wire Temperatursensoren messen</title>
		<link>https://www.bubuxblog.de/vorlauf-und-ruecklauf-vom-kachelofen-mittels-1-wire-temperatursensoren/</link>
					<comments>https://www.bubuxblog.de/vorlauf-und-ruecklauf-vom-kachelofen-mittels-1-wire-temperatursensoren/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 08 Mar 2015 13:22:11 +0000</pubDate>
				<category><![CDATA[Haustechnik]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=744</guid>

					<description><![CDATA[Unser Kachelofen von Brunner hat einen Wärmetauscher (HKD2.2) und versorgt damit den Wasserspeicher im Keller mit warmem Wasser. Aus diesem wird dann die Fußbodenheizung und das Warmwasser versorgt. Die Steuerung des Kachelofens übernimmt die EAS (Elektronische Abbrandsteuerung). Leider hat Brunner in der EAS keine mir bekannte Schnittstelle um die verschiedenen Temperaturen, die Statis der Abbrandsteuerung [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Unser Kachelofen von Brunner hat einen Wärmetauscher (HKD2.2) und versorgt damit den Wasserspeicher im Keller mit warmem Wasser. Aus diesem wird dann die Fußbodenheizung und das Warmwasser versorgt. Die Steuerung des Kachelofens übernimmt die <a title="Ofensteuerung Brunner" href="http://www.brunner.de/de/Produkte/Steuerungen/Ofensteuerungen" target="_blank">EAS</a> (Elektronische Abbrandsteuerung). Leider hat Brunner in der EAS keine mir bekannte Schnittstelle um die verschiedenen Temperaturen, die Statis der Abbrandsteuerung oder den Schalter der Kachelofentüre abzufragen.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/03/IMG_5564.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-750" src="http://blog.bubux.de/wp-content/uploads/2015/03/IMG_5564-1024x683.jpg" alt="IMG_5564" width="768" height="512" srcset="https://www.bubuxblog.de/wp-content/uploads/2015/03/IMG_5564-1024x683.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2015/03/IMG_5564-300x200.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Die Abbrandsteuerung selber ist unabhängig von der eigentlichen Hydraulik zum Anschluss des Kachelofens an den Warmwasserspeicher. Hier nutzen wir eine Steuerung der Fa. ÖkoCentro mit einer SHR 10-Steuerung von EnergieControl. Aber auch diese hat keine mir bekannte Schnittstelle die man einfach abfragen kann.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/03/IMG_7931.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-761" src="http://blog.bubux.de/wp-content/uploads/2015/03/IMG_7931-1024x683.jpg" alt="IMG_7931" width="768" height="512" srcset="https://www.bubuxblog.de/wp-content/uploads/2015/03/IMG_7931-1024x683.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2015/03/IMG_7931-300x200.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Als eine einfache Möglichkeit zumindest schon mal die Vorlauf- und Rücklauftemperatur zu messen, dachte ich an 1-Wire Temperatursensoren der Firma DALLAS (DS18B20). Diese sind günstig (z.B. 1,85€ bei Reichelt) und einfach am Raspberry PI zu implementieren. Die Vorbereitungen zur Nutzung der 1-Wire Sensoren ist nicht aufwändig und schnell passiert.</p>
<p>Sollen die 1-wire Sensoren nur parasitär versorgt werden, folgendes in der Shell eingeben um das entsprechende Kernelmodul zu laden:</p>
<pre>sudo modprobe w1-gpio</pre>
<p>oder wenn ein Pullup zur externen Stromversorgung genutzt wird, folgendes Kommando:</p>
<pre>sudo modprobe w1-gpio pullup=1</pre>
<p>Sollen Temperaturen über 70°C gemessen werden, wird zwecks der Genauigkeit der Sensoren die zusätzliche Stromversorgung mittels Pullup-Widerstand angeraten.<br />
Mehr zum Thema Anschlussarten gibt es z.B. <a href="http://www.msxfaq.de/verschiedenes/bastelbude/raspi-1wire.htm" title="Anschlussarten Raspi 1-wire" target="_blank">hier</a>.</p>
<p>Unabhängig ob Pull-Up oder nicht wird noch ein weiteres Kernelmodul benötigt:</p>
<pre>sudo modprobe w1-therm</pre>
<p>Ab der Kernelversion 3.18.3 muss noch eine Anpassung gemacht werden. Die Kernelversion wird wie folgt bestimmt:</p>
<pre>uname -r</pre>
<p>Ist die Kernelversion &gt; 3.18.3 muss in der Datei</p>
<pre>/boot/config.txt</pre>
<p>folgende Zeile eingefügt werden</p>
<pre># activating 1-wire with pullup
dtoverlay=w1-gpio-pullup
</pre>
<p>Ich habe die Sensoren mit separater Versorgung am Raspberry Pi angeschlossen. Wie das funktioniert, ist im <a title="Google Bildersuche 1-wire" href="https://www.google.de/search?q=1-wire&amp;source=lnms&amp;tbm=isch&amp;sa=X&amp;ei=NUf8VMz6GaTIyAPWt4CYDw&amp;ved=0CAgQ_AUoAg&amp;biw=1920&amp;bih=1089#tbm=isch&amp;q=1-wire+raspberry" target="_blank">Internet</a> in verschiedensten Foren etc. zu lesen. Ich hatte mal eine kleine Platine <a title="rs232_raspi.fzz" href="http://blog.bubux.de/wp-content/uploads/2015/03/rs232_raspi.fzz">rs232_raspi.fzz</a> mit einem MAX3232 für eine RS232-Schnittstelle für das <a href="http://blog.bubux.de/?p=663" title="M-BUS – Wasserzähler">M-Bus-Projekt</a> in Fritzing aufgebaut. Da hat auch noch der eine 4.7K Widerstand und eine Steckerleiste für 1-wire drauf gepaßt (oben Links zu sehen).</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/03/fritzing_1wire_rs232.png"><img loading="lazy" decoding="async" class="alignnone wp-image-762 size-medium" src="http://blog.bubux.de/wp-content/uploads/2015/03/fritzing_1wire_rs232-300x293.png" alt="fritzing_1wire_rs232" width="300" height="293" srcset="https://www.bubuxblog.de/wp-content/uploads/2015/03/fritzing_1wire_rs232-300x293.png 300w, https://www.bubuxblog.de/wp-content/uploads/2015/03/fritzing_1wire_rs232.png 920w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Sind die Kernelmodule geladen, alle Konfigurationen gemacht und alles angeschlossen, sollten die 1-wire Sensoren nach einem Neustart des Raspberry PI unter</p>
<pre>cd /sys/bus/w1/devices</pre>
<p>auftauchen.</p>
<p>Die Sensoren werden z.B. per &#8222;cat&#8220; mit folgendem Befehl ausgelesen</p>
<pre>cat 28-000005db9cea/w1_slave</pre>
<p>Das Ergebnis sollte dann ähnlich wie folgt aussehen:</p>
<p class="code">08 03 4b 46 7f ff 08 10 9e : crc=9e YES<br />
08 03 4b 46 7f ff 08 10 9e t=48500</p>
<p>Die Temperatur wird hinter dem &#8222;t=&#8220; in der zweiten Zeile ausgegeben. Um diese Temperatur z.B. mit PHP abzufragen und für weitere Verarbeitung nutzen zu können, folgendes PHP-Code-Schnipsel</p>
<p>[cc lang=&#8220;php&#8220;]<br />
<?
$ausgabe= shell_exec("cat /sys/bus/w1/devices/28-000005db9cea/w1_slave");
preg_match("/t=([0-9]{5})/",$ausgabe,$ergebnis);
$temperatur=round($ergebnis[1]/1000,1);
print $temperatur;
?><br />
[/cc]</p>
<p>Die Temperatur schreibe ich dann per Script, welches 10-minütig per Cron aufgerufen wird, in eine MySQL-Datenbank und stelle das Ergebnis in einer Webseite dar.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/03/kachelofen_webseite.png"><img loading="lazy" decoding="async" src="http://blog.bubux.de/wp-content/uploads/2015/03/kachelofen_webseite.png" alt="kachelofen_webseite" width="475" height="281" class="alignnone size-full wp-image-774" srcset="https://www.bubuxblog.de/wp-content/uploads/2015/03/kachelofen_webseite.png 475w, https://www.bubuxblog.de/wp-content/uploads/2015/03/kachelofen_webseite-300x177.png 300w" sizes="auto, (max-width: 475px) 100vw, 475px" /></a></p>
<p>Soviel zum Thema 1-wire. Die größere Herausforderung wird es aber, an die Werte der EAS heran zu kommen. Diese sind in soweit auch interessanter, als das diese Steuerung den Abbrand überwacht und informiert ob das Feuer heiß genug ist (&gt;450°C) um den geregelten Abbrand zu starten, zu heiß (&gt;750°C) und eine Gewisse Panik zu erzeugen, der Abbrand beendet ist und Holz nach gelegt werden könnte oder die Türe des Kachlofens nicht richtig geschlossen ist.</p>
<p>Ein Anfang ist aber gemacht und die EAS eine neue Herausforderung.</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/vorlauf-und-ruecklauf-vom-kachelofen-mittels-1-wire-temperatursensoren/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>M-BUS &#8211; Wasserzähler</title>
		<link>https://www.bubuxblog.de/m-bus-wasserzaehler/</link>
					<comments>https://www.bubuxblog.de/m-bus-wasserzaehler/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 13 Dec 2014 15:17:02 +0000</pubDate>
				<category><![CDATA[Haustechnik]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[M-Bus]]></category>
		<category><![CDATA[Meter-Bus]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<category><![CDATA[Wärmemengenzähler]]></category>
		<category><![CDATA[Wasserzähler]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=663</guid>

					<description><![CDATA[Von einem Freund habe ich einen M-Bus (Meter-Bus) Wasserzähler und einen Wärmemengenzähler bekommen. Der M-BUS ist ein Feldbus der über eine Zweidrahtleitung über sehr lange Strecken genutzt werden kann. Ein M-BUS Master fragt dabei alle Slaves im Strang oder Stern ab. Die Slaves werden teilweise vom M-Bus-Master mit Spannung versorgt. Mehr Details im Wiki. Der [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Von einem Freund habe ich einen M-Bus (Meter-Bus) Wasserzähler und einen Wärmemengenzähler bekommen. Der M-BUS ist ein Feldbus der über eine Zweidrahtleitung über sehr lange Strecken genutzt werden kann. Ein M-BUS Master fragt dabei alle Slaves im Strang oder Stern ab. Die Slaves werden teilweise vom M-Bus-Master mit Spannung versorgt. Mehr Details im <a title="M-BUS Wikipedia" href="http://de.wikipedia.org/wiki/M-Bus_%28Feldbus%29" target="_blank">Wiki</a>.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7712.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-653 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7712-300x200.jpg" alt="Techem Wärmemengenzähler" width="300" height="200" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7712-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7712-1024x682.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a> <a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7715.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-652 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7715-300x200.jpg" alt="Techem Wasserzähler" width="300" height="200" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7715-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7715-1024x682.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Der M-Bus-Master sollte in meinem Fall aus dem Raspberry und einem Pegelwandler bestehen. Pegelwandler gibt es fertig von verschiedenen Herstellen (<a href="http://www.relay.de/de/produkte/m-bus-master.html" target="_blank">Relay</a>, <a href="http://www.wachendorff-prozesstechnik.de/gateways-und-protokollwandler/m-bus/pegelwandler-seriell/Gateway-Protokollwandler-M-Bus-seriell-RS232-RS485-HD67021-HD67022.html" target="_blank">Wachendorff</a>). Diese sind aber, je nachdem für wieviele Slaves sie ausgelegt sind, relativ teuer.</p>
<p>Mein erster Ansatz war daher der Selbstbau eines Pegelwandlers inkl. RS232-Schnittstelle zum Anschluss an den Raspberry Pi. Im Netz gibt es verschiedene Beschreibungen einer<a href="http://www.m-bus.de/pw1.html" target="_blank"> einfachen Schaltung</a> und einige wenige Forumseinträge die sich mit dem Selbstbau eines Pegelwandlers bzw. generell mit M-Bus beschäftigen. Leider habe ich in keinem Forum eine Diskussion gefunden die bis zu einem funktionierenden System verfolgt wurde. Egal, ich habe es trotzdem mal versucht&#8230;</p>
<h3>&nbsp;</h3>
<h3>Selbstbau Pegelwandler</h3>
<p>Auf der Platine ist der Pegelwandler inkl. einer RSA232 Schnittstelle die aus einem MAX3232 besteht. Die +/-15 Volt für den Pegelwandler habe ich mittels DCDC-Wandler IH0515S der Fa. XP Power erzeugt. Dieses Bauteil kann man z.B. bei <a href="http://de.farnell.com/xp-power/ih0515s/wandler-dc-dc-2w--15v/dp/8727929" target="_blank">Farnell</a> beziehen. Dann das Ganze auf Lochraster zusammen gelötet und mit dem Raspi und dem Wärmemengenzähler verbunden.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7707.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-664 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7707-300x200.jpg" alt="IMG_7707" width="300" height="200" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7707-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7707-1024x682.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a> <a href="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7708.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-665 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7708-300x200.jpg" alt="IMG_7708" width="300" height="200" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7708-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7708-1024x682.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/12/max3232.png"><img loading="lazy" decoding="async" class="alignnone wp-image-662 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/12/max3232-300x232.png" alt="max3232" width="300" height="232" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/max3232-300x232.png 300w, https://www.bubuxblog.de/wp-content/uploads/2014/12/max3232.png 694w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><a href="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7716.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-688 size-medium" src="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7716-300x200.jpg" alt="Lochrasterplan" width="300" height="200" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7716-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7716-1024x682.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>Damit der Raspberry das M-Bus Protokoll versteht bzw. auch den Pegelwandler korrekt anspricht, habe ich die Bibliotheken von <a title="rSCADA" href="http://www.rscada.se/libmbus/" target="_blank">rSCADA</a> genutzt. Die Quellen liessen sich problemlos auf dem Raspberry kompilieren. Im Ergebnis wurden verschiedene Binaries erzeugt um mit Slaves im Bus zu kommunizieren.</p>
<p>Meine ersten Versuche waren jedoch nicht von Erfolg gekrönt. Es wurde kein M-Bus-Gerät gefunden. Bei der Fehlersuche habe ich zuerst die serielle Schnittstelle separat getestet und mit Minicom über den Raspberry mit einem anderen Linux-Rechner kommuniziert. Das hat funktioniert. Die weitere Fehlersuche z.B. am M-Bus-Ausgang sind allerdings am fehlenden Oszilloskop gescheitert, da das Multimeter mich nicht wirklich weiter brachte.</p>
<p>Etwas niedergeschlagen habe ich dann nach drei Tagen erfolgloser Fehlersuche nochmal nach fertigen Pegelwandlern gesucht und ein relativ preiswertes Gerät gefunden und kurzerhand gekauft. Damit fiel die Fehlerquelle &#8222;Pegelwandler&#8220; schon mal weg.</p>
<h3>&nbsp;</h3>
<h3>Versuch mit gekauftem Pegelwandler</h3>
<p>Der neue Pegelwandler benötigt zum Anschluss an den Raspberry Pi auch eine RS232 Schnittstelle. Um mir diesmal das Löten zu ersparen, hab ich erstmal den kompletten Versuchsaufbau auf einem Breadboard gesteckt. Der Pegelwandler läuft mit einer Spannung von 12-24 V DC weshalb ich den DCDC-Wandler aus dem ersten Versich auch nicht benötige.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7739.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-650" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7739-1024x682.jpg" alt="IMG_7739" width="768" height="511" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7739-1024x682.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7739-300x200.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Die Binaries von rSCADA unterscheiden zwischen TCP- und seriell angeschlossenen M-Bus-Pegelwandlern. Da meiner seriell angeschlossen ist, benutze ich &#8222;mbus-serial-scan&#8220; um nach angeschlossenen Slaves im Bus zu suchen.<br />
Als Argumente übergebe ich &#8222;-d&#8220; für den Debugmodus, &#8222;-b 2400&#8220; um 2400 Baud zu nutzen und &#8222;/dev/ttyAMA0&#8220; als serielle Schnittstelle des Pi.</p>
<p>Zu meiner Überraschung wurde direkt ein Slave (der Wasserzähler) erkannt. Sehr schön&#8230;</p>
<pre>pi@raspberry2 ~/libmbus-0.8.0/bin $ ./mbus-serial-scan -d -b 2400 /dev/ttyAMA0
Scanning primary addresses:
0 [2014-12-13 13:59:21] SEND (005): 10 40 00 40 16
[2014-12-13 13:59:21] RECV (001): E5

Found a M-Bus device at address 0
1 [2014-12-13 13:59:22] SEND (005): 10 40 01 41 16
2 [2014-12-13 13:59:22] SEND (005): 10 40 02 42 16
3 [2014-12-13 13:59:22] SEND (005): 10 40 03 43 16
4 [2014-12-13 13:59:22] SEND (005): 10 40 04 44 16
5 [2014-12-13 13:59:23] SEND (005): 10 40 05 45 16
6 [2014-12-13 13:59:23] SEND (005): 10 40 06 46 16
7 [2014-12-13 13:59:23] SEND (005): 10 40 07 47 16
...
</pre>
<p>Hat man alle angeschlossenen M-Bus-Geräte per Scan identifiziert, können mit einem weiteren Programm die Daten des Gerätes ausgelesen werden. Auch hier gibt es wieder das Argument &#8222;-d&#8220; für den Debugmodus, &#8222;-b&#8220; zur Einstellung der Baudrate, das Device der seriellen Schnittstelle und die vom Scan ermittelte Device-Nummer. Im Fall meines Wasserzählers ist das die &#8222;0&#8220;. Die Daten der Slaves werden in einer einfachen XML-Struktur zurück geliefert.</p>
<pre class="">./mbus-serial-request-data -d -b 2400 /dev/ttyAMA0 0
[2014-12-13 14:06:46] SEND (005): 10 5B 00 5B 16
[2014-12-13 14:06:47] RECV (084): 68 4E 4E 68 08 00 72 12 37 16 46 68 50 49 07 B6 00 00 00 0C 14 53 42 00 00 8C 10 12 35 53 42 00 0B 3B 00 00 00 8C 20 14 53 42 00 00 8C 30 14 00 00 00 00 04 6D 21 0F CD 1C 4C 14 02 00 00 00 42 6C BF 1C 42 EC 7E DF 1C 0A 92 2A 00 10 0A 92 2B 00 10 3E 16
mbus_frame_print: Dumping M-Bus frame [type 4, 84 bytes]: 68 4E 4E 68 08 00 72 12 37 16 46 68 50 49 07 B6 00 00 00 0C 14 53 42 00 00 8C 10 12 35 53 42 00 0B 3B 00 00 00 8C 20 14 53 42 00 00 8C 30 14 00 00 00 00 04 6D 21 0F CD 1C 4C 14 02 00 00 00 42 6C BF 1C 42 EC 7E DF 1C 0A 92 2A 00 10 0A 92 2B 00 10 3E 16
<MBusData>

<SlaveInformation>
<Id>46163712</Id>
<Manufacturer>TCH</Manufacturer>
<Version>73</Version>
<ProductName></ProductName>
<Medium>Water</Medium>
<AccessNumber>182</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>

<DataRecord id="0">
<Function>Instantaneous value</Function>
<Unit>Volume (1e-2&nbsp; m^3)</Unit>
<Value>4253</Value>
<Timestamp>2014-12-13T14:06:47</Timestamp>
</DataRecord>

<DataRecord id="1">
<Function>Instantaneous value</Function>
<Unit>Volume (1e-4&nbsp; m^3)</Unit>
<Value>425335</Value>
<Timestamp>2014-12-13T14:06:47</Timestamp>
</DataRecord>
...
</pre>
<p>Da es auf Anhieb funktioniert hat, habe ich die serielle Schnittstelle auf Lochraster gebannt und der Pegelwandler wird mittels kleinem 12V-Netzteil betrieben. Dann Raspberry Pi, Pegelwandler und Platine im Netzwerkschrank verstauen&#8230;</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7742.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-661" src="http://blog.bubux.de/wp-content/uploads/2014/12/IMG_7742-1024x670.jpg" alt="MAX3232" width="768" height="502" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7742-1024x670.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/12/IMG_7742-300x196.jpg 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<h3>&nbsp;</h3>
<h3>Software</h3>
<p>Den Stand des Wasserzählers protokolliere ich nun einmal täglich um 23:59 Uhr. Das wird per Cronjob und einem kleinen PHP-Script erledigt. Warum PHP? Weil ich zu ungeduldig war und das schnell umsetzen wollte und schon das ein oder andere ähnliche PHP-Script fertig hatte.</p>
<p>Das Script ruft das Binary wie oben erklärt per <em>shell_exec</em> auf. Ab dem XML-Teil parse ich die Ausgabe und extrahiere die relevanten Informationen die dann in eine MySQL-Tabelle geschrieben werden.</p>
<p>[cc lang=&#8220;php&#8220;]<br />
<?
//***********************************
//Wasserzaehler mit der ID:0 auslesen
//***********************************
$output = shell_exec("sudo /home/odroid/libmbus-0.7.0/bin/mbus-serial-request-data -d -b 2400 /dev/ttyS1 0");
$xmloutput=substr($output,strpos($output,'<MBusData>&#8218;));<br />
$xmloutput = new SimpleXMLElement($xmloutput);<br />
$zaehlerID=$xmloutput->SlaveInformation->Id;<br />
$zaehlerStand=$xmloutput->DataRecord[1]->Value/10000;</p>
<p>$mysqlhost=&#8220;&#8220;;<br />
$mysqluser=&#8220;&#8220;;<br />
$mysqlpwd=&#8220;&#8220;;<br />
$connection=mysql_connect($mysqlhost,$mysqluser,$mysqlpwd) or die (&#8222;Verbindungsversuch fehlgeschlagen&#8220;);<br />
$mysqldb=&#8220;&#8220;;<br />
mysql_select_db($mysqldb,$connection) or die(&#8222;Konnte die Datenbank nicht waehlen.&#8220;);<br />
$sql = &#8222;INSERT INTO wasserzaehler (timestamp,zaehlerid,zaehlerstand) VALUES (CURRENT_TIMESTAMP,$zaehlerID,$zaehlerStand)&#8220;;<br />
$query = mysql_query($sql) or die(&#8222;Anfrage 1 nicht erfolgreich&#8220;);<br />
?>;<br />
[/cc]</p>
<p>Da ich auf meiner Webseite aber nicht nur den absoluten Wasserverbrauch darstellen möchte sondern auch den Tagesverbrauch, kommt folgendes SQL zum Einsatz. Hier werden die Einträge aus zwei aufeinanderfolgenden Zeilen subtrahiert um die Differenz zum Vortag zu bestimmen.</p>
<pre>SELECT 
    CASE DATE_FORMAT(wz1.timestamp,'%w')
	WHEN 0 THEN 'Sonntag'
	WHEN 1 THEN 'Montag'
	WHEN 2 THEN 'Dienstag'
	WHEN 3 THEN 'Mittwoch'
	WHEN 4 THEN 'Donnerstag'
	WHEN 5 THEN 'Freitag'
	WHEN 6 THEN 'Samstag'
    ELSE 'fehler' END,
	wz1.zaehlerstand - IFNULL(wz2.zaehlerstand, 0) AS verbrauch
    FROM wasserzaehler wz1
    LEFT JOIN wasserzaehler wz2
    ON wz2.timestamp = (
	SELECT MAX(timestamp)
	FROM wasserzaehler wz3
	WHERE wz3.timestamp &lt; wz1.timestamp
   )
ORDER BY wz1.timestamp
</pre>
<p>Das Ergbnis sieht dann wie folgt aus. Ich war etwas erschreckt wieviel Wasser man an machen Tagen verbraucht!</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/12/wasserzaehler_screenshot.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-682" src="http://blog.bubux.de/wp-content/uploads/2014/12/wasserzaehler_screenshot.png" alt="wasserzaehler_screenshot" width="544" height="513" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/12/wasserzaehler_screenshot.png 544w, https://www.bubuxblog.de/wp-content/uploads/2014/12/wasserzaehler_screenshot-300x282.png 300w" sizes="auto, (max-width: 544px) 100vw, 544px" /></a></p>
<h3>&nbsp;</h3>
<h3>Selbstgebauter Pegelwandler</h3>
<p>Da ich ja nun weiß das es generell funktioniert und der Fehler meiner ersten Lösung definitiv im selbstgebauten Pegelwandler liegt, werde ich den Versuch mit dem Selbstbau demnächst nochmal angehen.</p>
<p>&nbsp;</p>
<p>Sobald der Wärmemengenzähler in den Wasserlauf des Kachelofens eingebaut ist, werde ich nochmal einen kurzen Beitrag schreiben. Das Prinzip des Auslesens ist ja analog zum Wasserzähler aber vielleicht gibt es in den zurückgelieferten Daten unterschiede.</p>
<p>&nbsp;</p>
<p>Viel Spaß mit dem M-Bus!</p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/m-bus-wasserzaehler/feed/</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title>Stabiler 24/7 Betrieb des Raspberry &#8211; Netzwerk neu starten</title>
		<link>https://www.bubuxblog.de/stabiler-247-betrieb-des-raspberry-netzwerk-neu-starten/</link>
					<comments>https://www.bubuxblog.de/stabiler-247-betrieb-des-raspberry-netzwerk-neu-starten/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 23 Nov 2014 15:19:16 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=631</guid>

					<description><![CDATA[Zum Thema stabiler 24/7-Betrieb des Raspberry PI´s gibt es viele gute Blogeinträge die sich mit dem richtigen Netzteil, dem korrektem Umgang von Linux mit der SD-Karte, evtl. Hitzeprobleme und Netzwerkproblemen aufgrund zu hoher Last beschäftigen. Siehe z.B.: hier oder hier Unter anderem wird auch immer wieder der Hardware-Watchdog des PI genannt. Diesen Watchdog hab ich [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Zum Thema stabiler 24/7-Betrieb des Raspberry PI´s gibt es viele gute Blogeinträge die sich mit dem richtigen Netzteil, dem korrektem Umgang von Linux mit der SD-Karte, evtl. Hitzeprobleme und Netzwerkproblemen aufgrund zu hoher Last beschäftigen.</p>
<p>Siehe z.B.: <a href="http://www.datenreise.de/raspberry-pi-stabiler-24-7-dauerbetrieb/" target="_blank">hier</a> oder <a href="http://elinux.org/R-Pi_Troubleshooting#Networking" target="_blank">hier</a></p>
<p>Unter anderem wird auch immer wieder der Hardware-Watchdog des PI genannt. Diesen Watchdog hab ich auch aktiviert, da ich in der Vergangenheit immer wieder Probleme mit dem Netzwerk (Stichwort <a title="Raspberry Forum" href="http://www.raspberrypi.org/forums/viewtopic.php?t=11971&amp;p=129570http://" target="_blank">smsc95xx errors</a> und weiterführende Links) hatte. Dies äusserte sich immer wieder mit dem Einfrieren des PI. Der Watchdog machte im Fehlerfall einen Restart und gut war. Nach den letzten Firmwareupdates hat sich die Frequenz der Restarts auch stark verringert.</p>
<p>Dann aber war mein Raspi plötzlich per SSH nicht mehr erreichbar und auch die Webseite wurde nicht mehr angezeigt. Seltsamerweise erfolgte kein Neustart durch den Watchdog. Da ich den Raspi Headless betreibe, blieb mir nicht viel anderes übrig als ihn einfach vom Strom zu trennen und wieder anzuschliessen. Danach lief alles wieder einwandfrei. Leider häuften sich diese Probleme so das es mir zu nervig wurde, ständig den Strom zu kappen. Schliesslich ist mein Raspi ja ein Server und soll gescheit laufen.</p>
<p>Nach den Neustarts ist mir aber auch aufgefallen, das die Daten der Leseköpfe lückenlos in die Datenbank geschrieben wurden. Anscheind lief der Raspi noch und nur das Netzwerk war nicht verfügbar.</p>
<p>Das Problem war teilweise im Message-Log zu sehen:</p>
<p><code><br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.095475] usb 1-1: USB disconnect, device number 10<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.095493] usb 1-1.1: USB disconnect, device number 11<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.095887] smsc95xx 1-1.1:1.0 eth0: unregister 'smsc95xx' usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.095954] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.136136] usb 1-1.2: USB disconnect, device number 12<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.136650] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.136748] cp210x 1-1.2:1.0: device disconnected<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.137275] usb 1-1.3: USB disconnect, device number 13<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.137769] ftdi_sio ttyUSB1: FTDI USB Serial Device converter now disconnected from ttyUSB1<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.137876] ftdi_sio 1-1.3:1.0: device disconnected<br />
Nov 22 12:51:10 raspberrypi kernel: [1279051.295583] Indeed it is in host mode hprt0 = 00021501<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.575374] usb 1-1: new full-speed USB device number 14 using dwc_otg<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.575636] Indeed it is in host mode hprt0 = 00021501<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.825598] usb 1-1: not running at top speed; connect to a high speed hub<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.825950] usb 1-1: New USB device found, idVendor=0424, idProduct=9512<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.825971] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.836520] hub 1-1:1.0: USB hub found<br />
Nov 22 12:51:11 raspberrypi kernel: [1279051.836765] hub 1-1:1.0: 3 ports detected<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.115374] usb 1-1.1: new full-speed USB device number 15 using dwc_otg<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.215553] usb 1-1.1: not running at top speed; connect to a high speed hub<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.215947] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.215973] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.219107] smsc95xx v1.0.4<br />
Nov 22 12:51:11 raspberrypi kernel: [1279052.280966] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:bd:01:0b<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.375552] usb 1-1.2: new full-speed USB device number 16 using dwc_otg<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.477284] usb 1-1.2: New USB device found, idVendor=10c4, idProduct=ea60<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.477318] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.477334] usb 1-1.2: Product: CP2104 USB to UART Bridge Controller<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.477349] usb 1-1.2: Manufacturer: Silicon Labs<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.477362] usb 1-1.2: SerialNumber: 0065B522<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.479039] cp210x 1-1.2:1.0: cp210x converter detected<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.479519] usb 1-1.2: cp210x converter now attached to ttyUSB0<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.491197] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.535606] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.555550] usb 1-1.3: new full-speed USB device number 17 using dwc_otg<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.640093] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.661511] usb 1-1.3: New USB device found, idVendor=0403, idProduct=6001<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.661547] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.661563] usb 1-1.3: Product: FT232R USB UART<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.661577] usb 1-1.3: Manufacturer: FTDI<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.661590] usb 1-1.3: SerialNumber: A4009G5A<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.664914] ftdi_sio 1-1.3:1.0: FTDI USB Serial Device converter detected<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665117] usb 1-1.3: Detected FT232RL<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665314] usb 1-1.3: Number of endpoints 2<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665337] usb 1-1.3: Endpoint 1 MaxPacketSize 64<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665353] usb 1-1.3: Endpoint 2 MaxPacketSize 64<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665367] usb 1-1.3: Setting MaxPacketSize 64<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.667714] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB1<br />
Nov 22 12:51:13 raspberrypi kernel: [1279054.248030] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1<br />
</code></p>
<p>An dem Raspi hängt der Lesekopf für den Stromzähler und für die Heizung. Der Raspi scheint die USB-Ports aus irgendwelchen Gründen unmotiviert neu zu starten. Das funktioniert für die USB-Ports immer erfolgreich, aber das Netzwerk blieb dabei gelegentlich auf der Strecke (obwohl in der letzten Zeile gegenteiliges behauptet wird). Das hängt anscheinend immer noch mit Fehlern im smsc95xx zusammen.</p>
<h2>Neustart des Netzwerkinterfaces</h2>
<p>Nun gut&#8230;dann muss das Netzwerk halt nochmal gestartet werden. Folgendes Bash-Script rufe ich alle 10 Minuten per Cron auf. Ist das Netzwerk verfügbar, passiert nichts. Ist das Netzwerk nicht verfügbar wird versucht des Interface neu zu starten. Gelingt auch das nicht, wird der Raspi rebootet. Mittels <em>logger</em> wird der Neustart in /var/log/messages geloggt.</p>
<p>[cc lang=&#8220;bash&#8220; lines=&#8220;40&#8243;]<br />
#!/bin/sh<br />
IP_TO_TEST=&#8220;<ip_die_testweise_gepingt_werden_soll>&#8220;<br />
PING_COUNT=1<br />
PING=&#8220;/bin/ping&#8220;<br />
IFUP=&#8220;/sbin/ifup&#8220;<br />
IFDOWN=&#8220;/sbin/ifdown &#8211;force&#8220;<br />
INTERFACE=&#8220;eth0&#8243;  #Device angeben welches geprüft werden soll<br />
LOCKF=&#8220;/opt/lockf&#8220;<br />
$PING -c $PING_COUNT $IP_TO_TEST > /dev/null 2> /dev/null<br />
if [ $? -ge 1 ]<br />
then<br />
    logger &#8222;$INTERFACE scheint unten zu sein, versuche restart&#8230;&#8220;<br />
        if [ -e $LOCKF]<br />
        then<br />
                logger &#8222;$INTERFACE immer noch unten, NEUSTART&#8230;&#8220;<br />
                rm -f $LOCKF 2>/dev/null<br />
                sudo reboot<br />
        else<br />
                touch $LOCKF<br />
                logger $(sudo $IFDOWN $INTERFACE)<br />
                sleep 10<br />
                logger $(sudo $IFUP $INTERFACE)<br />
        fi<br />
else<br />
    #logger &#8222;$INTERFACE laueft&#8220;<br />
    rm -f $LOCKF 2>/dev/null<br />
fi<br />
[/cc]</p>
<p>Im Log sieht man dann den erfolgreichen Neustart des Netzwerkinterfaces durch das obige Bach-Script.</p>
<p><code><br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665353] usb 1-1.3: Endpoint 2 MaxPacketSize 64<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.665367] usb 1-1.3: Setting MaxPacketSize 64<br />
Nov 22 12:51:12 raspberrypi kernel: [1279052.667714] usb 1-1.3: FTDI USB Serial Device converter now attached to ttyUSB1<br />
Nov 22 12:51:13 raspberrypi kernel: [1279054.248030] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1<br />
Nov 22 13:00:02 raspberrypi logger: eth0 scheint unten zu sein, versuche restart...<br />
Nov 22 13:00:09 raspberrypi kernel: [1279589.925658] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 13:00:09 raspberrypi kernel: [1279590.124240] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup<br />
Nov 22 13:00:09 raspberrypi logger: Stopping NTP server: ntpd. Starting NTP server: ntpd.<br />
Nov 22 13:00:11 raspberrypi kernel: [1279591.726167] smsc95xx 1-1.1:1.0 eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1<br />
Nov 22 13:00:32 raspberrypi logger: Stopping NTP server: ntpd. Starting NTP server: ntpd.<br />
</code></p>
<p>Seitdem läuft mein PI seit 16 Tagen durch. Mal sehen wie lange er ohne Neustart durchhält!</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/stabiler-247-betrieb-des-raspberry-netzwerk-neu-starten/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Gaszähler auslesen</title>
		<link>https://www.bubuxblog.de/gaszaehler-auslesen/</link>
					<comments>https://www.bubuxblog.de/gaszaehler-auslesen/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Wed, 12 Nov 2014 20:48:44 +0000</pubDate>
				<category><![CDATA[Haustechnik]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Gaszähler]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=600</guid>

					<description><![CDATA[Nachdem meine Versuche den M-BUS Wärmemengen- und Wasserzähler auszulesen vorerst beendet sind und ich auf den bestellten M-BUS-Pegelwandler warte, habe ich mich dem Auslesen des Gaszählers gewidmet. Das sollte erfolgsversprechender sein&#8230; Als ich dann endlich den vor langer Zeit bestellten Reed-Kontakt mk 471 b (z.B. bei Reichelt) wieder gefunden habe, konnte es losgehen. Der Gaszähler [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nachdem meine Versuche den M-BUS Wärmemengen- und Wasserzähler auszulesen vorerst beendet sind und ich auf den bestellten M-BUS-Pegelwandler warte, habe ich mich dem Auslesen des Gaszählers gewidmet. Das sollte erfolgsversprechender sein&#8230;</p>
<p>Als ich dann endlich den vor langer Zeit bestellten Reed-Kontakt <strong>mk 471 b</strong> (z.B. bei <a title="Reichelt" href="http://www.reichelt.de/index.html?ACTION=3;ARTICLE=27681;SEARCH=MK%20471B" target="_blank">Reichelt</a>) wieder gefunden habe, konnte es losgehen.</p>
<p>Der Gaszähler hat an der letzten Stelle des Zählwerkes bei der &#8222;0&#8220; einen Magneten wodurch der Reedkontakt bei jeder vollen Umdrehung einmal geschlossen wird. Diese Impulse gilt es mit einem Raspberry über einen GPIO zu zählen.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7735.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-603" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7735-1024x707.jpg" alt="IMG_7735" width="604" height="417" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7735-1024x707.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7735-300x207.jpg 300w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p>Den Reedkontakt habe ich natürlich wieder professionell mit Klebeband fixiert&#8230;hält!</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7734.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-602" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7734-1024x682.jpg" alt="IMG_7734" width="604" height="402" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7734-1024x682.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7734-300x200.jpg 300w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p>Angeschlossen ist der Reedkontakt über eine Zwillingslitze direkt an einen GPIO und Ground des Raspberry PI. Pull-Up braucht es keinen. Dieser wird per Software aktiviert.</p>
<p>Den GPIO lese ich mit einem Python-Script aus welches in einer Endlosschleife ausgeführt wird und den GPIO (im Beispiel Pin &#8222;21&#8220;) jede Sekunde abfragt. Sekundenweise sollte reichen, da ich nicht hoffe das unser Gaszähler so schnell läuft. Immer wenn der Reed geschlossen wird, wird eine &#8222;1&#8220; und der Zeitstempel in die Spalten &#8222;timestamp&#8220; und &#8222;zaehlerstand&#8220; einer MySQL-Tabelle geschrieben. Das passiert immer nur beim Wechsel des Reed von &#8222;Offen&#8220; nach &#8222;Geschlossen&#8220;. Sollte der Zähler genau mit dem Magnet am Reed stehen bleiben, passiert nichts.</p>
<p>[cc lang=&#8220;python&#8220;]</p>
<p>import RPi.GPIO as GPIO<br />
import time<br />
import MySQLdb</p>
<p>GPIO.setmode(GPIO.BOARD)<br />
GPIO.setwarnings(False)</p>
<p># GPIO definieren<br />
REED_gas = 21<br />
# definierten GPIO als Eingang setzen<br />
GPIO.setup(REED_gas, GPIO.IN, pull_up_down=GPIO.PUD_UP)</p>
<p>status_alt=1<br />
while True:<br />
    status_aktuell = GPIO.input(REED_gas)<br />
    # REEDKONTAKT geoeffnet<br />
    if status_aktuell == 1:<br />
        #print &#8222;Kontakt offen&#8220;<br />
        status_alt=GPIO.input(REED_gas)<br />
        # REEDKONTAKT geschlossen<br />
    elif status_aktuell==0:<br />
        #print &#8222;Kontakt geschlossen&#8220;<br />
        if status_alt!=status_aktuell:<br />
            status_alt=GPIO.input(REED_gas)<br />
            # Datenbankverbindung<br />
            db = MySQLdb.connect(host=&#8220;<host>&#8222;, user=&#8220;<benutzer>&#8222;, passwd=&#8220;<passwort>&#8222;, db=&#8220;<datenbank>&#8222;)<br />
            # Impuls in Datenbank eintragen<br />
            cursor = db.cursor()<br />
            cursor.execute(&#8222;&#8220;&#8220;INSERT INTO gaszaehler (timestamp,zaehlerstand) VALUES (CURRENT_TIMESTAMP,1)&#8220;&#8220;&#8220;)<br />
            db.commit()<br />
            cursor.close()<br />
    time.sleep(1)<br />
[/cc]</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7737.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-604" src="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7737-1024x682.jpg" alt="IMG_7737" width="604" height="402" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7737-1024x682.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/11/IMG_7737-300x200.jpg 300w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p>Da das Python-Script sich ab und an mal verabschiedet, starte ich es per Cronjob wieder neu falls der Prozess nicht mehr vorhanden ist. Ich sollte vielleicht lieber das Problem im Python-Script suchen und das ein oder andere Try&#038;Catch einbauen, aber es geht auch erstmal so&#8230;</p>
<pre>#!/bin/sh
if ps -ef | grep -v grep | grep gaszaehler.py ; then
&nbsp;&nbsp;&nbsp; exit 0
else
&nbsp;&nbsp;&nbsp; sudo python /usr/local/bin/gaszaehler.py &
&nbsp;&nbsp; &nbsp;logger "gaszaehler.py neu gestartet"
&nbsp;&nbsp;&nbsp; exit 0
fi</pre>
<p>Zur Auswertung benutze ich dann folgende SQL-Querys:</p>
<pre>
SELECT sum(zaehlerstand) FROM gaszaehler
</pre>
<p>Hiermit werden alle gespeicherten &#8222;Ticks&#8220; summiert. Dazu muss noch ein Startwert addiert werden da der Gaszähler ja schon eine zeitlang lief.<br />
Dieser Startwert muss ggf. ab und an mal korrigiert werden falls der Raspi mal einen Umlauf des Zählers nicht mitbekommt weil z.B. der unwahrscheinliche Fall eintritt, dass das Klebeband nicht gehalten hat oder wahrscheinlicher, das Python-Script bzw. der ganze Raspi nicht mehr läuft. Den Startwert gebe ich als eine Zahl <strong>inkl.</strong> der drei Nachkommastellen an und addiere das Ergebnis der SQL-Query dazu. Um die richtige &#8222;Einheit&#8220; kümmere ich mich in der Ausgabe auf der PHP-Seite mit folgender PHP-Zeile:</p>
<p>[cc lang=&#8220;php&#8220;]<br />
$sql = &#8222;SELECT sum(zaehlerstand) FROM gaszaehler&#8220;;<br />
$query = mysql_query($sql) or die(&#8222;Anfrage nicht erfolgreich&#8220;);<br />
while ($wert = mysql_fetch_array($query)) {<br />
	$gesamtwert=($wert[0]*10)+$gas_startwert;<br />
}<br />
$gesamtwert=substr($gesamtwert,0,-3).&#8220;.&#8220;.substr($gesamtwert,-3,2);<br />
[/cc]</p>
<p>Der Faktor 10 muss hier beachtet werden, da ja nur alle 0,01m&sup3; Impulse gezählt werden und ich den Startwert mit allen drei Nachkommastellen angegeben habe. Die zweite Zeile setzt das Komma in der Ausgabe an die richtige Stelle.</p>
<p>Eine tägliche Auswertung funktioniert z.B. mit folgender SQL-Query:</p>
<pre>
SELECT CASE DATE_FORMAT(timestamp,'%w')
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;    WHEN 0 THEN 'Sonntag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 1 THEN 'Montag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 2 THEN 'Dienstag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 3 THEN 'Mittwoch'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 4 THEN 'Donnerstag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 5 THEN 'Freitag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHEN 6 THEN 'Samstag'
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ELSE 'fehler' END,
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; sum(zaehlerstand)
FROM gaszaehler
WHERE DATE(timestamp)>=DATE_SUB(NOW(),INTERVAL 7 DAY)
GROUP BY day(timestamp)
ORDER BY timestamp
</pre>
<p>Auch hier bekommt man den korrekten Wert in m&sup3; durch einfache Kommaverschieberei in der Ausgabe. Den Faktor 10 benötigt man bei der täglichen Auswertung nicht:</p>
<p>[cc lang=&#8220;php&#8220;]substr(($wert[1]),0,-2).&#8220;.&#8220;.substr(($wert[1]),-2)[/cc]</p>
<p>In der Webseite sieht das folgendermaßen aus:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/11/gaszaehler_screenshot.png"><img loading="lazy" decoding="async" src="http://blog.bubux.de/wp-content/uploads/2014/11/gaszaehler_screenshot.png" alt="gaszaehler_screenshot" width="553" height="185" class="alignnone size-full wp-image-623" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/11/gaszaehler_screenshot.png 553w, https://www.bubuxblog.de/wp-content/uploads/2014/11/gaszaehler_screenshot-300x100.png 300w" sizes="auto, (max-width: 553px) 100vw, 553px" /></a></p>
<p>Das alles läuft erst drei Tage und es gibt bestimmt noch Verbesserungspotential aber ein Anfang ist gemacht.</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/gaszaehler-auslesen/feed/</wfw:commentRss>
			<slash:comments>19</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Pi in Watchdog-Loop</title>
		<link>https://www.bubuxblog.de/raspberry-pi-in-watchdog-loop/</link>
					<comments>https://www.bubuxblog.de/raspberry-pi-in-watchdog-loop/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 02 Aug 2014 18:59:35 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=560</guid>

					<description><![CDATA[Da der Raspi bei mir durch die oft beschriebenen Probleme mit dem smsc95xx relativ wacklig auf dem Netzwerk und den beiden USB-Ports ist und dadurch in unregelmäßigen Abständen unmotiviert die Arbeit einstellt, hatte ich den Hardware-Watchdog des Raspi aktiviert. Dieser veranlasst in meinem Fall einen Neustart des Systems wenn länger als 15 Minuten nichts mehr [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Da der Raspi bei mir durch die oft beschriebenen Probleme mit dem smsc95xx relativ wacklig auf dem Netzwerk und den beiden USB-Ports ist und dadurch in unregelmäßigen Abständen unmotiviert die Arbeit einstellt, hatte ich den Hardware-Watchdog des Raspi aktiviert. Dieser veranlasst in meinem Fall einen Neustart des Systems wenn länger als 15 Minuten nichts mehr in eine bestimmte Datei geschrieben wird. Wie die Einrichtung des Watchdog genau funktioniert, ist z.B. <a href="http://www.datenreise.de/raspberry-pi-stabiler-24-7-dauerbetrieb/" target="_blank">hier</a> beschrieben.</p>
<p>Diese Woche war es nun plötzlich so, das der Raspi in einer Endlosschleife bootete und anschliessend sofort wieder ein Signal zum Shutdown bekam, bootete, shutdown, &#8230;.</p>
<p>Meine erste Vermutung war das Netzteil. Den gleichen Effekt gab es aber auch mit einem anderen Netzteil. Der Ersatz-Raspi mit der gleichen SD-Karte rebootete auch ständig. Also kein Hardware-Fehler!</p>
<p>Also Monitor angeschlossen und mal geschaut was da beim booten so passiert. Das letzte was der Raspi so von sich gab bevor er wieder neu startete war:</p>
<pre><code>WDT device closed unexpectedly.  WDT will not stop!</code></pre>
<p>WDT ist der Watchdog Timer. Dieser schien sich selbständig gemacht zu haben. Nun hieß es also irgendwie diesen Watchdog zu stoppen. Die Zeit zwischen einem möglichen Login, Befehl absetzen etc. ist aber so kurz, das ich es vor einem Shutdown nie geschafft habe irgendwas sinnvolles auf der Konsole zu tun.</p>
<p>Abhilfe schafft z.B. das Programm &#8222;pLink&#8220;. Die plink.exe ist Teil von puTTy und unter Windows im gleichen Verzeichnis wie die putty.exe zu finden. Hiermit muss nicht erst eine gesonderte SSH-Verbindung zum Server aufgebaut werden, sondern es kann direkt der entsprechende Befehl abgesetzt werden.</p>
<p>In meinem Fall habe ich dem Watchdog um seine Konfiguration beraubt, wodurch dieser beim nächsten Neustart (der ja höchstwahrscheinlich ein paar Sekunden später erfolgt) nicht mehr gestartet wird.</p>
<pre>plink -ssh -pw &lt;passwort&gt; &lt;benutzer&gt;@&lt;pi_ip&gt; sudo mv /etc/watchdog.conf /etc/watchdog.alt</pre>
<p>Beraubt um seine Konfigdatei, sollte der Watchdog beim nächsten Restart nicht mehr starten. Gespannt hab ich ein paar Sekunden gewartet aber es kam kein Neustart mehr.</p>
<p>Woran es letztendlich gelegen hat das der Watchdog diesen immerwährenden Neustart erzwungen hat weiß ich noch nicht. Auch die Konfiguration des Watchdogs muss ich nochmal prüfen. Jedenfalls läuft der Raspi nun wieder!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/raspberry-pi-in-watchdog-loop/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Viessmann Heizung auslesen</title>
		<link>https://www.bubuxblog.de/viessmann-heizung-auslesen/</link>
					<comments>https://www.bubuxblog.de/viessmann-heizung-auslesen/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 27 Apr 2014 08:29:06 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Heizung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Optolink]]></category>
		<category><![CDATA[Raspberry PI]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<category><![CDATA[Viessmann]]></category>
		<category><![CDATA[Vitotronic]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=423</guid>

					<description><![CDATA[Wir haben eine Viessmann Vitodens 200-W Gastherme inkl. Solaranlage die über eine Vitotronic verfügt. Die Vitotronic hat eine optische Schnittstelle (Optolink) über die z.B. ein Heizungsmonteur verschiedene Parameter der Anlage auslesen und auch setzen kann. Dafür benötigt man normalerweise den entsprechenden Lesekopf und eine passende Software der Fa. Viessmann. Auf https://github.com/openv/openv/ gibt es aber auch [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Wir haben eine Viessmann Vitodens 200-W Gastherme inkl. Solaranlage die über eine Vitotronic verfügt. Die Vitotronic hat eine optische Schnittstelle (Optolink) über die z.B. ein Heizungsmonteur verschiedene Parameter der Anlage auslesen und auch setzen kann.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/vitotronic.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-434" src="http://blog.bubux.de/wp-content/uploads/2014/04/vitotronic.jpg" alt="vitotronic" width="570" height="250" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/vitotronic.jpg 570w, https://www.bubuxblog.de/wp-content/uploads/2014/04/vitotronic-300x131.jpg 300w" sizes="auto, (max-width: 570px) 100vw, 570px" /></a></p>
<p>Dafür benötigt man normalerweise den entsprechenden Lesekopf und eine passende Software der Fa. Viessmann.</p>
<p>Auf <a href="https://github.com/openv/openv/" target="_blank" rel="noopener noreferrer">https://github.com/openv/openv/</a> gibt es aber auch eine andere Lösung! Die Jungs dort haben viel Arbeit in die &#8222;Entschlüsselung&#8220; des Viessmann-Protokolls gelegt und verschiedene Anwendungen zur einfachen Kommunikation mit der Heizung entwickelt.</p>
<p><span style="color: #3366ff;">An dieser Stelle nochmal meinen Dank an dieses hervorragende Forum!</span></p>
<p>Unter den verschiedenen Bauanleitungen für die Leseköpfe habe ich mich für die <a href="https://github.com/openv/openv/wiki/Bauanleitung-USB" target="_blank" rel="noopener noreferrer">USB-Variante</a> entschieden. Mein Raspi hat ja noch einen USB-Anschluss frei und kann neben der <a title="Raspberry Pi – eHZ auslesen" href="http://blog.bubux.de/?p=89">Stromzählung</a> und der <a title="Raspberry PI – Heimautomatisierung mit COC, Homematic &amp; FHEM" href="http://blog.bubux.de/?p=153">Homematic-Steuerung</a> auch noch die Heizung auslesen. Nicht das ihm langweilig wird&#8230;</p>
<p>Das Platinchen muss über die V-Ausfräsung hinter der Klappe befestigt werden. Das habe ich dann &#8222;professionell&#8220; mit einem Papp-V und Tape erledigt. Hält!!</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/platine_frei.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-437" src="http://blog.bubux.de/wp-content/uploads/2014/04/platine_frei-1024x768.jpg" alt="platine_frei" width="604" height="453" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/platine_frei-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/04/platine_frei-300x225.jpg 300w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/platine_tape.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-438" src="http://blog.bubux.de/wp-content/uploads/2014/04/platine_tape-1024x768.jpg" alt="platine_tape" width="604" height="453" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/platine_tape-1024x768.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2014/04/platine_tape-300x225.jpg 300w" sizes="auto, (max-width: 604px) 100vw, 604px" /></a></p>
<p><span style="color: #0000ff;">Ich nutze den</span> <a href="https://github.com/openv/openv/" target="_blank" rel="noopener noreferrer">vcontrold</a> <span style="color: #0000ff;">und da</span> <a href="https://github.com/openv/openv/wiki/vcontrold-mit-Raspberry-Pi" target="_blank" rel="noopener noreferrer">hier </a><span style="color: #0000ff;">eine perfekte Anleitung zur Installation dieser Komponente auf dem Raspberry PI beschrieben ist, will ich auf die Installation und Konfiguration des Daemons auch nicht näher eingehen.</span></p>
<p>Der Daemon bietet eine Schnittstelle die z.B. mittels Telnet abgefragt werden kann. Ich nutze die Template-Möglichkeit (wird z.B. <a href="https://github.com/openv/openv/wiki/cygwin" target="_blank" rel="noopener noreferrer">hier </a>erklärt) um mehrere Heizungswerte auszulesen und die gelieferten Werte weiter verarbeiten zu können. Dazu wird bei mir folgendes Script (<em>update.sh)</em> alle 6 Minuten per Cron aufgerufen:</p>
<pre class="">if [ !$(pgrep vclient) ]
then vclient -h localhost:3001 -f /opt/vcontrold/vc-commands.txt -t /opt/vcontrold/update.tmpl -x /opt/vcontrold/update.sh
fi</pre>
<p>Der Eintrag in der Crontab sieht dann folgendermaßen aus:</p>
<pre class="">*/6 * * * * sudo /opt/vcontrold/update.sh</pre>
<p>Die Datei <em>vc-commands.txt</em> enthält eine Liste alle Werte die ausgelesen werden sollen. Diese Werte müssen auch in der &#8222;<a href="https://github.com/openv/openv/wiki/Vorschlag__Vito-Masterdateien" target="_blank" rel="noopener noreferrer">vito.xml</a>&#8220; definiert sein.</p>
<pre>getTempA
getTempWWist
getTempKist
getTempKol
getTempSpu
getBrennerStarts
getBrennerStunden1
getSolarStunden
getSolarLeistung
getPumpeStatusSolar
...</pre>
<p>In der Datei <em>update.tmpl </em>werden die zurück gelieferten Werte in Variablen geschrieben und können dann beliebig weiter verarbeitet werden (z.B. eine Prüfung ob ein Wert zurück gegeben wurde).</p>
<pre class="">if&nbsp; [ "x$E1" != x ]; then
     echo -n `date`&nbsp; &gt;&gt;/tmp/vc-err.txt
     echo "es ist ein Fehler aufgetreten: $C1:$E1" &gt;&gt;/tmp/vc-err.txt
     exit 1;
fi
if&nbsp; [ "x$E2" != x ]; then
     echo -n `date`&nbsp; &gt;&gt;/tmp/vc-err.txt
     echo "es ist ein Fehler aufgetreten: $C2:$E2" &gt;&gt;/tmp/vc-err.txt
     exit 1;
fi
...</pre>
<p>Auf der openv-Webseite wird oft eine <a href="http://openv.wikispaces.com/Datenauswertung+mit+RRDB" target="_blank" rel="noopener noreferrer">rrdb</a>&nbsp;zur Auswertung der Daten genutzt. Da ich mich mit einer rrdb nicht wirklich gut auskenne, schreibe ich die Daten lieber in eine MySQL-Datenbank.</p>
<h3>Tabellenstruktur</h3>
<p>Hierfür habe ich folgende Tabellen in der MySQL-Datenbank angelegt:</p>
<p>Tabellenstruktur für Tabelle <strong>brenner</strong></p>
<pre>CREATE TABLE IF NOT EXISTS `brenner` (
 `timestamp` datetime NOT NULL,
 `brennerstarts` float NOT NULL,
 `brennerstunden` float NOT NULL,
 `brennerstatus` int(11) NOT NULL,
 KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;</pre>
<p>Tabellenstruktur für Tabelle <strong>solar</strong></p>
<pre>CREATE TABLE IF NOT EXISTS `solar` (
 `timestamp` datetime NOT NULL,
 `solarstunden` float NOT NULL,
 `solarleistung` float NOT NULL,
 `solarpumpe` int(11) NOT NULL,
 KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
</pre>
<p>Tabellenstruktur für Tabelle&nbsp;<strong>temperaturen</strong></p>
<pre>CREATE TABLE IF NOT EXISTS `temperaturen` (
 `timestamp` datetime NOT NULL,
&nbsp; `aussentemperatur` float NOT NULL,
&nbsp; `warmwasser` float NOT NULL,
&nbsp; `speicher_unten` float NOT NULL,
&nbsp; `kollektor` float NOT NULL,
&nbsp; `vorlaufsolltemperaturM2` float NOT NULL,
&nbsp; KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;</pre>
<p>Tabellenstruktur für Tabelle <strong>snapshot</strong></p>
<pre>CREATE TABLE IF NOT EXISTS `snapshot` (
 `timestamp` datetime NOT NULL,
 `brennerstatus` float NOT NULL,
 `brennerstarts` float NOT NULL,
 `brennerstunden` float NOT NULL,
 `solarstunden` float NOT NULL,
 `solarleistung` float NOT NULL,
 `aussentemperatur` float NOT NULL,
 `warmwasser` float NOT NULL,
 `speicher_unten` float NOT NULL,
 `kollektor` float NOT NULL,
 `kesseltemperatur` float NOT NULL,
 `vorlauftemperaturM2` float NOT NULL,
 `vorlaufsolltemperaturM2` float NOT NULL,
 `raumsolltemperaturM1` float NOT NULL,
 `raumsolltemperaturM2` float NOT NULL,
 `raumsolltemperaturredM1` float NOT NULL,
 `raumsolltemperaturredM2` float NOT NULL,
 `warmwassersoll` float NOT NULL,
 `kesseltemperatursoll` float NOT NULL,
 `pumpestatusM1` float NOT NULL,
 `pumpestatusSP` float NOT NULL,
 `pumpestatussolar` float NOT NULL,
 `statusstoerung` varchar(100) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL,
 `systemzeit` varchar(100) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL,
 `error0` varchar(500) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL,
 `BetriebArt` varchar(20) NOT NULL,
 `BetriebArtM2` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;</pre>
<p>Die snapshot-Tabelle soll keine Historie enthalten, sondern immer nur eine Zeile mit den alle zwei Minuten ausgelesen Werten. Das hat sich nach ein paar Monaten Betrieb als sinnvoll erwiesen, da der Raspberry doch ganz schön ackern muss um aus einer Tabelle mit &gt; 150.000 Zeilen (und wachsend) die aktuellen Werte auf der Webseite anzuzeigen.</p>
<h3>Werte in Datenbank speichern</h3>
<p>In oben beschriebene Datei <em>update.tmpl</em> werden dann die Werte genutzt, um sie in der MySQL-Datenbank zu speichen. Dazu nutze ich den Aufruf des Kommandozeilentools &#8222;mysql&#8220; welches bei der Installation der Datenbank enthalten ist.</p>
<p>Hier die drei Aufrufe mit INSERT-Statements für die Temperatur-, die Solar und die Brennerdaten. In $1, $2 , $3, &#8230; stehen die Werte gemäß der Reihenfolge der <em>vc-commands.txt</em>.</p>
<pre>mysql --user= --password=  -e "INSERT INTO temperaturen (timestamp,aussentemperatur,warmwasser,kollektor,speicher_unten,vorlaufsolltemperaturM2) values (CURRENT_TIMESTAMP,$1,$2,$4,$5,$13);"</pre>
<pre>mysql --user= --password=  -e "INSERT INTO solar (timestamp,solarstunden,solarleistung) values (CURRENT_TIMESTAMP,$9,$10);"
</pre>
<pre>mysql --user= --password=  -e "INSERT INTO brenner (timestamp,brennerstarts,brennerstunden,brennerstatus) values (CURRENT_TIMESTAMP,$6,$7,IFNULL('$19',0));"
</pre>
<p>Für die Snapshot-Tabelle nutze ich ein <em>Update</em>-Statement da diese Tabelle immer nur eine Zeile enthalten soll.</p>
<pre>mysql --user= --password=  -e "UPDATE snapshot SET timestamp=CURRENT_TIMESTAMP,aussentemperatur=$1,warmwasser=$2,kollektor=$4,speicher_unten=$5,solarstunden=$9,solarleistung=$10,brennerstarts=$6,brennerstunden=$7,kesseltemperatur=$12,vorlauftemperaturM2=$13,vorlaufsolltemperaturM2=$14,raumsolltemperaturM1=$15,raumsolltemperaturM2=$16,raumsolltemperaturredM1=$17,raumsolltemperaturredM2=$18,brennerstatus=IFNULL('$19',0),warmwassersoll=$20,kesseltemperatursoll=$21,pumpestatusM1='$22',pumpestatussp='$23',pumpestatussolar='$24',statusstoerung='$R25',systemzeit='',error0='$R27',BetriebArt='$R29',BetriebArtM2='$R30';"
</pre>
<p>Wenn der Cron eingerichtet ist, sollte die Datenbank alle 6 Minuten mit den ausgelesenen Werten gefüllt werden.</p>
<h3>Anzeige der Daten</h3>
<p>Die Anzeige der Daten erfolgt mittels Webseite und PHP-Script. Auf einer Übersichtsseite lese ich die Snapshot-Tabelle aus. Das geht Dank der Snapshot-Tabelle auch recht schnell.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/temp_uebersicht.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-426" src="http://blog.bubux.de/wp-content/uploads/2014/04/temp_uebersicht.jpg" alt="temp_uebersicht" width="956" height="665" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_uebersicht.jpg 956w, https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_uebersicht-300x208.jpg 300w" sizes="auto, (max-width: 956px) 100vw, 956px" /></a></p>
<p>Auf einer weiteren Seite werden zusätzliche Werte aus der Snapshot-Tabelle angezeigt.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/temp_details.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-425" src="http://blog.bubux.de/wp-content/uploads/2014/04/temp_details.jpg" alt="temp_details" width="957" height="665" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_details.jpg 957w, https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_details-300x208.jpg 300w" sizes="auto, (max-width: 957px) 100vw, 957px" /></a></p>
<p>Weil die Erstellung des Graphen nicht auf der Snapshot-Tabelle basiert, dauerte die Anzeige dieser Seite auch immer recht lange. Daher wird die PNG-Grafik für den Graph nun viertelstündlich per Script erstellt und nur noch das fertige Bild in der Webseite angezeigt.</p>
<p>Hier der Crontab-Eintrag für das Script zur Erstellung der Grafik:</p>
<pre>*/15 * * * * sudo php /var/www/heizung/update_graph.php &amp;&gt; /dev/null</pre>
<p>und das Script selber. Zur Erstellung des Graphen nutze ich <a href="http://www.pchart.net/" target="_blank" rel="noopener noreferrer">pChart</a>.</p>
<p>[cclN_php]<br><!--?
include("class/pData.class.php");
include("class/pDraw.class.php");
include("class/pImage.class.php");

$mysqlhost="";
$mysqluser="";
$mysqlpwd="";
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
$mysqldb="";
mysql_select_db($mysqldb,$connection) or die("Konnte die Datenbank nicht waehlen.");

$zeit_tmp="";
$sql = "SELECT aussentemperatur,warmwasser,speicher_unten,kollektor,vorlaufsolltemperaturM2,hour(timestamp) FROM temperaturen WHERE DATE_ADD(timestamp, INTERVAL 72 HOUR) -->= NOW()&#8220;;<br>$query = mysql_query($sql) or die(&#8222;Anfrage nicht 1 erfolgreich&#8220;);<br>while ($wert = mysql_fetch_array($query)) {<br>$aussentemperatur[]=$wert[0];<br>$warmwasser[]=$wert[1];<br>$speicher_unten[]=$wert[2];<br>$kollektor[]=$wert[3];<br>$vorlauf[]=$wert[4];<br>if ($zeit_tmp==$wert[5])<br>{ $zeit_tmp=NULL; }<br>else<br>{ $zeit_tmp=$wert[5]; }<br>$zeit[]=$zeit_tmp;<br>}<br>mysql_close($connection);</p>
<p>$MyData = new pData();<br>$MyData-&gt;addPoints($aussentemperatur,&#8220;TempA&#8220;);<br>$MyData-&gt;addPoints($warmwasser,&#8220;TempW&#8220;);<br>$MyData-&gt;addPoints($speicher_unten,&#8220;TempS&#8220;);<br>$MyData-&gt;addPoints($kollektor,&#8220;TempK&#8220;);<br>$MyData-&gt;addPoints($vorlauf,&#8220;TempV&#8220;);<br>$MyData-&gt;addPoints($zeit,&#8220;Labels&#8220;);</p>
<p>$MyData-&gt;setSerieWeight(&#8222;TempA&#8220;,5);<br>$MyData-&gt;setSerieWeight(&#8222;TempS&#8220;,5);<br>$MyData-&gt;setSerieWeight(&#8222;TempW&#8220;,5);<br>$MyData-&gt;setSerieWeight(&#8222;TempK&#8220;,5);<br>$MyData-&gt;setSerieWeight(&#8222;TempV&#8220;,5);</p>
<p>$MyData-&gt;setSerieOnAxis (&#8222;TempA&#8220;, 0);<br>$MyData-&gt;setSerieOnAxis (&#8222;TempS&#8220;, 0);<br>$MyData-&gt;setSerieOnAxis (&#8222;TempK&#8220;, 0);<br>$MyData-&gt;setSerieOnAxis (&#8222;TempW&#8220;, 0);<br>$MyData-&gt;setSerieOnAxis (&#8222;TempK&#8220;, 0);<br>$MyData-&gt;setAxisName(0,&#8220;Temperatur&#8220;);</p>
<p>$MyData-&gt;setSerieDescription(&#8222;Labels&#8220;,&#8220;Uhrzeit&#8220;);<br>$MyData-&gt;setSerieDescription(&#8222;TempA&#8220;,&#8220;Aussentemperatur&#8220;);<br>$MyData-&gt;setSerieDescription(&#8222;TempS&#8220;,&#8220;Speicher&#8220;);<br>$MyData-&gt;setSerieDescription(&#8222;TempW&#8220;,&#8220;Warmwasser&#8220;);<br>$MyData-&gt;setSerieDescription(&#8222;TempK&#8220;,&#8220;Kollektor&#8220;);<br>$MyData-&gt;setSerieDescription(&#8222;TempV&#8220;,&#8220;Vorlauf&#8220;);<br>$MyData-&gt;setAbscissa(&#8222;Labels&#8220;);</p>
<p>$serieSettings = array(&#8222;R&#8220;=&gt;0,&#8220;G&#8220;=&gt;0,&#8220;B&#8220;=&gt;200);<br>$MyData-&gt;setPalette(&#8222;TempA&#8220;,$serieSettings);<br>$serieSettings = array(&#8222;R&#8220;=&gt;200,&#8220;G&#8220;=&gt;0,&#8220;B&#8220;=&gt;0);<br>$MyData-&gt;setPalette(&#8222;TempS&#8220;,$serieSettings);<br>$serieSettings = array(&#8222;R&#8220;=&gt;0,&#8220;G&#8220;=&gt;200,&#8220;B&#8220;=&gt;0);<br>$MyData-&gt;setPalette(&#8222;TempW&#8220;,$serieSettings);<br>$serieSettings = array(&#8222;R&#8220;=&gt;0,&#8220;G&#8220;=&gt;100,&#8220;B&#8220;=&gt;100);<br>$MyData-&gt;setPalette(&#8222;TempK&#8220;,$serieSettings);<br>$serieSettings = array(&#8222;R&#8220;=&gt;100,&#8220;G&#8220;=&gt;100,&#8220;B&#8220;=&gt;100);<br>$MyData-&gt;setPalette(&#8222;TempV&#8220;,$serieSettings);</p>
<p>$myPicture = new pImage(1205,330,$MyData);<br>$myPicture-&gt;Antialias = FALSE;<br>$myPicture-&gt;drawRectangle(0,0,1204,329,array(&#8222;R&#8220;=&gt;111,&#8220;G&#8220;=&gt;143,&#8220;B&#8220;=&gt;204));<br>$myPicture-&gt;setFontProperties(array(&#8222;FontName&#8220;=&gt;&#8220;/var/www/heizung/fonts/verdana.ttf&#8220;,&#8220;FontSize&#8220;=&gt;11));<br>$myPicture-&gt;drawText(200,35,&#8220;Temperaturen der letzten 3 Tage&#8220;,array(&#8222;FontSize&#8220;=&gt;12,&#8220;Align&#8220;=&gt;TEXT_ALIGN_BOTTOMMIDDLE));<br>$myPicture-&gt;setFontProperties(array(&#8222;FontName&#8220;=&gt;&#8220;/var/www/heizung/fonts/verdana.ttf&#8220;,&#8220;FontSize&#8220;=&gt;7));<br>$myPicture-&gt;setGraphArea(50,40,1155,300);<br>$labelSkip = floor(count($zeit)/48);<br>$scaleSettings = array(&#8222;XMargin&#8220;=&gt;10,&#8220;YMargin&#8220;=&gt;10,&#8220;Floating&#8220;=&gt;TRUE,&#8220;GridR&#8220;=&gt;180,&#8220;GridG&#8220;=&gt;180,&#8220;GridB&#8220;=&gt;180,&#8220;DrawSubTicks&#8220;=&gt;FALSE,&#8220;CycleBackground&#8220;=&gt;TRUE,&#8220;ScaleSpacing&#8220;=&gt;10,&#8220;LabelSkip&#8220;=&gt;$labelSkip,&#8220;DrawYLines&#8220;=&gt;array(0));<br>$myPicture-&gt;drawScale($scaleSettings);<br>$myPicture-&gt;drawLegend(600,20,array(&#8222;Style&#8220;=&gt;LEGEND_NOBORDER,&#8220;Mode&#8220;=&gt;LEGEND_HORIZONTAL));<br>$myPicture-&gt;Antialias = FALSE;<br>$myPicture-&gt;setShadow(TRUE,array(&#8222;X&#8220;=&gt;1,&#8220;Y&#8220;=&gt;1,&#8220;R&#8220;=&gt;0,&#8220;G&#8220;=&gt;0,&#8220;B&#8220;=&gt;0,&#8220;Alpha&#8220;=&gt;10));<br>$myPicture-&gt;drawLineChart(array(&#8222;DisplayValues&#8220;=&gt;FALSE,&#8220;DisplayColor&#8220;=&gt;DISPLAY_AUTO));<br>$myPicture-&gt;Render(&#8222;/var/www/heizung/tmp/temperaturen.png&#8220;);<br>?&gt;<br>[/cclN_php]</p>
<p>Hier noch eine Übersichtsseite verschiedener Durchschnittswerte. Diese werden direkt mit Aufruf der Seite generiert was entsprechend lange dauert. Diese Seite schaue ich aber nicht so oft an&#8230;</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2014/04/temp_details2.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-427" src="http://blog.bubux.de/wp-content/uploads/2014/04/temp_details2.jpg" alt="temp_details2" width="957" height="668" srcset="https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_details2.jpg 957w, https://www.bubuxblog.de/wp-content/uploads/2014/04/temp_details2-300x209.jpg 300w" sizes="auto, (max-width: 957px) 100vw, 957px" /></a></p>
<p>Viel Spaß mit dem Auslesen der Viessmann-Heizung!<br>Chris</p>


<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/viessmann-heizung-auslesen/feed/</wfw:commentRss>
			<slash:comments>70</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>
