Download aller Dateien als tarball poetherm.tgz
Du benötigst folgendes:
+++ ESP32 Board +++ EXT1 EXT2 1 1 2 +3.3V 2 3 GND 3 4 4 5 5 6 6 7 7 i2c SCL 8 8 9 9 10 10 i2c SDA +++ RTC DS3231 Modul +++ + 3.3V D i2c SDA C i2c SCL V - GND
xtensa-esp32-elf-g++ xtensa-esp32-elf-gcc xtensa-esp32-elf-ar xtensa-esp32-elf-size makewirst du dazu benötigen. Alternativ kannst du nachfolgende Binaries verwenden und mit dem nächsten Schritt fortfahren.
ESP32 via USB an Rechner anschließen.
Ganz wichtig: 802.3af/at/bt Ethernet und USB darf nicht gleichzeitig angeschlossen sein!
esptool.py --chip esp32 elf2image --flash_mode dio --flash_freq 80m \ --flash_size 16MB -o poetherm_0.24.bin poetherm_0.24.elf
apt-get update apt-get install curl rrdtool netpbm
Die Variablen in nachfolgendem Script anpassen und als root ausführen, um den Cronjob abzulegen
#!/bin/bash # reinhard@finalmedia.de # Do 28. Nov 21:29:36 CET 2019 # Systemnutzer (default: nobody 65534) # Dieser User muss dann auch natürlich Schreibzugriff # auf das Verzeichnis haben, in welchem du Datenbank # und Graph-Datei anlegen willst. username="nobody" # Datenbank-Datei definieren # Hier im Beispiel an einem volatilen Ort. Für den # Produktivbetrieb solltest du natürlich ein Ziel wählen, # an dem du die Datenbank dauerhaft ablegen und somit # stetig erweitern kannst. database="/tmp/temperature.rrd" # Graph-Datei definieren # Diese PNG Grafik wird die Temperatur Diagramme enthalten png="/tmp/temperature.png" # IP-Adresse des ESP32 Boards (Musst Du auf richtige Adresse/Hostname ändern!) # Tipp: Benutze hier einen Hostnamen und nenne ggf. in deiner /etc/hosts die # zugehörige IP. Dann wird später im Graph auch der Hostname, statt der # IP-Adresse angezeigt. Die IP-Adresse hast du z.B. in deinem Router als # static lease für das Board definiert. host="192.168.0.44" # Jetzt Cronjob erzeugen echo "* * * * * $username /usr/bin/poetherm.sh \ \"$host\" \"$database\" > \"$png\"" | tee -a /etc/crontab
Damit hast du deiner crontab eine neue Zeile hinzugefügt. Diese sieht (je nach gewählten Werten) z.B. so aus:
* * * * * user /usr/bin/poetherm.sh temp01 /home/user/temp01.rrd > /home/user/temp01.png
Das Script dient zum Erzeugen der Round Robin Datenbank, Abholen der Daten und Erzeugen eines Graphen
Wenn du keine Details wissen willst, kannst du als root das Script einfach wie folgt installieren:
base64 -d << @@@|zcat> /usr/bin/poetherm.sh && chmod +x /usr/bin/poetherm.sh H4sIAJxv5V0CA72T30/bMBDH3/NXHCYDqs35RcvAGmjdKIhpdBNjbA97cZNrEzWxI8ehA+2P3zkt BSS0t/Up9d35/P3cfbu9FU4KFU5kk3vboGSFAsK2MV201mhzNFXQJWVrc20EGCxULk32flooWVaY FTLIkAoyaen2qYbkMICxvoUkFsmR6O/Dx9E1JFF85HkWGwv+NvDSQgI7O/DLwzTXwD5g0dQFlrKd mnYqwI8gPkqC+OAwiIJ+n+pCW9WhxapGI21rMDAmg5OHhL5Fc1vgIqjVjMHJTtccfxcWYnq1sCUe s+v1ZeaRWEnUFPUT5uW6sfQrZh5xnBKHmkg1h0J1hwLQ3GM7Q/UGFqgUKJ3moIo0t+6JhsrtkmwL +BSY/9CcLQlJqNW6hNQgdYN1GjinuzUcRFR0+k04OHE+/H4+EgdRJHjydl8Moshlr66GYngzuhpS LgoGIhZxsk5cXoyXwUQk/cfo8OcL0WdNVplOJG1h4cgmOrsTSs+MbuunKG4yw7ltsSwRHie5nBbI Sa5L+rYqezK/tnaeUOsBLM/PBjQW/l7ampJmkWqlMLXcFhXq1sKAVPEGWG5tLcLQd0vqDMAgOQkz vA1VW5bwh8qsAZ6lwCJ+FDCK5Cgz4Ckc9HtO902BBs6NrHOS+EXx6xz5WXm3XmsnW5YNkLWdk+lz X8wQvo7PVwYgd9liLkuotLLUjaBqVaXSArcTEvBu73HNM/cQdAIbmzkSLrtWnK+M6HdfRvfY6eis 23t8vB7K0gerRXVFny/Go3hZtj2dkiMi0U3DoZLfrSYtVNcDJ6Ox0jgz73Wz5hmwUpI1F4hzBq93 XzW7Peahyp6VKL14TP4DhNbhdw8w4G6R1McpfBkQ9n7QHwV7mwV1G8o3TnqplbQbJr1DaTYO+knm ZnOcfNBRNhvHHIAD/S/edcfKHWee9xfCSqSlgAcAAA== @@@
Du bist dann fertig und kannst den Befehl "poetherm.sh" verwenden.
Hinweis: Der Cronjob muss dann schon einige Zeit laufen, bevor du genügend Daten in deiner Datenbank hast, sodass im Graph auch etwas sichtbar wird.
Lass den Cronjob also mal eine zeitlang Daten sammeln. In der Zwischenzeit kannst du dir durchlesen, was das Script genau tut:
Datei /usr/bin/poetherm.sh beinhaltet das nachfolgende Script.
#!/bin/bash # name: /usr/bin/poetherm.sh # author: reinhard@finalmedia.de # date: Do 28. Nov 21:29:43 CET 2019 test $# -lt 2 && \ echo "Beispielaufruf: $0 192.168.0.44 \ /tmp/temperature.rrd > \ /tmp/overview.png" >&2 && exit 1 title="Temperatur" database="$2" host="$1" # Datenbank in Datei erzeugen, wenn noch nicht existent test ! -f "$database" && \ rrdtool create $database --step 60 \ DS:temp:GAUGE:600:-273:5000 \ RRA:AVERAGE:0.5:1:1200 \ RRA:MIN:0.5:12:2400 \ RRA:MAX:0.5:12:2400 \ RRA:AVERAGE:0.5:12:2400 && \ chown nobody:nogroup "$database" # Aktuelle Temperatur Daten abholen und Datenbank updaten rrdtool update "$database" N:$(curl --connect-timeout 5 \ -s "http://$host/temp" 2>/dev/null | \ tr -dc "0-9." | head -c 64) # Vier Graphen On-The-Fly erzeugen und als eine # einzige PNG Datei vertikal montieren pnmcat -tb \ <(\ rrdtool graph /dev/stdout -a PNG --title="$title" \ "DEF:temp1=$database:temp:AVERAGE" \ "LINE1:temp1#ff0000:$host" | pngtopnm \ ) <(\ start="$(date -d "last week" +'%s')" end="$(date -d "now" +'%s')" rrdtool graph /dev/stdout -s "$start" -e "$end" \ -a PNG --title="$title (Woche)" \ "DEF:temp1=$database:temp:AVERAGE" \ "LINE1:temp1#ff0000:$host" | pngtopnm \ ) <(\ start="$(date -d "last month" +'%s')" end="$(date -d "now" +'%s')" rrdtool graph /dev/stdout -s "$start" -e "$end" \ -a PNG --title="$title (Monat)" \ "DEF:temp1=$database:temp:AVERAGE" \ "LINE1:temp1#ff0000:$host" | pngtopnm \ ) <(\ start="$(date -d "last year" +'%s')" end="$(date -d "now" +'%s')" rrdtool graph /dev/stdout -s "$start" -e "$end" \ -a PNG --title="$title (Jahr)" \ "DEF:temp1=$database:temp:AVERAGE" \ "LINE1:temp1#ff0000:$host" | pngtopnm \ ) <(\ start="$(date -d "-5 years" +'%s')" end="$(date -d "now" +'%s')" rrdtool graph /dev/stdout -s "$start" -e "$end" \ -a PNG --title="$title (5 Jahre)" \ "DEF:temp1=$database:temp:AVERAGE" \ "LINE1:temp1#ff0000:$host" | pngtopnm \ ) | pnmtopng
Das erzeugt dann z.b. solche schönen Graphen in einer PNG
Man kann die Werte aus der Datenbank jedoch auch auslesen und anderweitig verarbeiten. Siehe dazu auch die Doku von rrdtool.
rrdtool dump /tmp/temperature.rrd rrdtool dump /tmp/temperature.rrd | grep row | cut -d / -f2 | tr -dc "0-9.e+ \n"