03.04.2019, 19:58 
		
	
	Code:
require('socket.http')
------------------------------------------------------------------------------------------------------------------------------
--
-- Weather forecast from Yr, delivered by the Norwegian Meteorological Institute and the NRK
-- 
-- This is a combo of the codes contributions from the Admin, Thomas, and me MichelDeLigne
--
-- Usage:
-- * Define your place in the variable url in the function yrno_fetch()
--
-- * Ending the url with "forecast_hour_by_hour.xml" will give access to the predictions for a city for the next 48 hours, per hour
-- * Ending the url with "forecast.xml" will give predictions for 9 days, per 6 hours slices.
-- Search for your location in https://www.yr.no/
-- When found, add forecast.xml or forecast_hour_by_hour.xml to the url
-- 
-- Don't run the script more that once per hour, or 4 times a day for the 6h forecast. Yr.no web admins will certainly thank you for that.
-- (no they won't, but they won't curse you for polling their servers every minutes either, which is a total waste of time/bandwidth).
-- Previsions for the next hour (or 6h if the url ends with forecast.xml) would be contained in:
-- forecast[1].symbol             "Partly cloudy"
-- forecast[1].icon                "03n" (available at https://hjelp.yr.no/hc/en-us/articles/203786121-Weather-symbols-on-Yr) 
-- forecast[1].precipitation        [mm]
-- forecast[1].wind_direction        "SSW", "E", ...
-- forecast[1].wind_speed        [m/s]
-- forecast[1].temperature        [°C]
-- forecast[1].pressure            [hPa]
-- ld_minTemp                [°C] Min temperature for the next day 
-- ld_maxTemp                [°C] Max temperature for the next day
-- lt_tomorrow                What the next day is
-- Next hour forecast would be in forecast[2].symbol
-- and so on
-------------------------------------------------------------------------------------------------------------------------------
forecast = {}
---------------------------------------------------------------
-- Functions
---------------------------------------------------------------
function parsetag(parser, tag, attributes)
  if tag == 'time' then
    table.insert(forecast, {})
    forecast[ #forecast ].from = attributes.from
  elseif tag == 'symbol' then
    forecast[ #forecast ].symbol = attributes.name 
    forecast[ #forecast ].icon = attributes.var
  elseif tag == 'precipitation' then
    forecast[ #forecast ].precipitation = attributes.value
  elseif tag == 'windDirection' then
    forecast[ #forecast ].wind_direction = attributes.code
  elseif tag == 'windSpeed' then
    forecast[ #forecast ].wind_speed = attributes.mps
  elseif tag == 'temperature' then
    forecast[ #forecast ].temperature = attributes.value
  elseif tag == 'pressure' then
    forecast[ #forecast ].pressure = attributes.value
  end
end
-------------------------------
function yrno_fetch()
  ld_minTemp=0
  ld_maxTemp=0
  next_day={}
-- local url = 'https://www.yr.no/place/Belgium/Wallonia/Marche-lez-%C3%89caussinnes/forecast.xml'
  local url = 'http://www.yr.no/place/Belgium/Wallonia/Marche-lez-%C3%89caussinnes/forecast_hour_by_hour.xml'
  
  local data, err = socket.http.request(url)
  if data then
    require('lxp').new({
      StartElement = parsetag
    }):parse(data)
    -- log(forecast)
  else
    alert('Fetch failed: ' .. tostring(err))
    return 1
  end
    
  ll_tomorrow = os.time()+24*3600 -- tomorrow as long
  lt_tomorrow = os.date("*t",ll_tomorrow) -- tomorrow as table for use if forecast_write
  --gets the date of tomorrow
  local ls_match = os.date("%Y--%m--%d",ll_tomorrow)
  for index, value in ipairs(forecast) do
    if (value.from:match("^"..ls_match)) then
      local ld_temp=tonumber(value.temperature)
      if (ld_minTemp == nil) then
        ld_minTemp=ld_temp
      end 
      if (ld_maxTemp == nil) then
        ld_maxTemp=ld_temp
      end 
      if (ld_temp<ld_minTemp or index==1) then
        ld_minTemp=ld_temp
      end
      if (ld_temp>ld_maxTemp or index==1) then
        ld_maxTemp=ld_temp
      end
    end
  end
    
  return 0
end
------------------------------------------
-- Main code
------------------------------------------
if yrno_fetch() then 
  -- write the data to the bus, or do something else with it
  -- If the fetch fails, we do nothing.
  
  --log(ld_minTemp, ld_maxTemp, lt_tomorrow, forecast[1].symbol, forecast[1].icon, forecast[1].precipitation, forecast[1].wind_direction, 
  --forecast[1].wind_speed, forecast[1].temperature, forecast[1].pressure)
  
  --grp.write('1/1/12', ld_minTemp, dt.float16)
  --grp.write('1/1/13', ld_maxTemp, dt.float16)
  --grp.write('1/1/14', lt_tomorrow, dt.date)
  
  --grp.write('1/1/15', forecast[1].symbol)
  --grp.write('1/1/16', forecast[1].icon)
  
  --grp.write('1/1/17', forecast[1].precipitation)
  --grp.write('1/1/18', forecast[1].wind_direction)
  --grp.write('1/1/19', forecast[1].wind_speed)
  --grp.write('1/1/20', forecast[1].temperature)
  --grp.write('1/1/21', forecast[1].pressure)
endHi,
Here is a small contribution from me and others (mostly others in fact).
The script fetches the weather forecast from Yr.no
I've put together some of the previous scripts, and removedsome functions and correct the error handling.
I am not a big fan of using functions only once. I find it makes the code less readable because you have to jump all over the place when you read it.
There is also a description at the beginning of the code explaining how to use it.
Cheers.
Michel
 
 

