Ankündigung

Einklappen
Keine Ankündigung bisher.

DWD Wettervorhersage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    sorry habe ich überlesen!
    Gruß Hartwig

    Kommentar


      Zitat von MrIcemanLE Beitrag anzeigen
      Wahrscheinlich 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.
      Ich bekomme immer noch den Fehler "Array to string conversion" . Die Sache mit der Zip Erweiterung war mir bekannt, ich habe sie trotzdem noch mal ausgeführt. Jedoch ohne erfolg. Welche Lib könnte denn noch fehlen? Wie schon geschrieben. Der Server ist komplett neu auf einem jungfreulichen CentOs 7 augesetzt worden.
      Danke
      Gruß Christian

      Kommentar


        Zitat von Fireflash Beitrag anzeigen
        Fehlercode: 8 | Zeile: 272 | Array to string conversion ERROR
        Was kann das sein? Habe ich etwas vergesse noch zu installieren?
        Das ist garnicht so leicht zu finden. Hier wäre die Frage an gaert , welche Zeile hier ausgegeben wird. Bezogen auf den gesamten LBS wäre diese Zeile:
        PHP-Code:
        ${$key}[$day] = $v
        Bezogen auf den EXEC-Teil des LBS ist Zeile 272 mitten in dieser Arraydefinition:
        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'); 
        Sehe jetzt auf den ersten Blick nicht, woran das hier also liegen könnte. Im ersten Fall wäre eine mögliche Ursache, dass $day kein String sondern ein Array ist, was unwahrscheinlich ist, da die Variable zuvor mit dem Datum als String belegt wird.

        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 anzeigen
            Hier wäre die Frage an gaert , welche Zeile hier ausgegeben wird
            Der Fehler bezieht sich immer auf die Zeile des entsprechenden PHP-Skripts, in diesem Fall auf den Beginn des EXEC Skripts.
            Mitten in einer Array Definition wäre der Fehler tatsächlich ungewöhnlich. Verwendet ihr beide dieselbe Version?
            Am besten wäre, wenn Fireflash 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


              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($cache0777))
              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($chCURLOPT_TIMEOUT180);
              curl_setopt($chCURLOPT_RETURNTRANSFER1);
              curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
              curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
              curl_setopt($chCURLOPT_BINARYTRANSFER1);
              curl_setopt($chCURLOPT_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($chCURLINFO_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($jsonTRUE);

              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($id1), $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($id1implode("|"$userFormat));
              logic_setOutput($id2implode("|"$weekday));
              logic_setOutput($id3implode("|"$timestamps));
              logic_setOutput($id4implode("|"$data));
              logic_setOutput($id5implode("|"$hour));
              }
              }

              finish();


              function 
              getRemoteTimestamp($fileurl) {
              global 
              $id;
              $curl curl_init($fileurl);

              //don't fetch the actual page, you only want headers
              curl_setopt($curlCURLOPT_NOBODY1);
              curl_setopt($curlCURLOPT_HEADER);

              //stop it from outputting stuff to stdout
              curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
              curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
              curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);

              // attempt to retrieve the modification date
              curl_setopt($curlCURLOPT_FILETIMEtrue);

              $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($id103);
              if (
              is_int($priority) && $priority <= $logLevel && $priority 0) {
              $logLevelNames = array('none''emerg''alert''crit''err''warning''notice''info''debug');
              $version getLogicElementVar($id100);
              $lbsNo getLogicElementVar($id101);
              $logName getLogicElementVar($id102) . ' --- LBS' $lbsNo;
              strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname 'EXE' $lbsNo $scriptname 'LBS' $lbsNo;
              writeToCustomLog($logNamestr_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($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t================ ARRAY/OBJECT START ================");
              foreach (
              $var as $index => $line)
              writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t" $index " => " $line);
              writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t================ ARRAY/OBJECT END ================");
              }
              }
              }

              function 
              finish() {
              global 
              $id;
              debug($id"Baustein beendet");
              sql_disconnect();
              }
              ?>
              ###[/EXEC]###
              Danke
              Gruß Christian

              Kommentar


                Zitat von DJFalk Beitrag anzeigen
                Offensichtlich tut der DWD LBS seinen Dienst, die Ausgangsbox scheinbar nur nicht. Woran kann das liegen ?
                Das ist (mal wieder) der PHP-Vergleich mit "0". https://www.php.net/manual/de/langua...comparison.php
                PHP-Code:
                var_dump(== "a"); // 0 == 0 -> true 
                Demnach solltest du die Ausgangsbox "nicht leer" benutzen.
                Zuletzt geändert von MrIcemanLE; 30.04.2020, 10:47.
                Gruß
                Stefan

                Kommentar


                  Habs geändert, und gleich geht es auch. Danke für den Tip

                  Kommentar


                    Fireflash 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($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t" $index " => " $line); 
                    Edit: Könntest du $line mal testweise durch print_r($line,true) ersetzen? Damit sollte der Fehler erstmal behoben sein. Sollte das so sein, wäre mal interessant, was dann im Log-File landet. Das müssten dann ja Informationen über das Array im Array sein. Vielleicht kannst du den Auszug dann auch mal posten?
                    Zuletzt geändert von MrIcemanLE; 30.04.2020, 10:52.
                    Gruß
                    Stefan

                    Kommentar


                      Fireflash MrIcemanLE : Ich denke es liegt an dem Aufruf:

                      PHP-Code:
                      debug($id"Messgröße $key nicht gefunden",1,$json); 
                      Wenn $json ein Array ist, welches wiederum Arrays enthält, dann entsteht der Fehler in der Debug Funktion bei der Ausgabe:

                      PHP-Code:
                      writeToCustomLog($logNamestr_pad($logLevelNames[$logLevel], 7), $scriptname " [v$version]:\t" $index " => " $line); 
                      da hier $line ein Array ist. Man könnte stattdessen ein

                      PHP-Code:
                      debug($id"Messgröße $key nicht gefunden",1,json_encode($json)); 
                      verwenden.

                      Kommentar


                        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.
                        Danke
                        Gruß Christian

                        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 anzeigen
                            Mal 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:
                            Zeitraum
                            Max 8 Uhr (Vorhersagetag) bis 8 Uhr (Folgetag)
                            Min 20Uhr (Vortag) bis 20 Uhr (Vorhersagetag)
                            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.

                            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?
                            Hi MrIceman,

                            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.
                              Genau das wollte ich nicht unbedingt machen, da das Maximum Tx meist noch Teams höher als die Stundenwerte ist. Gleiches gilt fürs Minimum.

                              Min.Wert: 20 Uhr (Vortag) bis 8 Uhr
                              Max. Wert: 8 Uhr bis 20 Uhr.
                              In der Tat könnte man das auch so machen 🤔. Mir fällt immer bei starken Kaltfronten auf, dass diese Annahmen immer etwas wackelig sind. Da kann es mal schnell sein, dass der Wert aus der Nacht oder von 20Uhr (Vortag) höher ist als das Max von 8 bis 20 Uhr des aktuellen Tages.

                              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

                              Lädt...
                              X