NodeMCU deepSleep Fehler vermeiden


Während meiner Versuche mit dem NodeMCU und deepSleep stieß ich auf zwei Fehler die man machen kann, aber nicht sollte. Der erste lies mich den Baustein nicht mehr mit neuem Code bespielen. Der Grund ist, dass der Baustein während er im deepSleep Mode ist, sich nicht mehr flashen lässt. Die Lösung des Problems ist hier beschrieben:


You do not say what version of ESP8266 your using but if it has two buttons on the module (maybe called Reset & Flash) then hold down the flash button, briefly press the reset button and then after a second or two release the flash button. This should put the ESP into programming mode where the built in bootloader is running instead of your sketch.

Is there any other method putting the Wemos into programming mode instead of the second (flash) button?
Connect GPIO0 (that I think is pin D3 on the D1 Mini) to GND and then press the reset button.
You may also need to remove the D0-RST link but I’m not sure.

Der andere schwierig zu findende Fehler war, (vor lauter Begeisterung vergessen 😉 ) abzufangen, falls mal keine Verbindung zustande kommt. Hier ganz einfach mit dem Zähler tries behoben. Ansonsten geht er in Endlosschleife …

//connect to your local wi-fi network
WiFi.begin(ssid, password);/check wi-fi is connected to wi-fi network
int tries = 0;
while (WiFi.status() != WL_CONNECTED) {
if (tries > 10) {
// wenn keine verbindung gelingt
Serial.println("No WiFi! Gonig to Sleep");
Serial.println("WiFi connected..!");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());

Raspberry pi & waveshare 2.7 e-ink Display & python

Start with a headless raspberry, no need to connect monitor, keyboard:

Find the raspberry in your router and connect with ssh. Useullay steps are:

sudo raspi-config
sudo reboot

(neu einloggen)

sudo apt-get update -y
sudo apt-get upgrade -y

Here’s some example python code for drawing text horizontal on the waveshare e-ink display. You’ll find also a example where to find the length of text where to break lines. This examples reads some small text from a web site and looks up a rss feed for the weather.

Install the fonts

sudo apt-get install ttf-mscorefonts-installer

Install libraries

sudo apt-get install git-core
git clone git://
cd wiringPi

sudo apt-get install wiringpi
sudo dpkg -i wiringpi-latest.deb
gpio -v
tar zxvf bcm2835-1.59.tar.gz
cd bcm2835-1.59
sudo make check
sudo make install
  • Install Python2 libraries
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
  • Install Python3 libraries
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install spidev

pip install feedparser

(Before running the API codes we provided, you should start up the corresponding core drivers of the interfaces. In the ready-to-use system image file, both I2C and SPI are set to Enable by default, but the serial port is still in the terminal debugging function mode.)

  1. Enable the I2C function. Run the following command to configure your Raspberry Pi board:
     sudo raspi-config

    Select Advanced Interface Options -> I2C -> yes, to start up the I2C core driver. Then you also need to modify the configuration file. Run the following command to open the configuration file:

    sudo nano /etc/modules

    Add the following two lines to the configuration file

    Press the keys Ctrl+X to exit, and input Y to save the settings. Then, reboot the module to make the settings take effect.
  2. Enable the serial function. The serial port of RPi is set to serial terminal debugging function mode by default. If you want the serial port services as a common IO, you should modify the settings on the RPi. When the terminal debugging function is disabled, you cannot access RPi board via the serial port any more. If you want to control the RPi, you may need to enable the debugging function of the serial port again.
    sudo raspi-config

    Select Advanced Interface Options -> Serial. Select the option no can disable the serial debugging function. And then, the serial port can be used for serial communication. And select the option yes can enable the serial debugging function. You should reboot the module to make the settings take effect.

Note: the serial port on Raspberry Pi 3 Model B is unusable, because Pin 14 and Pin 15 is connected to the on-board Bluetooth model.
  1. Start up the spi function, run the following command:
    sudo raspi-config

    Select Advanced Interface Options -> I2C -> yes, to start up I2C core driver.


# coding: utf8
 #  width 176
 #  height 264

import epd2in7
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import time
import urllib2
import feedparser
import datetime

def getLengthText(myTextInput, myFont, pixels):
    #font = ImageFont.truetype('/usr/share/fonts/truetype/freefont/msttcorefonts/comic.ttf', 28)
    #font = ImageFont.truetype("arial", 20)
    myText = myTextInput
    mlen = 0
    mlen = len(myText)
    w, h = myFont.getsize(myText)
    while pixels < w:
        myText = myText[0:mlen-2]
        mlen = len(myText)
        w, h = myFont.getsize(myText)
    return mlen

def addText(myImage,myText, myFont, xx,yy):
    #font = ImageFont.truetype('/usr/share/fonts/truetype/freefont/msttcorefonts/comic.ttf', 28)
    #font = ImageFont.truetype("arial", 20)
    w, h = myFont.getsize(myText)
    mask ='1', (w, h), 255)
    draw2 = ImageDraw.Draw(mask)
    draw2.text((0, 0), myText, font = myFont, fill = 0)
    mask = mask.rotate(90, expand=True)
    myImage.paste(mask, (xx,epd2in7.EPD_HEIGHT - w - yy ))

