<?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>MySQL &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Fri, 08 Mar 2019 17:01: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>Feinstaub messen &#8211; Auswertungen und Graph</title>
		<link>https://www.bubuxblog.de/feinstaub-messen-auswertungen-und-graph/</link>
					<comments>https://www.bubuxblog.de/feinstaub-messen-auswertungen-und-graph/#comments</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sun, 30 Apr 2017 09:46:09 +0000</pubDate>
				<category><![CDATA[Snippet]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1417</guid>

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

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

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

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

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


<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/viessmann-heizung-auslesen/feed/</wfw:commentRss>
			<slash:comments>70</slash:comments>
		
		
			</item>
		<item>
		<title>Snippet &#8211; MySQL Datenbank sichern</title>
		<link>https://www.bubuxblog.de/snippet-mysql-datenbank-sichern/</link>
					<comments>https://www.bubuxblog.de/snippet-mysql-datenbank-sichern/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Sat, 22 Feb 2014 10:55:29 +0000</pubDate>
				<category><![CDATA[Snippet]]></category>
		<category><![CDATA[Datenbanksicherung]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RaspberryPI]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=322</guid>

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