sorry habe ich überlesen!
Ankündigung
Einklappen
Keine Ankündigung bisher.
DWD Wettervorhersage
Einklappen
X
-
Gast
Zitat von MrIcemanLE Beitrag anzeigenWahrscheinlich fehlt auch dir die Zip-Erweiterung bei PHP. Wenn die Datei nicht entpackt werden kann, findet der LBS danach die kml-Datei nicht. Zur Sicherheit kannst du mal bitte einen Level-8-Log-Auszug posten.
Kommentar
-
Zitat von Fireflash Beitrag anzeigenWas kann das sein? Habe ich etwas vergesse noch zu installieren?Fehlercode: 8 | Zeile: 272 | Array to string conversion ERROR
PHP-Code:${$key}[$day] = $v;
PHP-Code:$desc = array(
'95' => 'leichtes oder mäßiges Gewitter mit Regen oder Schnee',
'57' => 'mäßiger oder starker gefrierender Sprühregen',
'56' => 'leichter gefrierender Sprühregen',
'67' => 'mäßiger bis starker gefrierender Regen',
'66' => 'leichter gefrierender Regen',
'86' => 'mäßiger bis starker Schneeschauer',
'85' => 'leichter Schneeschauer',
'84' => 'mäßiger oder starker Schneeregenschauer',
'83' => 'leichter Schneeregenschauer',
'82' => 'äußerst heftiger Regenschauer',
'81' => 'mäßiger oder starker Regenschauer',
'80' => 'leichter Regenschauer',
'75' => 'durchgehend starker Schneefall',
'73' => 'durchgehend mäßiger Schneefall',
'71' => 'durchgehend leichter Schneefall',
'69' => 'mäßger oder starker Schneeregen',
'68' => 'leichter Schneeregen',
'55' => 'durchgehend starker Sprühregen',
'53' => 'durchgehend mäßiger Sprühregen',
'51' => 'durchgehend leichter Sprühregen',
'65' => 'durchgehend starker Regen',
'63' => 'durchgehend mäßiger Regen',
'61' => 'durchgehend leichter Regen',
'49' => 'Nebel mit Reifansatz, Himmel nicht erkennbar, unverändert',
'45' => 'Nebel, Himmel nicht erkennbar',
'03' => 'Effektive Wolkendecke mindestens 7/8',
'02' => 'Effektive Wolkendecke zwischen 4.6/8 und 6/8',
'01' => 'Effektive Wolkendecke zwischen 1/8 und 4.5/8',
'00' => 'Effektive Wolkendecke weniger als 1/8');
Ist für mich nur schwer nachzuvollziehen, da ich nicht unter CentOS7 und PHP7 arbeite. Möglicherweise hat sich hier bei PHP noch etwas geändert, dass ich gerade nicht erkenne. Hat noch jemand unter CentOS7 das Problem?
Gruß
Stefan
Kommentar
-
Hallo zusammen,
ich habe mit meiner DWD Logik noch ein anderes Problem, weiß aber nicht woran es liegt.
Offensichtlich tut der DWD LBS seinen Dienst, die Ausgangsbox scheinbar nur nicht. Woran kann das liegen ?
Unbenannt.png
Kommentar
-
Zitat von MrIcemanLE Beitrag anzeigenHier wäre die Frage an gaert , welche Zeile hier ausgegeben wird
Mitten in einer Array Definition wäre der Fehler tatsächlich ungewöhnlich. Verwendet ihr beide dieselbe Version?
Am besten wäre, wenn Gast mal das EXEC Skript hier posten würde, dann kann man sicher sein, dass man von denselben Sourcen ausgeht.
EDIT: Außerdem wäre es sinnvoll mal den kompletten Eintrag aus dem Errolog zu posten. Oben sieht man nur die letzten beiden Spalten. Man kann so gar nicht sehen, ob der Fehler wirklich von diesem LBS kommt.
Es ist übrigens ein typischer Fehler, wenn man versucht mit logic_setOutput ein Array auf einen Ausgang zu schreiben.Zuletzt geändert von jonofe; 30.04.2020, 10:13.
Kommentar
-
Gast
2020-04-30 11:00:02 506810 ? 27524 Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19000939.php | Fehlercode: 8 | Zeile: 272 | Array to string conversion ERROR 2020-04-30 11:00:02 507379 ? 27524 Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19000939.php | Fehlercode: 8 | Zeile: 272 | Array to string conversion ERROR
PHP-Code:###[EXEC]###
<?php
require(dirname(__FILE__) . "/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(300);
sql_connect();
setlocale(LC_TIME, "de_DE.utf8");
if ($E = logic_getInputs($id)) {
$DEBUG = $E[10]['value'];
$stationId = $E[2]['value'];
debug($id, "Baustein startet");
$url = "https://opendata.dwd.de/weather/local_forecasts/mos/MOSMIX_L/single_stations/$stationId/kml/MOSMIX_L_LATEST_$stationId.kmz";
$cache = sys_get_temp_dir() . "/EDOMI_LBSLBSID_MOSMIX_L_LATEST_$stationId.kmz";
$cacheUnzipped = sys_get_temp_dir() . "/EDOMI_LBSLBSID_MOSMIX_L_LATEST_$stationId.kml";
$xslFile = '/usr/local/edomi/main/dwd/mos-json-complete.xsl';
if (!file_exists($xslFile))
{
debug($id, "XSL-Datei existiert nicht: '$xslFile'", 1);
finish();
}
$V = logic_getVars($id);
if (file_exists($cache))
debug($id, "Timestamp temporäre Datei: ".filemtime($cache), 5);
if (!file_exists($cache) || (getRemoteTimestamp($url) > filemtime($cache))) {
debug($id, "Lokale Datei zu alt oder nicht vorhanden, fetche von URL '$url'", 5);
if (file_exists($cache)) unlink($cache);
if (file_exists($cacheUnzipped)) unlink($cacheUnzipped);
//Open file handler.
$fp = fopen($cache, 'w+');
//If $fp is FALSE, something went wrong.
if ($fp === false) {
debug($id, "Kann temporäre datei nicht erzeugen oder öffnen. --> Abbruch", 0);
finish();
}
if (chmod($cache, 0777))
debug($id, "Rechte erfolgreich geändert", 6);
else
debug($id, "Rechte konnten nicht geändert werden", 6);
//Create a cURL handle.
$ch = curl_init($url);
//Timeout if the file doesn't download after 180 seconds.
curl_setopt($ch, CURLOPT_TIMEOUT, 180);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $fp);
if (curl_exec($ch) === FALSE || !isEmpty(curl_error($ch))) {
debug($id, "Fehler beim Datenempfang: " . curl_error($ch) . " --> Abbruch", 1);
curl_close($ch);
fclose($fp);
finish();
}
//Get the HTTP status code.
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//Close the cURL handler.
curl_close($ch);
fclose($fp);
if (isEmpty($statusCode) || (int)$statusCode == 200) {
debug($id, "Download erfolgreich");
} else {
debug($id, "Fehler beim Datenempfang, Http-Statuscode: " . $statusCode . " --> (Abbruch)", 1);
}
$zip = new ZipArchive;
$res = $zip->open($cache);
if ($res === TRUE) {
$zip->renameIndex(0, "EDOMI_LBSLBSID_MOSMIX_L_LATEST_$stationId.kml ");
$zip->extractTo(sys_get_temp_dir(), "EDOMI_LBSLBSID_MOSMIX_L_LATEST_$stationId.kml ");
$zip->close();
}
if (file_exists($cacheUnzipped)) {
debug($id, "Unzip erfolgreich", 6);
} else {
debug($id, "Unzip fehlgeschlagen, Abbruch", 1);
finish();
}
} else {
debug($id, "Nutze lokalen Cache $cache", 5);
}
$xslDoc = new DOMDocument();
$xslDoc->load($xslFile);
$xmlDoc = new DOMDocument();
$xmlDoc->load($cacheUnzipped);
$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
$proc->setParameter('', 'station', $stationId);
$proc->setParameter('', 'title', '');
$proc->setParameter('', 'titleShort', '');
$json = $proc->transformToXML($xmlDoc);
debug($id, "Länge des JSON-Strings: " . strlen($json));
$json = json_decode($json, TRUE);
debug($id, "Länge des JSON-Arrays: " . count($json));
$timestamps = array();
$weekday = array();
$userFormat = array();
$data = array();
$hour = array();
$key = trim($E[4]['value']);
debug($id, "Verarbeite " . $E[4]['value']);
if (!is_array($json) || !array_key_exists('station', $json) || !array_key_exists($key, $json['station'])){
debug($id, "Messgröße $key nicht gefunden",1,$json);
}
else
{
debug($id, "Verarbeite " . count($json['timeSteps']) . " Zeitschritte");
for ($j = 0; $j < count($json['timeSteps']); $j++) {
//create dateTime object
$Date = new DateTime($json['timeSteps'][$j],new DateTimeZone('Europe/Amsterdam'));
//DateTime-Object to Unix-Timestamp
$t = $Date->getTimestamp();
//DateTime-Object to Std-Format
$day = $Date->format("Y-m-d");
$timestamps[$day] = $t;
$weekday[$day] = strftime("%a", $t);
$userFormat[$day] = strftime(getLogicElementVar($id, 1), $t-date('Z'));
if (is_numeric(trim($E[5]['value']))){
if((int)$Date->format("H") == (int)trim($E[5]['value'])){
$data[$day] = $json['station'][$key][$j];
$hour[$day] = (int)$Date->format("H");
}
}
else{
if (trim($json['station'][$key][$j]) == "-") continue;
$v = floatval($json['station'][$key][$j]);
switch (strtolower(trim($E[5]['value']))) {
case "max":
if(!array_key_exists($day,$data)){
$data[$day] = $v;
$hour[$day] = (int)$Date->format("H");
}
else{
if ($v>$data[$day]){
$data[$day] = $v;
$hour[$day] = (int)$Date->format("H");
}
}
break;
case "min":
if(!array_key_exists($day,$data)){
$data[$day] = $v;
$hour[$day] = (int)$Date->format("H");
}
else{
if ($v<$data[$day]){
$data[$day] = $v;
$hour[$day] = (int)$Date->format("H");
}
}
break;
case "sum":
if(array_key_exists($day,$data))
$data[$day] += $v;
else
$data[$day] = $v;
break;
default:
$data[$day] = $v;
break;
}
}
}
debug($id, "Beschreibe Ausgänge");
logic_setOutput($id, 1, implode("|", $userFormat));
logic_setOutput($id, 2, implode("|", $weekday));
logic_setOutput($id, 3, implode("|", $timestamps));
logic_setOutput($id, 4, implode("|", $data));
logic_setOutput($id, 5, implode("|", $hour));
}
}
finish();
function getRemoteTimestamp($fileurl) {
global $id;
$curl = curl_init($fileurl);
//don't fetch the actual page, you only want headers
curl_setopt($curl, CURLOPT_NOBODY, 1);
curl_setopt($curl, CURLOPT_HEADER, 1 );
//stop it from outputting stuff to stdout
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// attempt to retrieve the modification date
curl_setopt($curl, CURLOPT_FILETIME, true);
$result = curl_exec($curl);
if ($result === false) {
debug($id, "CURL-Error: ".curl_error($curl), 3);
return curl_error($curl);
}
// Separate the header into it's individual lines
$headers = explode( "\n" , $result );
debug($id, "Headers:", 6, $headers);
// Extract the last modified date from the headers
$last_modified = explode( ': ' , $headers[5] );
$last_modified[1] = preg_replace( "/\r|\n/", "", $last_modified[1] );
debug($id, "Last modification: ".$last_modified[1], 6);
// Return the data in the required format
debug($id, "Timestamp remote DWD-Datei: ".strtotime( $last_modified[1] ),5);
return strtotime( $last_modified[1] );
}
function debug($id, $msg, $priority = 8, $var = NULL) {
$E = getLogicEingangDataAll($id);
$logLevel = getLogicElementVar($id, 103);
if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
$logLevelNames = array('none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug');
$version = getLogicElementVar($id, 100);
$lbsNo = getLogicElementVar($id, 101);
$logName = getLogicElementVar($id, 102) . ' --- LBS' . $lbsNo;
strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
if (is_object($var))
$var = get_object_vars($var);
// transfer object into array
if (is_array($var)) {// print out array
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
foreach ($var as $index => $line)
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $index . " => " . $line);
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================");
}
}
}
function finish() {
global $id;
debug($id, "Baustein beendet");
sql_disconnect();
}
?>
###[/EXEC]###
Kommentar
-
Zitat von DJFalk Beitrag anzeigenOffensichtlich tut der DWD LBS seinen Dienst, die Ausgangsbox scheinbar nur nicht. Woran kann das liegen ?
PHP-Code:var_dump(0 == "a"); // 0 == 0 -> true
Zuletzt geändert von MrIcemanLE; 30.04.2020, 10:47.Gruß
Stefan
Kommentar
-
Gast So ist der Fehler fast direkt zu sehen. Er entsteht bei der Erstellung eines Logeintrages. Anscheined ist hier die Ausgabe ein array un kein string.
PHP-Code:writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $index . " => " . $line);
Zuletzt geändert von MrIcemanLE; 30.04.2020, 10:52.Gruß
Stefan
Kommentar
-
Gast MrIcemanLE : Ich denke es liegt an dem Aufruf:
PHP-Code:debug($id, "Messgröße $key nicht gefunden",1,$json);
PHP-Code:writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $index . " => " . $line);
PHP-Code:debug($id, "Messgröße $key nicht gefunden",1,json_encode($json));
Kommentar
-
Gast
jonofe : Ja jetzt klappt es, die Ausgabe im Debug ist jetzt richtig. Mein eigentlicher Fehler war ein Typo in E4, ich hatte Tx anstatt TX geschrieben.
MrIcemanLE : Kannst du die Zeile in den Code für die nächste Version mit aufnehmen?
Danke für Euere Hilfe.
Kommentar
-
Da die kommerziellen Wetterdienste ihre APIs schließen, beschäftige ich mich gerade auch mit den DWD-MOSMIX-Werten für eine Beregnungsfunktion (rufe die Werte allerdings mit Node Red ab). Leider ist die Dokumentation der Parameter durch den DWD schwach.
Z.B. erhalte ich für den Parameter RR1c („total precipitation during the last hour“) regelmäßig Werte. Für RRdc („total precipitation during the last 24h“) erhalte ich nur zwischen 7 und 8 Uhr einen Wert. Darauf muss man erstmal kommen!
Meine Frage: Was bedeutet der Wert RRdc überhaupt? Ich vermute die Regenmenge der 24h vor der Abrufzeit (also 7 bis 7 Uhr)? Das haut aber nicht hin, denn die Summe der stündlichen RR1c-Werte von 7 bis 7 Uhr ist völlig anders als der RRdc-Wert.
Und die Niederschlagsprognose: auf welchen Zeitraum bezieht die sich eigentlich? Rest des Tages? Oder die nächsten 24h?
Für etwas Aufklärung wäre ich sehr dankbar.
Kommentar
-
Zitat von MrIcemanLE Beitrag anzeigenMal eine Frage an die DWD-Runde. Die Verhersage der Maximal- und Minimaltemperaturen werden vom DWD im 12h Rhythmus ausgegeben. Die Tabelle enthält also für 8Uhr einen Max und einen Min-Wert, welcher für die vergangenen 12h gilt. Und dann nochmal 20Uhr (wieder für die vergangenen 12h) usw.
Wenn wir jetzt genau einen Max-Wert und einen Min-Wert pro Tag wollen, müsste man diese Werte irgendwie vergleichen und entscheiden, was man ausgibt.
Da sich bei den meisten Anwendungen einer Vorhersage der Begriff "Tag" auf die Zeit ab dem Morgen bezieht, würde ich die Werte wie folgt berechnen:Nimmt man das Max dagegen von 20Uhr (Vortag) bis 20 Uhr (Vorhersagetag) und es zieht in der Nacht eine Kaltfront durch, kann dies dazu führen, dass ich als Tageshöchstwert für den Vorhersagetag die Temp vom Vorabend angezeigt bekomme.Zeitraum Max 8 Uhr (Vorhersagetag) bis 8 Uhr (Folgetag) Min 20Uhr (Vortag) bis 20 Uhr (Vorhersagetag)
Nimmt man das Min von 8 Uhr (Vorhersagetag) bis 8 Uhr (Folgetag), sehe ich am Abend möglicherweise den Nachtfrost nicht, der für die kommende Nacht bzw. den kommenden Morgen erwartet wird.
Alternative:
Ich neheme alle Stundenwerte von 0 bis 23Uhr und suche das Min und das Max. Damit wäre die Trennung der Vorhersage um Mitternacht.
Wie ist eure Meinung dazu?
ich würde es so machen, wie man es aus den Nachrichten kennt. Dort wird Nacht und Tag getrennt. Nachts werden dann immer die Min. Werte genannt und tagsüber die Max. Werte. Dies würde für die Extremwerte bedeuten:
Min.Wert: 20 Uhr (Vortag) bis 8 Uhr
Max. Wert: 8 Uhr bis 20 Uhr
alternativ kannst du natürlich die Stundenwerte der beiden Zeiträume nach Min bzw. Max Wert durchsuchen.
Grüße
Alex
Kommentar
-
alternativ kannst du natürlich die Stundenwerte der beiden Zeiträume nach Min bzw. Max Wert durchsuchen.
Min.Wert: 20 Uhr (Vortag) bis 8 Uhr
Max. Wert: 8 Uhr bis 20 Uhr.
Ich werde nach meinem Urlaub mal ein Update veröffentlichen, das ein paar Änderungen bzgl. dieser Werte enthält. Auch die Wochentage sollten dann endlich passen.Gruß
Stefan
Kommentar
Kommentar