def main():
    epd = epd2in7.EPD()

    image ='1', (epd2in7.EPD_WIDTH, epd2in7.EPD_HEIGHT), 255)    # 255: clear the image with white
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("arial", 18)
    font2 = ImageFont.truetype("comic", 24)
    font3 = ImageFont.truetype("arial", 28)

    # get text from a feed
    #d = feedparser.parse('')
    d = feedparser.parse('')
    dnr = 0
    dlen = len(d['entries'])
    oberbayern = 0
    for n in range(dlen):
        actentry = d['entries'][n]['title'].encode('utf-8').strip()
        print str(n) + " " + actentry[0:8]
        if actentry[0:8] == "Oberbaye":
            oberbayern = n
        if actentry[0:8] == "München":
            muenchen = n
    print d['entries'][oberbayern]['title'].encode('utf-8').strip()
    print d['entries'][muenchen]['title'].encode('utf-8').strip()
    nb = d['entries'][oberbayern]['title'].strip()
    # get text from a website
    ttext = "err"
            #response = urllib2.urlopen('')
            response = urllib2.urlopen('')
            ttext =
            ttext = "err2"

    # add to display

    # first Line
    grad = u'°'
    #entlang umgerechnet oben 1,1 nach 1,264/2
    draw.line((0, 264, 0, 0), fill = 0)
    draw.line((1, 264, 1, 0), fill = 0)
    addText(image,"%H:%M %d.%m."), font3, 5, 6)
    addText(image, ttext + grad, font3, 5, 182)
    # horizontal unter der schrift:
    draw.line((38, 264, 38, 0), fill = 0)
    draw.line((39, 264, 39, 0), fill = 0)
    # senkrechte Linien, wenn quer gesehen
    draw.line((0, 264-180+5, 39, 264-180+5), fill = 0)
    draw.line((0, 264-180+4, 39, 264-180+4), fill = 0)
    draw.line((0, 263, 39, 263), fill = 0)
    draw.line((0, 262, 39, 262), fill = 0)

    draw.line((0, 0, 39, 0), fill = 0)
    draw.line((0, 1, 39, 1), fill = 0)

    muc = "München"
    mstr = d['entries'][muenchen]['title'].strip()
    mstr2 = mstr[mstr.find("):")+3:]

    xlen = 0
    xlen = getLengthText(mstr2,font, 264)
    mstr3 = mstr2[0:xlen]
    msRest = mstr2[xlen:]
    xlen = getLengthText(msRest,font, 264)
    mstr4 = msRest[0:xlen]

    addText(image, mstr3, font, 40, 0)
    addText(image, mstr4, font, 60, 0)
    #addText(image, "012345678901234567890123456789", font, 60, 0)

    xlen = 0
    xlen = getLengthText(nb,font, 264)
    nb1 = nb[0:xlen]
    nbRest = nb[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb2 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb3 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb4 = nbRest[0:xlen]
    nbRest = nbRest[xlen:]
    xlen = getLengthText(nbRest,font, 264)
    nb5 = nbRest[0:xlen]
    addText(image, nb1, font, 80, 0)
    addText(image, nb2, font, 100, 0)
    addText(image, nb3, font, 120, 0)
    addText(image, nb4, font, 140, 0)
    addText(image, nb5, font, 160, 0)
    #addText(image, "abcdef", font, 140, 0)
    #addText(image, "abcdef", font, 160, 0)

    # display images

if __name__ == '__main__':

Sony Radio Review: Sony XDR-P1DBP Taschenradio (DAB/DAB+)







Mein Autoradio für’s Radl und für den Garten. Ich habe die 3 möglichen Varianten durchgetestet: UKW Rad-Radio; Handy über Streaming und DAB+. Wirklich überzeugt hat nur das DAB+. Die beiden anderen Varianten hatten einfach zu häufig Störungen als dass es wirklich Spaß gemacht hätte. Das Testgebiet war in und um München. Befestigungen am Rad? Ich benutze  2 Varianten, im Lenkerfahrradkorb wenn der sowieso dran ist, oder in der Handyhalterung, mit der ich auch sehr zufrieden bin..

Zum Radio selber:  Ungefähr in Handygröße aber wesentlich tiefer. Für die Größe ein guter Klang, findet sehr viele Sender und hat 2 Möglichkeiten seine Lieblingssender abzuspeichern. Eingebauter Akku, über Micro-USB zu laden, gefälliges Design. Nicht billig, aber seinen Preis wert.

-> Empfehlung.


Vodafone Kabel Receiver – kein Ton

Mein Vodafone Kabel Sagem Modem liefert keinen Ton mehr. Reboot half nicht. Was letztendlich half: Im Receiver-Menu, Ton, HDMI Dolby ausschalten.

Beim nächsten Auftreten half: Im obigen Menu hin und her, dann aus schalten. Und dann ein Reboot (vom Strom trennen).

Update: Tritt immer mal wieder auf. Zurzeit hilft, ausschalten, vom Strom trennen, und dann wieder vonv orne.

Suchbegriffe: Vodafone Kabel Ton geht nicht

Aluminum Bike Phone Holder – short Test

I recently bought Banggood: GUB G-86 CNC Aluminum Alloy Bicycle Bike Phone Holder Handbar…. (Or see below for Amazon). I had 3 rides since I mounted it on my cross bike, and my opinion till now is, that it is the best phone holder, which I ever had. Had a few problems by mounting it on my handle bar, but fixed that after 3 tries (see photo). I own a iPhone 6, having placed it in a case. The claws (don’t forget to use adhesive patches) hold it perfect, and it takes really just a part of the time to fix it than with the other holders before. – I recommend it


Alexa, erzähl einen Witz. 10 Wochen mit Amazon Echo

Ein kleines persönliches Review.


Wahrscheinlich bin ich zu guter Kunde bei Amazon, auf jeden Fall erhielt ich im November die Einladung jeweils ein Amazon Echo und ein Amazon Echo Dot zu erwerben. Trotz gewisser Bedenken habe ich einen Ruf als Gadgetexperte zu verteidigen und musste deshalb bestellen. Hier ein paar persönliche Erfahrungswerte, bezogen auf den Echo, zum Dot am Schluß noch eine Anmerkung.

Ohne viel Plastik verpackt, erwartet einen ein schwarzer wertiger Zylinder mit 8 cm Durchmesser und 24 cm Höhe. Das Format ist gut gewählt, durch die geringe Grundfläche findet sich überall ein Plätzchen. Zumindest bei mir ist es jetzt so dass “Alexa” öfters umzieht. Als Bedienelemente gibt es lediglich 2 Knöpfe und der obere Rand funktioniert gleichzeitig als Lautstärkeregler. Einer der Knöpfe schaltet das Micro ab, also Alexa aus. Der andere ist Trigger, was eigentlich das Wort “Alexa” sein sollte, also zwingt es das Teil zum Zuhören. Der Lautstärkeregler fühlt sich gut an und zeigt mittels der blau umlaufenden LED-Bandes oben seine Funktion an. Wofür den Lautstärkeregler? Braucht man wenn bei der Alexakinderparty (nur eine Episode aus der Party) die Gäste übermütig sich zu einem “Alexa, Lautstärke 10” verleitet haben, um schnell wieder runter zu kommen. Nun aber kurz zum LED Band. Es läuft um den oberen Rand, kann “laufen” und die Farbe zwischen einem satten Blau und Türkis wechseln. Wirklich it’s magic: Saugeil gemacht. (Video schau’n).

Was kann sie jetzt aber nun, die Alexa? Habt Ihr gemerkt, es ist nicht mehr der/das “Amazon Echo”, es ist die “Alexa”. Die reine Tonkennung, also das was sie mit ihren 7 Mikrophonen aufschnappt, auch wenn sie selber Musik abspielt, funktioniert sehr gut. Sie muss halt damit leben aus Unkenntnis oft angebrüllt zu werden. Die Kinder erkennt sie schwerer, aber mittlerweile haben’s auch die Kinder raus, dass man ein wenig anders sprechen muss. Hier auch mal zwischendurch der Tipp dazu: Es funktioniert am besten wenn man seinen “Befehl” durchgängig gibt, also “Alexa, Musik Radio SWR3”. Die meisten warten höflichkeitshalber auf eine Rückmeldung zwischendurch, also “Alexa” … Pause und erwarten, dass sie “ja” sagt. So funktioniert es aber nicht.

Also die Töne werden gut erkannt, aber auch die Sprache? Man kann auf einer Website das Protokoll “seiner” Alexa mitlaufen lassen und sieht, und kann bewerten wie gut sie Worte verstanden hat. Bei uns, eine erstaunlich hohe Trefferquote. Dann aber die Kür: Wie gut erkennt sie was wir von ihr wollen? Also wie gut ist Amazons Backend KI? Die Plugins werden wohl schnell mehr, aber wir haben uns bisher auf einige wenige “Use-Cases” beschränkt. Was soll ich mit einem vorgelesenen Rezept von Was haben wir bisher probiert? “Wie ist das Wetter”: gut, “Lese mir die News vor”: zu langatmig (SPON vorlesen), Uhrzeit: gut, braucht man öfters als man denkt, Timer stellen (für Nudeln) sehr gut.
Soweit so gut unsere Highlights sind aber:
“Alexa, erzähl einen Witz” (Beispiel: Wieviel arbeiten in ihrer Abteilung? Ich schätze die Hälfte). Flachwitze, aber gut. Die Kinder lieben es.

“Alexa was hast du an?”, Selbstironie, nett: “Dasselbe wie gestern.”. Auch nett, Alexas Lieblingsfarbe: “schwarz”.

Nun aber zum Highlight eines tragbaren Lautsprechers: Musik. Rein physikalisch, Lautstärke und Klangqualität sind ok. In der Größe kann es keine Hifi-Anlage sein. Aber meistens reichts’. Natürlich muss das Teil mit einem “prime” Account verbunden sein, dann kann es aber viel. Fangen wir einfach an. “Alexa, Musik, Radio, SWR3” (ich nehme das jetzt nur als Beispiel, weil ich so gerne Verkehrsmeldungen aus meiner früheren Heimat höre). Klappt sehr gut, holt sich über tuneIn die Internetstreams. Die Amazon eigenen “Radio”sender: bekam ich vor allem angeboten, wenn ich nicht oder nicht richtig verstanden wurde. Sind leider gar nicht schlecht. Und während ich das hier schreibe höre ich eine CD, bzw. den Stream eines Künstlers den ich so kennenlernte. Und ich überlege mir die CD, bow. die mp3s zu kaufen: win, win.

Aber jetzt zu dem netten use case zusammen mit den Kindern, und zum Schluss: Ja, es gibt Menschen, die hören nur nassabgespielte LPs vom handsignierten Edison Grammophon. Ja, für Euch ist das nix. Aber für den Rest von uns, sorry leider geil! Ein Beispiel von heute? Mit den Kids Pizza belegt und gegessen. Dabei eine Reise durch die Musikgeschichte, ohne irgendwas zu bedienen: “Alexa, spiel eine kleine Nachtmusik”, “Mondscheinsonate”, “In the ghetto”, “Yellow submarine”, “Help”, “Imagine”, “Morning has broken”, “Mercedes Benz”, “Smoke on the water”, “Königin der Nacht” , boah alles gleich verstanden und abgespielt. So nen fixen DJ haste nur selten.


Bis 31.1. darf man das Teil zurückgeben. Mach ich nicht.

Der Dot versteht nicht ganz so gut Und der Klang naja: Als Küchenradio, oder an einen anderen Verstärker/Lautsprecher.

Fazit: Sowas hätte ich von Apple erwartet!

Günstig Temperatur, Luftfeuchte und Energie messen mit Raspberry Pi oder PC

Drahtloses Anbinden von Temperatursensoren und Energiemesser. Und das noch günstig. Sehr hilfreich war dieser Beitrag. Er beschreibt die Anbindung von drahtlosen Sensoren an Fhem. Fhem wollte ich jetzt (noch) nicht aufsetzen, deshalb realisierte ich meine eigene Anbindung in der die Temperaturkurven auf dem Webserver des Raspi angezeigt werden.Bildschirmfoto 2014-03-19 um 21.28.26

Zutaten: Ein Raspi (kann aber auch ein NAS, PC oder Mac sein). Ein Jeelink (arduino mit 868 MHz Sender/Empfänger auf einem USB-Stick) (Versand dauert ca. 4 Tage). Einen (oder mehrere, ich habe inzwischen 7) passende Temperatursensoren. (Gibt es auch mit Luftfeuchtemesser).

Verarbeitung: Der Jeelink muss mit dem passenden Sketch bestückt werden. Danach lauscht er nach senden Thermostationen und gibt das Ergebnis über seine serielle Schnittstelle aus. Zum Auslesen habe ich mir folgendes Perl-Script erstellt (alpha):


# LaCrosse auslesen
# Interpretation:
# OK
# 9
# 1 Byte: addr
# 1 Byte: battery, type, channel
# 2 Byte: temperature 
# 1 Byte: battery_low, humidity

use strict;
use warnings;

use Device::SerialPort;

my $device1 = 'F0'; 
my $device2 = '68'; 
my $device3 = 'E0'; 
my $device4 = 'CC'; 
my $device5 = '58'; 
my $device6 = 'D4'; # Fensterbrett war 38
my $device7 = '54'; 
my $device8 = 'DC'; 
my $device9 = '94'; 

my $port;
my %devices = ($device1 => 'n', $device2 => 'n', $device3 => 'n', $device4 => 'n', $device5 => 'n', $device6 => 'n', $device7 => 'n', $device8 => 'n', $device9 => 'n');
	my $sec;
	my $min;
	my $hour;
	my $mday;
	my $mon;
	my $year;
	my $wday;
	my $yday;
	my $isdst;
	my @myvalues;
	my $hygro;

 sub check_output{

     my $answer;
     my $answer1;
     # my( @bytes, $channel,$cmd,$addr,$data,$power,$consumption );
     my( @bytes, $addr, $battery_new, $type, $channel, $temperature, $battery_low, $humidity ); 
      my $state;
      my $readonly;

	my @array;
	my $len;

	print STDERR "wait for read\n";
    $answer1 = $port->read(255);
   	print STDERR "\n>" . $answer1 . "<-\n";

	#print "read\n";
    if ($answer1 ne "") {
    	$answer = $answer . $answer1;
    	#print "\n>" . $answer . "<\n";
		if( $answer =~ m/^OK.*\n/ ) {
		$len = length($answer);    	
		if ($answer ne "" && $len > 1000){ #something went wrong
			print STDERR "---- delete length $len too long----\n";
			print STDERR ">" . $answer . "<\n";
			$answer = "";
		if (length($answer) >= 2){
			if (substr($answer, 0, 2) ne "OK"){ #something went wrong
				print  STDERR  "---- delete wrong start----\n";
				$answer = "";

#Falls mehrere Zeilen geliefert werden, 
@array=split(/\n/, $answer);

foreach (@array){
$answer = $_;
#  if( $answer =~ m/^OK.*\n/ ) {
  if( $answer =~ m/OK 9 \d+ \d+ \d+ \d+ \d+/ ) {
    @bytes = split( ' ', substr($answer, 5) );

 $addr = sprintf( "%02X", $bytes[0] );
$battery_new = ($bytes[1] & 0x80) >> 7;
$type = ($bytes[1] & 0x70) >> 4;
$channel = $bytes[1] & 0x0F;
$temperature = ($bytes[2]*256 + $bytes[3] - 1000)/10;
$battery_low = ($bytes[4] & 0x80) >> 7;
$humidity = $bytes[4] & 0x7f; 

 # we simply write the temperatur at the hash
	print STDERR "Adr: " . $addr;
    print STDERR " Batt_new: " . $battery_new;
    print STDERR " Type: " . $type;
    print STDERR " Chan: " . $channel;
    print STDERR " Temp: " . $temperature;
    print STDERR " Batt_low: " . $battery_low;
    print STDERR " Hum: " . $humidity . "\n";
  $devices{$addr} = $temperature;
  if ($addr eq 'E0'){
  	$hygro = $humidity;

  #Wenn neue Adresse, dann hier ausgeben

    $answer ="";


 }#for each
}  # sub check_output

# -------------
# Hauptprogramm

    # Set up the serial port
    #print "Start\n";

    $port = Device::SerialPort->new("/dev/ttyUSB0");
#    $port = Device::SerialPort->new("/dev/tty.usbserial-AM01YRW0");

    # 19200, 81N on the USB ftdi driver
    $port->baudrate(57600); # you may change this value
    $port->databits(8); # but not this and the two following
    $port-> write_settings;
    $port-> lookclear;
     #print "start";

my $i;
$i = 7;        
while($i > 0){    

print STDERR "Durchlauf Nr: $i \n";

$port-> lookclear;

$i = $i -1;



 # output block; put at the end
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    $mon = $mon +1;
    $mon = sprintf("%02d", $mon);
    $mday = sprintf("%02d", $mday);
    $hour = sprintf("%02d", $hour);
    $min = sprintf("%02d", $min);
    $sec = sprintf("%02d", $sec);
    $year = $year + 1900;
	#@myvalues = values %devices;

# ToDo Aufräumen, muss auch weiterlaufen wenn bei einem Gerät die Batterie leer ist	
if  ($devices{$device1} eq "n") {
 print STDERR "na 1  $device1 nicht gefunden\n";
if  ($devices{$device2} eq "n") {
 print STDERR "na 2  $device2 nicht gefunden\n";
if  ($devices{$device3} eq "n") {
 print STDERR "na 3  $device3 nicht gefunden\n";
if  ($devices{$device4} eq "n") {
 print STDERR "na 4  $device4 nicht gefunden\n";
if  ($devices{$device5} eq "n") {
 print STDERR "na 5  $device5 nicht gefunden\n";
if  ($devices{$device6} eq "n") {
 print STDERR "na 6  $device6 nicht gefunden\n";
if  ($devices{$device7} eq "n") {
 print STDERR "na 7 $device7 nicht gefunden\n";
if  ($devices{$device7} eq "n") {
 print STDERR "na 8 $device8 nicht gefunden\n";
if  ($devices{$device9} eq "n") {
 print STDERR "na 9 $device9 nicht gefunden\n";
	print "$year-$mon-$mday" . "_" . "$hour:$min:$sec";
	print " $devices{$device1}";
	print " $devices{$device2}";
	print " $devices{$device3}";
	print " $hygro";
	print " $devices{$device4}";
	print " $devices{$device5}";
	print " $devices{$device6}";
	print " $devices{$device7}";
	print " $devices{$device8}";
	print " $devices{$device9}";
	print "\n";
 # output block; put at the end

 #nochmal alle aufzaehlen
 print STDERR "Alle erfolgreich gefunden\n";


$i = $i -1;
     #print "slept";

    print STDERR "Abbruch nicht genug gefunden\n";
 	print "$year-$mon-$mday" . "_" . "$hour:$min:$sec";
	print " $devices{$device1}";
	print " $devices{$device2}";
	print " $devices{$device3}";
	print " $hygro";
	print " $devices{$device4}";
	print " $devices{$device5}";
	print " $devices{$device6}";
	print " $devices{$device7}";
	print " $devices{$device8}";
	print " $devices{$device9}";
	print "\n";

Dazu noch einen cronjob, der die ausgabe des Perl-scripts parst durch gnuplot schickt und die entstandene Grafikdatei auf den Webserver schiebt. – Fertig.

Detaillierend zu Sebastians Frage:

Die Ausgabedatei sieht z.B. ungefähr so aus (Pro Zeile Datum, Uhrzeit, dann die Werte mit blank getrennt n wenn kein Wert).:

2020-08-18_02:21:17 33.7 n 24.8 61 n -19 n 11.5 21.7 25.4 22 80 23.5 76 25.5 64 25.4 63 17.4 n 26.5 25.2 25.5 26 26 23.1 71 24.2 66 24.4 61
2020-08-18_02:31:18 33.7 n 24.8 61 n -18.9 n 11.4 21.6 25.4 22 79 23.5 76 25.5 64 n n 17.4 n 26.5 25.2 25.5 26 25.9 23.1 71 24.1 66 24.4 61
2020-08-18_02:41:14 33.7 n 24.8 61 n -19 n 11.4 21.6 25.4 22 79 23.5 76 25.5 64 25.4 63 17.2 n 26.4 25.2 25.5 26 25.9 23.1 71 24.1 66 24.4 61
2020-08-18_02:51:18 33.7 n 24.8 61 n -18.9 n 11.4 21.6 25.4 22 79 23.5 76 25.5 64 25.4 63 17.2 n 26.4 25.2 25.4 26 25.9 23 71 24.1 66 24.3 60

Darauf kann mann dann den gnuplot loslassen mit dem Befehl “gnuplot datei”. Die Datei steuert den gnuplot und kann z.B. so aussehen:

set key left #legende nach links
set xtics rotate
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set format x "%d. %Hh"
set grid
set title "Johannes Temp Small Monitor"
set ylabel "C"
set xlabel "\n1 hour interval"
set terminal gif small size 800, 440 transparent
set output "/home/pi/bin/tc2small.gif"

plot "/home/pi/bin/temperatureout.txt" using 1:6 title "Sensor 1" with lines,\
"/home/pi/bin/temperatureout.txt" using 1:8 title "Sensor2" with lines, \
"/home/pi/bin/w4.txt" using 1:2 title "OpenWeather" with lines, \
"/home/pi/bin/weatherout_wunder3.txt" using 1:2 title "Wunderground" with lines

die entstandene gif Datei schiebe ich dann mittels ftp auf den Webserver.

Mittlerweile schreibe ich parallel dazu die Daten in eine mysql Datenbank und erstelle mittels Grafana die Auswertung. Das schaut dann ca. so aus wie unten.


Wie verbindet man den Jeelink mit dem Raspberry PI: link