This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Weather Info from API
#10
The updated version of weather script.
1.) Added possibility to read coordinates (latitude and longitude) from system.
2.) Changed data types of objects:
        a.) for humidity dt.scale
        b.) for uv_index dt.uint8
        c.) for pressure dt.uint16

Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
-- Please comment objects which you are not using, comment also grp.write() at the bottom of script --[[ -- You can set latitude and longitude in "Date time" option -- go to LogicMachine->Utilities->Date and time require('uci') latitude = uci.get('genohm-scada.core.latitude') -- read latitude from system latitude = tonumber(latitude) or 0 longitude = uci.get('genohm-scada.core.longitude') -- read longitude from system longitude = tonumber(longitude) or 0 if(latitude == 0 and longitude == 0) then -- if cooridinates were not set in the system   latitude = 51.5072 -- London   longitude = 0.1276 -- London end --]] -- you can set latitude and longitude manualy -- (if you set coordinates using "Date time" do not forget to comment these two lines latitude = 56.9496  -- Riga longitude = 24.1052 -- Riga --log('latitude = ' .. latitude) --log('longitude = ' .. longitude) --[[ status_temp = '32/1/13'           -- group address of temperature, should be float status_pressure = '32/1/14'       -- air pressure, should be float status_humidity = '32/1/15'       -- relative humidity, should be float status_wind_direction = '32/1/16' -- wind direction, should be float status_wind_speed = '32/1/17'     -- wind speed, should be float status_uv_index = '32/2/4'        -- UV index, should be float status_feelslike_temp = '32/2/3'  -- feels like temperature, should be float status_rain_today = '32/1/11'     -- today's rain object, should be boolean status_snow_today = '32/1/12'     -- today's snow object, should be boolean status_min_temp_today = '32/1/20'       -- today's minimum air temperature, float status_max_temp_today = '32/1/21'       -- today's maximum air temperature, float status_min_pressure_today = '32/1/22'   -- minimum air pressure, float status_max_pressure_today = '32/1/23'   -- maximum air pressure, float status_min_wind_speed_today = '32/1/24' -- minimum wind speed, float status_max_wind_speed_today = '32/1/25' -- maximum wind speed, float status_min_uv_today = '32/2/5'          -- minimum UV today, float status_max_uv_today = '32/2/6'          -- maximum UV today, float status_rain_tomor = '32/1/9'   -- tomorrow's rain object status_snow_tomor = '32/1/10'  -- tomorrow's snow object status_min_temp_tomor = '32/1/26' status_max_temp_tomor = '32/1/27' status_min_pressure_tomor = '32/1/28' status_max_pressure_tomor = '32/1/29' status_min_wind_speed_tomor = '32/1/30' status_max_wind_speed_tomor = '32/1/31' status_min_uv_tomor = '32/2/7' status_max_uv_tomor = '32/2/8' --]] --[[]] status_temp = grp.create({ datatype = dt.float16, address = '33/1/1', name = 'current_temp',}) status_pressure = grp.create({ datatype = dt.uint16, address = '33/1/2', name = 'current_press',}) status_humidity = grp.create({ datatype = dt.scale, address = '33/1/3', name = 'current_humid',}) status_wind_direction = grp.create({ datatype = dt.float16, address = '33/1/4', name = 'current_wind_dir',}) status_wind_speed = grp.create({ datatype = dt.float16, address = '33/1/5', name = 'current_wind_sp',}) status_uv_index = grp.create({ datatype = dt.uint8, address = '33/1/6', name = 'current_uv_index',}) status_feelslike_temp = grp.create({ datatype = dt.float16, address = '33/1/7', name = 'current_feels_temp',}) status_rain_today = grp.create({ datatype = dt.bool, address = '33/1/8', name = 'rain_today',}) status_snow_today = grp.create({ datatype = dt.bool, address = '33/1/9', name = 'snow_today',}) status_min_temp_today = grp.create({ datatype = dt.float16, address = '33/1/10', name = 'today_temp_min',}) status_max_temp_today = grp.create({ datatype = dt.float16, address = '33/1/11', name = 'today_temp_max',}) status_min_pressure_today = grp.create({ datatype = dt.uint16, address = '33/1/12', name = 'today_press_min',}) status_max_pressure_today = grp.create({ datatype = dt.uint16, address = '33/1/13', name = 'today_press_max',}) status_min_wind_speed_today = grp.create({ datatype = dt.float16, address = '33/1/14', name = 'today_wind_min',}) status_max_wind_speed_today = grp.create({ datatype = dt.float16, address = '33/1/15', name = 'today_wind_max',}) status_min_uv_today = grp.create({ datatype = dt.uint8, address = '33/1/16', name = 'today_uv_min',}) status_max_uv_today = grp.create({ datatype = dt.uint8, address = '33/1/17', name = 'today_uv_max',}) status_rain_tomor = grp.create({ datatype = dt.bool, address = '33/1/18', name = 'rain_tomor',}) status_snow_tomor = grp.create({ datatype = dt.bool, address = '33/1/19', name = 'snow_tomor',}) status_min_temp_tomor = grp.create({ datatype = dt.float16, address = '33/1/20', name = 'tomor_temp_min',}) status_max_temp_tomor = grp.create({ datatype = dt.float16, address = '33/1/21', name = 'tomor_temp_max',}) status_min_pressure_tomor = grp.create({ datatype = dt.uint16, address = '33/1/22', name = 'tomor_press_min',}) status_max_pressure_tomor = grp.create({ datatype = dt.uint16, address = '33/1/23', name = 'tomor_press_max',}) status_min_wind_speed_tomor = grp.create({ datatype = dt.float16, address = '33/1/24', name = 'tomor_wind_min',}) status_max_wind_speed_tomor = grp.create({ datatype = dt.float16, address = '33/1/25', name = 'tomor_wind_max',}) status_min_uv_tomor = grp.create({ datatype = dt.uint8, address = '33/1/26', name = 'tomor_uv_min',}) status_max_uv_tomor = grp.create({ datatype = dt.uint8, address = '33/1/27', name = 'tomor_uv_max',}) --]] rain_tod_YR = false        -- is rainy or not (for today) snow_tod_YR = false        -- is snowy or not (for today) rain_tom_YR = false        -- is rainy or not (for tomorrow) snow_tom_YR = false        -- is snowy or not (for tomorrow) -- current temperature, air pressure, humidity, wind direction and speed temperature_YR = -273    -- temperature in degree Celsius air_pressure_YR = -1     -- air pressure in hPa humidity_YR = -1         -- air humidity in % wind_direction_YR = -1   -- wind direction in degrees [0; 360) wind_speed_YR = -1       -- wind speed in m/s uv_index_YR = -1         -- UV index feelslike_temp_YR = -273 -- feels like temperature in degree Celsius function init_min_max_table() -- initialize table for minimum, maximum temperature, pressure, windspeed   local min_max = {}   min_max.min_t = 8000 -- minimum temperature for today   min_max.max_t = -273 -- maximum temperature for today   min_max.min_p = 8000 -- minimum pressure for today   min_max.max_p = -1   -- maximum pressure for today   min_max.min_w = 8000 -- minimum wind speed for today   min_max.max_w = -1   -- maximum wind speed for today   min_max.min_uv = 8000 -- minimum UV index   min_max.max_uv = -1   -- maximum UV index     return min_max end function set_timestamp(day) -- if day = 0 today; if day = 1 tomorrow, if day = 2 day after tomorrow   local date = os.date('*t')   date.day = date.day + day   local time = os.time(date)   return os.date('%Y-%m-%d', time), date.hour -- timestamp and current hour end -- minimum maximum values of temperature, pressure and windspeed function min_max_temp_press_wind(dat_tab, min_max_tab)   min_max_tab.min_t = math.min(min_max_tab.min_t, dat_tab.air_temperature or 8000)   min_max_tab.max_t = math.max(min_max_tab.max_t, dat_tab.air_temperature or -273)   min_max_tab.min_p = math.min(min_max_tab.min_p, dat_tab.air_pressure_at_sea_level or 8000)   min_max_tab.max_p = math.max(min_max_tab.max_p, dat_tab.air_pressure_at_sea_level or -1)   min_max_tab.min_w = math.min(min_max_tab.min_w, dat_tab.wind_speed or 8000)   min_max_tab.max_w = math.max(min_max_tab.max_w, dat_tab.wind_speed or -1)   min_max_tab.min_uv = math.min(min_max_tab.min_uv, dat_tab.ultraviolet_index_clear_sky or 8000)   min_max_tab.max_uv = math.max(min_max_tab.max_uv, dat_tab.ultraviolet_index_clear_sky or -1)     return min_max_tab end function check_for_rain(next1h)   local is_rainy = false   local code = ''     if type(next1h) == 'table' and type(next1h.summary) == 'table' then     code = next1h.summary.symbol_code or ''   end     if code:find('rain') then     is_rainy = true   end     return is_rainy end function check_for_snow(next1h)   local is_snowy = false   local code = ''     if type(next1h) == 'table' and type(next1h.summary) == 'table' then     code = next1h.summary.symbol_code or ''   end     if code:find('snow') then     is_snowy = true   end   return is_snowy end function calc_heat_index(temperature, humidity)   if temperature < 26.7 then     log('for heat_index calculation temperature should be higher than +26.7 Celsius degree')     return -273   end     if humidity < 0 or humidity > 100 then     log('humidity should be in a range from 0 ... 100%')     return -273   end     local T = temperature   local H = humidity   local c_1 = -8.785   local c_2 = 1.611   local c_3 = 2.339   local c_4 = -0.146   local c_5 = -0.0123   local c_6 = -0.0164   local c_7 = 0.00221   local c_8 = 0.000725   local c_9 = -0.00000358   local heat_index = c_1+c_2*T+c_3*H+c_4*T*H+c_5*T*T+c_6*H*H+c_7*T*T*H+c_8*T*H*H+c_9*T*T*H*H       return heat_index end function calc_wind_chill(temperature, wind_speed)   if temperature > 10 then     log('temperature should be less than +10.0 Celsius degree')       return -273   end       if wind_speed < 0 or wind_speed > 49.2 then       log('wind speed should be in a range 0 ... 49.2 m/s')     return -273   end     local T_air = temperature -- air temperature Celsius degree     local a = 0.62 -- coef   local b = 0.51 -- coef   local T_1 = 13.1 -- Celsius degree   local T_2 = 14.6 -- Celsius degree     local M_0 = 1.3333 -- m/s   local M = wind_speed -- m/s     local T_wind_chill     if M > M_0 then     T_wind_chill = (a*T_air + T_1) + (b*T_air - T_2)*(M/M_0)^0.16   else     T_wind_chill = T_air   end     return T_wind_chill end function calc_feelslike(temperature, wind_speed, humidity)   local T_feelslike     if temperature <= 10.0 then -- if less than 10.0 Celsius degree (or equal) then wind chill     T_feelslike = calc_wind_chill(temperature, wind_speed)   elseif temperature >= 26.7 then -- if more than 26.7 Celsius degree (or equal) then heat index     T_feelslike = calc_heat_index(temperature, humidity)   else -- other cases just return temperature     T_feelslike = temperature   end   return T_feelslike end min_max_today = init_min_max_table() -- table for minimum maximum temperature, air pressure, wind direction min_max_tomor = init_min_max_table() -- table for minimum maximum temperature, air pressure, wind direction json = require('json') http = require('socket.http') args = 'lat=' .. latitude .. '&lon=' .. longitude --url = 'https://api.met.no/weatherapi/locationforecast/2.0/compact?' .. args url = 'https://api.met.no/weatherapi/locationforecast/2.0/complete?' .. args mac = 0 io.readfile('/sys/class/net/eth0/address'):gsub('%x%x', function(v)   mac = mac * 256 + tonumber(v, 16) end) http.USERAGENT = 'LM ' .. mac res, err = http.request(url) data = json.pdecode(res) if type(data) == 'table' then   timestamp, hour = set_timestamp(0) -- current day     if hour < 10 then     timestamp_current_hour = timestamp .. 'T0' .. hour .. ':00:00Z' -- time stamp for current hour   else     timestamp_current_hour = timestamp .. 'T' .. hour .. ':00:00Z'  -- time stamp for current hour   end     --log('timestamp = ' .. timestamp)     timestamp_next = set_timestamp(1) -- timestamp for tomorrow   --log('timestamp_next = ' .. timestamp_next)     --timestamp_after_next = set_timestamp(2) -- timestamp for day after tomorrow   --log('timestamp_after_next = ' .. timestamp_after_next)     --timestamp_after_after = set_timestamp(3) -- timestamp for day after day after tomorrow   --log('timestamp_after_after = ' .. timestamp_after_after)     for i, entry in ipairs(data.properties.timeseries) do          -- for weather now     if entry.time == timestamp_current_hour then -- get data only for one hour (current hour)       current_data = entry.data.instant.details       if type(current_data) == 'table' then         temperature_YR = current_data.air_temperature or -273           -- temperature in Celsius degree         air_pressure_YR = current_data.air_pressure_at_sea_level or -1  -- air pressure in hPa         humidity_YR = current_data.relative_humidity or -1              -- air humidity in %         wind_direction_YR = current_data.wind_from_direction or -1      -- wind direction in degrees [0;360)         wind_speed_YR = current_data.wind_speed or -1                   -- wind speed in m/s         uv_index_YR = current_data.ultraviolet_index_clear_sky or -1    -- uv index         feelslike_temp_YR = calc_feelslike(temperature_YR, wind_speed_YR, humidity_YR) -- feels like temperature in Celsius degree       end     end         if entry.time:sub(1, #timestamp) == timestamp then -- checks remaining hours + 3 previous hours of current day         current_data = entry.data.instant.details       if type(current_data) == 'table' then         min_max_today = min_max_temp_press_wind(current_data, min_max_today)       end             if rain_tod_YR == false then -- if detected rain does not check for rain         rain_tod_YR = check_for_rain(entry.data.next_1_hours)       end             if snow_tod_YR == false then -- if detected snow does not check for snow         snow_tod_YR = check_for_snow(entry.data.next_1_hours)       end     end         if entry.time:sub(1, #timestamp_next) == timestamp_next then -- checks 24 hours of next day       tomor_data = entry.data.instant.details       if type(tomor_data) == 'table' then         min_max_tomor = min_max_temp_press_wind(tomor_data, min_max_tomor)       end             if rain_tom_YR == false then -- if detected rain does not check for rain         rain_tom_YR = check_for_rain(entry.data.next_1_hours)       end             if snow_tom_YR == false then -- if detected snow does not check for snow         snow_tom_YR = check_for_snow(entry.data.next_1_hours)       end     end     end     -- data for current hour   grp.write(status_temp, temperature_YR)   grp.write(status_pressure, air_pressure_YR)   grp.write(status_humidity, humidity_YR)   grp.write(status_wind_direction, wind_direction_YR)   grp.write(status_wind_speed, wind_speed_YR)   grp.write(status_uv_index, uv_index_YR)   grp.write(status_feelslike_temp, feelslike_temp_YR)       -- data for today: rain, snow; min and max for temperature, pressure, wind   grp.write(status_rain_today, rain_tod_YR)   grp.write(status_snow_today, snow_tod_YR)     grp.write(status_min_temp_today, min_max_today.min_t)   grp.write(status_max_temp_today, min_max_today.max_t)   grp.write(status_min_pressure_today, min_max_today.min_p)   grp.write(status_max_pressure_today, min_max_today.max_p)   grp.write(status_min_wind_speed_today, min_max_today.min_w)   grp.write(status_max_wind_speed_today, min_max_today.max_w)   grp.write(status_min_uv_today, min_max_today.min_uv)   grp.write(status_max_uv_today, min_max_today.max_uv)       -- data for tomorrow: rain, snow; min and max for temperature, pressure, wind   grp.write(status_rain_tomor, rain_tom_YR)   grp.write(status_snow_tomor, snow_tom_YR)     grp.write(status_min_temp_tomor, min_max_tomor.min_t)   grp.write(status_max_temp_tomor, min_max_tomor.max_t)   grp.write(status_min_pressure_tomor, min_max_tomor.min_p)   grp.write(status_max_pressure_tomor, min_max_tomor.max_p)   grp.write(status_min_wind_speed_tomor, min_max_tomor.min_w)   grp.write(status_max_wind_speed_tomor, min_max_tomor.max_w)   grp.write(status_min_uv_tomor, min_max_tomor.min_uv)   grp.write(status_max_uv_tomor, min_max_tomor.max_uv)   end

4. How often we can start this script?
You can run the script every four hours, should work fine.

Attached Files
.lua   my_script_v13.lua (Size: 15.57 KB / Downloads: 17)
Reply


Messages In This Thread
Weather Info from API - by Fahd - 24.02.2022, 23:52
RE: Weather Info from API - by admin - 25.02.2022, 08:31
RE: Weather Info from API - by Mrinj - 27.05.2022, 13:14
RE: Weather Info from API - by admin - 27.05.2022, 13:19
RE: Weather Info from API - by Mrinj - 27.05.2022, 13:23
RE: Weather Info from API - by AlexLV - 08.06.2022, 05:51
RE: Weather Info from API - by RomansP - 08.06.2022, 08:52
RE: Weather Info from API - by AlexLV - 09.06.2022, 08:21
RE: Weather Info from API - by RomansP - 09.06.2022, 11:04
RE: Weather Info from API - by RomansP - 10.06.2022, 07:53
RE: Weather Info from API - by Mrinj - 22.06.2022, 08:00
RE: Weather Info from API - by Fahd - 22.06.2022, 09:59
RE: Weather Info from API - by RomansP - 22.06.2022, 08:17
RE: Weather Info from API - by Mrinj - 22.06.2022, 16:24
RE: Weather Info from API - by admin - 23.06.2022, 06:24
RE: Weather Info from API - by Mrinj - 23.06.2022, 06:36
RE: Weather Info from API - by Acla - 09.07.2022, 23:16
RE: Weather Info from API - by admin - 11.07.2022, 06:28
RE: Weather Info from API - by Acla - 11.07.2022, 21:30
RE: Weather Info from API - by RomansP - 12.07.2022, 06:20
RE: Weather Info from API - by fabiorusco - 31.10.2022, 10:48
RE: Weather Info from API - by RomansP - 31.10.2022, 13:48
RE: Weather Info from API - by fabiorusco - 03.11.2022, 06:51
RE: Weather Info from API - by fabiorusco - 03.11.2022, 13:07
RE: Weather Info from API - by RomansP - 03.11.2022, 14:44
RE: Weather Info from API - by fabiorusco - 03.11.2022, 15:09
RE: Weather Info from API - by P_marienborg - 17.01.2023, 09:15
RE: Weather Info from API - by admin - 17.01.2023, 09:15
RE: Weather Info from API - by alias74 - 09.06.2023, 08:07

Forum Jump: