Wetter für Lazarus

Wetter mit Lazarus

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.

wetter_zdf.PNG

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.

Beispiel Projekt für die Wetter-Unit

 

Sourcecode

Den kompletten Sourcecode finden Sie mit dem Beispiel und der weather-Unit in meiner Dropbox.

Hier erfahren Sie, wie Sie Lazarus installieren.

Dieser Beitrag hat 2 Kommentare

Kommentar verfassen