Zisternenfüllstandsmessung mit Time Of Flight-Sensor

Zisternenfüllstandsmessung mit Time Of Flight-Sensor

Mit Version 1028 der Software zur Messung des Zisternenfüllstandes, kommt neben dem HC-SR04 Ultraschallsensor noch ein zweiter alternativer zu nutzender Sensor dazu. Diesmal ein Time Of Flight (ToF) Laser-Entfernungsmesser vom Typ VL53L0XV2. Die erste Version der Software ist allerdings noch Beta und ich würde mich auf Rückmeldungen zu dem neuen Sensor freuen!

In der Webseite der Software kann in den Einstellungen zwischen den beiden Sensoren gewählt werden. Neu ist zudem noch der frei wählbare Name für den Sensor welcher auf der Sensor-Webseite oben links angezeigt wird. Hiermit kann man nun beim Einsatz mehrerer Sensoren in verschiedenen Zisternen unterscheiden oder auch einen Öltank-Füllstandssensor korrekt benennen.

Der ToF-Sensor besitzt eine I2C-Schnittstelle und wird an die gleichen PINs wie der Ultraschallsensor angeschlossen. Es geht aber nicht mit beiden Sensoren parallel, sondern nur der eine oder der andere!

Der ToF-Sensor wird wie folgt angeschlossen:

D1SCL
D2SDA
3,3-5VVCC
MasseGND

Die beiden übrigen Anschlüsse bleiben frei.

Hier gibt es die neue Version zum Download:
http://www.bubux.de/heimautomatisierung/ota/zisterne_1028.bin

Hier findet ihr die vorherigen Artikel zur Zisterne mit den grundlegenden Anleitungen und Anschlussschema.

Gruß
Chris

Update Füllstandsanzeige Zisterne v1026

Update Füllstandsanzeige Zisterne v1026

Nachdem ich das letzte Update (v1024) bzgl. der PINs etwas verbaselt hatte, hier nun ein neues Update für die Füllstandsanzeige der Zisterne. Zudem gibt es auf mehrfachen (berechtigten) Wunsch auch nochmal ein komplettes Schaubild für die Verdrahtung aller bisher genutzten Komponenten.

Hier gibt es die aktuelle Version zum Download:
http://www.bubux.de/heimautomatisierung/ota/zisterne_aktuell.bin

Zur Installation etc. bitte wieder in die älteren Artikeln schauen!

Das Update enthält unter anderem:

  • DHT22-Temperatur-Sensor an D5 (statt des bereits durch das Display genutzten D6)
  • Darstellung der Werte auf der Webseite nicht mehr als TABLE sondern als DIV-Boxen damit es auf kleinen Displays auch besser passt
  • Bei Erstinstallation und Einrichtung des WLAN per Access Point wird nur die Konfiguration der WLAN-Daten angezeigt was hoffeltnlich das Problem mit dem “fehlenden” Speicher-Button beseitigt. Hier wäre ich über Erfahrungen dankbar!
  • TITLE-Tag eingebaut
  • ein paar Kleinigkeiten…
Mehr lesen

Update Füllstandsanzeige Zisterne v1024

Kurz vor Ende des alten Jahres nochmal ein Update für die Software zum Auslesen des Zisternenfüllstandes mittels ESP8266. Die Neuerungen in dieser Version sind folgende:

  • Eine weitere Zisternenbauform (liegender Zylinder)
  • Temperatur- und Luftfeuchterfassung mittels DHT22
  • Literanzahl, Temperatur und Luftfeuchte mit in die MQTT-Topics aufgenommen

Falls ein Temperatursensor angeschlossen und aktiviert ist, werden dessen Messwerte auf der Startseite angezeigt. Die Anzeige der Temperaturdaten wird alle 60 Sekunden abgefragt und zeigt daher im ersten Moment nach Neustart keine Werte an.

Aktuell kann als Temperatursensor ein DHT22 genutzt werden (weitere Sensoren sind in Arbeit). Aktiviert wird der Sensor in der Konfiguration.

Die neuen MQTT-Topics können ebenfalls in der Konfiguration hinterlegt werden.

Die neue Zisternenbauform ist auch in der Konfiguration zu finden. Die Berechnung funktioniert bei einer runden liegenden Zisterne. Eine ovale Form wird aktuell nicht unterstützt.

