<?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>Wasserzähler &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/tag/wasserzaehler/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Fri, 11 Aug 2017 14:41:30 +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>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 fetchpriority="high" 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="(max-width: 300px) 100vw, 300px" /></a> <a href="http://blog.bubux.de/wp-content/uploads/2014/11/IMG_7715.jpg"><img 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="(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 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="(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>
	</channel>
</rss>
