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
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.
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í.