Hallo zusammen,
nach einer API-Änderung von Openweathermap konnte ich den LBS 19000828 von maques nicht mehr nutzen. Nach ein paar Anpassungen funktiert die Abfrage aktueller Wetterdaten wieder und ich möchte den entsprechenden Code teilen.
Für die Nutzung wird ein kostenfreier API-Code benötigt, der auf der Website erstellt werden kann. Kostenlos sind damit 1.000 Abfragen von Wind, Temperaturen, Sonnenaufgang und -untergang sowie der allgemeinen Wetterlage pro Tag möglich, Wochenvorhersagen und extravagante Infos (UV-, Pollenbelastung) benötigen einen bezahlten API-Code.
MfG Max
nach einer API-Änderung von Openweathermap konnte ich den LBS 19000828 von maques nicht mehr nutzen. Nach ein paar Anpassungen funktiert die Abfrage aktueller Wetterdaten wieder und ich möchte den entsprechenden Code teilen.
Für die Nutzung wird ein kostenfreier API-Code benötigt, der auf der Website erstellt werden kann. Kostenlos sind damit 1.000 Abfragen von Wind, Temperaturen, Sonnenaufgang und -untergang sowie der allgemeinen Wetterlage pro Tag möglich, Wochenvorhersagen und extravagante Infos (UV-, Pollenbelastung) benötigen einen bezahlten API-Code.
MfG Max
Code:
##[DEF]###
[name = Openweathermap API ]
[e#1 Trigger = Trigger ]
[e#2 important = APIKey #init=c6349fc6f993XXXXXXXXXXXXXXXX ]
[e#3 important = Längengrad #init=11.091 ]
[e#4 important = Breitengrad #init=49.245 ]
[e#5 important = lang #init=de ]
[e#6 important = units #init=metric ]
[e#7 important = Zeitraum #init=current]
[e#8 optional = Stundenvorhersage #init=all ]
[e#9 optional = Datumsformat #init=%a, %d.%b %Y %H:%M ]
[e#10 optional = Zeitformat #init=%H:%M ]
[e#11 important = Cache-Zeit #init=2700 ]
[e#12 important = Trenner #init=|]
[e#13 important = debug #init=8 ]
[a#1 = last Update ]
[a#2 = Datum ]
[a#3 = Sunrise]
[a#4 = Sunset ]
[a#5 = Aktuelle Temperatur ]
[a#6 = max Temperatur ]
[a#7 = min Temperatur ]
[a#8 = gefühlte aktuelle Temperatur ]
[a#9 = Luftfeuchte ]
[a#10 = Luftdruck]
[a#11 = Wind m/s ]
[a#12 = Windrichtung in ° ]
[a#13 = Windrichtung Text ]
[a#14 = Windboe ]
[a#15 = Bewölkung %]
[a#16 = Sicht in meter ]
[a#17 = Weatherlage ID ]
[a#18 = Wetterlage]
[a#19 = Weather Beschreibung ]
[a#20 = Weather Icon ]
[a#21 = Weather Openweather Font Icon ]
[a#22 = Wetterereignis Quelle ]
[a#23 = Wetterereignis Event ]
[a#24 = Wetterereignis Start ]
[a#25 = Wetterereignis Ende ]
[a#26 = Wetterereignis Beschreibung ]
[a#27 = Openweather JSON-String ]
[a#28 = Error ]
[v#1 = 1.0 ] (Version)
[v#2 = LBS ]
[v#3 = "Openweathermap API" ]
###[/DEF]###
###[HELP]###
Der Baustein implementiert die Weather Api von Openweathermap <b><a href="https://openweathermap.org/api" target="_blank">https://openweathermap.org/api</a></b>.
Der kostenfreie API-KEY kann nach einer Registrierung hier https://openweathermap.org/price beantragt werden. Dieser Key lässt aktuell 1.000 Abrufe je Tag (Also ca. alle 1,5 Minuten) zu.
Der Baustein cached das Ergebnis in einer Datei in /tmp auch dann, wenn mehrere Instanzen des Bausteins angelegt und genutzt werden, um die Anzahl der Abrufe zu optimieren.
e1: Startet den Baustein bzw. Triggert eine Abfrage, ob die Cache-time überschritten wurde.
e2: APIKey - Kann hier <a href="https://home.openweathermap.org/users/sign_up" target="_blank">https://home.openweathermap.org/users/sign_up</a> beantragt werden
e3: Längengrad
e4: Breitengrad
e5: Sprache - <a href="https://openweathermap.org/api/one-call-api#multi" target="_blank">https://openweathermap.org/api/one-call-api#multi</a>
e6: Einheit - standard, metric, imperial
e7: Zeitraum - current, daily, hourly, minutely
e8: Zeitraum Stundenvorhersage - all, today, tomorrow
e9: Datumsformat - <a href="https://www.php.net/manual/de/function.strftime.php" target="_blank">PHP datetime.formats</a>
e10: Zeitformat - <a href="https://www.php.net/manual/de/function.strftime.php" target="_blank">PHP datetime.formats</a>
e11: Zeitraum, in dem die Daten lokal gecached werden in Seckunden
e12: Feldtrenner
e13 debug 0,1
<b>Um die Koordinaten (Breitengrad und Längengrad) für e3 und e4 zu ermitteln:</b>
- Navigieren zum gewünschten Ort in der Karte z.B. durch Eingabe einer Adresse
- In der Adressleiste des Browsers sollten an der URL die Koordinaten angefügt sein, im Beispiel:
https://www.openstreetmap.org/search?query=......#map=19/<b>48.20877/16.36358</b>
- Die letzten beiden Angaben definieren Längengrad (hier: 16.36358) und Breitengrad (hier: 48.20877)
a1: Letzte Aktualisierung
a2: Datum/Uhrzeit
a3: Sonnenaufgang
a4: Sonnenuntergang
a5: Aktuelle Temperatur - default: kelvin, metric: Celsius, imperial: Fahrenheit
a6: HöchstTemperatur im Zeitraum
a7: TiefstTemperatur im Zeitraum
a8: gefühlte aktuelle Temperatur Tag/Stunde
a9: Luftfeuchtigkeit in %
a10: Luftdruck in hPa
a11: Wind default: metre/sec, metric: metre/sec, imperial: miles/hour
a12: Windrichtung in °
a13: Windrichtung Text
a14: Windboe - default: metre/sec, metric: metre/sec, imperial: miles/hour
a15: Bewölkung %
a16: Sicht in meter
a17: Wetterlage - <a href="https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2" target="_blank">https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2</a>
a18: Wetterlage Text
a19: Wetter Beschreibung - <a href="https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2" target="_blank">https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2</a>
a20: Wetter Icon - <a href="https://openweathermap.org/weather-conditions#How-to-get-icon-URL" target="_blank">https://openweathermap.org/weather-conditions#How-to-get-icon-URL</a>
a21: Position des Wetter Icons im Openweather Font - <a href="https://websygen.github.io/owfont/" target="_blank">https://websygen.github.io/owfont/</a>
a22: Wetterereignis Quelle z.B. DWD
a23: Wetterereignis Event
a24: Wetterereignis Startin Epoch
a25: Wetterereignis Ende in Epoch
a26: Wetterereignis Beschreibung
a27: Das komplette Ergebnis der Abfrage als JSON - String
a28: Error
Changes:
1.0 - Initiale Version (adaptiert von LBS19000828 von maque
###[/HELP]###
###[LBS]###
<?
function LB_LBSID($id) {
if ($E=getLogicEingangDataAll($id)) {
if ($E[1]['refresh']==1) {
callLogicFunctionExec(LBSID,$id);
}
}
}
?>
###[/LBS]###
###[EXEC]###
<?
function debugFunction ($logName, $logLevel, $logMessage) {
writeToCustomLog($logName, $logLevel, $logMessage);
}
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
global $lbs_name, $id, $errorNo;
debugFunction ($lbs_name, 0, __FUNCTION__. ": $errstr: Line: $errline, No: $errno, File: $errfile");
setLogicLinkAusgang($id, $errorNo, "$errstr: Line: $errline, No: $errno, File: $errfile");
}
function deg2txt($deg) {
global $debug, $lbs_name;
if (($deg > 348.75 && $deg <= 360) || ($deg >= 0 && $deg <= 11.25))
$ret = 'N';
elseif ($deg > 11.25 && $deg <= 33.75)
$ret = 'NNO';
elseif ($deg > 33.75 && $deg <= 56.25)
$ret = 'NO';
elseif ($deg > 56.25 && $deg <= 78.75)
$ret = 'ONO';
elseif ($deg > 78.75 && $deg <= 101.25)
$ret = 'O';
elseif ($deg > 101.25 && $deg <= 123.75)
$ret = 'OSO';
elseif ($deg > 123.75 && $deg <= 146.25)
$ret = 'SO';
elseif ($deg > 146.25 && $deg <= 168.75)
$ret = 'SSO';
elseif ($deg > 168.75 && $deg <= 191.25)
$ret = 'S';
elseif ($deg > 191.25 && $deg <= 213.75)
$ret = 'SSW';
elseif ($deg > 213.75 && $deg <= 236.25)
$ret = 'SW';
elseif ($deg > 236.25 && $deg <= 258.75)
$ret = 'WSW';
elseif ($deg > 258.75 && $deg <= 281.25)
$ret = 'W';
elseif ($deg > 281.25 && $deg <= 303.75)
$ret = 'WNW';
elseif ($deg > 303.75 && $deg <= 326.25)
$ret = 'NW';
elseif ($deg > 326.25 && $deg <= 348.75)
$ret = 'NNW';
if ($debug>5)
debugFunction ($lbs_name, 0, __FUNCTION__. " $deg Grad = $ret");
return $ret;
}
function checkToday($epoch) {
global $debug, $lbs_name;
if(strtotime("tomorrow") > $epoch)
{
//echo 'today';
$rc = 1;
}
else
$rc = 2;
if ($debug>2)
debugFunction ($lbs_name, 0, __FUNCTION__. "RC=$rc");
return $rc;
}
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
global $id;
sql_connect();
set_error_handler("exception_error_handler", E_ALL);
if ($E=getLogicEingangDataAll($id)) {
$api = $E[2]['value'];
$lon = $E[3]['value'];
$lat = $E[4]['value'];
$lang = $E[5]['value'];
$units = $E[6]['value'];
$period = $E[7]['value'];
$periodHourlyforecast = $E[8]['value'];
$dateformat = $E[9]['value'];
$timeformat = $E[10]['value'];
$cache = $E[11]['value'];
$delimiter= $E[12]['value'];
$debug = $E[13]['value'];
}
$cachefile="/tmp/EDOMI_" . logic_getVar($id, 2) . ".json";
$lbs_name = logic_getVar($id, 2) . " - " . logic_getVar($id, 3);
$error="";
$errorNo=41;
if ($debug>0)
debugFunction ($lbs_name, 0, __FUNCTION__. "openweather Exec -> gestartet");
if (!file_exists($cachefile) || (time() - filemtime($cachefile))>$cache) {
$url = "https://api.openweathermap.org/data/2.5/weather?lon=$lon&lat=$lat&units=$units&lang=$lang&appid=$api";
$cached=0;
$lastUpdate=time();
if ($debug>0)
debugFunction ($lbs_name, 0, "File $cachefile not existing or to old, fetching data...");
}
else {
$url = $cachefile;
$lastUpdate=filemtime($cachefile);
$cached=1;
if ($debug>0) debugFunction ($lbs_name, 0, "File $cachefile exists and is not expired, fetching data from file...");
}
try {
$opts = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);
$context = stream_context_create($opts);
if ($json = file_get_contents($url, false, $context)) {
$data = json_decode($json, true);
if (json_last_error() == JSON_ERROR_NONE) {
$datum="";
$sunrise="";
$sunset="";
$tempCurr="";
$FtempCurr="";
$tempDay="";
$tempMax="";
$tempMin="";
$tempNight="";
$tempEvening="";
$tempMorning="";
$FtempDay="";
$FtempNight="";
$FtempEvening="";
$FtempMorning="";
$humidity="";
$pressure="";
$dewpoint="";
$windspeed="";
$windgust="";
$winddirection="";
$winddirectiont="";
$clouds="";
$pop="";
$uvi="";
$visibility="";
$rain="";
$snow="";
$weatherId="";
$weatherIdFont="";
$weatherMain="";
$weatherDesc="";
$weatherIcon="";
$sender_name = "";
$event="";
$start = "";
$end = "";
$description = "";
try {
if($period == "current") {
if ($dateformat == "")
$datum = $data["dt"];
else
$datum = strftime( $dateformat, $data["dt"]);
if ($timeformat == "") {
$sunrise = $data["sys"]["sunrise"];
$sunset = $data["sys"]["sunset"];
}
else {
$sunrise = strftime( $timeformat, $data["sys"]["sunrise"]);
$sunset = strftime( $timeformat, $data["sys"]["sunset"]);
}
$tempCurr = $data["main"]["temp"];
$FtempCurr = $data["main"]["feels_like"];
$pressure = number_format($data["main"]["pressure"] , 0, "." , "");
$humidity = $data["main"]["humidity"];
$visibility = $data["visibility"];
$windspeed = $data["wind"]["speed"];
$winddirection = number_format($data["wind"]["deg"],0);
$winddirectiont = deg2txt($data["wind"]["deg"]);
$windgust = $data["wind"]["gust"];
$clouds = $data["clouds"]["all"];
$weatherId = $data["weather"]["0"]["id"];
$weatherIdFont = dechex($weatherId + 60000);
$weatherMain = $data["weather"]["0"]["main"];
$weatherDesc = $data["weather"]["0"]["description"];
$weatherIcon = $data["weather"]["0"]["icon"];
}
}
catch (exception $e) {
debugFunction("$lbs_name", 0, "Error: Unvalid period $period");
setLogicLinkAusgang($id, $errorNo, "Error: Unvalid period $period");
}
setLogicLinkAusgang($id, 1, strftime( "%d.%m.%Y %H:%M", $lastUpdate));
if ($period != "alerts") {
setLogicLinkAusgang($id, 2, rtrim($datum, $delimiter));
setLogicLinkAusgang($id, 3, rtrim($sunrise, $delimiter));
setLogicLinkAusgang($id, 4, rtrim($sunset, $delimiter));
setLogicLinkAusgang($id, 5, $tempCurr);
setLogicLinkAusgang($id, 6, rtrim($tempDay, $delimiter));
setLogicLinkAusgang($id, 7, rtrim($tempMax, $delimiter));
setLogicLinkAusgang($id, 8, rtrim($tempMin, $delimiter));
setLogicLinkAusgang($id, 9, rtrim($tempNight, $delimiter));
setLogicLinkAusgang($id, 10, rtrim($tempMorning, $delimiter));
setLogicLinkAusgang($id, 11, rtrim($tempEvening, $delimiter));
setLogicLinkAusgang($id, 12, $FtempCurr);
setLogicLinkAusgang($id, 13, rtrim($FtempDay, $delimiter));
setLogicLinkAusgang($id, 14, rtrim($FtempNight, $delimiter));
setLogicLinkAusgang($id, 15, rtrim($FtempMorning, $delimiter));
setLogicLinkAusgang($id, 16, rtrim($FtempEvening, $delimiter));
setLogicLinkAusgang($id, 17, rtrim($humidity, $delimiter));
setLogicLinkAusgang($id, 18, rtrim($pressure, $delimiter));
setLogicLinkAusgang($id, 19, rtrim($dewpoint, $delimiter));
setLogicLinkAusgang($id, 20, rtrim($windspeed, $delimiter));
setLogicLinkAusgang($id, 21, rtrim($winddirection), $delimiter);
setLogicLinkAusgang($id, 22, rtrim($winddirectiont, $delimiter));
setLogicLinkAusgang($id, 23, rtrim($windgust, $delimiter));
setLogicLinkAusgang($id, 24, rtrim($clouds, $delimiter));
setLogicLinkAusgang($id, 25, rtrim($pop, $delimiter));
setLogicLinkAusgang($id, 26, rtrim($rain, $delimiter));
setLogicLinkAusgang($id, 27, rtrim($snow, $delimiter));
setLogicLinkAusgang($id, 28, rtrim($uvi, $delimiter));
setLogicLinkAusgang($id, 29, rtrim($visibility, $delimiter));
setLogicLinkAusgang($id, 30, rtrim($weatherId, $delimiter));
setLogicLinkAusgang($id, 31, rtrim($weatherMain, $delimiter));
setLogicLinkAusgang($id, 32, rtrim($weatherDesc, $delimiter));
setLogicLinkAusgang($id, 33, rtrim($weatherIcon, $delimiter));
setLogicLinkAusgang($id, 34, rtrim($weatherIdFont, $delimiter));
}
setLogicLinkAusgang($id, 35, rtrim($sender_name, $delimiter));
setLogicLinkAusgang($id, 36, rtrim($event, $delimiter));
setLogicLinkAusgang($id, 37, rtrim($start, $delimiter));
setLogicLinkAusgang($id, 38, rtrim($end, $delimiter));
setLogicLinkAusgang($id, 39, rtrim($description, $delimiter));
setLogicLinkAusgang($id, 40, json_encode($data));
setLogicLinkAusgang($id, $errorNo, $error);
if (!$cached) {
$fp=fopen($cachefile,"w");
fwrite($fp,$json);
fclose($fp);
}
}
else {
debugFunction("$lbs_name", 0, "Error reading JSON: " . json_last_error());
setLogicLinkAusgang($id, $errorNo, "Error reading JSON: " . json_last_error());
}
}
}
catch (exception $e) {
debugFunction("$lbs_name", 0, "Error fetching $url: $e");
}
setLogicElementStatus($id,0);
sql_disconnect();
?>
###[/EXEC]###



Kommentar