-
Notifications
You must be signed in to change notification settings - Fork 4
Wettervorhersage im Wohnmobil
Diese Anleitung entstammt einem praktischen Beispiel aus Disussion #30. Wenn die Wetterstation auf einem Fahrzeug angebracht ist, ändert sich regelmäßig der Standort. Der Nutzer möchte hier automatisch die Wettervorhersage für seinen momentanen Aufenthaltsort und/oder das Tagesziel in die Website aufgenommen haben.
Für diesen Zweck ist es natürlich erforderlich, daß WeeWX den Aufenthaltsort kennt. Für die folgenden Beispiele nehmen wir an, daß dieser Aufenthaltsort als $current.latitude
und $current.longitude
zur Verfügung steht. Hierzu eignet sich ein GPS-Empfänger, der die Koordinaten per MQTT versendet. Die Erweiterung MQTTSubscribe kann die Koordinaten dann in WeeWX einlesen und zur Verfügung stellen.
Da der Aufenthaltsort beliebige Koordinaten haben kann, funktioniert das nur mit den Vorhersagen von Open-Meteo, bei denen der gewünschte Ort nicht als Codierung sondern als Koordinaten übergeben wird. Open-Meteo sucht dann den nächstliegenden Gitterpunkt heraus, für den eine Vorhersage vorliegt.
Das Programm dwd-mosmix
kann nicht direkt auf Werte in WeeWX zugreifen. Stattdessen wird mit den Mitteln, mit denen WeeWX die Webseiten erzeugt, ein Shell-Script geschrieben, das den Programmaufruf mit den passenden Parametern inklusive der aktuellen Koordinaten enthält. Dieses Script wird in einem zweiten Schritt durch ein weiteres Script ausführbar gemacht und mittels crontab aufgerufen.
Für die folgende Anleitung nehmen wir an, daß WeeWX in die folgenden Verzeichnisse installiert ist:
-
SKIN_ROOT
=/etc/weewx/skins
-
SQLITE_ROOT
=/var/lib/weewx
Wenn Sie WeeWX in andere Verzeichnisse installiert haben, passen Sie die Verzeichnisnamen entsprechend an.
Erzeugen Sie im Skin-Verzeichnis von WeeWX ein Unterverzeichnis namens open-meteo-forecast
:
mkdir /etc/weewx/skins/open-meteo-forecast
In diesem Verzeichnis erstellen Sie eine Datei namens dwd-mosmix-call.sh.tmpl
mit folgendem Inhalt:
#encoding UTF-8
#errorCatcher Echo
#!/bin/bash
/usr/local/bin/dwd-mosmix --weewx --belchertown --html --daily --hourly --open-meteo=$Extras.model $current.latitude.raw,$current.longitude.raw
#set $inc_pth=$os.path.join($SKIN_ROOT,$Extras.path)
## nur zusammen mit --html --daily
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s.inc' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) $(os.path.join($inc_pth,$Extras.daily_forecast_file))
## nur zusammen mit --html --hourly
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s-hourly.inc' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) $(os.path.join($inc_pth,$Extras.hourly_forecast_file))
## nur zusammen mit --belchertown
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s-belchertown.json' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) /var/www/html/weewx/belchertown/json/forecast.json
Von den Optionen --belchertown
, --html
, --daily
und --hourly
sind nur die wirklich benötigten anzugeben. Die anderen sind wegzulassen.
In weewx.conf
ergänzen Sie im Abschnitt [StdReport]
:
[[open-meteo-forecast]]
skin = open-meteo-forecast
HTML_ROOT = /var/lib/weewx
[[[Extras]]]
model = icon_global
path = /etc/weewx/skins/Belchertown/dwd
daily_forecast_file = forecast-where-I-am.inc
hourly_forecast_file = forecast-where-I-am-hourly.inc
[[[CheetahGenerator]]]
[[[[ToDate]]]]
[[[[[shellscript]]]]]
template = dwd-mosmix-call.sh.tmpl
[[[Generators]]]
generator_list = weewx.cheetahgenerator.CheetahGenerator,
Der Wert von path
unter [[[Extras]]]
muß mit dem Wert von path
unter [WeatherServices]
übereinstimmen.
Erstellen Sie im Verzeichnis /usr/local/bin
eine Datei mobile-forecast
mit folgendem Inhalt:
#!/bin/bash
/bin/chmod +x /var/lib/weewx/dwd-mosmix-call.sh
/var/lib/weewx/dwd-mosmix-call.sh
Machen Sie die Datei anschließend ausführbar:
sudo chmod +x /usr/local/bin/mobile-forecast
Damit die Vorhersage regelmäßig berechnet wird, ergänzen Sie folgende Zeile in /etc/crontab
:
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root /usr/local/bin/mobile-forecast >/var/log/mobile-forecast.log 2>&1
Wenn es Ihnen genügt, daß die Vorhersage stündlich berechnet wird, können Sie die Datei mobile-forecast
auch nach /etc/cron.hourly
speichern und /etc/crontab
unverändert lassen.
Sie können die erzeugten Vorhersagen in jede Visualisierung (Skin) einbinden, die Sie installiert haben.
Die Option --belchertown
bewirkt, daß die Datei forecast.json
erzeugt wird, die die Belchertown-Skin zur Darstellung der Wettervorhersage verwendet. Dazu muß in weewx.conf
der Unterabschnitt [[Belchertown]]
im Abschnitt [WeatherServices]
wie in Konfiguration in weewx.conf
beschrieben konfiguriert werden.
Wird die Option --html
genutzt, werden CheetahGenerator-Include-Dateien (*.inc
) erzeugt, die in den Templates Ihrer Visualisierung (Skin) mittels #include
eingefügt werden.
Beispiel:
<div class="col-sm-8">
<p style="font-size:110%">Wettervorhersage</p>
#include raw "dwd/forecast-where-I-am.inc"
</div>
Unterwegs werden die Daten über Mobilfunk bereitgestellt, und dort ist das Datenvolumen immer noch begrenzt. Es liegt also nahe, sich Gedanken darüber zu machen, wann die Vorhersage wirklich neu berechnet werden muß. Zwei Gründe spielen eine Rolle:
- Die letzte Berechnung ist schon so lange her, daß neue Wetterdaten vorliegen könnten.
- Der Aufenthaltsort hat sich so weit geändert, daß man von anderen Wetterbedingungen ausgehen muß.
Für dieses Beispiel soll zugrundegelegt werden, daß die Vorhersage neu berechnet werden muß wenn
- die letzte Berechnung mehr als eine Stunde zurückliegt oder
- der Aufenthaltsort sich um mehr als 100 km geändert hat.
Gegenüber der vorherigen Anleitung unterscheidet sich nur die Datei dwd-mosmix-call.sh.tmpl
:
#encoding UTF-8
#errorCatcher Echo
#from geopy.distance import geodesic
#set $inc_pth = $os.path.join($SKIN_ROOT,$Extras.path)
#set $last_forecast_ts = $(int(os.path.getmtime(os.path.join($inc_pth,$forecast_fn))))
#set $last_forecast_dist = $geodesic(($current.latitude.raw,$current.longitude.raw),($current(timestamp=$last_forecast_ts,max_delta=300).latitude.raw,$current(timestamp=$last_forecast_ts,max_delta=300).longitude.raw)).km
#!/bin/bash
#if $last_forecast_ts<$time.time()-3600 or $last_forecast_dist>=100
/usr/local/bin/dwd-mosmix --weewx --belchertown --html --daily --hourly --open-meteo=$Extras.model $current.latitude.raw,$current.longitude.raw
## nur zusammen mit --html --daily
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s.inc' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) $(os.path.join($inc_pth,$Extras.daily_forecast_file))
## nur zusammen mit --html --hourly
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s-hourly.inc' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) $(os.path.join($inc_pth,$Extras.hourly_forecast_file))
## nur zusammen mit --belchertown
mv $(os.path.join($inc_pth,'forecast-openmeteo-%s-%s-%s-belchertown.json' % ($current.latitude.raw,$current.longitude.raw,$Extras.model))) /var/www/html/weewx/belchertown/json/forecast.json
#else
/bin/true
#end if