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