Hier gibt es die aktuelle Version zum Download:
http://www.bubux.de/heimautomatisierung/ota/zisterne_aktuell.bin

Für den genauen Aufbau (Anschluss Sensor, Anschluss Diplay etc.) bitte die vorherigen Artikel beachten.

Dann euch noch einen guten Rutsch ins neue Jahr!

Gruß

Chris

Netzwerkweit Werbung blockieren mit Pi-hole

Netzwerkweit Werbung blockieren mit Pi-hole

pihole_logoHabt ihr genug von flackernden Werbebannern die mehr Raum einnehmen als der eigentliche Seiteninhalt oder gefühlte 100 Ad-Server die beim Öffnen einer einzigen Webseite kontaktiert werden? Adblock & Co. sind eine gute Sache, allerdings auf den Webbrowser beschränkt auf dem das Plugin installiert ist. Android oder iOS waren da meistens außen vor. Auf der Suche nach einem weiteren Beschäftigungsfeld für meinen Raspberry Pi bin ich auf ein nettes Projekt gestoßen!

Das ist ein Update des ursprünglichen Artikels da sich ein paar wichtige Dinge geändert haben und ich auch einen DNS-Loop eingebaut hatte…

Installation

Mit einer Zeile ist er auf dem Raspberry Pi installiert: der Werbeblocker Pi-hole

curl -L https://install.pi-hole.net | bash Mehr lesen

Füllstandsmessung der Zisterne mittels ESP8266 – UPDATE

Update vom 14.06.2020 hier

Heute ein kleines Update für die Füllstandsmessung der Zisterne mittels Ultraschall und dem ESP8266.

In der neuen Version v1016 gibt es jetzt eine Abfragemöglichkeit der gemessenen Werte mittels JSON.

