<?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>PHP &#8211; bubuxblog</title>
	<atom:link href="https://www.bubuxblog.de/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bubuxblog.de</link>
	<description></description>
	<lastBuildDate>Tue, 10 Apr 2018 15:48:29 +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>Webseite zur Darstellung der Sensordaten</title>
		<link>https://www.bubuxblog.de/webseite-zur-darstellung-der-sensordaten/</link>
					<comments>https://www.bubuxblog.de/webseite-zur-darstellung-der-sensordaten/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Mon, 09 Apr 2018 18:08:04 +0000</pubDate>
				<category><![CDATA[Haustechnik]]></category>
		<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Odroid]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Gaszähler]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sensordaten anzeigen]]></category>
		<category><![CDATA[Webseite]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1526</guid>

					<description><![CDATA[Da ich in der letzten Zeit sehr oft bezüglich der Erstellung einer Webseite zur Darstellung der Sensordaten (Heizung, Strom, Wasser, Gas, &#8230;) angesprochen wurde, habe ich mich entschlossen eine abgespeckte Variante meiner internen Webseite zu veröffentlichen. Die Webseite nutzt eine ältere Version der Metro UI-Oberfläche als &#8222;Framework&#8220; zur Darstellung der HTML-Seiten, sowie pChart zum Zeichnen [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Da ich in der letzten Zeit sehr oft bezüglich der Erstellung einer Webseite zur Darstellung der Sensordaten (Heizung, Strom, Wasser, Gas, &#8230;) angesprochen wurde, habe ich mich entschlossen eine abgespeckte Variante meiner internen Webseite zu veröffentlichen. Die Webseite nutzt eine ältere Version der <a href="https://metroui.org.ua/" target="_blank" rel="noopener">Metro UI-Oberfläche</a> als &#8222;Framework&#8220; zur Darstellung der HTML-Seiten, sowie <a href="http://www.pchart.net/" target="_blank" rel="noopener">pChart</a> zum Zeichnen der Graphen in den Detailansichten.</p>
<p>Meine Implementierung ist schon etwas älter und auch mit der Zeit gewachsen. Da es sich bei dieser Webseite um ein recht überschaubares Projekt handelt und ich mit dem Ergebnis zufrieden bin, habe ich mir nie die Mühe gemacht die Seite generischer zu gestalten. Daher muss bei nötigen Anpassungen der Code direkt geändert werden und es gibt auch keine Trennung von HTML und PHP, keine durchgehende allumfassende Fehlerbehandlung, evtl. &#8222;unschönes&#8220; HTML usw.</p>
<p>Der Code soll als <strong>Anregung und Grundlage</strong> für eine eigene Seite dienen&#8230;nicht mehr, nicht weniger. Wem´s ausreicht kann es natürlich auch 1:1 übernehmen. Positiv an meiner Lösung finde ich immer noch die Flexibilität in den Auswertungen die direkt auf der Datenbank mittels SQL ausgeführt werden können.</p>
<h3>Die Startseite</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2018/04/index.png"><img fetchpriority="high" decoding="async" class="alignnone wp-image-1537 size-large" src="http://blog.bubux.de/wp-content/uploads/2018/04/index-1024x538.png" alt="Übersicht Webseite Sensordaten" width="768" height="404" srcset="https://www.bubuxblog.de/wp-content/uploads/2018/04/index-1024x538.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2018/04/index-300x158.png 300w, https://www.bubuxblog.de/wp-content/uploads/2018/04/index-768x404.png 768w, https://www.bubuxblog.de/wp-content/uploads/2018/04/index.png 1397w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<p>Die Startseite wird mittels &#8222;Meta-Refresh&#8220; alle 180 Sekunden neu geladen und dient der Übersicht der wichtigsten Sensordaten. Mit Klick auf die (verlinkten) Boxen gelangt man jeweils zu einer detaillierteren Übersicht der Sensordaten. In der Übersicht werden keine komplizierten Datenbankauswertungen gemacht. Hier werden die Snapshot-Tabellen mit den aktuellen Werten ausgelesen und einige SQL-Aggregat-Funktionen genutzt. Das ging auch auf einem alten Raspi einigermaßen schnell. Das hängt natürlich von den Tabellengrößen in den Datenbanken ab. Da bei mir einige Tabellen mit den Jahren relativ groß geworden sind (~500k Zeilen), bin ich irgendwann auf einen <a href="http://blog.bubux.de/odroid-c2-vs-raspberry-pi-2/">Odroid</a> umgestiegen.</p>
<p><span id="more-1526"></span></p>
<h3>Übersicht der Außentemperaturen</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2018/04/aussentemperatur.png"><img decoding="async" class="alignnone wp-image-1541 size-large" src="http://blog.bubux.de/wp-content/uploads/2018/04/aussentemperatur-1024x606.png" alt="AUssentemperatur Webseite" width="768" height="455" srcset="https://www.bubuxblog.de/wp-content/uploads/2018/04/aussentemperatur-1024x606.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2018/04/aussentemperatur-300x178.png 300w, https://www.bubuxblog.de/wp-content/uploads/2018/04/aussentemperatur-768x455.png 768w, https://www.bubuxblog.de/wp-content/uploads/2018/04/aussentemperatur.png 1395w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<p>Die Übersicht der Außentemperatur wird aus den Daten des Außenfühlers der Viessmann-Heizung generiert. Die Übersichten für anderen Sensoren sehen analog dieser Ansicht aus.</p>
<p>&nbsp;</p>
<h3>Die Übersicht der Heizungsdaten</h3>
<p><a href="http://blog.bubux.de/wp-content/uploads/2018/04/heizung.png"><img decoding="async" class="alignnone size-large wp-image-1543" src="http://blog.bubux.de/wp-content/uploads/2018/04/heizung-1024x610.png" alt="" width="768" height="458" srcset="https://www.bubuxblog.de/wp-content/uploads/2018/04/heizung-1024x610.png 1024w, https://www.bubuxblog.de/wp-content/uploads/2018/04/heizung-300x179.png 300w, https://www.bubuxblog.de/wp-content/uploads/2018/04/heizung-768x458.png 768w, https://www.bubuxblog.de/wp-content/uploads/2018/04/heizung.png 1393w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<p>Die Übersicht der Heizungsdaten stellt verschiedene Daten dar die mittels <a href="https://github.com/openv/openv/wiki">openv</a> aus der Heizung ausgelesen werden. Aktuell lese ich mit openv nur aus und setze keine Werte (z.B. Sommer-/Winterumschaltung).</p>
<p>&nbsp;</p>
<h3>Voraussetzung und Grundlagen</h3>
<p>Details zum Auslesen der verschiedenen Sensordaten findet ihr in vorangegangenen Artikeln hier im Blog:</p>
<ul>
<li><a href="http://blog.bubux.de/viessmann-heizung-auslesen/">Viessmann Heizung mittels openv auslesen</a></li>
<li><a href="http://blog.bubux.de/m-bus-wasserzaehler/">M-Bus Wasserzähler auslesen</a></li>
<li><a href="http://blog.bubux.de/gaszaehler-auslesen/">Gaszähler mit Reed auslesen</a></li>
<li><a href="http://blog.bubux.de/raspberry-pi-ehz-auslesen/">Stromzähler mit optischem Lesekopf auslesen</a></li>
</ul>
<p>Die Webseite liest die Datenbanken des Wasserzähler, des Gaszählers, der Heizung und des Stromzählers aus. Folgend nochmal eine Übersicht der Tabellenstrukturen welche auch in den Artikel oben zu finden sind. In MySQL (bzw. MariaDB) habe ich zwei Datenbanken angelegt (vito, haus) mit verschiedenen Tabellen.</p>
<h4>Die Tabellen der Datenbank &#8222;vito&#8220;:</h4>
<pre class=""> CREATE TABLE `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>
<pre class="">CREATE TABLE `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>
<pre class="">CREATE TABLE `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>
<pre class="">CREATE TABLE `temperaturen` (
 `timestamp` datetime NOT NULL,
 `aussentemperatur` float NOT NULL,
 `warmwasser` float NOT NULL,
 `speicher_unten` float NOT NULL,
 `kollektor` float NOT NULL,
 `vorlaufsolltemperaturM2` float NOT NULL,
 KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<h3>&nbsp;</h3>
<h4>Die Tabellen der Datenbank &#8222;haus&#8220;:</h4>
<pre class="">CREATE TABLE `gaszaehler` (
 `timestamp` datetime NOT NULL,
 `zaehlerstand` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<pre class="">CREATE TABLE `stromzaehler` (
 `timestamp` datetime NOT NULL,
 `public_key` varchar(100) NOT NULL,
 `zaehlerstand` float DEFAULT NULL,
 `active_power` float NOT NULL,
 KEY `strom_index` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<pre class="">CREATE TABLE `strom_snapshot` (
 `zeitstempel` date NOT NULL,
 `zaehlerstand` float NOT NULL,
 `wirkleistung` float NOT NULL,
 `aktuelles_jahr` float NOT NULL,
 `aktueller_monat` float NOT NULL,
 `aktueller_tag` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<pre class="">CREATE TABLE `wasserzaehler` (
 `timestamp` datetime NOT NULL,
 `zaehlerid` int(11) NOT NULL,
 `zaehlerstand` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<pre class="">CREATE TABLE `wasser_snapshot` (
 `timestamp` date NOT NULL,
 `zaehlerstand` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1</pre>
<h3>&nbsp;</h3>
<h3>&#8222;Installation&#8220;</h3>
<p>Einen funktionierenden Webserver (z.B. Apache) mit PHP und eine MySQL oder MariaDB vorausgesetzt, muss das unten verlinkte tar.gz in ein beliebiges Verzeichnis im www-Verzeichnis des Webservers entpackt werden.</p>
<p>Das funktioniert mit&nbsp;</p>
<pre class="toolbar:2 nums:false lang:default decode:true ">tar -xvzf webseite_sensordaten.tar.gz</pre>
<h3>&nbsp;</h3>
<h3>Konfiguration</h3>
<p>In der Datei config.inc müssen ein paar wenige Einstellungen vorgenommen werden. Folgende Einstellungen werden für die Verbindung zur Datenbank benötigt:</p>
<pre class="toolbar:2 nums:false lang:default decode:true">$mysqlhost="&lt;hostname&gt;";
$mysqluser="&lt;username&gt;";
$mysqlpwd="&lt;passwort&gt;";
$mysqldbvito="&lt;name_der_db_mit_den_vito_tabellen&gt;";
$mysqldbhaus="&lt;name_der_db_mit_den_haus_tabellen&gt;";</pre>
<p>Die folgenden Werte dienen der Auswertung des Gaszählers. Da dieser per Reed-Kontakt ausgelesen keinen Gesamtstand ausgibt und nur die einzelnen Impulse zählt, kann hier ein Startwert definiert. Auch die Werte zur Umrechnung von m³ in KW werden hier eingetragen. Diese Informationen gibt es beim Gaslieferanten.</p>
<p>Zudem kann noch definiert werden wie viel Tage in der Übersicht angezeigt werden sollen. Entsprechender Werte gibt es auch für den Wasserzähler und den Stromzähler.</p>
<pre class="toolbar:2 nums:false lang:default decode:true">$gas_startwert="2311650";
$brennwert_gas=10.097;
$zustandszahl_gas=0.9309;
$anz_tage_gas=7;

$anz_tage_wasser=7;

$anz_tage_strom=7;</pre>
<p>&nbsp;</p>
<p><strong>Wichtiger und letzter Schritt:</strong> Das Verzeichnis &#8222;tmp&#8220; muss schreibbar für den Webserver sein. Dort werden die generierten Graphen als PNG gespeichert. Das war es schon!</p>
<p><strong>Fehlt nur noch das Paket mit den PHP-Seiten: <a href="http://blog.bubux.de/wp-content/uploads/2018/04/webseite_sensordaten.tar.gz">webseite_sensordaten.tar.gz</a></strong></p>
<p>&nbsp;</p>
<p>Viel Spaß mit</p>
<p>Chris</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bubuxblog.de/webseite-zur-darstellung-der-sensordaten/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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 loading="lazy" 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="auto, (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>Gaszähler auslesen &#8211; Darstellung der Daten</title>
		<link>https://www.bubuxblog.de/gaszaehler/</link>
					<comments>https://www.bubuxblog.de/gaszaehler/#respond</comments>
		
		<dc:creator><![CDATA[diefenbecker]]></dc:creator>
		<pubDate>Tue, 19 Jan 2016 20:46:35 +0000</pubDate>
				<category><![CDATA[Heimautomatisierung]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Snippet]]></category>
		<category><![CDATA[Gaszähler]]></category>
		<category><![CDATA[Hausautomatisierung]]></category>
		<category><![CDATA[Homeautomation]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.bubux.de/?p=1035</guid>

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

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