<?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>Linux &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/category/linux/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>Odroid C2 &#8211; Update 1 (Gas- und Wasserzähler)</title>
		<link>https://www.bubuxblog.de/odroid-c2-update-1-gas-und-wasserzaehler/</link>
					<comments>https://www.bubuxblog.de/odroid-c2-update-1-gas-und-wasserzaehler/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Wed, 25 Jan 2017 16:02:06 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Odroid]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1299</guid>

					<description><![CDATA[Ich habe zwei Raspberry Pi´s laufen. Einer &#8222;spricht&#8220; mit der Heizung, ließt den Stromzähler aus, beherbergt die MySQL-Datenbanken und präsentiert die Daten auf einer Webseite. Der zweite Raspi ließt den Wasserzähler aus, zählt die Umdrehungen des Gaszählers, beherbergt den Werbeblocker Pi-Hole und ist Videorecorder mit tvheadend im Backend. Einer der beiden Raspis soll nun dem [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ich habe zwei Raspberry Pi´s laufen. Einer &#8222;spricht&#8220; mit der <a href="http://blog.bubux.de/viessmann-heizung-auslesen/" target="_blank">Heizung</a>, ließt den <a href="http://blog.bubux.de/raspberry-pi-ehz-auslesen/" target="_blank">Stromzähler</a> aus, beherbergt die MySQL-Datenbanken und präsentiert die Daten auf einer Webseite. Der zweite Raspi ließt den <a href="http://blog.bubux.de/m-bus-wasserzaehler/" target="_blank">Wasserzähler</a> aus, zählt die Umdrehungen des <a href="http://blog.bubux.de/gaszaehler-auslesen/" target="_blank">Gaszählers</a>, beherbergt den Werbeblocker <a href="http://blog.bubux.de/werbung-blockieren-mit-pi-hole/" target="_blank">Pi-Hole</a> und ist Videorecorder mit <a href="https://tvheadend.org/" target="_blank">tvheadend</a> im Backend.</p>
<p>Einer der beiden Raspis soll nun dem neuen Odroid weichen. Dabei entschied ich mich für den zweiten Raspi, da die ganzen PHP-Scripte erstmal nicht anzupassen sind. Das scheint mir der meiste Aufwand zu werden.<br />
<span id="more-1299"></span></p>
<h2>Pi-Hole umziehen</h2>
<p>Auch wenn &#8222;Pi&#8220; im Namen steckt, läuft die Installation mit dem curl-Script auf den Odroid genauso problemlos wie auf dem Raspberry. Daher ist der <a href="http://blog.bubux.de/werbung-blockieren-mit-pi-hole/" target="_blank">Artikel über Pi-Hole</a> auch für den Odroid soweit noch aktuell. Eine positive Anmerkung ist, das man neben den bereits vorkonfigurierten DNS-Servern aus der Installationsroutine, in der aktuellen Version von Pi-Hole jetzt auch die eigene Fritzbox als DNS in den Einstellungen der Pi-Hole-Oberfläche bequem eingeben kann. Damit entfällt die manuelle Anpassung in der Datei <em><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">dnsmasq</span><span class="crayon-sy">.</span><span class="crayon-v">d</span><span class="crayon-o">/</span><span class="crayon-cn">01</span><span class="crayon-o">&#8211;</span><span class="crayon-v">pihole</span><span class="crayon-sy">.</span></em><span class="crayon-v"><em>conf</em>.</span></p>
<p><span class="crayon-v">Beim Aufbau der Pi-Hole-Oberfläche ist der Odroid auch spürbar schneller als der Raspberry Pi. Im Netz merkt man keinen Unterschied.<br />
</span></p>
<figure id="attachment_1311" aria-describedby="caption-attachment-1311" style="width: 300px" class="wp-caption alignnone"><a href="http://blog.bubux.de/wp-content/uploads/2017/01/pi_hole_dns.png"><img loading="lazy" decoding="async" class="wp-image-1311 size-medium" src="http://blog.bubux.de/wp-content/uploads/2017/01/pi_hole_dns-300x183.png" alt="DNS-EInstellungen Pi-Hole" height="183" width="300" srcset="https://www.bubuxblog.de/wp-content/uploads/2017/01/pi_hole_dns-300x183.png 300w, https://www.bubuxblog.de/wp-content/uploads/2017/01/pi_hole_dns.png 470w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-1311" class="wp-caption-text">DNS-Einstellungen Pi-Hole</figcaption></figure>
<h2>&nbsp;</h2>
<h2>Das Script für den Gaszählers umziehen</h2>
<p>Beim Gaszähler nutze ich ein <a href="http://blog.bubux.de/gaszaehler-auslesen/" target="_blank">Python-Script</a>, welches die Schließimpulse eines Reed-Kontaktes mitzählt. Also einfach mal Pythonscript kopiert, gestartet und &#8230; Fehlermeldungen angeschaut! Das Python auf dem Odroid hat die von mir genutzte RPi.GIOP-Klasse angemeckert was auch verständlich ist. Auf dem Odroid muss das gegen WiringPi2 getauscht werden.</p>
<p>1. WiringPi 2 für Python installieren</p>
<pre class="code">git clone https://github.com/hardkernel/WiringPi2-Python.git
cd WiringPi2-Python
git submodule init
git submodule update</pre>
<p>2. Bauen &amp; Installieren</p>
<pre class="code">sudo python setup.py install</pre>
<p>Das angepaßte Script zum Auslesen des Gaszählers schaut dann für den Odroid wie folgt aus:</p>
<p>[cc lang=&#8220;python&#8220; tab_size=&#8220;2&#8243; lines=&#8220;50&#8243;]<br />
import wiringpi2 as wpi<br />
import time<br />
import MySQLdb<br />
import sys</p>
<p>wpi.wiringPiSetupPhys()<br />
# GPIO definieren<br />
REED_gas = 21<br />
# definierten GPIO als Eingang setzen<br />
# 0 output, 1 input, 2 PWM mode<br />
wpi.pinMode(REED_gas,0)</p>
<p>lt = time.localtime()<br />
dateiname=&#8220;gaszaehler_&#8220;+time.strftime(&#8222;%Y%m%d&#8220;,lt) +&#8220;.log&#8220;</p>
<p>logger = open(dateiname,&#8220;w&#8220;)<br />
logger.write(&#8222;gestartet&#8230;&#8220;+&#8220;\n&#8220;)<br />
logger.close()</p>
<p>status_alt=1<br />
while True:<br />
    try:<br />
        dateiname=&#8220;gaszaehler_&#8220;+time.strftime(&#8222;%Y%m%d&#8220;,lt) +&#8220;.log&#8220;<br />
        logger = open(dateiname,&#8220;a&#8220;)<br />
        status_aktuell = wpi.digitalRead(REED_gas)<br />
        # KONTAKT -&gt; geoeffnet<br />
        if status_aktuell == 1:<br />
            #logger.write(&#8222;Kontakt offen&#8220;+&#8220;\n&#8220;)<br />
            status_alt=wpi.digitalRead(REED_gas)<br />
            # KONTAKT -&gt; geschlossen<br />
        elif status_aktuell==0:<br />
            logger.write(&#8222;Kontakt geschlossen&#8220;+&#8220;\n&#8220;)<br />
            if status_alt!=status_aktuell:<br />
                logger.write(&#8222;Impuls&#8220;+&#8220;\n&#8220; )<br />
                status_alt=wpi.digitalRead(REED_gas)<br />
                # Datenbankverbindung<br />
                db = MySQLdb.connect(host=&#8220;&#8220;, user=&#8220;&#8220;, passwd=&#8220;&#8220;, db=&#8220;&#8220;)<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 />
                logger.close()<br />
        except:<br />
            e = sys.exc_info()[0]<br />
            dateiname=&#8220;gaszaehler_&#8220;+time.strftime(&#8222;%Y%m%d&#8220;,lt) +&#8220;.log&#8220;<br />
            logger = open(dateiname,&#8220;a&#8220;)<br />
            logger.write(&#8222;Es ist ein Fehler aufgetreten: %s&#8220; % e)<br />
            logger.close()<br />
            time.sleep(1)<br />
[/cc]</p>
<p>Neben WiringPi habe ich auch die Verbindung zur DB in die while-Schleife gepackt. Vorher wurde die Verbindung einmal am Anfang hergestellt und in der Schleife nur noch die Daten per Insert eingetragen. Es zeigt sich aber, das der Odroid oder die Datenbank die noch auf dem anderen Pi läuft die Verbindung nach einer Zeit kappt und es zu Fehlern kam. Auch das Logging habe ich etwas abgeändert, da während das while lief nur Blockweise wenn gerade Zeit war in die Datei geschrieben wurde. Das störte bei der Fehlersuche.</p>
<p>Hier auch nochmal die Pinbelegung des Odroid C2 und deren Zusammenhang mit den PinModes von WiringPi2:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2017/01/odroid_c2_gpio.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1309" src="http://blog.bubux.de/wp-content/uploads/2017/01/odroid_c2_gpio-1024x724.png" alt="" height="543" width="768" srcset="https://www.bubuxblog.de/wp-content/uploads/2017/01/odroid_c2_gpio-1024x724.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2017/01/odroid_c2_gpio-300x212.png 300w, https://www.bubuxblog.de/wp-content/uploads/2017/01/odroid_c2_gpio-768x543.png 768w, https://www.bubuxblog.de/wp-content/uploads/2017/01/odroid_c2_gpio.png 1246w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Das war es schon für die Anpassungen des Scriptes für den Gaszähler. Bei diesem Script gibt es keine Performanceunterschiede im Vergleich wenn es auf dem Raspi lief.</p>
<p></p>
<h2>Das Script für den Wasserzähler umziehen</h2>
<p>Als nächstes kam der <a href="http://blog.bubux.de/m-bus-wasserzaehler/" target="_blank">Wasserzähler mit M-BUS</a> an die Reihe. Hier habe ich mir die Quellen in der Version 0.8.0 von <a href="http://www.rscada.se/libmbus/" target="_blank">rScada</a> gezogen und anschliessend versucht diese zu bauen. Dies führte schon beim<em> ./configure</em> zu Fehlermeldungen. Die Quellen waren zu alt und konnten die Prozessorarchitektur des Odroid (ARM) nicht ermitteln. Um das zu beheben benötigt man aktuelle Versionen der Dateien<em> config.guess</em> und <em>config.sub</em>. Diese sind unter den beiden folgenden Links zu finden.</p>
<p><a href="http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" target="_blank">http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD</a></p>
<p><a href="http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" target="_blank">http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD</a></p>
<p>Die beiden Dateien einfach gegen die bereit vorhanden ersetzen und<em> ./configure</em> läuft durch. <em>make</em> und <em>make install</em> laufen dann auch fehlerfrei durch wie im <a href="http://blog.bubux.de/m-bus-wasserzaehler/" target="_blank">Artikel </a>beschrieben.</p>
<p>Die Pins zum zum Anschluss des M-BUS-Master (Tx &amp; Rx) sind gleich belegt wie auf dem Raspberry.</p>
<p>Die Scripte von rScada funktionieren identisch wie vorher. Mit<em> mbus-serial-scan</em> wurde der Wasserzähler auf fehlerfrei erkannt. Leider scheiterte anschliessend der Versuch mit <em><span class="crayon-v">mbus</span><span class="crayon-o">&#8211;</span><span class="crayon-v">serial</span><span class="crayon-o">&#8211;</span><span class="crayon-v">request</span><span class="crayon-o">&#8211;</span><span class="crayon-v">data</span></em> die Daten aus dem vorher erkannten Zähler auszulesen. Nahc den ersten ausgelesenen Bytes verabschiedete sich <em><span class="crayon-v">mbus</span><span class="crayon-o">&#8211;</span><span class="crayon-v">serial</span><span class="crayon-o">&#8211;</span><span class="crayon-v">request</span><span class="crayon-o">&#8211;</span><span class="crayon-v">data</span></em> mit einem Segmentation Fault. In den Systemlogs war nicht wirklich rauszufinden warum dem so ist. Nach ein kurzer Analyse dachte ich ein Versuch mit der vorherigen Version 0.7.0 kann nicht schaden. Damit tat es dann auch fehlerfrei. Was nun genau das Problem des Segfaults war, weiß ich nicht. Die Unterschiede zur Version 0.8.0 sind auch anscheinend nicht relevant da alles wie gewünscht funktioniert.</p>
<p>Soviel zu den ersten beiden &#8222;Umzügen&#8220;. Fehlen noch der DVB-S Empfänger mit tvheadend und dann geht´s schon an die Dinge die aktuell noch auf dem anderen Raspberry Pi laufen.</p>
<p>&nbsp;</p>
<p>Gruß</p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/odroid-c2-update-1-gas-und-wasserzaehler/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Odroid C2 (vs Raspberry PI 2)</title>
		<link>https://www.bubuxblog.de/odroid-c2-vs-raspberry-pi-2/</link>
					<comments>https://www.bubuxblog.de/odroid-c2-vs-raspberry-pi-2/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Mon, 02 Jan 2017 11:28:44 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Odroid]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1257</guid>

					<description><![CDATA[Zuerst einmal noch ein frohes neues Jahr an alle! Die Tage habe ich ein neues Spielzeug bekommen (nein, nicht zu Weihnachten). Es ist ein Odroid C2 mit eMMC-Speicherkarte. Den gab es im Komplettpaket mit Odroid, eMMC, Gehäuse und Netzteil für 70€. Der Odroid besitzt einen Quad-Core mit 1,5 GHz, 2 GB RAM und ein Gigabit-LAN [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Zuerst einmal noch ein frohes neues Jahr an alle!</p>
<p>Die Tage habe ich ein neues Spielzeug bekommen (nein, nicht zu Weihnachten). Es ist ein Odroid C2 mit eMMC-Speicherkarte. Den gab es im Komplettpaket mit Odroid, eMMC, Gehäuse und Netzteil für 70€. Der Odroid besitzt einen Quad-Core mit 1,5 GHz, 2 GB RAM und ein Gigabit-LAN welches er sich, im Gegensatz zur Raspberry-Architektur, nicht mit den USB-Ports teilen muss. Somit sollte die Gesamtleistung in allen Belangen deutlich höher ausfallen als die des Raspberry 2 oder 3. Auf der eMMC war ein Ubuntu 16.04 LTS mit Mate Desktop vorinstalliert.</p>
<figure id="attachment_1259" aria-describedby="caption-attachment-1259" style="width: 768px" class="wp-caption alignnone"><a href="http://blog.bubux.de/wp-content/uploads/2016/12/IMG_9477.jpg"><img loading="lazy" decoding="async" class="wp-image-1259 size-large" src="http://blog.bubux.de/wp-content/uploads/2016/12/IMG_9477-e1482917785552-1024x739.jpg" alt="Odroid Oberseite" width="768" height="554" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9477-e1482917785552-1024x739.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9477-e1482917785552-300x216.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9477-e1482917785552-768x554.jpg 768w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a><figcaption id="caption-attachment-1259" class="wp-caption-text">Odroid Oberseite</figcaption></figure>
<p><span id="more-1257"></span></p>
<h2>Schneller Test versus schlampige Programmierung</h2>
<p>Ein erster schneller Test sollte die Geschwindigkeitsmessung bei der Anzeige meiner Intranet-Seite für die mitgeloggten Daten (Temperaturen, Gasverbrauch, Stromverbrauch, &#8230;) sein. Die Tabellen sind in den letzten 3 Jahren teilweise doch recht groß geworden und der Raspberry 2 tut sich mit der Anzeige der ein oder anderen Auswertung merklich schwer. Zum Beispiel dauert die Abfrage des wöchentlichen Wasserverbrauches rund 38 Sekunden&#8230;nichts für ungeduldige Gemüter.</p>
<figure id="attachment_1261" aria-describedby="caption-attachment-1261" style="width: 300px" class="wp-caption alignleft"><a href="http://blog.bubux.de/wp-content/uploads/2016/12/IMG_9485-e1482920354556.jpg"><img loading="lazy" decoding="async" class="wp-image-1261 size-medium" src="http://blog.bubux.de/wp-content/uploads/2016/12/IMG_9485-e1482920354556-300x216.jpg" alt="Odoid Unterseite" width="300" height="216" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9485-e1482920354556-300x216.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9485-e1482920354556-768x554.jpg 768w, https://www.bubuxblog.de/wp-content/uploads/2016/12/IMG_9485-e1482920354556-1024x738.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-1261" class="wp-caption-text">Odroid Unterseite mit der eMMC-Karte (roter Aufkleber)</figcaption></figure>
<p>Also MySQL, Apache und PHP installiert. Dabei ließ sich MySQL nach der Installation nicht starten. Da scheint es einen bekannten <a href="https://bugs.launchpad.net/ubuntu/+source/mysql-5.7/+bug/1573279" target="_blank">Fehler</a> zu geben. Ich habe mich dann einen halben Tag mit Versuchen rumgeschlagen es ans laufen zu bekommen. Letztendlich habe ich mich dann geschlagen gegeben und MariaDB installiert. MariaDB funktionierte auf Anhieb inkl. des Datenimportes der Daten aus der MySQL-Datenbank des Raspberrys. Die Installation von Apache und PHP 7 funktionierte auf Anhieb. Dann die PHP-Scripte auf den Odroid kopiert, einen Browser geöffnet und &#8230; nichts gesehen außer einer weißen Seite. Nach kurzem Blick in das Apache-Log dann die Ernüchterung: Einfach die Scripte kopieren ist nicht, da ich in der Vergangenheit schlampig programmiert hatte. So unterstützt PHP 7 unter anderem nur noch M<em>ySQLi</em> (<a href="http://php.net/manual/de/book.mysqli.php" target="_blank"><em>i</em> wie improved</a>). So hatte ich mir das nicht vorgestellt, aber es ist ein guter Anlass um den kompletten Code zu überarbeiten. Und ein Downgrade auf PHP 5.x ist wohl auch <a href="https://www.heise.de/newsticker/meldung/Ende-des-aktiven-Supports-fuer-PHP-5-3583353.html" target="_blank">keine Alternative mehr</a>.</p>
<h2>Code-Korrektur</h2>
<p>Um trotzdem die Geschwindigkeit testen zu können, habe ich die Seite zur Anzeige des wöchentlichen Wasserverbrauches PHP 7-tauglich gemacht. In dieser Seite wird eine kleine Datenbanktabelle mit ~ 700 Zeilen ausgelesen (den Wasserzähler habe ich noch nicht so lange). Die beiden SQL-Statements die im Script verwendet werden sehen folgendermaßen aus:</p>
<p>Folgendes Select liest den Gesamtzählerstand aus:</p>
<pre class="">SELECT zaehlerstand FROM wasserzaehler</pre>
<p>Das etwas länglichere Select liest den Verbrauch der letzten 7 Tage, gruppiert nach Wochentag, aus:</p>
<pre class="">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
)
WHERE DATE(wz1.timestamp) &gt;= DATE_SUB(NOW(),INTERVAL 7 DAY) GROUP BY day(wz1.timestamp)
ORDER BY wz1.timestamp";</pre>
<p>Das Ergebnis ist eine Übersicht des Gesamtverbrauch und des Wasserverbrauches der letzten 7 Tage:</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/12/wasserzähler.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1263" src="http://blog.bubux.de/wp-content/uploads/2016/12/wasserzähler.png" alt="" width="818" height="462" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/12/wasserzähler.png 818w, https://www.bubuxblog.de/wp-content/uploads/2016/12/wasserzähler-300x169.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/12/wasserzähler-768x434.png 768w" sizes="auto, (max-width: 818px) 100vw, 818px" /></a></p>
<h2>Warpgeschwindigkeit</h2>
<p>Der Raspberry 2 benötigt bis zur Anzeige dieser Seite geschlagene 38 Sekunden. Der Odroid etwas mehr als 1 Sekunde! Diesen eklatanten Geschwindigkeitsunterschied hätte ich nicht erwartet. Allerdings weiß ich auch nicht, was den Raspberry bei der Auswertung dieser kleinen Tabelle genau überfordert. Es ist jedenfalls mal ein dicker Pluspunkt für den Odroid. Mal sehen wie er sich mit den anderen Abfragen schlägt sobald ich die restlichen PHP-Scripte angepasst habe.</p>
<p>Das wird allerdings neben der PHP-Problematik noch ein steiniger Weg werden, da ich die komplette <a href="http://blog.bubux.de/raspberry-pi-heimautomatisierung-mit-coc-und-fhem/" target="_blank">FHEM-Implementierung</a> irgendwie vom Raspberry auf den Odroid bekommen muss. Problem ist dabei wahrscheinlich weniger FHEM selber, sondern die COC-Hardware die auf den GPIOs des Raspberry sitzt und die GPIOs des Raspberry nicht kompatibel mit denen des Odroid sind. Dazu aber mehr, wenn es soweit ist.</p>
<p>Nebenbei habe ich bei dieser Gelegenheit auch noch kurz den Leistungsmesser dazwischen gehangen. Im Leerlauf (die Abfrage des Wasserzählers kann man nicht als mehr bezeichnen) konsumiert der Odroid etwa 3 Watt.</p>
<p>&nbsp;</p>
<p>Gruß Chris</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/odroid-c2-vs-raspberry-pi-2/feed/</wfw:commentRss>
			<slash:comments>1</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>Synchrones Multiroom mit Kodi und AirAudio</title>
		<link>https://www.bubuxblog.de/multiroom-mit-kodi-und-airaudio/</link>
					<comments>https://www.bubuxblog.de/multiroom-mit-kodi-und-airaudio/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 13 Feb 2016 10:05:40 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[AirAudio]]></category>
		<category><![CDATA[Kodi]]></category>
		<category><![CDATA[Multiroom]]></category>
		<category><![CDATA[shairport]]></category>
		<category><![CDATA[shairport-sync]]></category>
		<category><![CDATA[synchron]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1092</guid>

					<description><![CDATA[Heute ein Update bzgl. meiner Versuche, die Audioausgabe wie im Artikel Multiroom mit Kodi und AirAudio beschrieben, auf mehrere Lautsprecher zu synchronisieren. Das Wichtigste aber schon mal vorweg: Die Wiedergabe ist nun absolut synchron auf der Musicbox Air von Canton und dem Kodi-Wohnzimmer PC! Auch wenn ich es in dem ersten Multiroom-Artikel nur als &#8222;nice-to-have&#8220; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.bubux.de/wp-content/uploads/2016/02/synchron.png" rel="attachment wp-att-1097"><img loading="lazy" decoding="async" class="wp-image-1097 alignright" src="http://blog.bubux.de/wp-content/uploads/2016/02/synchron.png" alt="synchron" width="241" height="136" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/02/synchron.png 914w, https://www.bubuxblog.de/wp-content/uploads/2016/02/synchron-300x170.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/02/synchron-768x434.png 768w" sizes="auto, (max-width: 241px) 100vw, 241px" /></a>Heute ein Update bzgl. meiner Versuche, die Audioausgabe wie im Artikel <a href="http://blog.bubux.de/multiroom-mit-kodi/" target="_blank">Multiroom mit Kodi und </a><a href="http://blog.bubux.de/multiroom-mit-kodi/" target="_blank">AirAudio</a> beschrieben, auf mehrere Lautsprecher zu synchronisieren. Das Wichtigste aber schon mal vorweg:</p>
<p><strong>Die Wiedergabe ist nun absolut synchron auf der Musicbox Air von Canton und dem Kodi-Wohnzimmer PC!</strong></p>
<p>Auch wenn ich es in dem ersten Multiroom-Artikel nur als &#8222;nice-to-have&#8220; bezeichnet habe, hat mich das Problem mit der asynchronen Wiedergabe bzw. dem hochwahrscheinlichen Auseinanderdriften doch nicht in Ruhe gelassen.</p>
<h3>Synchrones Multiroom</h3>
<p>Martin, der Entwickler der App &#8222;<a href="http://www.airaudio.eu/" target="_blank">AirAudio&#8220;</a> hat mich dann von sich aus dankenswerterweise darauf hingewiesen, das die aktuelle Airplay-Implementierung von <a href="http://kodi.tv/" target="_blank">Kodi</a> <strong>keine </strong>Audio-Synchronisierung unterstützt. Solange dem so ist, werden alle meine Versuche bzgl. einer synchronen Wiedergabe auf dem mit Kodi-betriebenen Wohnzimmer-PC scheitern &#8211; und das unabhängig vom Zuspieler! Also auch die Nutzung von Whaale hätte kein Unterschied gemacht.</p>
<p>Statt der Airplay-Implementierung von Kodi selbst, sollte ich <em><a href="https://github.com/mikebrady/shairport-sync" target="_blank">shairplay-sync</a></em> als AirPlay-Abspieler auf dem Wohnzimmer-PC installieren. Bei <em>shairplay-sync</em> handelt es sich um ein Fork von <em>shairplay. shairplay-sync</em> unterstützt aber zusätzlich die Implementierung der synchronen Audiowiedergabe mittels Airplay.</p>
<p>Für die Installation von<em> shairplay-sync</em> gibt es neben den GIT-Quellen auch ein <a href="https://launchpad.net/~dantheperson/+archive/ubuntu/shairplay-sync" target="_blank">Paket</a> für verschiedene Linux-Versionen. Da ich beim <a href="http://blog.bubux.de/wohnzimmer-pc/" target="_blank">Wohnzimmer-PC</a> (immer noch) ein Ubuntu 14.04 LTS nutze, konnte ich die Installation mittels <a href="https://wiki.ubuntuusers.de/Launchpad/PPA/" target="_blank">PPA</a> durchführen, da hiefür ein Paket bereitgestellt wird. Bei einem Raspberry kann bei der Installation z.B. nach der Anleitung von <a href="https://github.com/mikebrady/shairport-sync/blob/master/README.md" target="_blank">mikebrady</a> Verfahren werden.</p>
<h3>Installation von shairplay-sync</h3>
<p>Mit folgendem Befehl werden die von <a href="https://launchpad.net/~dantheperson/+archive/ubuntu/shairplay-sync" target="_blank"><em>dantheperson</em></a> bereitgestellten Paketquellen von <em>shairplay-sync</em> im Ubuntu hinzugefügt:</p>
<pre class="">sudo add-apt-repository ppa:dantheperson/shairplay-sync</pre>
<p>Das Update der Paketquellen und die eigentliche Installation erfolgt dann wie folgt:</p>
<pre class="">sudo apt-get update
sudo apt-get upgrade
sudo apt-get install shairport-sync</pre>
<p>Die Konfig-Datei von <em>shairport-sync</em> ist nach erfolgreicher Installation im Verzeichnis <em>etc</em> zu finden. Hier müssen ggf. noch ein paar Anpassungen vorgenommen werden.</p>
<pre class="">sudo vim /etc/shairport-sync.conf</pre>
<p>In der Konfig-Datei kann z.B. unter <em>general</em> der Name des &#8222;AirPlay-Gerätes&#8220; konfiguriert werden.</p>
<h3>Audiogerät und -Ausgang ermitteln</h3>
<p>Wichtiger sind aber die Einstellungen unter dem Punkt <em>alsa</em>. Hier muss das Device für die Audioausgabe eingetragen werden. So musste ich z.B. schauen, das der S/PDIF-Ausgang genutzt wird.</p>
<pre class="">alsa =
{
    output_device = "hw:0,1";
    mixer_control_name = "PCM";
    mixer_device = "hw:0";
//  audio_backend_latency_offset = 0;
//  audio_backend_buffer_desired_length = 6615;
};</pre>
<p>Die entsprechende Hardware für output_device kann über den <em>Alsamixer</em> herausgefunden werden:</p>
<pre class="">alsamixer</pre>
<p>Mit <em>F6</em> werden alle im System verfügbaren Soundkarten angezeigt. Bei mir ist das <em>HDA Intel</em> mit der Nummer &#8222;0&#8220;. (Ich denke, das die Grafikkarte &#8222;1&#8220; hier auch wegen der möglichen Audioausgabe über HDMI angezeigt wird).</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/02/alsa2.png" rel="attachment wp-att-1110"><img loading="lazy" decoding="async" class="alignnone wp-image-1110 size-large" src="http://blog.bubux.de/wp-content/uploads/2016/02/alsa2-1024x607.png" alt="alsa2" width="768" height="455" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa2-1024x607.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa2-300x178.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa2-768x455.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa2.png 1320w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Nun fehlt noch der passende Audioausgang. Dazu mit <em>F2</em> in den im Bild gezeigten Dialog und den Eintrag mit &#8222;<em>devices</em>&#8220; auswählen.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/02/alsa3.png" rel="attachment wp-att-1111"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1111" src="http://blog.bubux.de/wp-content/uploads/2016/02/alsa3-1024x607.png" alt="alsa3" width="768" height="455" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa3-1024x607.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa3-300x178.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa3-768x455.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa3.png 1320w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Im Ergebnis werden alle Audio-Geräte inklusive den vorhandenen Schnittstellen wie S/PDIF oder Klinke ausgegeben. Leider wird dieser Unterschied (zumindest bei mir) nicht in der Übersicht angezeigt.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/02/alsa4.png" rel="attachment wp-att-1112"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1112" src="http://blog.bubux.de/wp-content/uploads/2016/02/alsa4-1024x607.png" alt="alsa4" width="768" height="455" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa4-1024x607.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa4-300x178.png 300w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa4-768x455.png 768w, https://www.bubuxblog.de/wp-content/uploads/2016/02/alsa4.png 1320w" sizes="auto, (max-width: 768px) 100vw, 768px" /></a></p>
<p>Also heißt es ausprobieren. Es sind ja nur zwei Möglichkeiten geblieben da das eigentliche Gerät mit &#8222;0&#8220; ja schon bekannt ist. Bleibt in der <em>shairplay-sync</em>-Konfiguration unter <em>output_device</em> nur noch <em>hw:0,0</em> oder <em>hw:0,1</em> zu testen. In meinem Fall war der S/PDIF-Ausgang <em>hw:0,1</em>. Die Mixer-Kontrolle ist unter 6 zu finden und in der Konfiguration entsprechend mit <em>hw:0</em> anzugeben.</p>
<p>Andere Einstellungen habe ich in der Konfiguration nicht verändert. Evtl. paßt aber auch abhängig von der Hardware schon die Default-EInstellung und es sind keine Änderungen an der Konfiguration von <em>shairplay-sync</em> nötig.</p>
<p>Die nötigen Einstellungen können zum Testen auch direkt beim manuellen Start von <em>shairplay-sync</em> mittels Argument mitgegeben werden. Dazu erstmal ein bereits laufendes <em>shairplay-sync</em> mit folgendem Befehl stoppen:</p>
<pre class="">sudo shairport-sync -k</pre>
<p>Folgender Aufruf beinhaltet u.a. die von mir angepaßten Parameter:</p>
<pre class="">sudo shairport-sync -vvv -a "Wohnzimmer" -d hw:0,1 -m hw:0 -c PCM</pre>
<p><em>-v</em> schreibt Debuginformationen zur Analyse von Problemen. <em>-vv</em> oder <em>-vvv</em> gibt mehr Informationen preis.<br />
<em>-a</em> definiert den im AirPlay-Zuspieler angezeigten Namen<br />
<em>-d</em> definiert das Gerät zur Audioausgabe. Hier kann dann mit dem im <em>alsamixer</em> gefundenen Geräten experimentiert werden<br />
<em>-c</em> definiert den zu nutzenden Mixer. Dieser gehört in der Regel zum genutzten Gerät.</p>
<p>Eine komplette Liste aller Parameter von <em>shairport-sync</em> ist in der Hilfe oder in den man-Pages zu finden.</p>
<pre class="">shairport-sync -h</pre>
<pre class="">man shairport-sync</pre>
<h3>Ergebnis</h3>
<p>Im Ergebnis bin ich nun sehr zufrieden mit meiner Multiroom-Lösung. Neben den schon im <a href="http://blog.bubux.de/multiroom-mit-kodi/" target="_blank">ersten Artikel</a> gut funktionierenden Punkten, kam jetzt das absolut synchrone Abspielen auf mehrere Lautsprecher hinzu. Die ganze Lösung ist immer noch sehr anwenderfreundlich. Fehlt mir jetzt noch ein kleiner portabler AirPlay-Lautsprecher für die Terrasse.</p>
<p>Vielen Dank nochmal an Martin von <a href="http://www.airaudio.eu/" target="_blank">AirAudio</a> für die sehr gute und schnelle Unterstützung!</p>
<p>&nbsp;</p>
<p>Gruß<br />
Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/multiroom-mit-kodi-und-airaudio/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Multiroom mit Kodi und AirAudio</title>
		<link>https://www.bubuxblog.de/multiroom-mit-kodi/</link>
					<comments>https://www.bubuxblog.de/multiroom-mit-kodi/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 23 Jan 2016 12:12:05 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Multimedia]]></category>
		<category><![CDATA[AirAudio]]></category>
		<category><![CDATA[Kodi]]></category>
		<category><![CDATA[Multiroom]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1033</guid>

					<description><![CDATA[Multiroom ist ja aktuell in aller Munde. Auch ich wollte mich diesem Trend nicht verschliessen und habe einen &#8222;kleinen&#8220; Küchenlautsprecher angeschafft &#8211; die Canton Musicbox Air 3 in schickem Hochglanz-Weiß, passend zur Küche. Der Lautsprecher verfügt über WLAN mit Airplay und DLNA-Unterstützung. Vor allem aber hat sie genug Leistung und einen gutem Klang (vielleicht sogar [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Multiroom ist ja aktuell in aller Munde. Auch ich wollte mich diesem Trend nicht verschliessen und habe einen &#8222;kleinen&#8220; Küchenlautsprecher angeschafft &#8211; die Canton Musicbox Air 3 in schickem Hochglanz-Weiß, passend zur Küche. Der Lautsprecher verfügt über WLAN mit Airplay und DLNA-Unterstützung. Vor allem aber hat sie genug Leistung und einen gutem Klang (vielleicht sogar etwas zu viel Wumms für die Küche&#8230;).</p>
<figure id="attachment_1065" aria-describedby="caption-attachment-1065" style="width: 237px" class="wp-caption alignleft"><a href="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8769.jpg" rel="attachment wp-att-1065"><img loading="lazy" decoding="async" class="wp-image-1065" src="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8769-1024x683.jpg" alt="IMG_8769" width="237" height="158" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8769-1024x683.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8769-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8769-768x512.jpg 768w" sizes="auto, (max-width: 237px) 100vw, 237px" /></a><figcaption id="caption-attachment-1065" class="wp-caption-text">Canton Musicbox Air 3</figcaption></figure>
<p>Gut, alleine mit dem Kauf des Canton-Lautsprechers war ich noch weit weg von Multiroom. Irgendwie muß &#8222;Multiroom&#8220; in meiner bereits vorhandenen Infrastruktur umgesetzt werden. Diese besteht aus einem mit <a href="http://kodi.tv/" target="_blank">Kodi</a> betriebenem <a href="http://blog.bubux.de/wohnzimmer-pc/" target="_blank">Wohnzimmer-PC </a>und daran angeschlossenem 5.1 Receiver mit 5 Lautsprechern.</p>
<h3></h3>
<h3></h3>
<h3></h3>
<h3></h3>
<h3>Was bedeutet Multiroom?</h3>
<p>Für den einen bedeutet Multiroom die Wiedergabe der gleichen Tonquelle auf beliebig vielen Lautsprechern. Oder aber auch die Wiedergabe verschiedener Quellen auf einzelne Lautsprecher oder auch gruppiert auf unterschiedliche Lautsprecher.</p>
<p>Multiroom ist aber auch die Möglichkeit zur Auswahl der Wiedergabe von einer Tonquelle auf einem bestimmten Lautsprecher. Im ersten Anlauf tendiere ich zu diesem Ansatz, da ich nicht das komplette Haus beschallen muss und mich meistens in einem Raum aufhalte.</p>
<p>Die verschiedenen Hersteller wollen natürlich auch alle ein Stück vom Kuchen den Sonos mit seiner &#8222;PLAY&#8220;-Reihe angeschnitten hat und beschert dem Markt verschiedenen Mutliroom-Lösungen. Neben Sonos wäre da z.B. Teufel mit seiner Raumfeld-Reihe, Denon mit &#8222;HEOS&#8220;, Yamaha mit MusiCast und vielen mehr zu nennen.</p>
<p>Da ich im Wohnzimmer mit einem Denon-Receiver und den ELAC-Lautsprechern schon eine vernünftige Basis habe, schied für mich ein neues Komplettset der oben genannten Kandidaten aus. Ausser der Raumfeld-Reihe haben die meisten Multiroom-Sets auch eher &#8222;Plastik-Charm&#8220;, weshalb ich die ELAC-Lautsprecher bevorzuge.</p>
<h3>Bedeutet Multiroom synchrone Musikwiedergabe?</h3>
<p>Im Fall der oben beschriebenen Multiroom-Lösungen sollte der Ton schon synchron aus den Lautsprechern kommen. Schliesslich soll damit unter anderem auch 5.1/7.1/usw. umgesetzt werden. Das erledigt bei mir der Denon-Receiver ja schon. Bleibt noch die Synchronität zwischen Lautsprechern die z.B. in verschiedenen Räumen aufgestellt sind. Primär die Räume, die auch &#8222;akustisch verbunden&#8220; sind. Das war erstmal nicht mein Ziel, da es mir im ersten Anlauf um die Beschallung des Wohnzimmers <span style="text-decoration: underline;">oder</span> der Küche basierend auf der Musikdatenbank des Wohnzimmer-PCs geht. Bei Filmen benötige ich den Ton nicht in der Küche oder sonstwo im Haus. Natürlich habe ich mich auch mit dem synchronen Abspielen der Musik beschäftigt aber dazu später mehr.</p>
<p><span id="more-1033"></span></p>
<h3>Erste Ansätze</h3>
<p>Meine erste Idee war die Steuerung aller Lautsprecher mittels des Wohnzimmer-PCs. Kodi selber gibt da aber meines Wissens bisher nichts her. Daher war der erste Versuch mit Linuxmitteln und PulseAudio. Damit PulseAudio auch mit Airplay-Geräten umgehen kann, bedarf es der Installation zweier Pakete:</p>
<ul>
<li><strong>pulseaudio-module-raop</strong></li>
<li><strong>paprefs</strong></li>
</ul>
<pre class="">sudo apt-get update
sudo apt-get upgrade
sudo apt-get install pulseaudio-module-raop
sudo apt-get install paprefs</pre>
<p>Danach ist in den PusleAudio-Einstellungen die Unterstützung von Airplay-Lautsprechern vorhanden.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/ubuntu-airplay.png" rel="attachment wp-att-1068"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1068" src="http://blog.bubux.de/wp-content/uploads/2016/01/ubuntu-airplay.png" alt="ubuntu-airplay" width="749" height="323" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/ubuntu-airplay.png 749w, https://www.bubuxblog.de/wp-content/uploads/2016/01/ubuntu-airplay-300x129.png 300w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<p>Der Airplay-Lautsprecher in der Küche wurde gefunden und ich konnte die Audiowiedergabe mittels der PulseAudio-Einstellungen entweder im Wohnzimmer oder in der Küche hören. Diese Lösung hatte einen extrem niedrigen <a href="https://de.wikipedia.org/wiki/Woman_acceptance_factor" target="_blank">WAF</a> und war mir selber auch zu umständlich, da immer zwischen Kodi und den Audio-Einstellungen gewechselt werden musste. Zudem funktioniert <a href="https://en.wikipedia.org/wiki/Remote_Audio_Output_Protocol" target="_blank">RAOP </a>nicht mit Airplay2-Lautsprechern. Mit diesem Manko beschäftigt sich <a href="https://hfujita.github.io/pulseaudio-raop2/" target="_blank">RAOP2</a> was mir aber noch zu experimentell ist. Vom Wohnzimmer-PC wird mittlerweile eine 24/7-Verfügbarkeit erwartet ;-).</p>
<h3>Küchentablet</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/yatse_lokal.jpg" rel="attachment wp-att-1071"><img loading="lazy" decoding="async" class=" wp-image-1071 alignright" src="http://blog.bubux.de/wp-content/uploads/2016/01/yatse_lokal.jpg" alt="yatse_lokal" width="169" height="343" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/yatse_lokal.jpg 224w, https://www.bubuxblog.de/wp-content/uploads/2016/01/yatse_lokal-148x300.jpg 148w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a>Zweiter Versuch war eine Lösung über unser Küchentablet welches hauptsächlich für Chefkoch-Rezepte genutzt wurde. Aber es ist ja auch schick die Musik in der Küche, auch aus der Küche steuern zu können. Mit lokal auf dem Tablet gespeicherter Musik war es keine große Herausforderung den neuen Küchenlautsprecher zu nutzen. Die Canton-Musicbox taucht in allen Audioplayern mittels &#8222;Abspielen mit&#8220;-Menüs im Android auf.</p>
<p>Ich wollte aber auf die komplette Musikdatenbank vom Kodi zugreifen. Also <a href="http://yatse.tv/redmine/projects/yatse" target="_blank">Yatse</a> zur Fernsteuerung vom Kodi auf dem Tablet installiert und weiter getestet. Im Yatse gab es aber leider keine Möglichkeit zur Audioausgabe auf vorhandenen WLAN-Lautsprechern. Entweder konnte die Musik im Wohnzimmer, wo Kodi selbst läuft, gesteuert werden oder die Musik konnte lokal auf dem Tablet über dessen Lautsprecher wiedergegeben werden. Das will aber nun wirklich niemand hören.</p>
<p>&nbsp;</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/airaudio.png" rel="attachment wp-att-1073"><img loading="lazy" decoding="async" class=" wp-image-1073 alignleft" src="http://blog.bubux.de/wp-content/uploads/2016/01/airaudio.png" alt="airaudio" width="58" height="58" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/airaudio.png 225w, https://www.bubuxblog.de/wp-content/uploads/2016/01/airaudio-150x150.png 150w" sizes="auto, (max-width: 58px) 100vw, 58px" /></a>Wenn der Ton aber nun schon auf dem Tablet ist, muss man ihn doch auch irgendwo anders abspielen können? Da kommt die App <a href="http://www.airaudio.eu/" target="_blank">AirAudio</a> in Spiel. Diese &#8222;hijacked&#8220; den am Tablet ausgegebenen Ton und kann diesen dann mittels verschiedener Protokolle (Airplay, DLNA, Sonos, &#8230;.) an dem Tablet bekannte Lautsprecher streamen. Dazu muss allerdings das Tablet gerooted werden da Android dieses &#8222;abgreifen&#8220; der Audioausgabe normalerweise nicht zulässt. Bei dem alten Samsung Tab 3 geht das Rooten zum Glück relativ einfach.</p>
<p>Nach dem Start von AirAudio erscheinen dort nun alle gefunden Lautsprecher. Natürlich auch die Musicbox als Airplay-Lautsprecher. Damit Kodi auch als Airplay-Lautsprecher gefunden wird, muss die Airplay-Unterstützung in den Kodi-Einstellungen <a href="http://stadt-bremerhaven.de/airplay-kodi-fire-tv/" target="_blank">aktiviert</a> werden.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8772.jpg" rel="attachment wp-att-1075"><img loading="lazy" decoding="async" class="alignnone wp-image-1075" src="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8772-e1453482663620-1024x724.jpg" alt="IMG_8772" width="750" height="530" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8772-e1453482663620-1024x724.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8772-e1453482663620-300x212.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8772-e1453482663620-768x543.jpg 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></p>
<p>In AirAudio kann nun per Fingertip auf das Airplay-Symbol vor dem gefunden Lautsprecher der Ton des Tablets umgeleitet werden. Die Lautstärke jedes Lautsprechers ist auch einzeln regelbar. Das funktioniert alles sehr gut, da stimmt der WAF und ich hatte meine erste Anforderung an Multiroom gelöst. Es lassen sich natürlich problemlos zusätzliche Airplay-fähige Geräte hinzufügen.</p>
<h3>Synchrone Musikwiedergabe</h3>
<p>Interessant wird es jetzt, wenn zwei oder mehr Lautsprecher ausgewählt werden! Das funktioniert auch. Hier kommt jetzt aber das mit der Synchronität nochmal ins Spiel. Schon wenigen Millisekunden Unterschied in der Wiedergabe sind für das menschliche Ohr zu erkennen und auch sehr unangenehm für den Zuhörer.</p>
<p>Solch ein Unterschied ist leider auch bei der Wiedergabe über AirAudio auf mehrere Lautsprecher vorhanden. Dafür bietet die App aber die Möglichkeit, die Verzögerung (in Millisekunden) jedes Lautsprechers zu ändern.</p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8773.jpg" rel="attachment wp-att-1076"><img loading="lazy" decoding="async" class="alignnone wp-image-1076" src="http://blog.bubux.de/wp-content/uploads/2016/01/IMG_8773-1024x683.jpg" alt="IMG_8773" width="750" height="500" srcset="https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8773-1024x683.jpg 1024w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8773-300x200.jpg 300w, https://www.bubuxblog.de/wp-content/uploads/2016/01/IMG_8773-768x512.jpg 768w" sizes="auto, (max-width: 750px) 100vw, 750px" /></a></p>
<p>Nach längerem Ausprobieren bekommt man den Ton dann wirklich synchron auf den Lautsprechern ausgegeben. Leider ist das Vergnügen nur von kurzer Dauer da es nach einer Weile wieder auseinander driftet und nach dem nächsten Start der App wieder komplett asynchron läuft. Somit ist eine synchrones Abspielen mittels AirAudio, zumindest bei mir, bisher nicht möglich.</p>
<p>Nett an der Lösung mit AirAudio ist aber noch, das neben der Ausgabe von Yatse auch Amazon Prime Musik, Spotify und Co. auf den verfügbaren Lautsprechern wieder gegeben werden können. Viele dieser Musik-Streaming Apps lassen normalerweise nur eine lokale Wiedergabe des Tons zu und verfügen nicht über &#8222;Abspielen mit&#8220;-Funktionalität.</p>
<h3>Synchronität die Zweite</h3>
<p>So richtig lies mich das Problem mit der Synchronität aber doch nicht los. Nach etwas Recherche im Internet gab es da noch die App <a href="http://www.whaale.com/" target="_blank">Whaale</a>. Diese gab es damals aber nur für Apple-Geräte. Ich war dann kurz versucht mir ein iPad zu beschaffen, konnte mich dann aber grade noch so zurückhalten als ich die Preise für gebrauchte iPad2 gesehen habe. Den Kram kann Apple behalten.</p>
<p>Zwischenzeitlich ist auch eine Android-Version verfügbar. Leider verabschiedet sich Kodi auf dem Linux-Rechner augenblicklich mit einem Segmentation-Fault sobald Whaale versucht, Kodi als Airplay-Lautsprecher zu nutzen. Entweder ist nun die Whaale-Version für Android noch fehlerhaft oder meinem Kodi (v15.2 “Isengard”) ist irgendwas nicht genehm. Nun warte ich auf Updates von Whaale und die neue Kodi Version &#8222;Jarvis&#8220;. Dort muss man dann wahrscheinlich nur noch &#8222;Jarvis, Spiele Musik im Wohnzimmer ab&#8220; sagen.</p>
<p>Mit Whaale kann ausserdem nur lokal gespeicherte Musik und das Angebot einiger Streamingdienste wiedergegeben werden.</p>
<p>Ich bleibe aber an der Sache dran. Es macht ja auch viel mehr Spaß als ein fertiges System von Sonos welches wahrscheinlich einwandfrei funktioniert&#8230;</p>
<h3><span style="color: #ff0000;">Synchronität Update</span></h3>
<p><span style="color: #ff0000;">Mittlerweile funktioniert das synchrone Abspielen einwandfrei! Wie genau es umgesetzt wurde, ist in <a href="http://blog.bubux.de/multiroom-mit-kodi-und-airaudio/" target="_blank">diesem Artikel</a> beschrieben.</span></p>
<p>&nbsp;</p>
<p>Gruß</p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/multiroom-mit-kodi/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry PI 24/7 operation &#8211; Update</title>
		<link>https://www.bubuxblog.de/raspberry-pi-247-operation-update/</link>
					<comments>https://www.bubuxblog.de/raspberry-pi-247-operation-update/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 21 Mar 2015 16:32:55 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=893</guid>

					<description><![CDATA[Nach den Anpassungen für den Neustart des Netzwerkinterfaces wie in Artikel &#8222;Stabiler 24/7 Betrieb des Raspberry&#8220; beschrieben, läuft der Minirechner heute genau seit 100 Tagen. Sehr gut! After the adjustments to restart the network interface as described in post &#8222;Stabiler 24/7 Betrieb des Raspberry&#8222;, the Raspberry PI runs just fine for 100 days now. Very [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nach den Anpassungen für den Neustart des Netzwerkinterfaces wie in Artikel &#8222;<span style="text-decoration: underline;"><a title="Stabiler 24/7 Betrieb des Raspberry – Netzwerk neu starten" href="http://blog.bubux.de/?p=631">Stabiler 24/7 Betrieb des Raspberry</a></span>&#8220; beschrieben, läuft der Minirechner heute genau seit 100 Tagen. Sehr gut!</p>
<p id="tw-target-text" class="tw-data-text vk_txt tw-ta tw-text-small" dir="ltr" data-placeholder="Übersetzung"><span style="color: #003366;">After the adjustments to restart the network interface as described in post &#8222;<span style="text-decoration: underline;"><a style="color: #003366; text-decoration: underline;" title="Stabiler 24/7 Betrieb des Raspberry – Netzwerk neu starten" href="http://blog.bubux.de/?p=631">Stabiler 24/7 Betrieb des Raspberry</a></span>&#8222;, the Raspberry PI runs just fine for 100 days now. Very good!</span></p>
<p><a href="http://blog.bubux.de/wp-content/uploads/2015/03/raspi_uptime.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-892 size-full" src="http://blog.bubux.de/wp-content/uploads/2015/03/raspi_uptime.jpg" alt="Raspberry Pi Uptime" width="675" height="425" srcset="https://www.bubuxblog.de/wp-content/uploads/2015/03/raspi_uptime.jpg 675w, https://www.bubuxblog.de/wp-content/uploads/2015/03/raspi_uptime-300x189.jpg 300w" sizes="auto, (max-width: 675px) 100vw, 675px" /></a></p>
<p>Chris</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/raspberry-pi-247-operation-update/feed/</wfw:commentRss>
			<slash:comments>0</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>
	</channel>
</rss>