Dazu einfach /json hinter die Web-Adresse eures ESP hängen (z.B. http://zisterne/json). Folgende Werte werden aktuell übermittelt:

Hier der Link zum aktuellen BIN: www.bubux.de/heimautomatisierung/ota/zisterne_aktuell.bin. Im vorherigen Artikel werden die restlichen Funktionalitäten und das Flashen auf den ESP erklärt.

Auf der Todo-Liste steht jetzt noch MQTT und eine Implementierung zur (groben) Berechnung der Regenmenge pro Zeiteinheit.

Gruß Chris

Webseite zur Darstellung der Sensordaten

Webseite zur Darstellung der Sensordaten

Da ich in der letzten Zeit sehr oft bezüglich der Erstellung einer Webseite zur Darstellung der Sensordaten (Heizung, Strom, Wasser, Gas, …) angesprochen wurde, habe ich mich entschlossen eine abgespeckte Variante meiner internen Webseite zu veröffentlichen. Die Webseite nutzt eine ältere Version der Metro UI-Oberfläche als “Framework” zur Darstellung der HTML-Seiten, sowie pChart zum Zeichnen der Graphen in den Detailansichten.

Meine Implementierung ist schon etwas älter und auch mit der Zeit gewachsen. Da es sich bei dieser Webseite um ein recht überschaubares Projekt handelt und ich mit dem Ergebnis zufrieden bin, habe ich mir nie die Mühe gemacht die Seite generischer zu gestalten. Daher muss bei nötigen Anpassungen der Code direkt geändert werden und es gibt auch keine Trennung von HTML und PHP, keine durchgehende allumfassende Fehlerbehandlung, evtl. “unschönes” HTML usw.

Der Code soll als Anregung und Grundlage für eine eigene Seite dienen…nicht mehr, nicht weniger. Wem´s ausreicht kann es natürlich auch 1:1 übernehmen. Positiv an meiner Lösung finde ich immer noch die Flexibilität in den Auswertungen die direkt auf der Datenbank mittels SQL ausgeführt werden können.

Die Startseite

Übersicht Webseite Sensordaten

Die Startseite wird mittels “Meta-Refresh” alle 180 Sekunden neu geladen und dient der Übersicht der wichtigsten Sensordaten. Mit Klick auf die (verlinkten) Boxen gelangt man jeweils zu einer detaillierteren Übersicht der Sensordaten. In der Übersicht werden keine komplizierten Datenbankauswertungen gemacht. Hier werden die Snapshot-Tabellen mit den aktuellen Werten ausgelesen und einige SQL-Aggregat-Funktionen genutzt. Das ging auch auf einem alten Raspi einigermaßen schnell. Das hängt natürlich von den Tabellengrößen in den Datenbanken ab. Da bei mir einige Tabellen mit den Jahren relativ groß geworden sind (~500k Zeilen), bin ich irgendwann auf einen Odroid umgestiegen.

Mehr lesen

Odroid C2 – Update 1 (Gas- und Wasserzähler)

Ich habe zwei Raspberry Pi´s laufen. Einer “spricht” mit der Heizung, ließt den Stromzähler aus, beherbergt die MySQL-Datenbanken und präsentiert die Daten auf einer Webseite. Der zweite Raspi ließt den Wasserzähler aus, zählt die Umdrehungen des Gaszählers, beherbergt den Werbeblocker Pi-Hole und ist Videorecorder mit tvheadend im Backend.

Einer der beiden Raspis soll nun dem neuen Odroid weichen. Dabei entschied ich mich für den zweiten Raspi, da die ganzen PHP-Scripte erstmal nicht anzupassen sind. Das scheint mir der meiste Aufwand zu werden.
Mehr lesen

Odroid C2 (vs Raspberry PI 2)

Zuerst einmal noch ein frohes neues Jahr an alle!

Die Tage habe ich ein neues Spielzeug bekommen (nein, nicht zu Weihnachten). Es ist ein Odroid C2 mit eMMC-Speicherkarte. Den gab es im Komplettpaket mit Odroid, eMMC, Gehäuse und Netzteil für 70€. Der Odroid besitzt einen Quad-Core mit 1,5 GHz, 2 GB RAM und ein Gigabit-LAN welches er sich, im Gegensatz zur Raspberry-Architektur, nicht mit den USB-Ports teilen muss. Somit sollte die Gesamtleistung in allen Belangen deutlich höher ausfallen als die des Raspberry 2 oder 3. Auf der eMMC war ein Ubuntu 16.04 LTS mit Mate Desktop vorinstalliert.

Odroid Oberseite
Odroid Oberseite

Mehr lesen

Jack O’Lantern mit LED-Augen

Halloween steht vor der Tür! Eine schöne Idee zum Thema Halloween hatte ich letztes Jahr schon auf HACKADAY gesehen. Es war ein Jack O’Lantern mit LED-Augen. Letztes Jahr ist meine Bestellung für die LED-Augen allerdings zu spät angekommen um noch einen Halloween-Kürbis vor die Tür zu stellen. Aber dieses Jahr paßt es.

Die ursprüngliche Idee ist von Michal. Er nutzt allerdings einen Kürbis aus Keramik. Ich hab den Arduino in einen echten Kürbis verfrachtet. In dem Kürbis gibt es nichts, was Isopropanol an der Elektronik nicht wieder sauber bekommt.

jack1

Also Kürbis schnell ausgehöhlt, Mund, Nase und Augen reingeschnitten und an der Innenseite der Augen etwas Platz für die beiden “MAX7219 LED 8×8” geschnitzt. Diese habe ich mit Zahnstochern von innen fixiert. Der Arduino liegt frei verkabelt im Kürbis.

jack2

So schaut es dann aus: ein freundlich schauender Halloween-Kürbis!

 

Gruß

Chris

Amazon Kindle als Statusdisplay – Update

Amazon Kindle als Statusdisplay – Update

Nachdem das Statusdisplay für Wetter- und Temperaturdaten sowie weitere Informationen auf dem Kindle nun ein paar Tage in Betrieb ist und soweit gut funktioniert, habe ich noch ein paar Veränderungen vorgenommen. Grundlage dafür sind die Arbeiten aus dem vorherigen Artikel.

Anpassungen am Kindle als Statusdisplay

WLAN aktivieren/deaktivieren

Um die Laufzeit der Batterie des Kindle zu verlängern, schalte ich das WLAN in dem Script zeige_daten.sh zum holen des Statusbild am Beginn des Scriptes ein und am Ende wieder aus. Nachteil an der Sache ist, das man sich per SSH nicht mehr mit dem Kindle verbinden kann, da das Kindle UI-Framework beim Booten mit dem Aufruf des Scriptes init_daten.sh deaktiviert wird und der Kindle nicht mehr auf irgendwelche Tastendrücke reagiert. D.h der automatische Aufruf dieses Scriptes beim Booten muss wieder deaktiviert werden (Stichwort “Kite -> onboot”). Nach einem Reboot des Kindle (~40 Sek. auf den Knopf an der Unterseite drücken) kann man dann wieder per SSH über WLAN zugreifen. Dann besteht die Verbindung solange der Cron nicht das Script zeige_daten.sh aufruft. Bei längeren Arbeiten muss daher der Cron auskommentiert, oder ifdown wlan0 im Script zeige_daten.sh auskommentiert werden. Das Script init_daten.sh rufe ich dann manuell auf bevor ich die SSH-Sitzung beende.

Hier mein aktuelles zeige_daten.sh Script. Die Änderungen gegenüber der vorherigen Version sind in Zeile 3, 4 und 18 zu finden:

#!/bin/sh

ifup wlan0
sleep 30

cd "$(dirname "$0")"

rm daten_output.png
eips -c
eips -c

if wget http://raspberry/kindle/daten_output.png; then
    eips -g daten_output.png
else
    eips -g daten_error.png
fi

ifdown wlan0

 

Uhrzeit stellen

Da der Kindle bei mir nicht am Internet hängt und auch kein Amazon-Konto konfiguriert ist, wurde die Uhrzeit nicht synchronisiert bzw. lief immer aus dem Ruder. Daher erstmal Uhrzeit kontrollieren und ggf. manuell einstellen:

date
date MMDDHHMMYYYY
date 250317572016

Anschliessend die neue Uhrzeit/Datum in die Hardware-Uhr schreiben:

hwclock -w

Dann noch in folgender Datei anstelle des NTP-Servers von Amazon den von meiner Fritzbox (in der Regel fritz.box) eintragen:

vi /etc/sysconfig/ntp

 

Batterieanzeige des Kindle

Während der Anzeige des Statusbild gibt es keine Möglichkeit mehr den Ladezustand der Batterie des Kindle zu sehen. Mittels SSH kann man den Ladezustand der Batterie (in %) mit dem Befehl:

gasgauge-info -s

abfragen. (Dieser Befehl kann übrigens noch verschiedene anderer Werte der Batterie des Kindle abfragen).

Um diese Information auch im Statusbild verfügbar zu machen, nutze ich das Tool eips welches im Kindle zum Löschen des Bildschirmes, dem Schreiben von Zeichen, dem Scrollen der Anzeige und der Anzeige von PNG-Bildern genutzt werden kann. Also einfach ein kleines Shell-Script mit folgendem Inhalt erstellt und per Cron (vi /etc/crontab/root) alle 5 Minuten ausgeführt.

#!/bin/sh
gasgauge-info -s | xargs /usr/sbin/eips 47 39 > /dev/null;

Der Ladezustand des Kindle-Akkus wird dann in der rechten unteren Ecke angezeigt. Beim aktualisieren des Statusbild wird die Information erstmal wieder überschrieben, dann nach 5 Minuten durch Starten des obigen Scriptes durch den Cron jedoch wieder angezeigt.

Mit eips kann das %-Zeichen der Ausgabe nicht geschrieben werden. Es erscheint eine entsprechende Fehlermeldung. Diese wird nach /dev/null geleitet. 47 und 39 sind die Zeilen- und Spaltennummer zur Ausgabe des Textes.

Im Ergebnis schaut es dann mit 42% Akkustand wie im folgendemn Bild aus. Das mit der 42 war Zufall 🙂

kindle_batteriestand

Anpassungen an der Serverkomponente

Neben den Änderungen am Kindle habe ich auch noch einige Anpassungen des Python-Scriptes bzgl. der Anzeige weiterer Daten vorgenommen. Dazu habe ich auch ein paar zusätzliche SVG erstellt. Im Python-Script werden auf Basis verschiedene IF-Abfragen unterschiedliche SVG-Templates geladen. Das aktualisierte Python-Script ist am Ende des Artikels zu finden.

Batterieanzeige der Fensterkontakte

kindle_batterie Der Batteriezustand der Homematic-Fensterkontakte kann über FHEM abgefragt werden.

Zum Thema Batteriestatus von Homematic-Geräten gibt es übrigens auch einen netten Artikel in meintechblog.de.

Jedenfalls werden im Python-Script die Statis der Batterien aller Homematic-Fensterkontakte abgefragt. Alle Namen der Fensterkontakte die den Status “low” melden, werden aneinandergereiht in eine Variable geschrieben. Ist diese Variable ungleich “leer”, wird anstelle des Statusbild mit den Temperaturen etc. ein entsprechender Hinweis mit der Liste aller Batterie-schwächelnder Fensterkontakte angezeigt. Und das so lange, bis die Batterien gewechselt wurden. Im linken Bild ist der Hinweis über zwei leere Batterien zu sehen. Für diese Anzeige gibt es ein eigenes SVG.

Temperatur Warmwasserspeicher

kindle_puffertempDie Anzeige des Luftdruckes und der Windgeschwindigkeit ist nett, für mich aber nicht wirklich informativ. Wie schon im vorherigen Artikel angedeutet ist die Temperatur des Warmwasserspeicher wesentlich hilfreicher. Diese Daten lese ich schon seit längerem aus und schreibe sie in eine Snapshot-Tabelle. Übersteigt die untere Temperatur im Pufferspeicher die Marke von 28°C, wird anstelle des Luftdruck/Wind die oberer und untere Temperatur des Warmwasserspeicher angezeigt.
In der Praxis sehe ich so morgens den Luftdruck und nach Anfeuern des Kamins oder Aufheizen der Solarpanel irgendwann die Puffertemperatur. Auch für diese Anzeige gibt es ein eigenes SVG.

 

Status der Heizung

kindle_heizungZum guten Schluss noch eine weiteres SVG welches zur Anzeige kommt, sobald die Viessmann-Gastherme einen anderen Status als “kein Fehler” meldet. Dies kann neben echten Fehlern in der Anlage z.B. auch eine anstehende Wartung sein. Auch diese Anzeige wird solange angezeigt bis der Status der Heizung wieder OK ist.
Während ich das hier schreibe kommt mir gerade der Gedanke, das die Anzeige der Wartung ggf. relativ lange angezeigt wird da der Heizungsbauer die nächsten 5 Monate keinen Termin frei hat. Hier muss noch ein Reset-Mechanismus her…

Da ich keinen echten Fehler der Heizung als Beispiel für das Bild provozieren konnte, habe ich im Python-Script die Abfragen nach “kein Fehler” testweise so verändert, das die Gut-Meldung der Heizung angezeigt wird. Diese ist auch im Bild zu sehen.
 

Abgeändertes Python-Script

Hier noch das versprochene Python-Script in der neuen Version. Neben den oben besprochenen Punkten habe ich das Auslesen der Fensterkontakte (für “Offen/Geschlossen”- und den Batteriestatus) noch in eine While-Schleife gepackt die über eine Liste aller Fensterkontakte läuft. Diese Copy&Paste-Faulheit wie beim ersten Anlauf rächt sich irgendwann immer…

#!/usr/bin/python2
# -*- coding: utf-8 -*-

import codecs
import telnetlib
import MySQLdb
from datetime import datetime, time


################
# Hole FHEM data
################
tnet_host= "localhost"
tnet_port= 7072
def fhem_task(fcmd):
    tc= telnetlib.Telnet(tnet_host,tnet_port)
    tc.write(fcmd)
    erg= tc.read_until( "\n" )
    tc.close()
    return erg

# Abwesenheit pruefen
if "off" in fhem_task("list ABWESENHEIT STATE\r\n"):
    abwesenheit="nicht gesetzt"
if "on" in fhem_task("list ABWESENHEIT STATE\r\n"):
    abwesenheit="gesetzt"

# Liste Fensterkontakte
listFensterkontakte = ['FensterHeizung', 'FensterKeller', 'FensterGaestezimmer1', 'FensterGaestezimmer2', 'FensterBuero1', 'FensterBuero2', 'FensterWohnen1', 'FensterWohnen2', 'FensterWohnen3', 'FensterWohnen4', 'FensterGaestebad', 'FensterSpind', 'FensterBad1']

# Fensterkontakte
anz_fenster_offen=0;
for Fensterkontakt in listFensterkontakte:
    if "open" in fhem_task("get "+ Fensterkontakt +" param STATE\r\n"):
        anz_fenster_offen += 1

# Garagenkontakt
if "open" in fhem_task("get Garagentor param STATE\r\n"):
    stat_garage="offen"
else:
    stat_garage="geschlossen"

# Batteriestatus Fensterkontakte
kontakt_batterie_low=""
for Fensterkontakt in listFensterkontakte:
    if "low" in fhem_task("get "+ Fensterkontakt +" param battery\r\n"):
        kontakt_batterie_low += Fensterkontakt + ", "

# Wetter
try:
    condition=str.split(fhem_task("get MeinWetter condition\r\n"))
    if len(condition)==5:
        wetter_icon=condition[3] + " " + condition[4]
    else:
        wetter_icon=condition[3]
except:
    wetter_icon="Fehler"

luftdruck=str.split(fhem_task("get MeinWetter pressure\r\n"))
tendenz=str.split(fhem_task("get MeinWetter pressure_trend_txt\r\n"))
wind=str.split(fhem_task("get MeinWetter wind_speed\r\n"))

######################
# Datenbanken auslesen
######################
db = MySQLdb.connect(host="localhost", user="", passwd="", db="")
cur = db.cursor()
cur.execute("SELECT MIN(aussentemperatur), MAX(aussentemperatur) FROM temperaturen WHERE timestamp >= DATE(NOW()) ORDER BY timestamp")
for row in cur.fetchall():
    mintemp=round(row[0],2)
    maxtemp=round(row[1],2)

cur = db.cursor()
cur.execute("SELECT warmwasser, speicher_unten, error0 FROM snapshot")
for row in cur.fetchall():
    speicher_oben=round(row[0],2)
    speicher_unten=round(row[1],2)
    fehlerspeicher=row[2].replace(" ","\r",2)

db.close()


################
# Preprocess SVG
################
now = datetime.now()
now_time = now.time()
if time(5,50) <= now.time() <= time(22,50):
    # Wenn eine der Batterien der Fensterkontakte leer ist
    if kontakt_batterie_low!="":
        output = codecs.open('batterie_preprocess.svg', 'r', encoding='utf-8').read()
    # Wenn die Heizung einen Fehler anzeigt
    elif 'kein Fehler' not in fehlerspeicher:
        output = codecs.open('fehler_preprocess.svg', 'r', encoding='utf-8').read()
    # ansonsten abhaengig von speicher_unten ein SVG mit Luftdruck und Wind anzeigen. Ansonsten Puffertemperaturen
    elif speicher_unten<=28:
        output = codecs.open('daten_script_preprocess_lfw.svg', 'r', encoding='utf-8').read()
    else:
        output = codecs.open('daten_script_preprocess.svg', 'r', encoding='utf-8').read()
        
    # Platzhalter mit Daten ersetzen
    output = output.replace('ICON_ONE',wetter_icon.decode("utf-8"))
    output = output.replace('WETTER_BESCHR',wetter_icon.decode("utf-8"))
    output = output.replace('TEMP_A',fhem_task("get Aussenthermometer param temperature\r\n"))
    output = output.replace('LUFT_A',fhem_task("get Aussenthermometer param humidity\r\n"))
    output = output.replace('MIN_TEMP',str(mintemp))
    output = output.replace('MAX_TEMP',str(maxtemp))
    output = output.replace('PS_O',str(speicher_oben))
    output = output.replace('PS_U',str(speicher_unten))
    output = output.replace('DRUCK_A',luftdruck[3])
    output = output.replace('TENDENZ',tendenz[3])
    output = output.replace('WIND_A',wind[3])
    output = output.replace('ANZ_FENSTER',str(anz_fenster_offen))
    output = output.replace('STAT_ABWESENHEIT',abwesenheit)
    output = output.replace('STAT_GARAGE',stat_garage)
    output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S'))
    output = output.replace('FEHLERSPEICHER',fehlerspeicher)
    output = output.replace('BATTERIE',kontakt_batterie_low.replace(", ","\r"))
    # neues SVG schreiben
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)
else:
    # Platzhalter mit Daten ersetzen
    output = codecs.open('sleep_preprocess.svg', 'r', encoding='utf-8').read()
    output = output.replace('DATUM_UHRZEIT',datetime.strftime(datetime.now(), '%d.%m.%Y %H:%M:%S'))
    # neues SVG schreiben
    codecs.open('daten_script_output.svg', 'w', encoding='utf-8').write(output)

Viel Spaß mit den neuen Ideen, SVGs und dem Script. Falls ihr noch weitere Ideen habt den Kindle als Statusdisplay zu nutzen, lasst es mich wissen.

Gruß
Chris