{"id":287,"date":"2018-09-13T16:13:42","date_gmt":"2018-09-13T16:13:42","guid":{"rendered":"http:\/\/test1.schartel-web.de\/?page_id=287"},"modified":"2018-09-16T13:02:24","modified_gmt":"2018-09-16T13:02:24","slug":"temperatur","status":"publish","type":"page","link":"http:\/\/test1.schartel-web.de\/?page_id=287","title":{"rendered":"Temperatur"},"content":{"rendered":"<p><a name=\"anfang\"><\/a><\/p>\n<h1><span id=\"Temperaturlogging_mit_dem_rrdtool\">Temperaturlogging mit dem rrdtool<\/span><\/h1><div id=\"toc_container\" class=\"toc_wrap_right toc_light_blue no_bullets\"><p class=\"toc_title\">Inhalt<\/p><ul class=\"toc_list\"><li><ul><li><\/li><li><ul><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><li><\/li><\/ul><\/li><li><ul><li><\/li><\/ul><\/li><li><\/li><\/ul><\/li><\/ul><\/div>\n\n<p><\/p>\n<h2><span id=\"1nbspEinleitung\">1.&nbsp;Einleitung<\/span><\/h2>\n<p>Im folgenden wird beschrieben wie Temperaturen mit<\/p>\n<p>1.) kabelgebundenen Temperatursensoren Dallas DS81B20, dem Net-IO-Board von Pollin, dem RasperiPi und dem rrdtool<br \/>\nund<br \/>\n2.) mit den an die WLAN-Funkmodule angschlossenen Temperatursensoren Dallas DS18B20, dem RaspberryPi und dem rrdtool<\/p>\n<p>aufgezeichnet werden.<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h2><span id=\"2_Kabelgebundene_Temperatursensoren_Dallas_DS18b20_mit_AVR-Net-IO_von_Pollin_Raspberry_Pi_mit_Raspian_Ethersex\">2. Kabelgebundene Temperatursensoren Dallas DS18b20 mit AVR-Net-IO von Pollin, Raspberry Pi mit Raspian, Ethersex<\/span><\/h2>\n<h3><span id=\"21_Ethersex_Firmware_fuer_AVR-NET-IO_erzeugen_ethersexhex\">2.1 Ethersex Firmware f\u00fcr AVR-NET-IO erzeugen (ethersex.hex)<\/span><\/h3>\n<p>Dazu ist das AVR-Net-IO von Pollin erforderlich, es kann bei Pollin (www.pollin.de) als Fertigmodul oder als Bausatz bezogen werden (AVR-Fertigmodul 28,95 \u20ac Stand Dez. 2016). Empfohlen wird ein Austausch des Prozessors Atmega 32 &#8211;&gt; Atmega 644 (fuses atmega 644: ef: FF ,hf 99 oder D9, lf:FF). Zum flashen der ethersex-Firmware ist ein ISP Programmer erforderlich (z.Bsp der\u00a0<a href=\"http:\/\/www.conrad.de\/ce\/ProductDetail.html?hk=SEM&amp;insert=NA&amp;WT.srch=1&amp;utm_source=google&amp;utm_medium=deeplink&amp;utm_content=dl_article&amp;utm_campaign=g_adwords&amp;productcode=191406&amp;gclid=CI--mKPAsLICFYHwzAodsWUASA\">Smart USB Light<\/a> oder der USBasp).<br \/>\nWer keine Linux-Maschine hat, kann sich unter Windows mit Hilfe des kostenlosen VMWARE eine virtuelle Ubuntu Maschine installieren \/z.Bsp Ubuntu 10.04).<br \/>\nIn einem Terminalfenster wird mit den ogligatorischen Befehlen<br \/>\n&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">apt-get update<br \/>\napt-get upgrade<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>das Ubuntu system auf den neuesten Stand gebracht.<br \/>\nEs empfiehlt sich mit mkdir ein Verzeichnis z.B. ethersexinstall zu erstellen , in das Verzeichnis zu wechseln und dann die Ethersexsoftware von dem repostiory zu holen:<br \/>\n&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">git clone git:\/\/github.com\/ethersex\/ethersex.git<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Damit das make menuconfig funktioniert m\u00fcssen vorher noch einige Pakete installiert werden:<br \/>\n&nbsp;<\/p>\n<table border=\"1\" frame=\"box\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">sudo apt-get install gcc-avr avr-libc binutils-avr m4 gawk libncurses5-dev<br \/>\nmake dialog git-core avrdude<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Jetzt in das Verzeichnis ethersex wechseln und make menuconfig ausf\u00fchren:<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">make menuconfig<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong> Auf dem Bildschirm erscheint:<\/strong><\/p>\n<p><b>Load a Default Configuration<\/b> \u2192 Pollin AVR Net IO<br \/>\n<b>General Setup:<\/b> Prompt for Experimental Code markieren, Target Architecture: AVR, TARGET MCU: Atmega 644, MCU Frequency:16000000, Hardware\/periphery Class: NetIO VFS(Virtual File System Support): markieren, Control6 Skripts: markieren<br \/>\n<b>Network: <\/b> [*] Ethernet (ENC28J60) support \u2192 Etherrape IP address: &#8222;xxx.xxx.xxx&#8220;, Netmask: &#8222;255.255.255.0&#8220;<br \/>\n<b>Network: <\/b>[*]Default gateway: Das eigene Gateway, d.h. die IP Adresse des Routers eintragen.<br \/>\n<b>Network: <\/b>[*] TCP support<br \/>\n<b>Network: <\/b>[*] UDP support<br \/>\n<b>IO: <\/b>[*] Named and logic state I\/O \u2502 \u2502 \u2502 \u2502 (default) Named pin configuration<br \/>\n<b>IO: <\/b> [*] TTY Layer (EXPERIMENTAL) \u2192 (X) Simple<br \/>\n<b>IO: <\/b> [*] ADC input \u2192 (ARef) ADC Reference<br \/>\n<b>IO: <\/b> [*] Onewire support \u2192 [*] Onewire device detection support<br \/>\n<b>Protocols:<\/b>[*] ECMD (Ethersex Command) support \u2192 [*] TCP\/Telnet, [*] UDP<br \/>\n<b>Applications:<\/b> [*] System clock support \u2192 [*] Date and Time support , [*] Use 32 kHz crystal to tick the clock, [*] Synchronize using NTP protocol, [*] Uptime (whm in unix format like: d days, hh:mm)<br \/>\n<b>Applications:<\/b> [*] http Server<\/p>\n<p><b>Wenn unter Protocols [*] Use 32 kHz crystal to tick the clock aktiviert wird, muss an den PINs TOSC1(PC6) resp. TOSC2(PC7) ein 32 kHz Uhrenquarz angeschlossen werden.<\/b><\/p>\n<p>Danach mit make die Datei ethersex.hex erzeugen. Mit dieser Datei wird der Atmega 644 im Net IO Board geflasht.<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">make<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"22_Ethersex_Firmware_auf_AVR-NET-IO_flashen_ethersexhex\">2.2 Ethersex Firmware auf AVR-NET-IO flashen (ethersex.hex)<\/span><\/h3>\n<p>In das Verzeichnis ethersex mit <em>cd ethersex<\/em> wechseln und mit:<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">cd ethersex<\/td>\n<\/tr>\n<tr>\n<td class=\"temperatur\">sudo avrdude -p m644 -P lpt1 -c usbasp -U flash:w:ethersex.hex<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>den atmega 644 flashen.<\/p>\n<div id=\"attachment_326\" style=\"width: 235px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/usbasp-isp-prgrammer.jpg\"><img aria-describedby=\"caption-attachment-326\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-326 size-full\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/usbasp-isp-prgrammer.jpg\" alt=\"\" width=\"225\" height=\"225\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/usbasp-isp-prgrammer.jpg 225w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/usbasp-isp-prgrammer-150x150.jpg 150w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><p id=\"caption-attachment-326\" class=\"wp-caption-text\">usbasp isp avr programmer<\/p><\/div>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"23_Anschluss_der_Temperatursensoren_Dallas_DS18B20_an_das_Pollin_Board\">2.3 Anschlu\u00df der Temperatursensoren Dallas DS18B20 an das Pollin Board<\/span><\/h3>\n<p>&nbsp;<\/p>\n<div id=\"attachment_324\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board.jpg\"><img aria-describedby=\"caption-attachment-324\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-324 size-medium\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board-300x203.jpg\" alt=\"\" width=\"300\" height=\"203\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board-300x203.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board-768x519.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board-1024x692.jpg 1024w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/Pollin-board.jpg 1081w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-324\" class=\"wp-caption-text\">AVR-Net-IO von Pollin Sub D platine von Pollin (3,95 \u20ac Stand 12.16)<\/p><\/div>\n<p>&nbsp;<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"24_Anzeige_der_Temperaturwerte_der_Dallas_DS18B20_am_AVR-NET-IO_im_Webbrowser\">2.4 Anzeige der Temperaturwerte der Dallas DS18B20 am AVR-NET-IO im Webbrowser<\/span><\/h3>\n<p>Wird das Pollin Board nun per Netzwerkkabel an das lokale Netzwerk angeschlossen, so kann \u00fcber die IP-Adresse des Pollin Boardes die Oberfl\u00e4che von Ethersex angezeigt werden:<\/p>\n<p>Wird die IP-Adresse des Pollin Boards im Browser eingeben, es erscheint \u00e4hnliches wie:<br \/>\n<a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-317\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm-300x140.jpg\" alt=\"\" width=\"300\" height=\"140\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm-300x140.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm-768x359.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm-1024x479.jpg 1024w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ethersex_startbildschirm.jpg 1889w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Durch folgende Eingabe: IP-Adresse\/ow.ht erscheint:<\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ehtersex-1-wire-status.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-310\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ehtersex-1-wire-status-300x216.jpg\" alt=\"\" width=\"300\" height=\"216\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ehtersex-1-wire-status-300x216.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/ehtersex-1-wire-status.jpg 373w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Unter Address stehen die IDs der Temperatursensoren unter Data die jeweiligen Temperaturen.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"25_Tempeaturlogging_mit_dem_RaspberryPI\">2.5 Tempeaturlogging mit dem RaspberryPI<\/span><\/h3>\n<p>Mit einem RaspberryPI k\u00f6nnen die Temperaturwerte sowohl in einer Textdatei, als auch in einer MySql Datenbank geloggt werden. Eine weitere M\u00f6glichkeit ist das Temperaturlogging per rrdtool.<\/p>\n<p>Auf dem Raspi kann das Betriebssystem Raspian installiert werden, indem ein entsprechendes Image heruntergeladen wird und mit der Software win32diskimager auf die SD-Karte des Raspi<br \/>\n\u00fcbertragen wird.Nach dem ersten Start des Raspi und dem ssh-Zugang z.Bsp \u00fcber Mobaxterm empfiehlt es sich foglende Befehle auszuf\u00fchren:<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">apt-get update<\/td>\n<\/tr>\n<tr>\n<td class=\"temperatur\">apt-get upgrade<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Weiterhin m\u00fcssen folgende Pakete installiert werden:<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">apt-get install rrdtool<\/td>\n<\/tr>\n<tr>\n<td class=\"temperatur\">apt-get install php5<\/td>\n<\/tr>\n<tr>\n<td class=\"temperatur\">apt-get install netcat<\/td>\n<\/tr>\n<tr>\n<td class=\"temperatur\">apt-get install librrds-perl<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Voraussetzung f\u00fcr das logging der Temperaturen ist, da\u00df eine Datenbank f\u00fcr das rrdtool erzeugt werden mu\u00df.<\/p>\n<p>Nach der Installation des Raspi und der Installation der obigen Pakete kann das mit folgendem Befehlen in der Datei rrd_db_erzeug_ds_1820_kabel.sh erreicht werden:<\/p>\n<p><strong>rrd_db_erzeug_ds_1820_kabel.sh<\/strong><\/p>\n<p class=\"datei\">#!\/bin\/bash<br \/>\nrrdtool create hometemp_ds1820_kabel.rrd &#8211;step 300 \\<br \/>\nDS:temp_wz:GAUGE:600:U:U \\<br \/>\nDS:temp_k:GAUGE:600:U:U \\<br \/>\nRRA:AVERAGE:0.5:1:12 \\<br \/>\nRRA:AVERAGE:0.5:1:288 \\<br \/>\nRRA:AVERAGE:0.5:12:168 \\<br \/>\nRRA:AVERAGE:0.5:12:720 \\<br \/>\nRRA:AVERAGE:0.5:288:365<\/p>\n<p>In der ersten Zeile wird die rrd-Datenbank hometemp_ds1820_kabel.rrd erzeugt. Das &#8211;step 300 besagt, da\u00df alle 300 sek=5min ein Wert abgespeichert werden kann.<br \/>\ntemp_wz und temp_k sind die Namen der Temperaturwerte in der rrd-Datenbank. In dieser Datenbank werdn also zwei Temperaturwerte aufgezeichnet. Weitere Werte zur<br \/>\nErzeugung der rrd-Datenbank bitte im Internet zum Thema rrdtool nachlesen.<\/p>\n<p>Wird also die Datei hometemp_ds1820_kabel.rrd ausgef\u00fchrt, findet man im aktuellen Verzeichnis die rrd-Datenbank hometemp_ds1820_kabel.rrd.<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"26_Erfassen_der_Temperaturen_und_speichern_in_der_rrd-Datenbank_mit_einem_shellskript_rrd_temp_kabel_db_updatesh\">2.6 Erfassen der Temperaturen und speichern in der rrd-Datenbank mit einem shellskript rrd_temp_kabel_db_update.sh:<\/span><\/h3>\n<p class=\"datei\">#!\/bin\/bash<br \/>\nAVRNETIO_IP=&#8220;192.168.178.10&#8243;<br \/>\nAVRNETIO_PORT=2701<br \/>\nTEMP_ID=&#8220;28ff0cb0a1150354&#8243; #tempf\u00fchler vorne<br \/>\nTEMP_ID_ter=&#8220;28607e7406000065&#8243; #tempf\u00fchler terrasse<br \/>\ntemp_vorne_datei=&#8220;\/ethersex\/rfm12\/`date &#8218;+%Y&#8217;`\/`date &#8218;+%m&#8217;`\/`date &#8218;+%d&#8217;`\/temp_vorne_`date &#8218;+%Y&#8217;`_`date &#8218;+%m&#8217;`_`date &#8218;+%d&#8217;`neu_test.txt&#8220;<br \/>\ntemp_zaehler=0<br \/>\ntemp_zaehler_vorne=0<br \/>\ntag=`date &#8218;+%d&#8217;`<br \/>\njahr=`date &#8218;+%y&#8217;`<br \/>\nmonat=`date &#8218;+%m&#8217;`<br \/>\nstunde=`date &#8218;+%H&#8217;`<br \/>\nminute=`date &#8218;+%M&#8217;`<br \/>\nsekunde=`date &#8218;+%S&#8217;`<br \/>\nwhile [ -z &#8222;$temp_ter&#8220; ] #falls variable leer, while schleife<br \/>\ndo<br \/>\ntemp_zaehler_ter=`expr $temp_zaehler_ter + 1` #anzahl der Durchl\u00e4ufe in der Schleife<br \/>\necho &#8222;tempzaehlerterrasse=$temp_zaehler_ter&#8220;<br \/>\nif [ $temp_zaehler_ter -gt 5 ] ; then # ist die anzahl der Durchl\u00e4ufe gr\u00f6sser als 5, dann Abbruch<br \/>\nbreak<br \/>\nfi<br \/>\n`echo 1w convert $TEMP_ID_ter | nc -u -n $AVRNETIO_IP $AVRNETIO_PORT -q 1 | grep -v OK || exit 1` # Temperaturmessung<br \/>\ntemp_ter=`echo &#8222;1w get $TEMP_ID_ter&#8220; | nc -u -v -n $AVRNETIO_IP $AVRNETIO_PORT -q 1` #speichern der Temperatur in der Variable temp_ter<br \/>\ntemp_ter=`echo $temp_ter | sed &#8217;s\/^ \/\/&#8217;` #l\u00f6scht Leerzeichen<br \/>\necho &#8222;tempterrasse=$temp_ter&#8220;<br \/>\ndone<br \/>\nsleep 10<br \/>\nwhile [ -z &#8222;$temp_vorne&#8220; ]<br \/>\ndo<br \/>\ntemp_zaehler_vorne=`expr $temp_zaehler_vorne + 1`<br \/>\necho &#8222;tempzaehlervorne=$temp_zaehler_vorne&#8220;<br \/>\nif [ $temp_zaehler_vorne -gt 5 ] ; then<br \/>\nbreak<br \/>\nfi<br \/>\n`echo 1w convert $TEMP_ID | nc -u -n $AVRNETIO_IP $AVRNETIO_PORT -q 1 | grep -v OK || exit 1`<br \/>\ntemp_vorne=`echo &#8222;1w get $TEMP_ID&#8220; | nc -u -v -n $AVRNETIO_IP $AVRNETIO_PORT -q 1`<br \/>\ntemp_vorne=`echo $temp_vorne | sed &#8217;s\/^ \/\/&#8217;`<br \/>\necho &#8222;tempvorne=$temp_vorne&#8220;<br \/>\ndone<br \/>\necho &#8222;temperaturvorne=$temp_vorne&#8220;<br \/>\necho &#8222;temperaturterrasse=$temp_ter&#8220;<br \/>\ndatum_stunde_minute=`date +&#8217;%Y-%m-%d %H:%M:00&#8217;`<br \/>\nu_zeit=`date &#8211;date=&#8220;$datum_stunde_minute&#8220; +%s` #unixzeit<br \/>\ntemp_vorne1=`echo $temp_vorne | sed &#8217;s\/^ \/\/&#8217;` #l\u00f6scht leerzeichen<br \/>\necho &#8222;temperaturvorne=$temp_vorne&#8220;<br \/>\nzeile_ter=`echo $jahr $monat $tag $stunde $minute $sekunde $temp_ter1`<br \/>\necho &#8222;zeileterrasse=$zeile_ter&#8220;<br \/>\nif [ $var1w_ter != &#8222;1w&#8220; ] ; then<br \/>\necho $zeile_ter &gt;&gt; \/ethersex\/rfm12\/`date &#8218;+%Y&#8217;`\/`date &#8218;+%m&#8217;`\/`date &#8218;+%d&#8217;`\/temp_ter_`date &#8218;+%Y&#8217;`_`date &#8218;+%m&#8217;`_`date &#8218;+%d&#8217;`temp_terrasse.txt #Abspeichern der zeileterrasse in der Datei, im Verzeichnis \/ethersex\/rfm12\/2016\/<br \/>\n#Beispieldaeiname=temp_ter_2016_12_04temp_terrasse.txt<br \/>\nfi<br \/>\necho &#8222;temperatur=$temp_vorne1&#8220;<br \/>\necho &#8222;unixzeit=$u_zeit&#8220;<br \/>\nrrdtool update \/ethersex\/rrdtool\/hometemp_ds1820_kabel.rrd $u_zeit:$temp_wz1:$temp_vorne1 #speichert die Temperaturwerte mit der unixzeit in der rrd-Datenbank<\/p>\n<p>Diese Shellskript lasse ich mit Hilfe von crontab alle 5 min ausf\u00fchren. Dazu ist folgender Eintrag in der crontab erforderlich:<\/p>\n<p class=\"datei\">*\/5 * * * * \/ethersex\/rrdtool\/rrd_temp_kabel_db_update.sh<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"27_Anzeige_der_Temperaturwerte_in_einer_Graphik\">2.7 Anzeige der Temperaturwerte in einer Graphik<\/span><\/h3>\n<p>Damit die Temperaturwerte \u00fcber den Tag benutzerfreundlich angezeigt werden k\u00f6nnen ist eine Grafik erforderlich z.B. so:<br \/>\n<a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01.jpg\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01-300x138.jpg\" alt=\"\" width=\"300\" height=\"138\" class=\"alignnone size-medium wp-image-318\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01-300x138.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01-768x353.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01-1024x471.jpg 1024w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_01.jpg 1902w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Diese graphische Anzeige erfordert php, perl und javaskript. Mit javaskript wird der Kalender erzeugt mit perl die Graphik innerhalb von cgi-bin.<\/p>\n<p>Die Graphik kann angezeigt werden indem im Browser folgendes eingegeben wird:<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td class=\"temperatur\">IP-Adresse des Webservers\/temperatur.php <\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"28_Einrichtung_des_apache2_Webservers_fuer_cgi-bin\">2.8 Einrichtung des apache2 Webservers f\u00fcr cgi-bin<\/span><\/h3>\n<p><big>Im Verzeichnis<\/big><\/p>\n<p><em>\/etc\/apache2\/sites-available<\/em> die Datei <em>default<\/em> anpassen:<br \/>\n&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td>cd \/etc\/apache2\/sites-available<br \/>\nnano .\/default<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"29_Perl_Skript_zur_Erzeugung_der_Temperaturgraphik\">2.9 Perl Skript zur Erzeugung der Temperaturgraphik<\/span><\/h3>\n<p class=\"datei\">&lt;VirtualHost *:80&gt;<br \/>\nServerAdmin webmaster@localhost<br \/>\nDocumentRoot \/var\/www<br \/>\n&lt;Directory \/&gt;<br \/>\nOptions FollowSymLinks<br \/>\nAllowOverride None<br \/>\n&lt;\/Directory&gt;<br \/>\n&lt;Directory \/var\/www\/&gt;<br \/>\nOptions Indexes FollowSymLinks MultiViews ExecCGI<br \/>\nAllowOverride None<br \/>\nOrder allow,deny<br \/>\nallow from all<br \/>\n&lt;\/Directory&gt;<br \/>\nScriptAlias \/cgi-bin\/ \/usr\/lib\/cgi-bin\/<br \/>\n&lt;Directory &#8222;\/usr\/lib\/cgi-bin&#8220;&gt;<br \/>\nAllowOverride None<br \/>\nOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br \/>\nOrder allow,deny<br \/>\nAllow from all<br \/>\nAddHandler cgi-script .cgi .pl<br \/>\n&lt;\/Directory&gt;<br \/>\nErrorLog ${APACHE_LOG_DIR}\/error.log<br \/>\n# Possible values include: debug, info, notice, warn, error, crit,<br \/>\n# alert, emerg.<br \/>\nLogLevel warn<br \/>\nCustomLog ${APACHE_LOG_DIR}\/access.log combined<br \/>\n&lt;\/VirtualHost&gt;<\/p>\n<p>In dieser perl Datei k\u00f6nnen Graphiken f\u00fcr 5 Temperaturf\u00fchler erzeugt werden.<\/p>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">value <br \/>\nin <br \/>\ntemperatur.php<\/th><th class=\"column-2\">rrd-Datenbank<\/th><th class=\"column-3\">Temperatur-<br \/>\nBezeichnung <br \/>\nin <br \/>\nrrd-Datenbank<\/th><th class=\"column-4\">shellskript <br \/>\nErzeugung <br \/>\nDatenbank<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">rfm12temp<\/td><td class=\"column-2\">\/ethersex\/rrdtool\/hometemp.rrd<\/td><td class=\"column-3\">rfm12temp<\/td><td class=\"column-4\">\/ethersex\/rrdtool\/rrd_db_erzeug.sh<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">temp_vorne<\/td><td class=\"column-2\">\/ethersex\/rrdtool\/hometemp_ds1820_kabel.rrd<\/td><td class=\"column-3\">temp_k<\/td><td class=\"column-4\">\/ethersex\/rrdtool\/rrd_db_erzeug_ds_1820_kabel.sh<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">temp<\/td><td class=\"column-2\">\/ethersex\/rrdtool\/hometemp_neu_1.rrd<\/td><td class=\"column-3\">rfm12temp_ter<\/td><td class=\"column-4\">\/ethersex\/rrdtool\/rrd_db_erzeug_hometemp_neu_1.sh<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">temp_wz<\/td><td class=\"column-2\">\/ethersex\/rrdtool\/hometemp_ds1820_kabel.rrd<\/td><td class=\"column-3\">temp_wz<\/td><td class=\"column-4\">\/ethersex\/rrdtool\/rrd_db_erzeug_ds_1820_kabel.sh<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">temp_k<\/td><td class=\"column-2\">\/ethersex\/rrdtool\/hometemp_ds1820_kabel.rrd<\/td><td class=\"column-3\">temp_k<\/td><td class=\"column-4\">\/ethersex\/rrdtool\/rrd_db_erzeug_ds_1820_kabel.sh<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-2 from cache -->\n<p>In diesen if bzw. elsif Ausdr\u00fccken sind die jeweiligen value-werte der Datei temperatur.php:<\/p>\n<p>elsif (($x[0] eq &#8222;rfm12temp&#8220;) &amp;&amp; ($x[1] eq &#8222;temp_vorne&#8220;) &amp;&amp; ($x[2] eq &#8222;&#8220;)) # 1. und 2. bedeutet in der Datei temperatur.php diese beiden sind angehakt:<\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_02.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-319 size-medium\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_02-300x144.jpg\" alt=\"\" width=\"300\" height=\"144\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_02-300x144.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_02.jpg 444w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"210_Die_php-Datei_temperaturphp_zur_Anzeige_der_Temperaturgraphik_im_Web-Browser\">2.10 Die php-Datei temperatur.php zur Anzeige der Temperaturgraphik im Web-Browser<\/span><\/h3>\n<p>Die php-Datei temperatur.php sieht folgenderma\u00dfen aus:<\/p>\n<p class=\"datei\">&lt;!DOCTYPE html PUBLIC &#8222;-\/\/W3C\/\/DTD XHTML 1.0 Strict\/\/EN&#8220; &#8222;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-strict.dtd&#8220;&gt;<br \/>\n&lt;html xmlns=&#8220;http:\/\/www.w3.org\/1999\/xhtml&#8220; lang=&#8220;en&#8220; xml:lang=&#8220;en&#8220;&gt;<br \/>\n&lt;head&gt;<br \/>\n&lt;title&gt;Temperaturen rrdtool&lt;\/title&gt;<br \/>\n&lt;script type=&#8220;text\/javascript&#8220;&gt;<br \/>\n\/\/ &lt;!&#8211; webdarstellung frei nach http:\/\/www.kompf.de\/weather\/pionewire.html &#8211;&gt;<br \/>\nvar date = new Date();<br \/>\nvar monthNames = new Array(&#8222;Januar&#8220;, &#8222;Februar&#8220;, &#8222;M&amp;auml;rz&#8220;, &#8222;April&#8220;, &#8222;Mai&#8220;, &#8222;Juni&#8220;,<br \/>\n&#8222;Juli&#8220;, &#8222;August&#8220;, &#8222;September&#8220;, &#8222;Oktober&#8220;, &#8222;November&#8220;, &#8222;Dezember&#8220;);<br \/>\nvar daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);<br \/>\nfunction lenOfMonth() {<br \/>\nvar month = date.getMonth();<br \/>\nvar year = date.getFullYear();<br \/>\nif (1 == month) {<br \/>\nreturn ((0 == year % 4) &amp;&amp; (0 != (year % 100))) ||<br \/>\n(0 == year % 400) ? 29 : 28;<br \/>\n}<br \/>\nelse {<br \/>\nreturn daysInMonth[month];<br \/>\n}<br \/>\n}<br \/>\nfunction drawCalendar() {<br \/>\nvar d1 = new Date(date.getFullYear(), date.getMonth(), 1);<br \/>\nvar wday1 = d1.getDay() &#8211; 1;<br \/>\nif (wday1 &lt; 0) wday1 = 6;<br \/>\nvar mlen = lenOfMonth();<br \/>\ndocument.getElementById(&#8222;tyear&#8220;).innerHTML = date.getFullYear();<br \/>\ndocument.getElementById(&#8222;tmonth&#8220;).innerHTML = monthNames[date.getMonth()];<br \/>\nfor (var i = 0; i &lt; 42; ++i) {<br \/>\nvar el = document.getElementById(&#8222;td&#8220; + i);<br \/>\nvar d = i &#8211; wday1 + 1;<br \/>\nif (d &lt;= 0 || d &gt; mlen) {<br \/>\nel.innerHTML = &#8218;&amp;nbsp;&#8216;;<br \/>\n} else {<br \/>\nel.innerHTML = &#8220;;<br \/>\nvar a = document.createElement(&#8218;a&#8216;);<br \/>\na.href=&#8220;javascript:sd(&#8220; + d + &#8222;)&#8220;;<br \/>\na.innerHTML = d.toString();<br \/>\nel.appendChild(a);<br \/>\n}<br \/>\nif (d == date.getDate()) {<br \/>\nel.className = &#8217;selected&#8216;;<br \/>\n} else {<br \/>\nel.className = &#8220;;<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\nfunction setDateParams() {<br \/>\nvar month = date.getMonth() + 1;<br \/>\ndocument.forms[0].start.value = &#8222;00:00 &#8220; + date.getDate() + &#8222;.&#8220; + month + &#8222;.&#8220; + date.getFullYear();<br \/>\nvar endDate = new Date(date.getTime());<br \/>\nif (document.forms[0].range[0].checked == true) {<br \/>\nendDate.setDate(endDate.getDate() + 1);<br \/>\n} else if (document.forms[0].range[1].checked == true) {<br \/>\nendDate.setDate(endDate.getDate() + 7);<br \/>\n} else if (document.forms[0].range[2].checked == true) {<br \/>\nendDate.setMonth(endDate.getMonth() + 1);<br \/>\n} else if (document.forms[0].range[3].checked == true) {<br \/>\nendDate.setFullYear(endDate.getFullYear() + 1);<br \/>\n}<br \/>\nmonth = endDate.getMonth() + 1;<br \/>\ndocument.forms[0].end.value = &#8222;00:00 &#8220; + endDate.getDate() + &#8222;.&#8220; + month + &#8222;.&#8220; + endDate.getFullYear();<br \/>\n}<br \/>\nfunction dy(delta) {<br \/>\ndate.setFullYear(date.getFullYear() + delta);<br \/>\ndrawCalendar();<br \/>\nsetDateParams();<br \/>\n}<br \/>\nfunction dm(delta) {<br \/>\ndate.setMonth(date.getMonth() + delta);<br \/>\ndrawCalendar();<br \/>\nsetDateParams();<br \/>\n}<br \/>\nfunction sd(d) {<br \/>\ndate.setDate(d);<br \/>\ndrawCalendar();<br \/>\nsetDateParams();<br \/>\n}<br \/>\nfunction init() {<br \/>\ndrawCalendar();<br \/>\nsetDateParams();<br \/>\ndocument.forms[0].submit();<br \/>\n}<br \/>\n\/\/ &#8211;&gt;<br \/>\n&lt;\/script&gt;<br \/>\n&lt;style media=&#8220;all&#8220; type=&#8220;text\/css&#8220;&gt;<br \/>\n@import &#8222;..\/style\/kompf.css&#8220;;<br \/>\n&lt;\/style&gt;<br \/>\n&lt;style type=&#8220;text\/css&#8220;&gt;<br \/>\nbody, table, form {<br \/>\nfont: 10px\/16px open_sans, arial, helvetica, sans-serif;<br \/>\nbackground-color: white;<br \/>\nmargin:0px;<br \/>\nwidth:100%;<br \/>\n}<br \/>\nform table, form table td {<br \/>\nbackground-color: #F8F475;<br \/>\n}<br \/>\ntd {<br \/>\nfont: 18px\/24px open_sans, arial, helvetica, sans-serif;<br \/>\nborder-width: 0px 0px 1px 0px;<br \/>\nborder-style: solid;<br \/>\nborder-color: #998DB3;<br \/>\n}<br \/>\ntd.selected {<br \/>\nbackground-color: #EE5512;<br \/>\n}<br \/>\nfieldset {<br \/>\nfloat: left;<br \/>\n}<br \/>\n#td6 a, #td13 a, #td20 a, #td27 a, #td34 a, #td41 a {<br \/>\ncolor: red !important;<br \/>\n}<br \/>\nform a:link {<br \/>\ncolor: blue;<br \/>\ntext-decoration: none;<br \/>\n}<br \/>\nform a:visited {<br \/>\ncolor: blue;<br \/>\ntext-decoration: none;<br \/>\n}<br \/>\nform a:hover {<br \/>\ntext-decoration: none;<br \/>\nbackground-color: #f90;<br \/>\n}<br \/>\n#druck{position:absolute;top:550px;left:800px;}<br \/>\n#temp_vorne{position:absolute;top:550px;left:1200px;}<br \/>\n#temp_ter{position:absolute;top:620px;left:1400px;}<br \/>\n#divselect{position:absolute;width:100%;top:450px;left:50px;}<br \/>\n&lt;\/style&gt;<br \/>\n&lt;\/head&gt;<br \/>\n&lt;body onload=&#8220;init()&#8220;&gt;<br \/>\n&lt;div id=&#8220;Header&#8220;&gt; &amp;gt; Wetteraufzeichnung (einstellbarer Zeitraum)<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div id=&#8220;divimage&#8220;&gt;&lt;iframe frameborder=&#8220;1&#8243; height=&#8220;400&#8243; id=&#8220;graph2&#8243; marginheight=&#8220;0&#8243; marginwidth=&#8220;0&#8243; name=&#8220;graph2&#8243; scrolling=&#8220;auto&#8220; width=&#8220;1600&#8243;&gt;&lt;\/iframe&gt;&lt;\/div&gt;<br \/>\n&lt;div id=&#8220;divselect&#8220;&gt;<br \/>\n&lt;form action=&#8220;http:\/\/192.168.178.87\/cgi-bin\/graph2.pl&#8220; enctype=&#8220;application\/x-www-form-urlencoded&#8220; id=&#8220;formselect&#8220; method=&#8220;get&#8220; target=&#8220;graph2&#8243; name=&#8220;formselect&#8220;&gt;<br \/>\n&lt;fieldset&gt;&lt;legend&gt;Messgr&amp;ouml&amp;szlige&lt;\/legend&gt;<br \/>\n&lt;table&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input checked=&#8220;checked&#8220; id=&#8220;var&#8220; name=&#8220;var&#8220; type=&#8220;checkbox&#8220; value=&#8220;rfm12temp&#8220;&gt;&lt;label for=&#8220;vartemp0&#8243;&gt;Temperatur rfm12 Garten &amp;#176C (rfm12temp)&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input checked=&#8220;checked&#8220; id=&#8220;vartemp1&#8243; name=&#8220;var&#8220; type=&#8220;checkbox&#8220; value=&#8220;temp_vorne&#8220;&gt;&lt;label for=&#8220;vartemp1&#8243;&gt;Temperatur vorne &amp;#176C (temp_vorne)&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;vartemps5&#8243; name=&#8220;var&#8220; type=&#8220;checkbox&#8220; value=&#8220;temp&#8220;&gt;&lt;label for=&#8220;vartemps5&#8243;&gt;Temperatur Terrasse &amp;#176C (temp)&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;vartemps7&#8243; name=&#8220;var&#8220; type=&#8220;checkbox&#8220; value=&#8220;temp_wz&#8220;&gt;&lt;label for=&#8220;vartemps7&#8243;&gt;Temperatur Wohnzimmer &amp;#176C (temp_wz)&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;vartemps9&#8243; name=&#8220;var&#8220; type=&#8220;checkbox&#8220; value=&#8220;temp_k&#8220;&gt;&lt;label for=&#8220;vartemps9&#8243;&gt;Temperatur Keller &amp;#176C (temp_k)&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/fieldset&gt;<br \/>\n&lt;!&#8211;&lt;fieldset&gt;&lt;legend&gt;MinMax&lt;\/legend&gt;<br \/>\n&lt;table&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;minmax&#8220; name=&#8220;minmax&#8220; type=&#8220;checkbox&#8220; value=&#8220;true&#8220;&gt;&lt;label for=&#8220;minmax&#8220;&gt;Minimum\/Maximum anzeigen&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;\/table&gt; &#8211;&gt;<br \/>\n&lt;\/fieldset&gt;<br \/>\n&lt;fieldset&gt;&lt;legend&gt;Zeitraum&lt;\/legend&gt;<br \/>\n&lt;table&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input checked=&#8220;checked&#8220; id=&#8220;rangeday&#8220; name=&#8220;range&#8220; onchange=&#8220;javascript:setDateParams()&#8220; type=&#8220;radio&#8220; value=&#8220;day&#8220;&gt;&lt;label for=&#8220;rangeday&#8220;&gt;Tag&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;rangeweek&#8220; name=&#8220;range&#8220; onchange=&#8220;javascript:setDateParams()&#8220; type=&#8220;radio&#8220; value=&#8220;week&#8220;&gt;&lt;label for=&#8220;rangeweek&#8220;&gt;Woche&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;rangemonth&#8220; name=&#8220;range&#8220; onchange=&#8220;javascript:setDateParams()&#8220; type=&#8220;radio&#8220; value=&#8220;month&#8220;&gt;&lt;label for=&#8220;rangemonth&#8220;&gt;Monat&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;input id=&#8220;rangeyear&#8220; name=&#8220;range&#8220; onchange=&#8220;javascript:setDateParams()&#8220; type=&#8220;radio&#8220; value=&#8220;year&#8220;&gt;&lt;label for=&#8220;rangeyear&#8220;&gt;Jahr&lt;\/label&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/fieldset&gt;<br \/>\n&lt;fieldset&gt;&lt;legend&gt;Startzeitpunkt&lt;\/legend&gt;<br \/>\n&lt;table class=&#8220;calendar&#8220;&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;a href=&#8220;javascript:dy(-1)&#8220;&gt;&amp;lt;&lt;\/a&gt;&lt;\/td&gt;<br \/>\n&lt;td colspan=&#8220;5&#8243; id=&#8220;tyear&#8220; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;a href=&#8220;javascript:dy(+1)&#8220;&gt;&amp;gt;&lt;\/a&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;a href=&#8220;javascript:dm(-1)&#8220;&gt;&amp;lt;&lt;\/a&gt;&lt;\/td&gt;<br \/>\n&lt;td colspan=&#8220;5&#8243; id=&#8220;tmonth&#8220; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; rowspan=&#8220;1&#8243;&gt;&lt;a href=&#8220;javascript:dm(+1)&#8220;&gt;&amp;gt;&lt;\/a&gt;&lt;\/td&gt;<br \/>\n&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td0&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td1&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td2&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td3&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td4&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td5&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td6&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td7&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td8&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td9&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td10&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td11&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td12&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td13&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td14&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td15&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td16&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td17&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td18&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td19&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td20&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td21&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td22&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td23&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td24&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td25&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td26&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td27&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td28&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td29&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td30&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td31&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td32&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td33&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td34&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td35&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td36&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td37&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td38&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td39&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td40&#8243; rowspan=&#8220;1&#8243;&gt;<br \/>\n&lt;td colspan=&#8220;1&#8243; id=&#8220;td41&#8243; rowspan=&#8220;1&#8243;&gt;&lt;\/tr&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/fieldset&gt;<br \/>\n&lt;fieldset&gt;&lt;legend&gt;Grafik&lt;\/legend&gt; &lt;input name=&#8220;size&#8220; type=&#8220;text&#8220; value=&#8220;Zeitraum&#8220;&gt; &lt;input name=&#8220;start&#8220; type=&#8220;text&#8220; value=&#8220;now &#8211; 1 day&#8220;&gt; &lt;input name=&#8220;end&#8220; type=&#8220;text&#8220; value=&#8220;now&#8220;&gt; &lt;input type=&#8220;submit&#8220; value=&#8220;Anzeigen&#8220;&gt;&lt;\/fieldset&gt;<br \/>\n&lt;\/form&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;!&#8211; Der folgende php-Abschnitt ist f\u00fcr die anzeige der Temperaturwerte aus den Textdateien &#8211;&gt;<br \/>\n&lt;?php<br \/>\necho &#8222;&lt;div id = &#8218;druck&#8216;&gt;&#8220;;<br \/>\n$timestamp = time();<br \/>\n$jahr = date(&#8222;Y&#8220;,$timestamp);<br \/>\n$monat = date(&#8222;m&#8220;,$timestamp);<br \/>\n$tag = date(&#8222;d&#8220;,$timestamp);<br \/>\n$file=&#8220;\/ethersex\/rfm12\/&#8220;.$jahr.&#8220;\/&#8220;.$monat.&#8220;\/&#8220;.$tag.&#8220;\/rfm_12_temp_&#8220;.$jahr.&#8220;_&#8220;.$monat.&#8220;_&#8220;.$tag.&#8220;.txt&#8220; ;<br \/>\n$inhalt_file=file($file);<br \/>\n$anz_zeilen=count($inhalt_file);<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho &#8222;anzahlzeilen=&#8220;.$anz_zeilen;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $file;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $inhalt_file[$anz_zeilen-1];<br \/>\n$zeile=$inhalt_file[$anz_zeilen-1];<br \/>\n$zeile_ar=explode(&#8220; &#8222;,$zeile);<br \/>\n$temp_10_a=$zeile_ar[4];<br \/>\n\/\/ echo &#8222;temp10_a=$temp_10_a&#8220;;<br \/>\n$temp_1_a=$zeile_ar[5];<br \/>\n\/\/ echo &#8222;temp1_a=$temp_1_a&#8220;;<br \/>\n\/\/ echo &#8222;&lt;br&gt;&#8220;;<br \/>\n$temp=$temp_10_a.&#8220;.&#8220;.$temp_1_a ;<br \/>\n$vz_gart=$zeile_ar[3] ;<br \/>\n\/\/ echo &#8222;vz_gart=$vz_gart&#8220; ;<br \/>\nif ($vz_gart ==&#8220;1&#8243;) {<br \/>\n\/\/ echo &#8222;plus&#8220;;<br \/>\n\/\/ echo &#8222;temp10_a=$temp_10_a&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;Temperatur Garten&lt;\/p&gt;&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;&#8220;.$temp.&#8220; &amp;deg;C&lt;\/p&gt;&#8220;;<br \/>\n} else {<br \/>\necho &#8222;minus&#8220;;<br \/>\n$temp=$temp * -1;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;Temperatur Garten&lt;\/p&gt;&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;&#8220;.$temp.&#8220; &amp;deg;C&lt;\/p&gt;&#8220;;<br \/>\n}<br \/>\n\/\/echo &#8222;temp10_v_2=$temp_10_a&#8220;;<br \/>\necho &#8222;&lt;\/div&gt;&#8220;;<br \/>\n?&gt;<br \/>\n&lt;?php<br \/>\n\/\/ Temp_vorne<br \/>\necho &#8222;&lt;div id = &#8218;temp_vorne&#8216;&gt;&#8220;;<br \/>\n\/\/rfm_12_temp_2014_10_22<br \/>\n$file_v=&#8220;\/ethersex\/rfm12\/&#8220;.$jahr.&#8220;\/&#8220;.$monat.&#8220;\/&#8220;.$tag.&#8220;\/temp_vorne_&#8220;.$jahr.&#8220;_&#8220;.$monat.&#8220;_&#8220;.$tag.&#8220;neu_test.txt&#8220; ;<br \/>\n$inhalt_file_v=file($file_v);<br \/>\n$anz_zeilen_v=count($inhalt_file_v);<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho &#8222;anzahlzeilen_v=&#8220;.$anz_zeilen_v;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $file_v;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $inhalt_file_v[$anz_zeilen_v-1];<br \/>\n$zeile_v=$inhalt_file_v[$anz_zeilen_v-1];<br \/>\n$temp_v_ar=explode(&#8220; &#8222;,$zeile_v);<br \/>\n\/\/ $temp_10_v=$temp_v_ar[4];<br \/>\n\/\/ $temp_1_v=$temp_v_ar[5] ;<br \/>\n$temp_vorne=$temp_v_ar[6];<br \/>\necho &#8222;tempvorne=$temp_vorne &#8222;;<br \/>\n\/\/ $vz=$temp_v_ar[3] ;<br \/>\n\/\/echo &#8222;vz=$vz&#8220; ;<br \/>\n\/\/ if ($vz ==&#8220;1&#8243;) {<br \/>\n\/\/echo &#8222;plus&#8220;;<br \/>\n\/\/ echo &#8222;temp10_v_2=$temp_10_v&#8220;;<br \/>\n\/\/ echo &#8222;temp10_v=$temp_10_v&#8220;;<br \/>\n\/\/ echo &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;Temperatur Vorne&lt;\/p&gt;&#8220;;<br \/>\n\/\/ $temp_v=$temp_10_v.&#8220;.&#8220;.$temp_1_v ;<br \/>\n\/\/ echo &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;&#8220;.$temp_v.&#8220; \u00b0C&lt;\/p&gt;&#8220;;<br \/>\n\/\/} else if ($vz ==&#8220;0&#8243;) {<br \/>\n\/\/ echo &#8222;minus&#8220;;<br \/>\n\/\/ $temp_v=$temp_10_v.&#8220;.&#8220;.$temp_1_v ;<br \/>\n\/\/ $temp_v=$temp_v * -1;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\n\/\/ echo &#8222;temp1_v=$temp_1_v&#8220;;<br \/>\n\/\/ echo &#8222;temp10_v=$temp_10_v&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;Temperatur Vorne&lt;\/p&gt;&#8220;;<br \/>\n\/\/$temp_v=$temp_10_v.&#8220;,&#8220;.$temp_1_v ;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;&#8220;.$temp_vorne.&#8220; &amp;deg;C&lt;\/p&gt;&#8220;;<br \/>\n\/\/}<br \/>\n\/\/ echo &#8222;temp10_v_2=$temp_10_v&#8220;;<br \/>\n?&gt;<br \/>\n&lt;?php<br \/>\n\/\/HIER ID ANPASSEN!!!!<br \/>\n\/\/ echo &#8222;&lt;b&gt; Letzte \u00c4nderung: &#8222;.date(&#8222;d.m.Y,H:i&#8220;,<br \/>\n\/\/ filemtime(basename(&#8222;\/temperatur\/temp_daily.png&#8220;)));<br \/>\n\/\/ echo &#8220; Uhr &lt;\/b&gt;&#8220;;<br \/>\n\/\/ $file = &#8218;\/sys\/bus\/w1\/devices\/28-000004f8c7a4\/w1_slave&#8216;;<br \/>\n\/\/ $lines = file($file);<br \/>\n\/\/ $temp = explode(&#8218;=&#8216;, $lines[1]);<br \/>\n\/\/ $temp = number_format($temp[1] \/ 1000, 1, &#8218;,&#8216;, &#8220;);<br \/>\n\/\/ $temps = explode(&#8222;,&#8220;, $temp);<br \/>\n\/\/ $temp_terrasse=$temps[0].&#8220;,&#8220;.$temps[1].&#8220;\u00b0C&#8220;;<br \/>\n$file_terr=&#8220;\/ethersex\/rfm12\/&#8220;.$jahr.&#8220;\/&#8220;.$monat.&#8220;\/&#8220;.$tag.&#8220;\/temp_ter_&#8220;.$jahr.&#8220;_&#8220;.$monat.&#8220;_&#8220;.$tag.&#8220;temp_terrasse.txt&#8220; ;<br \/>\n$inhalt_file_terr=file($file_terr);<br \/>\n$anz_zeilen_terr=count($inhalt_file_terr);<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho &#8222;anzahlzeilen_terr=&#8220;.$anz_zeilen_terr;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $file_terr;<br \/>\necho &#8222;&lt;br&gt;&#8220;;<br \/>\necho $inhalt_file_terr[$anz_zeilen_terr-1];<br \/>\n$zeile_terr=$inhalt_file_terr[$anz_zeilen_terr-1];<br \/>\n$temp_terr_ar=explode(&#8220; &#8222;,$zeile_terr);<br \/>\n\/\/ $plus_minus= $temp_terr_ar[11];<br \/>\n$temp_terrasse=$temp_terr_ar[6];<br \/>\necho &#8222;&lt;\/div&gt;&#8220;;<br \/>\necho &#8222;&lt;div id = &#8218;temp_ter&#8216;&gt;&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;Temperatur Terrasse&lt;\/p&gt;&#8220;;<br \/>\necho &#8222;&lt;p style=&#8217;font-size:20px;&#8216;&gt;&#8220;.$temp_terrasse.&#8220; &amp;deg;C&lt;\/p&gt;&#8220;; ;<br \/>\necho &#8222;&lt;\/div&gt;&#8220;;<br \/>\n$timestamp = time();<br \/>\n$jahr = date(&#8222;Y&#8220;,$timestamp);<br \/>\n$monat = date(&#8222;m&#8220;,$timestamp);<br \/>\n$tag = date(&#8222;d&#8220;,$timestamp);<br \/>\n?&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<\/p>\n<p>Der javaskript Abschnitt der Datei erzeugt diesen Kalender, der variabel beliebig zum Einstellen des Datums ist:<\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_03.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-320 size-medium\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_03-300x122.jpg\" alt=\"\" width=\"300\" height=\"122\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_03-300x122.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_03-768x313.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_03.jpg 830w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>In dem Bild steht der Kalender auf dem 4.12. 2016 und in der Graphik werden dann nachdem der Button Anzeigen angeklickt wurde die Temperaturen vom 4.12.16 00:00 Uhr bis 5.12.00 Uhr also f\u00fcr 24 Stunden angezeigt.<br \/>\nSelbstverst\u00e4ndlich kann man auch den Zeitraum verl\u00e4ngern, oder verk\u00fcrzen.<\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-321\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04-300x135.jpg\" alt=\"\" width=\"300\" height=\"135\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04-300x135.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04-768x345.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04-1024x459.jpg 1024w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_04.jpg 1897w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_322\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05.jpg\"><img aria-describedby=\"caption-attachment-322\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-322 size-medium\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05-300x141.jpg\" alt=\"\" width=\"300\" height=\"141\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05-300x141.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05-768x361.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05-1024x481.jpg 1024w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_05.jpg 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-322\" class=\"wp-caption-text\">Graph f\u00fcr die Anzeige der Wochenwerte<\/p><\/div>\n<p>usw.<\/p>\n<p>Damit der Graph angezeigt wird mu\u00df in der php-Datei temperatur.php der Verweis auf die Perl Datei stehen.<br \/>\n&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td>&lt;form action=&#8220;http:\/\/192.168.178.87\/cgi-bin\/graph2.pl&#8220; enctype=&#8220;application\/x-www-form-urlencoded&#8220; id=&#8220;formselect&#8220; method=&#8220;get&#8220; target=&#8220;graph2&#8243; name=&#8220;formselect&#8220;&gt;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><big><br \/>\nDer php-Abschnitt in der Datei temperatur.php f\u00fchrt zu dieser Anzeige:<\/big><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_06.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-323\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_06-300x92.jpg\" alt=\"\" width=\"300\" height=\"92\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_06-300x92.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_06-768x235.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/grafik-rrd-perl_06.jpg 897w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h2><span id=\"3_Temperaturmessung_8211_und_Temperaturlogging_mit_dem_WLAN_Funkmodul_ESP8266_RaspberryPI_mit_Raspian_RRDtool_und_Dallas_DS18B20\">3. Temperaturmessung &#8211; und Temperaturlogging mit dem WLAN Funkmodul ESP8266, RaspberryPI mit Raspian, RRDtool und Dallas DS18B20<\/span><\/h2>\n<p>Das WLAN-Funkmodul ESP8266 ist ein preisg\u00fcnstiges Funkmodul es ist sehr klein und eignet sich deshalb zur \u00dcbertragung von Temperaturwerten gemessen mit dem Dallas Temperatursensor DS\u00a0 18B20 per WLAN.<br \/>\n<a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-firmware-schaltbild_01.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-312\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-firmware-schaltbild_01-300x212.jpg\" alt=\"\" width=\"300\" height=\"212\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-firmware-schaltbild_01-300x212.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-firmware-schaltbild_01-768x543.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-firmware-schaltbild_01.jpg 842w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-programmierer-schaltbild_01.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-314\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-programmierer-schaltbild_01-300x212.jpg\" alt=\"\" width=\"300\" height=\"212\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-programmierer-schaltbild_01-300x212.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-programmierer-schaltbild_01-768x543.jpg 768w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-01-programmierer-schaltbild_01.jpg 842w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<div id=\"attachment_315\" style=\"width: 222px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-12E-schaltbild.jpg\"><img aria-describedby=\"caption-attachment-315\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-315 size-medium\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-12E-schaltbild-212x300.jpg\" alt=\"\" width=\"212\" height=\"300\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-12E-schaltbild-212x300.jpg 212w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-12E-schaltbild.jpg 595w\" sizes=\"(max-width: 212px) 100vw, 212px\" \/><\/a><p id=\"caption-attachment-315\" class=\"wp-caption-text\">ESP8266-12E Schaltbild<\/p><\/div>\n<p><strong>Mit den folgenden Dateien wird der esp8266-01 programmiert:<\/strong><\/p>\n<p><strong><big>ds.lua:<\/big><\/strong><\/p>\n<p class=\"datei\">t = require(&#8222;ds18b20&#8220;)<br \/>\n&#8212; GPIO0 is pin 4 esp8226-01,GPI4 0=pin 2<br \/>\npin = 4<br \/>\nlasttemp = 0<br \/>\nt.setup(pin)<br \/>\ntemperature=t.read()<br \/>\nlasttemp = temperature<br \/>\nt1 = lasttemp \/ 10000<br \/>\nt2 = (lasttemp &gt;= 0 and lasttemp % 10000) or (10000 &#8211; lasttemp % 10000)<br \/>\ntempout=(string.format(&#8222;%d&#8220;, t1) .. &#8222;.&#8220; .. string.sub(t2, 1, 1))<br \/>\nprint(&#8222;Temperature: &#8222;..tempout..&#8220;&#8218;C&#8220;)<\/p>\n<p><strong><big>ds18b20.lua:<\/big><\/strong><\/p>\n<p class=\"datei\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; DS18B20 one wire module for NODEMCU<br \/>\n&#8212; NODEMCU TEAM<br \/>\n&#8212; LICENCE: http:\/\/opensource.org\/licenses\/MIT<br \/>\n&#8212; Vowstar &lt;vowstar@nodemcu.com&gt;<br \/>\n&#8212; 2015\/02\/14 sza2 &lt;sza2trash@gmail.com&gt; Fix for negative values<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/p>\n<p class=\"datei\">&#8212; Set module name as parameter of require<br \/>\nlocal modname = &#8230;<br \/>\nlocal M = {}<br \/>\n_G[modname] = M<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; Local used variables<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; DS18B20 dq pin<br \/>\nlocal pin = nil<br \/>\n&#8212; DS18B20 default pin<br \/>\nlocal defaultPin = 9<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; Local used modules<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; Table module<br \/>\nlocal table = table<br \/>\n&#8212; String module<br \/>\nlocal string = string<br \/>\n&#8212; One wire module<br \/>\nlocal ow = ow<br \/>\n&#8212; Timer module<br \/>\nlocal tmr = tmr<br \/>\n&#8212; Limited to local environment<br \/>\nsetfenv(1,M)<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n&#8212; Implementation<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\nC = &#8218;C&#8216;<br \/>\nF = &#8218;F&#8216;<br \/>\nK = &#8218;K&#8216;<br \/>\nfunction setup(dq)<br \/>\npin = dq<br \/>\nif(pin == nil) then<br \/>\npin = defaultPin<br \/>\nend<br \/>\now.setup(pin)<br \/>\nend<\/p>\n<p class=\"datei\">function addrs()<br \/>\nsetup(pin)<br \/>\ntbl = {}<br \/>\now.reset_search(pin)<br \/>\nrepeat<br \/>\naddr = ow.search(pin)<br \/>\nif(addr ~= nil) then<br \/>\ntable.insert(tbl, addr)<br \/>\nend<br \/>\ntmr.wdclr()<br \/>\nuntil (addr == nil)<br \/>\now.reset_search(pin)<br \/>\nreturn tbl<br \/>\nend<\/p>\n<p class=\"datei\">function readNumber(addr, unit)<br \/>\nresult = nil<br \/>\nsetup(pin)<br \/>\nflag = false<br \/>\nif(addr == nil) then<br \/>\now.reset_search(pin)<br \/>\ncount = 0<br \/>\nrepeat<br \/>\ncount = count + 1<br \/>\naddr = ow.search(pin)<br \/>\ntmr.wdclr()<br \/>\nuntil((addr ~= nil) or (count &gt; 100))<br \/>\now.reset_search(pin)<br \/>\nend<br \/>\nif(addr == nil) then<br \/>\nreturn result<br \/>\nend<br \/>\ncrc = ow.crc8(string.sub(addr,1,7))<br \/>\nif (crc == addr:byte(8)) then<br \/>\nif ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then<br \/>\n&#8212; print(&#8222;Device is a DS18S20 family device.&#8220;)<br \/>\now.reset(pin)<br \/>\now.select(pin, addr)<br \/>\now.write(pin, 0x44, 1)<br \/>\n&#8212; tmr.delay(1000000)<br \/>\npresent = ow.reset(pin)<br \/>\now.select(pin, addr)<br \/>\now.write(pin,0xBE,1)<br \/>\n&#8212; print(&#8222;P=&#8220;..present)<br \/>\ndata = nil<br \/>\ndata = string.char(ow.read(pin))<br \/>\nfor i = 1, 8 do<br \/>\ndata = data .. string.char(ow.read(pin))<br \/>\nend<br \/>\n&#8212; print(data:byte(1,9))<br \/>\ncrc = ow.crc8(string.sub(data,1,8))<br \/>\n&#8212; print(&#8222;CRC=&#8220;..crc)<br \/>\nif (crc == data:byte(9)) then<br \/>\nt = (data:byte(1) + data:byte(2) * 256)<br \/>\nif (t &gt; 32767) then<br \/>\nt = t &#8211; 65536<br \/>\nend<\/p>\n<p class=\"datei\">if (addr:byte(1) == 0x28) then<br \/>\nt = t * 625 &#8212; DS18B20, 4 fractional bits<br \/>\nelse<br \/>\nt = t * 5000 &#8212; DS18S20, 1 fractional bit<br \/>\nend<\/p>\n<p class=\"datei\">if(unit == nil or unit == &#8218;C&#8216;) then<br \/>\n&#8212; do nothing<br \/>\nelseif(unit == &#8218;K&#8216;) then<br \/>\nt = t + 2731500<br \/>\nelse<br \/>\nreturn nil<br \/>\nend<br \/>\n&#8211;t = t \/ 10000<br \/>\nreturn t<br \/>\nend<br \/>\ntmr.wdclr()<br \/>\nelse<br \/>\n&#8212; print(&#8222;Device family is not recognized.&#8220;)<br \/>\nend<br \/>\nelse<br \/>\n&#8212; print(&#8222;CRC is not valid!&#8220;)<br \/>\nend<br \/>\nreturn result<br \/>\nend<\/p>\n<p class=\"datei\">function read(addr, unit)<br \/>\nt = readNumber(addr, unit)<br \/>\nif (t == nil) then<br \/>\nreturn nil<br \/>\nelse<br \/>\nreturn t<br \/>\nend<br \/>\nend<\/p>\n<p class=\"datei\">&#8212; Return module table<br \/>\nreturn M<\/p>\n<p><strong>send.lua:<\/strong><\/p>\n<p class=\"datei\">function sendData(tempout)<br \/>\nprint(tempout)<br \/>\nconn = nil<br \/>\nconn = net.createConnection(net.TCP, 0)<br \/>\nconn=net.createConnection(net.TCP, false)<br \/>\nconn:on(&#8222;receive&#8220;, function(conn, payload) print(&#8222;Get done.&#8220;, payload) end )<br \/>\nconn:connect(80,&#8220;192.168.178.87&#8243;)<br \/>\nconn:send(&#8222;GET \/temp_esp8266.php?tempout=&#8220;..tempout..&#8220; HTTP\/1.1\\r\\nHost: 192.168.178.87\\r\\n&#8220; .. &#8222;Connection: keep-alive\\r\\nAccept: *\/*\\r\\n\\r\\n&#8220;)<br \/>\nend<br \/>\nsendData(tempout)<\/p>\n<p><strong>und zum Schlu\u00df init.lua:<\/strong><\/p>\n<p class=\"datei\">&#8211;init.lua<br \/>\n&#8212; Check every 600000 10 minutes &#8211; 15000 &#8211; 15sec -900.000 15 min<br \/>\n&#8211;tempout = 0 &#8212; Initialize value that holds temp<br \/>\nwifi.setmode(wifi.STATION)<br \/>\n&#8211;modify according your wireless router settings<br \/>\nwifi.sta.config(&#8222;wlan-id&#8220;,&#8220;passwort&#8220;)<br \/>\nwifi.sta.connect()<br \/>\ntmr.alarm(1, 1000, 1, function()<br \/>\nif wifi.sta.getip()== nil then<br \/>\nprint(&#8222;IP unavaiable, Waiting&#8230;&#8220;)<br \/>\nprint(&#8222;Setting up WIFI&#8230;&#8220;)<br \/>\nelse<br \/>\ntmr.stop(1)<br \/>\nprint(&#8222;Config done, IP is &#8222;..wifi.sta.getip())<br \/>\ntempout = 0<br \/>\nipadress = wifi.sta.getip()<br \/>\ndofile(&#8218;ds.lua&#8216;)<br \/>\ndofile(&#8217;send.lua&#8216;)<br \/>\ntmr.alarm(2, 300000, 1, function() &#8212; Do every 15 minutes<br \/>\nprint(&#8222;Config done, IP is &#8222;..wifi.sta.getip())<br \/>\ntempout = 0<br \/>\ndofile(&#8218;ds.lua&#8216;)<br \/>\ndofile(&#8217;send.lua&#8216;)<br \/>\n&#8212; node.dsleep(400000000)<br \/>\ntmr.wdclr(2)<br \/>\nend)<br \/>\nend<br \/>\nend)<br \/>\nsrv = net.createServer(net.TCP)srv:listen(80, function(conn)<br \/>\nconn:on(&#8222;receive&#8220;, function(conn, payload)<br \/>\nprint(payload)<br \/>\nconn:send(&#8218;HTTP\/1.1 200 OK\\r\\nConnection: keep-alive\\r\\nCache-Control: private, no-store\\r\\n\\r\\n&#8216;)<br \/>\nconn:send(&#8218;&lt;!DOCTYPE HTML&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;html lang=&#8220;en&#8220;&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;head&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;meta http-equiv=&#8220;Content-Type&#8220; content=&#8220;text\/html; charset=utf-8&#8243;&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;meta http-equiv=&#8220;refresh&#8220; content=&#8220;60&#8243;&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;meta name=&#8220;viewport&#8220; content=&#8220;width=device-width, initial-scale=1&#8243;&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;title&gt;(2_ESP8266 &amp; DS18B20)&lt;\/title&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;\/head&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;body&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;h1&gt;(2_ESP8266 &amp; DS18B20)&lt;\/h1&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;h2&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;input style=&#8220;text-align: center&#8220; type=&#8220;text&#8220; size=4 name=&#8220;p&#8220; value=&#8220;&#8218;.. tempout ..'&#8220;&gt; C &lt;br&gt;&lt;br&gt;&#8216;)<br \/>\nconn:send(&#8218;IP-Adresse=&#8216;)<br \/>\nconn:send(&#8218;&lt;input style=&#8220;text-align: center&#8220; type=&#8220;text&#8220; size=20 name=&#8220;x&#8220; value=&#8220;&#8218;.. ipadress .. &#8218;&#8220;&gt; &lt;br&gt;&lt;br&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;\/h2&gt;&#8216;)<br \/>\nconn:send(&#8218;&lt;\/body&gt;&lt;\/html&gt;&#8216;)<br \/>\nconn:close()<br \/>\ncollectgarbage()<br \/>\nend)<br \/>\nconn:on(&#8222;sent&#8220;, function(conn) conn:close() end)<br \/>\nend)<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h3><span id=\"31_Bemerkungen_zu_den_Dateien_initlua_sendlua\">3.1 Bemerkungen zu den Dateien init.lua, send.lua<\/span><\/h3>\n<p>Die Datei init.lua wird beim booten des Moduls automatisch ausgef\u00fchrt.<\/p>\n<p>mit dem Abschnitt:<\/p>\n<p class=\"datei\">tmr.alarm(2, 300000, 1, function() &#8212; Do every 5 minutes<br \/>\nprint(&#8222;Config done, IP is &#8222;..wifi.sta.getip())<br \/>\ntempout = 0<br \/>\ndofile(&#8218;ds.lua&#8216;)<br \/>\ndofile(&#8217;send.lua&#8216;)<br \/>\n&#8212; node.dsleep(400000000)<br \/>\ntmr.wdclr(2)<br \/>\nend)<\/p>\n<p>in init.lua werden alle 5 Minuten die Dateien ds.lua und send.lua ausgef\u00fchrt.<\/p>\n<p>mit dem Abschnitt<\/p>\n<p class=\"datei\">srv:listen(80, function(conn)<br \/>\n&#8230;<\/p>\n<p>bis<\/p>\n<p class=\"datei\">conn:on(&#8222;sent&#8220;, function(conn) conn:close() end)<br \/>\nend)<\/p>\n<p>in init.lua wird eine html-Seite unter der Ip-Adresse des ESP8266 erzeugt. Die html-Seite sieht dann so aus:<br \/>\n<a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-html-seite.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-316\" src=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-html-seite-300x156.jpg\" alt=\"\" width=\"300\" height=\"156\" srcset=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-html-seite-300x156.jpg 300w, http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/esp8266-html-seite.jpg 499w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>In der Datei send.lua befindet sich die Zeile:<\/p>\n<p class=\"datei\">conn:send(&#8222;GET \/temp_esp8266_12E.php?tempout=&#8220;..tempout..&#8220; HTTP\/1.1\\r\\nHost: 192.168.178.87\\r\\n&#8220; .. &#8222;Connection: keep-alive\\r\\nAccept:<\/p>\n<p>Diese Zeile f\u00fchrt die Datei temp_esp8266_12E.php aus, der Temperaturwert der in tempout gespeichert ist, wird \u00fcbergeben.<br \/>\nDie Datei speichert weiterhin den Temperaturwert in einer Textdatei mit Namen temp_terrasse_2016_12_04.txt im Verzeichnis des aktuellen Jahres, Monats, Tages ab. Asu\u00dferdem wird der Temperaturwert<br \/>\nzusammen mit der aktuellen Uhrzeit und Datum in der Form der unixzeit in der rrd-Datenbank \/ethersex\/rrdtool\/esp_8266_temp_terrasse.rrd abgespeichert.<\/p>\n<p><strong>temp_esp8266_12E.php:<\/strong><\/p>\n<p class=\"datei\"><!--?php $temp = $_GET['tempout']; $now = new DateTime(); $datenow = $now-&gt;format('Y-m-d H:i:s');&lt;br ?--> \/\/$temp=10.5;<br \/>\n$pfad_jahr=&#8220;\/var\/www\/&#8220;.$now-&gt;format(&#8218;Y&#8216;);<br \/>\n$pfad_monat=&#8220;\/var\/www\/&#8220;.$now-&gt;format(&#8218;Y&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;m&#8216;).&#8220;\/&#8220;;<br \/>\n$pfad_tag=&#8220;\/var\/www\/&#8220;.$now-&gt;format(&#8218;Y&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;m&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;d&#8216;).&#8220;\/&#8220;;<br \/>\n$pfad=&#8220;\/var\/www\/&#8220;.$now-&gt;format(&#8218;Y&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;m&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;d&#8216;).&#8220;\/&#8220;;<br \/>\nif (is_dir($pfad_jahr)) {<br \/>\n} else {<br \/>\nmkdir ($pfad_jahr);<br \/>\n}<br \/>\nif (is_dir($pfad_monat)) {<br \/>\n} else {<br \/>\nmkdir ($pfad_monat);<br \/>\n}<br \/>\nif (is_dir($pfad_tag)) {<br \/>\n} else {<br \/>\nmkdir ($pfad_tag);<br \/>\n}<br \/>\n$file= &#8222;temp_terrasse_&#8220;.$now-&gt;format(&#8218;Y_m_d&#8216;).&#8220;.txt&#8220;;<br \/>\n$pfad=&#8220;\/var\/www\/&#8220;.$now-&gt;format(&#8218;Y&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;m&#8216;).&#8220;\/&#8220;.$now-&gt;format(&#8218;d&#8216;).&#8220;\/&#8220;;<br \/>\n$datei = fopen($pfad.$file,&#8220;a+&#8220;);<br \/>\n$temp1=&#8220;\\n&#8220;.$temp.&#8220; &#8222;;<br \/>\necho fwrite($datei, $temp1);<br \/>\necho fwrite($datei, $datenow);<br \/>\nfclose($datei);<br \/>\n$datenow = $now-&gt;format(&#8218;Y-m-d H:i:s&#8216;);<br \/>\n\/\/$datenow=$datenow.&#8220;:00&#8243;;<br \/>\n$conn-&gt;close();<br \/>\n$u_zeit=strtotime($datenow) ;<br \/>\n\/\/ $uzeit=strtotime($datenow) ;<br \/>\nif ($temp != 85) {<br \/>\nexec(&#8222;\/usr\/bin\/rrdtool update \/ethersex\/rrdtool\/esp_8266_temp_terrasse.rrd $u_zeit:$temp&#8220;);<br \/>\n}<br \/>\n?&gt;<\/p>\n<p><a href=\"#anfang\">An den Anfang der Seite<\/a><\/p>\n<h2><span id=\"4_Dateien_zum_Download\">4. Dateien zum Download<\/span><\/h2>\n<p><a href=\"http:\/\/schartel-web.de\/dateien\/rrd_db_erzeug_ds_1820_kabel.sh\">rrd_db_erzeug_ds_1820_kabel.sh<\/a><\/p>\n<p><a href=\"http:\/\/schartel-web.de\/dateien\/rrd_temp_kabel_db_update.sh\">rrd_temp_kabel_db_update.sh<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/graph2.pl\">graph2.pl<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/temperatur.php\">temperatur.php<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/ds.lua\">ds.lua<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/ds18b20.lua\">ds18b20.lua<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/send.lua\">send.lua<\/a><\/p>\n<p><a href=\"http:\/\/test1.schartel-web.de\/wp-content\/uploads\/2018\/09\/dateien\/\/init.lua\">init.lua<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Temperaturlogging mit dem rrdtoolInhalt 1.&nbsp;Einleitung Im folgenden wird beschrieben wie Temperaturen mit 1.) kabelgebundenen Temperatursensoren Dallas DS81B20, dem Net-IO-Board von Pollin, dem RasperiPi und dem rrdtool und 2.) mit den an die WLAN-Funkmodule angschlossenen Temperatursensoren Dallas DS18B20, dem RaspberryPi und dem rrdtool aufgezeichnet werden. An den Anfang der Seite 2. Kabelgebundene Temperatursensoren Dallas DS18b20 mit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/pages\/287"}],"collection":[{"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=287"}],"version-history":[{"count":51,"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/pages\/287\/revisions"}],"predecessor-version":[{"id":475,"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=\/wp\/v2\/pages\/287\/revisions\/475"}],"wp:attachment":[{"href":"http:\/\/test1.schartel-web.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}