Oft steht man vor der Aufgabe in einer Software, Dateien aus dem Internet zu laden. Innerhalb von Lazarus stellt das Synapse Package viele Funktionen dafür zur Verfügung. Für meinen Medienplayer suchte ich nach der Möglichkeit, einfache Wetterdaten anzuzeigen. Wie beides zusammen passt, lesen Sie in diesem Blog.
Meine Motivation war, für einen eigenen Medienplayer, Wetterdaten möglichst einfach darzustellen. Die Medienplayer-Software läuft als Lazarus-Programm auf einem Raspberry Pi. Während dem Abspielen von MP3-Titeln oder von Webradio sollte in bestimmten Zeitabständen auch das aktuelle Wetter angezeigt werden.
Nach einigen Internet-Recherchen mit vielen Texten über API’s bin ich auf einen Blog-Beitrag über die ZDF-Wettergrafiken gestoßen. Diese werden täglich erzeugt und liegen als JPG-Dateien vor.
Für fast jedes Bild gibt es ein eigenes File. Das Wetter für „heute“ steht beispielsweise in dem Bild wwwdyn.zdf.de/ext/weather/preview-brd-0.jpg.
Damit ist der erste Teil gelöst: Das Bild für das aktuelle Wetter muss mit dem Synapse-Paket vom ZDF-Server geladen und dann angezeigt werden.
Alles Wissenswerte und viele Beispiele über die Verwendung von Synapse gibt es im Wiki unter diesem Link http://wiki.freepascal.org/Synapse.
Da in meinem Fall parallel weitere Prozesse laufen und die Download-Geschwindigkeit nicht immer gleich hoch ist, wollte ich den Download als eigenen Thread ablaufen lassen.
Dafür habe ich ein eigenes Thread-Objekt angelegt:
TDownloadJpgThread = class(TThread) private function GetPictureFromUrl(Image : TWeatherPic) : boolean; protected procedure Execute; override; public Constructor Create; published end;
Der Download erfolgt über die Funktion GetPictureFromUrl. Hier stehen die angepassten Codezeilen aus den Beispielen des WIKI’s.
function TDownloadJpgThread.GetPictureFromUrl(Image : TWeatherPic) : boolean; var HTTPGetResult: Boolean; HTTPSender: THTTPSend; begin Result:=false; HTTPSender:=THTTPSend.Create; try HTTPGetResult:=HTTPSender.HTTPMethod('GET',Image.Url); if (HTTPSender.ResultCode>=100) and (HTTPSender.ResultCode<=299) then begin HTTPSender.Document.SaveToFile(WeatherLocalPath+PathDelim+Image.Filename); Result:=true; end; finally HTTPSender.Free; end; end;
Die Execute-Prozedur habe ich so ausgelegt, dass nicht bei jedem Aufruf ein Download erfolgt. Mir reichen die Daten täglich aktuell. Deshalb werden sie nach einem Download lokal zwischengespeichert und bei Bedarf von dort geladen. Ist das Dateidatum älter als 24 Stunden erfolgt wieder ein neuer Download.
procedure TDownloadJpgThread.Execute; var i : integer; dt : TDateTime; Download : boolean; f : string; begin for i:=0 to MAX_WEATHER_PICS-1 do begin //Pfad und Dateinamen zusammenbauen f:=WeatherLocalPath+PathDelim+WeatherPics[i].Filename; Download:=true; //Prüfen, ob lokale Datei schon existiert if FileExistsUTF8(f)=true then begin //Dateidatum prüfen und entscheiden, ob Download erfolgen soll dt:=FileDateToDateTime(FileAge(f)); WeatherPics[i].Date:=dt; if HoursBetween(now,dt)<24 then Download:=false; //kleiner 24 Stunden >> kein Download end else WeatherPics[i].Date:=StrToDateTime('01.01.1900'); if Download=true then begin GetPictureFromUrl(WeatherPics[i]); //Downloaden WeatherPics[i].Date:=now; WeatherPics[i].Download:=true; end else begin WeatherPics[i].LoadFromFile(f); //Lokale Datei laden WeatherPics[i].Download:=false; end; end; end;
Welche Wetterbilder gibt es? Ziemlich viele. Ich verwende am liebsten: die Vorhersagen für Tag und Nacht, die weiteren Aussichten, das Europa-Wetter und Informationen zum Pollenflug, UV und Ozon.
Definiert werden diese in der Unit mit der Klasse TWeatherPic.
WeatherPics[0].Caption:='Vorhersage: Heute'; WeatherPics[0].Url:='http://wwwdyn.zdf.de/ext/weather/preview-brd-0.jpg'; WeatherPics[1].Caption:='Vorhersage: Heute Nacht'; WeatherPics[1].Url:='http://wwwdyn.zdf.de/ext/weather/preview-brd-1.jpg'; WeatherPics[2].Caption:='Vorhersage: Morgen'; WeatherPics[2].Url:='http://wwwdyn.zdf.de/ext/weather/preview-brd-2.jpg'; WeatherPics[3].Caption:='Vorhersage: Aussichten'; WeatherPics[3].Url:='http://wwwdyn.zdf.de/ext/weather/preview-brd-3.jpg'; WeatherPics[4].Caption:='Temperatur'; WeatherPics[4].Url:='http://wwwdyn.zdf.de/ext/weather/temp-brd-3.jpg'; WeatherPics[5].Caption:='UV-Index'; WeatherPics[5].Url:='http://wwwdyn.zdf.de/ext/weather/uv-brd-1.jpg'; WeatherPics[6].Caption:='Pollen-Belastung'; WeatherPics[6].Url:='http://wwwdyn.zdf.de/ext/weather/poll-suedwest-0.jpg'; WeatherPics[7].Caption:='Ozon-Belastung'; WeatherPics[7].Url:='http://wwwdyn.zdf.de/ext/weather/ozone-brd-1.jpg'; WeatherPics[8].Caption:='Euro-Wetter'; WeatherPics[8].Url:='http://wwwdyn.zdf.de/ext/weather/rain-eur-0.jpg';
Wenn sie genau wissen möchten, wie es funktioniert. Schauen Sie sich am besten das Beispiel-Projekt an.
Sourcecode
Den kompletten Sourcecode finden Sie mit dem Beispiel und der weather-Unit in meiner Dropbox.
Hier erfahren Sie, wie Sie Lazarus installieren.
Pingback: TACTbox – Mein Mediaplayer – Mein Techblog
Pingback: TACTbox – Mein Mediaplayer – Tech+Code