FĂŒr ein gröĂeres Vorhaben musste ich mich wieder etwas in XSLT & Apache FOP einarbeiten. Statt nur mit Beispiel-XMLs zu testen, habe ich mir ein kleines, aber sinnvolles Projekt gesucht â und so entstand die Idee, eine Wetterstation mit ePaper-Anzeige zu bauen. https://youtu.be/DMgWOIySd4I Im aktuellen Stadium wird das Bild lokal auf meinem Rechner erzeugt und anschlieĂend auf meinen externen Webserver (all-inkl.com) hochgeladen.SpĂ€ter soll das Ganze komplett lokal auf einem Raspberry Pi laufen â dazu mehr im zweiten Teil der Serie. Automatisierung per Bash-Skript Der komplette Prozess â vom Abrufen der Wetterdaten ĂŒber die Transformation mit XSLT bis hin zur PNG-Erzeugung â lĂ€uft automatisiert in einem einzigen Bash-Skript ab.Dieses Skript lĂ€sst sich spĂ€ter problemlos auf einem Raspberry Pi ausfĂŒhren, sodass das System komplett autark arbeitet. Aktuell lade ich das generierte Bild auf meinen Webserver bei All-inkl., von dem sich der ESP32 das PNG regelmĂ€Ăig abholt. Doch: Wenn Raspberry Pi und ESP32 im selben lokalen Netzwerk sind, kann sogar der externe Webserver entfallen.In diesem Fall reicht ein kleiner Webserver auf dem Pi, etwa via lighttpd oder python3 -m http.server, um das Bild bereitzustellen. Benötigte Komponenten & Tools Damit du das Projekt 1:1 nachbauen kannst, benötigst du folgende Tools und Hardware: Software & Umgebung - Leistungsstarke Entwicklungsumgebungz.âŻB. IntelliJ IDEA oder eine andere IDE mit XML/XSLT-UnterstĂŒtzung - WSL mit Ubuntu (unter Windows)Wird benötigt fĂŒr Tools wie curl, Bash-Skripte und einfache Paketinstallation(alternativ geht auch ein nativer Linux-Rechner oder Raspberry Pi) - Apache FOPZur Umwandlung der XSL-FO-Datei in ein PNGDownload Apache FOP - Geo-Koordinaten deines Standorts (zwingend erforderlich fĂŒr API-Abfragen) - Ohne diese gibt die Meteomatics API keine Wetterdaten zurĂŒck. - Du kannst deine Latitude / Longitude ganz einfach ĂŒber Google Maps ermitteln: - Google Maps öffnen â Rechtsklick auf Standort â klick auf die angezeigten Koordinaten - die Koordinaten wie 52.1385884, 10.9670108 liegen nun in der Zwischenablage Hardware - ePaper Display (z.âŻB. 6" Inkplate)UnterstĂŒtzt PNG-Anzeige und kann spĂ€ter als stromsparendes Dashboard verwendet werdenâ kompatibel mit ESP32 & USB-C-Anschluss - USB-C DatenkabelZur Verbindung mit dem PC/Mac beim spĂ€teren Flashen des Controllers Inkplate 6 Zoll und 6-Farb-Display Das in diesem Projekt verwendete Inkplate 6 Zoll ePaper Display habe ich bereits auf meinem Blog vorgestellt. Daher gehe ich auf dieses nicht speziell ein. - Erfahrungsbericht: Wie gut sind die neuen E-Paper Displays von Soldered? - API-Daten des Bitaxe Gamma mit ESP32 und E-Paper-Display visualisieren Projektdateien Das komplette Projekt mit Beispieldaten, XSLT-Template und Bash-Skript findest du auf GitHub: github.com/StefanDraeger/xml2weatherpng Warum das Inkplate 6" ePaper Display die perfekte Wahl ist FĂŒr dieses Projekt setze ich das Inkplate 6" ein â ein vielseitiges ePaper-Display mit integriertem ESP32-Mikrocontroller. Dieses Board bringt alles mit, was man fĂŒr eine smarte, energieeffiziente Wetteranzeige benötigt: - ePaper-Technologie: Einmal dargestellte Inhalte bleiben auch ohne Stromzufuhr sichtbar. Dadurch eignet sich das Display ideal fĂŒr statische Inhalte wie Wetterdaten, die nur in Intervallen aktualisiert werden mĂŒssen. - Integrierter ESP32: Der verbaute Mikrocontroller ermöglicht die direkte WLAN-Anbindung und den Abruf des Wetterbildes â ohne zusĂ€tzliches SteuergerĂ€t. - LiPo-Batterieanschluss: Dank der UnterstĂŒtzung fĂŒr LiPo-Akkus kann das GerĂ€t völlig autark und kabellos betrieben werden. - Deep Sleep-Modus: Nach dem Herunterladen und Anzeigen des Wetterbildes wechselt der ESP32 in den energieeffizienten Schlafmodus, um Strom zu sparen. Der Bildschirminhalt bleibt dabei vollstĂ€ndig erhalten. Inkplate 6Inch ePaperDisplay - aktuelle Wetterdaten Inkplate 6Inch ePaperDisplay - Ansicht von der Seite Inkplate 6Inch ePaperDisplay - Sicht aus jedem Winkel möglich Inkplate 6Inch ePaperDisplay - Taste WakeUp Inkplate 6Inch ePaperDisplay - USB-C-Schnittstelle und RESET Taster Inkplate 6Inch ePaperDisplay - LiPo Batterie Diese Kombination aus sparsamer Anzeige, kabellosem Betrieb und einfacher WLAN-Anbindung macht das Inkplate 6" zur idealen Hardwarebasis fĂŒr dieses Projekt â besonders fĂŒr den Einsatz im Wohnbereich, Garten oder an Orten ohne stĂ€ndige Stromversorgung. Wetterdaten via Meteomatics API beziehen Im ersten Schritt legen wir uns einen kostenlosen Account bei meteomatics.com an. Damit erhalten wir Zugriff auf die Wetterdaten-API, die wir spĂ€ter im Projekt verwenden. Parameter des kostenfreien Accounts von Meteomatics Kostenloses Kontingent: Mit dem Basic-Account sind bis zu 500 API-Abfragen pro Tag möglich â mehr als ausreichend, um die Wetterdaten im 15-Minuten-Intervall abzurufen: 24 h * 60 min / 15 min = 96 Abfragen pro Tag Der Login zum kostenlosen Account ist auf der Webseite etwas versteckt. Hier der direkte Link:Kostenloses Meteomatics-Konto erstellen Nach der Registrierung erhĂ€ltst du Benutzername und Passwort, mit denen du spĂ€ter ganz einfach via curl oder in deinem Bash-Skript auf die Wetterdaten zugreifen kannst. Die Meteomatics API im Ăberblick Die Meteomatics Weather API ist sehr flexibel aufgebaut und liefert Wetterdaten in verschiedenen Formaten (XML, CSV, JSON, PNG etc.).In diesem Projekt nutzen wir die XML-Ausgabe, da sie sich perfekt mit XSLT weiterverarbeiten lĂ€sst. Dokumentation & Einstieg Die offizielle API-Dokumentation findest du hier: Getting Started mit der Meteomatics API Dort findest du: - Authentifizierungsbeispiele (curl, Python, etc.) - ParameterĂŒbersicht (Temperatur, Luftfeuchtigkeit, Wetterlage, u.âŻv.âŻm.) - Ausgabeformate (XML, JSON, PNG, CSV) - Struktur der URL-Abfragen Nachfolgend zeige ich dir Schritt-fĂŒr-Schritt wie du diese Daten via curl im XML Format lĂ€dst. Beispiel-Abfrage (XML) Sobald du deinen Account und deine Koordinaten hast, kannst du z.âŻB. folgende Wetterwerte abfragen: - Temperatur in 2âŻm Höhe (t_2m:C) - Relative Luftfeuchtigkeit (relative_humidity_2m:p) - Wettersymbol-ID (weather_symbol_1h:idx) curl -u "username:passwort" "https://api.meteomatics.com/now/t_2m:C,relative_humidity_2m:p,weather_symbol_1h:idx/52.1385884,10.9670108/xml" > wetter.xml Diese Abfrage liefert die aktuellen Wetterdaten als strukturiertes XML in der Daten wetter.xml, das wir im nĂ€chsten Schritt weiterverarbeiten werden. BENUTZER 2025-06-12T07:05:15Z OK 14.1 77.9 1 đĄ Ich fĂŒhre alle curl-Befehle unter einem lokalen Linux-System via WSL (Windows Subsystem for Linux) auf meiner Windows 11 Maschine aus.WSL lĂ€sst sich mit wenigen Klicks installieren â eine Anleitung findest du auf meinem YouTube Kanal im Video Linux unter Windows 11 - So gehtâs Alternativ kann das Projekt natĂŒrlich auch direkt auf einem nativen Linux-System oder einem Raspberry Pi ausgefĂŒhrt werden. Was ist XSLT â und wie verarbeitet man damit XML? XSLT (Extensible Stylesheet Language Transformations) ist eine Sprache, mit der man XML-Daten in andere Formate ĂŒberfĂŒhren kann â z.âŻB. HTML, Text oder wie in unserem Fall XSL-FO, das wir spĂ€ter in ein PNG-Bild umwandeln. WĂ€hrend man in vielen Tutorials hĂ€ufig das Durchlaufen mit for-each sieht, verwende ich in diesem Projekt eine gezielte, direkte Abfrage einzelner XML-Knoten.So bleibt das Layout klar strukturiert und wir behalten die Kontrolle ĂŒber jede Ausgabezeile. Grundstruktur einer XSLT-Datei Zugriff auf einzelne Werte aus wetter.xml Statt Schleifen nutze ich in den einzelnen -Elementen direkte XPath-Abfragen wie diese: Temperatur: °C Genauso lĂ€sst sich auch der Zeitstempel (z.âŻB. dateGenerated) gezielt ansprechen: Vorteil dieser Methode - Einfaches, lesbares Layout (insbesondere bei fixen Daten wie Temperatur, Luftfeuchte, Wettersymbol) - Kein unnötiges Durchlaufen von Elementen - Exakte Kontrolle ĂŒber die Formatierung jedes einzelnen Wertes Wetter-Icons fĂŒr die aktuelle Lage Um die aktuelle Wetterlage visuell darzustellen, verwende ich Wetter-Symbole im PNG-Format. Icons herunterladen Die passenden Icons können direkt bei Meteomatics kostenfrei heruntergeladen werden:mm_api_symbols.tar.gz â Meteomatics Widget Icons Bereits vorbereitet im GitHub-Repository Im Original-Archiv stimmen die Dateinamen leider nicht direkt mit den weather_symbol_1h:idx-IDs der API ĂŒberein.Damit das Einbinden in XSLT funktioniert, mĂŒssten die Dateien eigentlich manuell umbenannt werden â aber das habe ich bereits fĂŒr dich erledigt. Du findest im GitHub-Repository einen fertigen Ordner mit allen Symbolen, korrekt benannt nach der ID: images/104.png, images/1.png, usw. Du musst also nichts mehr selbst umbenennen. Zugriff im XSLT Mit den umbenannten Dateien funktioniert der Zugriff auf das passende Icon ganz einfach per external-graphic: Die PNG-Dateien liegen im Ordner images/ relativ zur Ausgabe. Das XSLT-Template fĂŒr unser Wetterlayout Nachdem wir nun die Wetterdaten im XML-Format lokal gespeichert haben, erstellen wir im nĂ€chsten Schritt das passende XSLT-Template, das diese Daten in ein visuelles Layout ĂŒberfĂŒhrt. Ziel ist es, ein XSL-FO-Dokument zu erzeugen, das von Apache FOP in ein PNG-Bild umgewandelt werden kann. Dieses Bild zeigt: - den aktuellen Standortnamen (hier: Schöningen), - das Datum und die Uhrzeit der Abfrage, - die Temperatur in °C, - die Luftfeuchtigkeit in Prozent, - sowie ein passendes Wettersymbol auf Basis der weather_symbol_1h:idx-ID. Das Layout orientiert sich an einem kompakten Infodisplay, optimiert fĂŒr die Darstellung auf einem ePaper-Display mit 4,2 oder 5 Zoll. Die einzelnen Werte werden direkt aus dem XML-Dokument ausgelesen â ohne Schleifen â und gezielt in fo:block-Elemente geschrieben. Das sorgt fĂŒr ein sauberes, stabiles und gut kontrollierbares Layout. Im folgenden Abschnitt siehst du den vollstĂ€ndigen Aufbau des Templates, das du bei Bedarf jederzeit an dein eigenes Design oder zusĂ€tzliche Wetterparameter anpassen kannst. XSL Dokument als Template Schöningen  TEMPERATUR °C  LUFTFEUCHTIGKEIT % Bildgenerierung mit Apache FOP auf der Kommandozeile Sobald wir unser XML mit den Wetterdaten und das passende XSLT-Template vorbereitet haben, nutzen wir Apache FOP, um daraus ein fertiges PNG-Bild zu erzeugen. Apache FOP ist ein Kommandozeilen-Tool, das XSL-FO-Dateien (Formatting Objects) in verschiedene Formate wie PDF, PNG oder SVG umwandeln kann. Voraussetzungen Stelle sicher, dass du: - Java installiert hast (java -version) - Apache FOP heruntergeladen und entpackt hast - dich im Verzeichnis der FOP-BinĂ€rdateien befindest oder fop im Pfad liegt Der Befehl fop -xml wetter.xml -xsl meteomatics2fo.xsl -png output/forecast.png đ ErklĂ€rung der Parameter: - -xml wetter.xml: Die XML-Datei mit den aktuellen Wetterdaten - -xsl meteomatics2fo.xsl: Dein XSLT-Template, das die Daten in ein Layout ĂŒberfĂŒhrt - -png forecast.png: Der Name der Ausgabedatei â in diesem Fall ein PNG-Bild erstellte Datei forecast.png durch Apache FOP Java unter WSL installieren FĂŒr die AusfĂŒhrung von Apache FOP ist eine funktionierende Java-Umgebung erforderlich.Auch wenn Java bereits unter Windows installiert ist, musst du es innerhalb von WSL (z.âŻB. Ubuntu) separat installieren, da beide Umgebungen unabhĂ€ngig voneinander arbeiten. Installation unter Ubuntu/WSL: sudo apt update sudo apt install default-jre Alternativ kannst du auch das JDK installieren, falls du zusĂ€tzlich Java-Programme entwickeln willst: sudo apt install default-jdk Nach der Installation kannst du mit folgendem Befehl prĂŒfen, ob Java korrekt eingerichtet ist: java -version Damit steht dem Einsatz von Apache FOP innerhalb deiner WSL-Umgebung nichts mehr im Weg. Automatischer Upload per SCP ohne Passwortabfrage Damit das generierte Wetterbild (forecast.png) regelmĂ€Ăig und automatisch auf deinen Webserver hochgeladen werden kann (z.âŻB. per CronJob), verwenden wir den SCP-Befehl â allerdings ohne Passwortabfrage. Da SCP standardmĂ€Ăig keine PasswortĂŒbergabe erlaubt, mĂŒssen wir einmalig ein SSH-SchlĂŒsselpaar erstellen und den öffentlichen SchlĂŒssel auf den Server ĂŒbertragen. SSH-Key erstellen FĂŒhre folgenden Befehl in deiner Linux-/WSL-Konsole aus: ssh-keygen -t rsa -b 4096 -C "[email protected]" - Der Kommentar (hier deine E-Mail-Adresse) ist optional. - DrĂŒcke einfach ENTER bei der Frage nach dem Speicherpfad (~/.ssh/id_rsa ist Standard). - Lege kein Passwort fest, damit die Verbindung automatisiert erfolgen kann. Ăffentlichen SchlĂŒssel auf den Webserver ĂŒbertragen Jetzt lĂ€dst du deinen öffentlichen SchlĂŒssel auf den Server (nur einmal nötig): ssh-copy-id benutzer@domain Gib bei der ersten Verbindung dein normales Passwort ein.AnschlieĂend kannst du dich ohne Passwortabfrage per SSH/SCP verbinden. Bild hochladen per SCP Jetzt kannst du dein Bild mit einem einfachen Befehl hochladen: scp ./output/forecast.png benutzer@domain:/pfad/wetterdisplay/forecast.png Der Upload erfolgt in Sekunden â perfekt fĂŒr die Einbindung in ein Bash-Skript oder Cronjob. Das Wetterbild auf dem Inkplate 6 anzeigen Nachdem wir im ersten Teil ein PNG mit aktuellen Wetterdaten generiert haben, geht es nun darum, dieses Bild auf einem ePaper-Display anzuzeigen.Ich verwende dafĂŒr das Inkplate 6 â ein stromsparendes, ESP32-basiertes ePaper-Board mit 6-Zoll-Anzeige und WLAN. Inkplate 6Inch ePaperDisplay - aktuelle Wetterdaten Inkplate 6Inch ePaperDisplay - Ansicht von der Seite Ăber eine einfache WLAN-Verbindung lĂ€dt das Board das Wetterbild in regelmĂ€Ăigen AbstĂ€nden herunter und stellt es direkt auf dem Display dar â ganz ohne HTML, Browser oder App.Im folgenden Code-Beispiel siehst du, wie das Bild mit wenigen Zeilen Code automatisch aktualisiert wird. Boardtreiber fĂŒr die Inkplate Displays Damit wir das Board ĂŒberhaupt programmieren können, mĂŒssen wir den Boardtreiber installieren, dazu kopieren wir die nachfolgende Adresse in Datei > Einstellungen > ZusĂ€tzliche Boardverwalter-URLs. https://raw.githubusercontent.com/SolderedElectronics/Dasduino-Board-Definitions-for-Arduino-IDE/master/package_Dasduino_Boards_index.json Nachdem der Index aktualisiert wurde, können wir die SchaltflĂ€che "Boardverwalter" im linken MenĂŒ der Arduino IDE wĂ€hlen und dort nach Inkplate suchen. In meinem Fall habe ich die aktuelle Version 8.1.0 installiert. Benötigte Bibliothek fĂŒr das Inkplate Display ZusĂ€tzlich zum Boardtreiber benötigen wir noch den Treiber fĂŒr das ePaperDisplay, diesen finden wir im Bibliothenverwalter wenn wir nach InkplateLibrary suchen. Bei der Installation der Bibliothek hatte ich zunĂ€chst Probleme weil die Sourcen nicht gefunden wurden. Die Lösung war zunĂ€chst das ich das GitHub Repository SolderedElectronics/Inkplate-Arduino-library als ZIP-Datei heruntergeladen habe und diese dann ĂŒber Sketch > Bibliothek einbinden > ZIP-Bibliothek hinzufĂŒgen... installiert habe. Quellcode /* * Titel : Wetteranzeige mit dem Inkplate 6 ePaper-Display * Beschreibung : Dieses Programm lĂ€dt ein zuvor erzeugtes PNG-Bild mit aktuellen Wetterdaten * von einem Webserver herunter und zeigt es auf dem stromsparenden ePaper-Display an. * Das Bild wird in regelmĂ€Ăigen AbstĂ€nden neu geladen (alle 30 Minuten). * * Author : Stefan Draeger * Webseite : https://draeger-it.blog * Blogbeitrag : https://draeger-it.blog/wetterdaten-visualisieren-mit-xslt-apache-fop-teil-1-png-erzeugung-am-pc/ */ #include "HTTPClient.h" // FĂŒr HTTP-Anfragen (Bild abrufen) #include "WiFi.h" // FĂŒr WLAN-Verbindung #include "Inkplate.h" // Bibliothek fĂŒr das Inkplate ePaper-Display // URL zum PNG-Bild mit den generierten Wetterdaten String forecastUrl = "http://ressourcen-draeger-it.de/wetterdisplay/forecast.png"; // HTTP- und WiFi-Clients vorbereiten (werden im drawImage intern genutzt) HTTPClient sender; WiFiClient wifiClient; // Display-Objekt erzeugen (automatische Modell-Erkennung, z.âŻB. Inkplate 6") Inkplate display; // WLAN-Zugangsdaten const char* ssid = "abc"; // SSID deines WLANs const char* password = "123"; // WLAN-Passwort void setup() { Serial.begin(115200); // Serielle Ausgabe zur Debug-Ăberwachung // WLAN im Station-Modus aktivieren und verbinden WiFi.mode(WIFI_MODE_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); // Warteanimation wĂ€hrend der Verbindung } Serial.println(); Serial.print("Verbunden mit IP: "); Serial.println(WiFi.localIP()); // Display initialisieren (muss einmalig aufgerufen werden) display.begin(); } void loop() { // Display vollstĂ€ndig löschen display.clearDisplay(); display.display(); // Erstes Update zur BestĂ€tigung des Clearings display.fillScreen(INKPLATE_WHITE); // Hintergrundfarbe setzen // Bild von der angegebenen URL laden und anzeigen // Parameter: URL, X-Position, Y-Position, Dithering aktiv, nicht invertieren display.drawImage(forecastUrl, 10, 0, true, false); display.display(); // Anzeige aktualisieren // 30 Minuten Pause (1800000 Millisekunden), danach wiederholen delay(1800000); }
Read the full article