Martin JS Programování Mosaic 23. 2. 2022 0:34 8. 3. 2022 21:48

Knihovní funkce fbYrWeather přestala pracovat, protože došlo ke změně na serveru (viz připojený text z webu).

Budete provádět změnu této knihovny?

Bezplatná služba dat o počasí od Yr

Změny ve službě od 1. února 2022

Od 1. února 2022 jsou forecast.xml a většina starých widgetů ukončeny. Bezplatná data o počasí lze místo toho stáhnout přímo z Meteorologického ústavu, ale budou vyžadovat přepsání, protože jsou v jiném formátu než stará předpověď.xml z Yr.

Většina našich widgetů zmizí, ale vytvořili jsme náhradu za stažený meteogram ve formátu svg.

Přečtěte si více o všech změnách na našem vývojářském portálu

Odpovědi 2

Luboš Urban 1. 3. 2022 12:55

Aktuálně s přepracováním funkčního bloku fbYrWeather nepočítáme. Aktivní nadále zůstává stahování předpovědi počasí přes fbOpenWeatherOrg.

Kulhana 8. 3. 2022 21:48

Věnoval jsem tomu sám několik večerů a dní a mohu nabídnout kód. Principiálně to není nic složitého - načtení JSONu. Ta hlavní část kód je přiložena dole.

Nastavení ETH1_uni1 mám takto

host            : STRING[255] := 'https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=50.22653&lon=14.58552'; - to je příklad dotazu např. pro Kostelec nad Labem. Když si to dáte do prohlížeče, tak uvidíte, jaký JSON to produkuje a v nějakém nástroji na JSONy pak můžete zkoumat strukturu a parsovat si další parametry...

Kdyžtak pošlu kód celý i s deklaracemi, ale nechci to tady vytapetovat stovkami řádek kódu.

   REPEAT // HTTP čtení parametrů
   JsonPageParserW(
            exec := postniTo,
            chancode := ETH1_uni1,
            pagename := host,
            JsonInfo := JSON);

      IF JsonPageParserW.done  THEN     // vyparsovan jeden radek
         arrayIndexString := MID(JSON.stack.item[3].name,2,2);
         arrayIndex       := STRING_TO_INT(arrayIndexString)+1;

         IF JSON.stack.item[1].name = 'properties' THEN
            IF JSON.stack.item[2].name = 'meta' AND JSON.stack.item[3].name = 'updated_at' THEN
               weatherUpdated := JSON.item.value;
            END_IF;

            IF JSON.stack.item[2].name = 'timeseries' AND arrayIndex > 0 AND arrayIndex < 90 THEN
               IF JSON.stack.item[4].name = 'time' THEN   //načtení času položky
                  recDateString                     := MID(JSON.item.value,10,1);
                  recDateString                     := CONCAT('D#',recDateString); // nutno doplnit D#, aby fungoval převod
                  yrWeatherData[arrayIndex].recDate := STRING_TO_DATE(recDateString);
                  recTimeString                     := MID(JSON.item.value,8,12);
                  recTimeString                     := CONCAT('T#',recTimeString); // nutno doplnit T#, aby fungoval převod
                  recTime                           := STRING_TO_TIME(recTimeString);
                  yrWeatherData[arrayIndex].recTime := ADD_TIME(recTime, LREAL_TO_TIME(timeOffset*3600000));
                  IF yrWeatherData[arrayIndex].recTime >= T#24:00:00 THEN
                     yrWeatherData[arrayIndex].recTime := yrWeatherData[arrayIndex].recTime - T#24:00:00;
                     yrWeatherData[arrayIndex].recDate := DATE_AND_TIME_TO_DATE(ADD_DT_TIME(DATE_TO_DATE_AND_TIME(yrWeatherData[arrayIndex].recDate), T#1d));
                  END_IF;
               END_IF;

               IF JSON.stack.item[5].name = 'instant' THEN   //načtení hodnot uložených v instant hodnotách pro hodinu
                  IF JSON.stack.item[7].name = 'air_temperature'           THEN yrWeatherData[arrayIndex].airTemp := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'wind_speed'                THEN yrWeatherData[arrayIndex].windSpeed := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'air_pressure_at_sea_level' THEN yrWeatherData[arrayIndex].airPressure := JSON.item.value; END_IF;
               END_IF;

               IF JSON.stack.item[5].name = 'next_1_hours'THEN   //načtení hodnot uložených v souhrnu pro celou hodinu
                  IF JSON.stack.item[7].name = 'precipitation_amount' THEN yrWeatherData[arrayIndex].N1precAmount := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'symbol_code'          THEN yrWeatherData[arrayIndex].N1symbolCode := JSON.item.value; END_IF;
               END_IF;
               IF JSON.stack.item[5].name = 'next_6_hours' THEN   //načtení hodnot uložených v souhrnu pro 6 následujících hodin
                  IF JSON.stack.item[7].name = 'symbol_code'          THEN yrWeatherData[arrayIndex].N6symbolCode := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'air_temperature_max'  THEN yrWeatherData[arrayIndex].N6airTempMax := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'air_temperature_min'  THEN yrWeatherData[arrayIndex].N6airTempMin := JSON.item.value; END_IF;
                  IF JSON.stack.item[7].name = 'precipitation_amount' THEN yrWeatherData[arrayIndex].N6precAmount := JSON.item.value; END_IF;
               END_IF;
            END_IF;
         END_IF;
      END_IF;
   UNTIL JsonPageParserW.break END_REPEAT;

Vaše odpověď

Pro vložení odpovědi je nezbytné být přihlášený. Pokračujte na přihlášení.