Posts: 49
Threads: 3
Joined: May 2018
Reputation:
0
Hello,
i nedd to know how may mm of rain done. I modify the script:
require('json')
https = require('ssl.https')
escape = require('socket.url').escape
key = 'xxxxxxxxxxxx'
location = 'Mandello del Lario'
latitude = 45.921373
longitude = 9.314482
args = 'lat=' .. latitude .. '&lon=' .. longitude
url = 'https://api.apixu.com/v1/forecast.json?key=%s&q=%s&days=2'
url = string.format(url, key, escape(arg))
res = https.request(url)
data = json.pdecode(res)
if type(data) ~= 'table' then
alert('Informazioni meteo non pervenute')
return
end
if data.error then
log('error', data.error)
return
end
current = data.current
today = data.forecast.forecastday[ 1 ].day
tomorrow = data.forecast.forecastday[ 2 ].day
-- log(current, today, tomorrow)
-- temperature in C
grp.write('32/2/1', current.temp_c)
-- total precipitation in millimeters
grp.write('32/2/8', today.totalprecip_mm)
But don't function. Can someone help me please.
Posts: 56
Threads: 1
Joined: Dec 2020
Reputation:
22
Hello, fabiorusco!
I have added one more object to my script for api.met.no (it is free, no need for special key, you can monitor weather for tomorrow and after tomorrow).
Here are changes what I have added
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local precipitation_amount_6h = -
1
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
And here the whole script:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
local status_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/1' ,
name =
'current_temp' ,})
local status_pressure =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/2' ,
name =
'current_press' ,})
local status_humidity =
grp.create ({
datatype =
dt.scale ,
address =
'33/1/3' ,
name =
'current_humid' ,})
local status_wind_direction =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/4' ,
name =
'current_wind_dir' ,})
local status_wind_speed =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/5' ,
name =
'current_wind_sp' ,})
local status_uv_index =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/6' ,
name =
'current_uv_index' ,})
local status_feelslike_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/7' ,
name =
'current_feels_temp' ,})
local status_rain_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/8' ,
name =
'rain_today' ,})
local status_snow_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/9' ,
name =
'snow_today' ,})
local status_min_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/10' ,
name =
'today_temp_min' ,})
local status_max_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/11' ,
name =
'today_temp_max' ,})
local status_min_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/12' ,
name =
'today_press_min' ,})
local status_max_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/13' ,
name =
'today_press_max' ,})
local status_min_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/14' ,
name =
'today_wind_min' ,})
local status_max_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/15' ,
name =
'today_wind_max' ,})
local status_min_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/16' ,
name =
'today_uv_min' ,})
local status_max_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/17' ,
name =
'today_uv_max' ,})
local status_rain_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/18' ,
name =
'rain_tomor' ,})
local status_snow_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/19' ,
name =
'snow_tomor' ,})
local status_min_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/20' ,
name =
'tomor_temp_min' ,})
local status_max_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/21' ,
name =
'tomor_temp_max' ,})
local status_min_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/22' ,
name =
'tomor_press_min' ,})
local status_max_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/23' ,
name =
'tomor_press_max' ,})
local status_min_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/24' ,
name =
'tomor_wind_min' ,})
local status_max_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/25' ,
name =
'tomor_wind_max' ,})
local status_min_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/26' ,
name =
'tomor_uv_min' ,})
local status_max_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/27' ,
name =
'tomor_uv_max' ,})
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local rain_tod_YR =
false
local snow_tod_YR =
false
local rain_tom_YR =
false
local snow_tom_YR =
false
local temperature_YR = -
273
local air_pressure_YR = -
1
local humidity_YR = -
1
local wind_direction_YR = -
1
local wind_speed_YR = -
1
local uv_index_YR = -
1
local feelslike_temp_YR = -
273
local precipitation_amount_6h = -
1
function init_min_max_table ()
local min_max = {}
min_max.min_t =
8000
min_max.max_t = -
273
min_max.min_p =
8000
min_max.max_p = -
1
min_max.min_w =
8000
min_max.max_w = -
1
min_max.min_uv =
8000
min_max.max_uv = -
1
return min_max
end
function set_timestamp (
day )
local date =
os.date (
'*t' )
date.day =
date.day +
day
local time =
os.time (
date )
return os.date (
'%Y-%m-%d' ,
time ),
date.hour
end
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
local a =
0.62
local b =
0.51
local T_1 =
13.1
local T_2 =
14.6
local M_0 =
1.3333
local M =
wind_speed
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
T_feelslike =
calc_wind_chill (
temperature ,
wind_speed )
elseif temperature >=
26.7 then
T_feelslike =
calc_heat_index (
temperature ,
humidity )
else
T_feelslike =
temperature
end
return T_feelslike
end
local min_max_today =
init_min_max_table ()
local min_max_tomor =
init_min_max_table ()
local latitude =
45.921373
local longitude =
9.314482
https =
require (
'ssl.https' )
json =
require (
'json' )
ltn12 =
require (
'ltn12' )
args =
'lat=' ..
latitude ..
'&lon=' ..
longitude
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 )
response = {}
res ,
code =
https.request ({
url =
url ,
protocol =
'tlsv12' ,
headers = {
[
'user-agent' ] =
'LM ' ..
mac
},
sink =
ltn12.sink.table (
response )
})
if res and code ==
200 then
data =
json.pdecode (
table.concat (
response ))
else
log (
'request error' ,
res ,
code )
end
if type (
data ) ==
'table' then
timestamp ,
hour =
set_timestamp (
0 )
if hour <
10 then
timestamp_current_hour =
timestamp ..
'T0' ..
hour ..
':00:00Z'
else
timestamp_current_hour =
timestamp ..
'T' ..
hour ..
':00:00Z'
end
timestamp_next =
set_timestamp (
1 )
for i ,
entry in ipairs (
data.properties.timeseries )
do
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
if entry.time :
sub (
1 , #
timestamp ) ==
timestamp then
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
rain_tod_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tod_YR ==
false then
snow_tod_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
if entry.time :
sub (
1 , #
timestamp_next ) ==
timestamp_next then
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
rain_tom_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tom_YR ==
false then
snow_tom_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
end
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 )
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
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 )
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
Attached Files
Posts: 49
Threads: 3
Joined: May 2018
Reputation:
0
03.11.2022, 06:51
(This post was last modified: 03.11.2022, 06:52 by fabiorusco .)
(31.10.2022, 13:48) RomansP Wrote: Hello, fabiorusco!
I have added one more object to my script for api.met.no (it is free, no need for special key, you can monitor weather for tomorrow and after tomorrow).
Here are changes what I have added
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local precipitation_amount_6h = -
1
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
And here the whole script:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
local status_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/1' ,
name =
'current_temp' ,})
local status_pressure =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/2' ,
name =
'current_press' ,})
local status_humidity =
grp.create ({
datatype =
dt.scale ,
address =
'33/1/3' ,
name =
'current_humid' ,})
local status_wind_direction =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/4' ,
name =
'current_wind_dir' ,})
local status_wind_speed =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/5' ,
name =
'current_wind_sp' ,})
local status_uv_index =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/6' ,
name =
'current_uv_index' ,})
local status_feelslike_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/7' ,
name =
'current_feels_temp' ,})
local status_rain_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/8' ,
name =
'rain_today' ,})
local status_snow_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/9' ,
name =
'snow_today' ,})
local status_min_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/10' ,
name =
'today_temp_min' ,})
local status_max_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/11' ,
name =
'today_temp_max' ,})
local status_min_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/12' ,
name =
'today_press_min' ,})
local status_max_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/13' ,
name =
'today_press_max' ,})
local status_min_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/14' ,
name =
'today_wind_min' ,})
local status_max_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/15' ,
name =
'today_wind_max' ,})
local status_min_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/16' ,
name =
'today_uv_min' ,})
local status_max_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/17' ,
name =
'today_uv_max' ,})
local status_rain_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/18' ,
name =
'rain_tomor' ,})
local status_snow_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/19' ,
name =
'snow_tomor' ,})
local status_min_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/20' ,
name =
'tomor_temp_min' ,})
local status_max_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/21' ,
name =
'tomor_temp_max' ,})
local status_min_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/22' ,
name =
'tomor_press_min' ,})
local status_max_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/23' ,
name =
'tomor_press_max' ,})
local status_min_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/24' ,
name =
'tomor_wind_min' ,})
local status_max_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/25' ,
name =
'tomor_wind_max' ,})
local status_min_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/26' ,
name =
'tomor_uv_min' ,})
local status_max_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/27' ,
name =
'tomor_uv_max' ,})
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local rain_tod_YR =
false
local snow_tod_YR =
false
local rain_tom_YR =
false
local snow_tom_YR =
false
local temperature_YR = -
273
local air_pressure_YR = -
1
local humidity_YR = -
1
local wind_direction_YR = -
1
local wind_speed_YR = -
1
local uv_index_YR = -
1
local feelslike_temp_YR = -
273
local precipitation_amount_6h = -
1
function init_min_max_table ()
local min_max = {}
min_max.min_t =
8000
min_max.max_t = -
273
min_max.min_p =
8000
min_max.max_p = -
1
min_max.min_w =
8000
min_max.max_w = -
1
min_max.min_uv =
8000
min_max.max_uv = -
1
return min_max
end
function set_timestamp (
day )
local date =
os.date (
'*t' )
date.day =
date.day +
day
local time =
os.time (
date )
return os.date (
'%Y-%m-%d' ,
time ),
date.hour
end
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
local a =
0.62
local b =
0.51
local T_1 =
13.1
local T_2 =
14.6
local M_0 =
1.3333
local M =
wind_speed
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
T_feelslike =
calc_wind_chill (
temperature ,
wind_speed )
elseif temperature >=
26.7 then
T_feelslike =
calc_heat_index (
temperature ,
humidity )
else
T_feelslike =
temperature
end
return T_feelslike
end
local min_max_today =
init_min_max_table ()
local min_max_tomor =
init_min_max_table ()
local latitude =
45.921373
local longitude =
9.314482
https =
require (
'ssl.https' )
json =
require (
'json' )
ltn12 =
require (
'ltn12' )
args =
'lat=' ..
latitude ..
'&lon=' ..
longitude
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 )
response = {}
res ,
code =
https.request ({
url =
url ,
protocol =
'tlsv12' ,
headers = {
[
'user-agent' ] =
'LM ' ..
mac
},
sink =
ltn12.sink.table (
response )
})
if res and code ==
200 then
data =
json.pdecode (
table.concat (
response ))
else
log (
'request error' ,
res ,
code )
end
if type (
data ) ==
'table' then
timestamp ,
hour =
set_timestamp (
0 )
if hour <
10 then
timestamp_current_hour =
timestamp ..
'T0' ..
hour ..
':00:00Z'
else
timestamp_current_hour =
timestamp ..
'T' ..
hour ..
':00:00Z'
end
timestamp_next =
set_timestamp (
1 )
for i ,
entry in ipairs (
data.properties.timeseries )
do
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
if entry.time :
sub (
1 , #
timestamp ) ==
timestamp then
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
rain_tod_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tod_YR ==
false then
snow_tod_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
if entry.time :
sub (
1 , #
timestamp_next ) ==
timestamp_next then
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
rain_tom_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tom_YR ==
false then
snow_tom_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
end
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 )
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
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 )
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
Thank you,
good help for me.
Best regards
Fabio
Posts: 49
Threads: 3
Joined: May 2018
Reputation:
0
03.11.2022, 13:07
(This post was last modified: 03.11.2022, 13:10 by fabiorusco .)
(03.11.2022, 06:51) fabiorusco Wrote: (31.10.2022, 13:48) RomansP Wrote: Hello, fabiorusco!
I have added one more object to my script for api.met.no (it is free, no need for special key, you can monitor weather for tomorrow and after tomorrow).
Here are changes what I have added
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local precipitation_amount_6h = -
1
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
And here the whole script:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
local status_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/1' ,
name =
'current_temp' ,})
local status_pressure =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/2' ,
name =
'current_press' ,})
local status_humidity =
grp.create ({
datatype =
dt.scale ,
address =
'33/1/3' ,
name =
'current_humid' ,})
local status_wind_direction =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/4' ,
name =
'current_wind_dir' ,})
local status_wind_speed =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/5' ,
name =
'current_wind_sp' ,})
local status_uv_index =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/6' ,
name =
'current_uv_index' ,})
local status_feelslike_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/7' ,
name =
'current_feels_temp' ,})
local status_rain_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/8' ,
name =
'rain_today' ,})
local status_snow_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/9' ,
name =
'snow_today' ,})
local status_min_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/10' ,
name =
'today_temp_min' ,})
local status_max_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/11' ,
name =
'today_temp_max' ,})
local status_min_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/12' ,
name =
'today_press_min' ,})
local status_max_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/13' ,
name =
'today_press_max' ,})
local status_min_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/14' ,
name =
'today_wind_min' ,})
local status_max_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/15' ,
name =
'today_wind_max' ,})
local status_min_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/16' ,
name =
'today_uv_min' ,})
local status_max_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/17' ,
name =
'today_uv_max' ,})
local status_rain_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/18' ,
name =
'rain_tomor' ,})
local status_snow_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/19' ,
name =
'snow_tomor' ,})
local status_min_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/20' ,
name =
'tomor_temp_min' ,})
local status_max_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/21' ,
name =
'tomor_temp_max' ,})
local status_min_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/22' ,
name =
'tomor_press_min' ,})
local status_max_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/23' ,
name =
'tomor_press_max' ,})
local status_min_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/24' ,
name =
'tomor_wind_min' ,})
local status_max_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/25' ,
name =
'tomor_wind_max' ,})
local status_min_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/26' ,
name =
'tomor_uv_min' ,})
local status_max_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/27' ,
name =
'tomor_uv_max' ,})
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local rain_tod_YR =
false
local snow_tod_YR =
false
local rain_tom_YR =
false
local snow_tom_YR =
false
local temperature_YR = -
273
local air_pressure_YR = -
1
local humidity_YR = -
1
local wind_direction_YR = -
1
local wind_speed_YR = -
1
local uv_index_YR = -
1
local feelslike_temp_YR = -
273
local precipitation_amount_6h = -
1
function init_min_max_table ()
local min_max = {}
min_max.min_t =
8000
min_max.max_t = -
273
min_max.min_p =
8000
min_max.max_p = -
1
min_max.min_w =
8000
min_max.max_w = -
1
min_max.min_uv =
8000
min_max.max_uv = -
1
return min_max
end
function set_timestamp (
day )
local date =
os.date (
'*t' )
date.day =
date.day +
day
local time =
os.time (
date )
return os.date (
'%Y-%m-%d' ,
time ),
date.hour
end
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
local a =
0.62
local b =
0.51
local T_1 =
13.1
local T_2 =
14.6
local M_0 =
1.3333
local M =
wind_speed
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
T_feelslike =
calc_wind_chill (
temperature ,
wind_speed )
elseif temperature >=
26.7 then
T_feelslike =
calc_heat_index (
temperature ,
humidity )
else
T_feelslike =
temperature
end
return T_feelslike
end
local min_max_today =
init_min_max_table ()
local min_max_tomor =
init_min_max_table ()
local latitude =
45.921373
local longitude =
9.314482
https =
require (
'ssl.https' )
json =
require (
'json' )
ltn12 =
require (
'ltn12' )
args =
'lat=' ..
latitude ..
'&lon=' ..
longitude
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 )
response = {}
res ,
code =
https.request ({
url =
url ,
protocol =
'tlsv12' ,
headers = {
[
'user-agent' ] =
'LM ' ..
mac
},
sink =
ltn12.sink.table (
response )
})
if res and code ==
200 then
data =
json.pdecode (
table.concat (
response ))
else
log (
'request error' ,
res ,
code )
end
if type (
data ) ==
'table' then
timestamp ,
hour =
set_timestamp (
0 )
if hour <
10 then
timestamp_current_hour =
timestamp ..
'T0' ..
hour ..
':00:00Z'
else
timestamp_current_hour =
timestamp ..
'T' ..
hour ..
':00:00Z'
end
timestamp_next =
set_timestamp (
1 )
for i ,
entry in ipairs (
data.properties.timeseries )
do
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
if entry.time :
sub (
1 , #
timestamp ) ==
timestamp then
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
rain_tod_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tod_YR ==
false then
snow_tod_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
if entry.time :
sub (
1 , #
timestamp_next ) ==
timestamp_next then
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
rain_tom_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tom_YR ==
false then
snow_tom_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
end
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 )
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
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 )
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
Thank you,
good help for me.
Best regards
Fabio
Hello,
how it's possible to know the total precipitation of today?
Is it good also for Italy ? (the service is located in scandinavian zone)
Posts: 56
Threads: 1
Joined: Dec 2020
Reputation:
22
Hello.
I have added calculation of precipitation amount of current day (gives you precipitation amount of remaining day + 3 previous hours of current day).
It is also suitable for Italy (have checked with Rome coordinates).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
local status_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/1' ,
name =
'current_temp' ,})
local status_pressure =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/2' ,
name =
'current_press' ,})
local status_humidity =
grp.create ({
datatype =
dt.scale ,
address =
'33/1/3' ,
name =
'current_humid' ,})
local status_wind_direction =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/4' ,
name =
'current_wind_dir' ,})
local status_wind_speed =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/5' ,
name =
'current_wind_sp' ,})
local status_uv_index =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/6' ,
name =
'current_uv_index' ,})
local status_feelslike_temp =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/7' ,
name =
'current_feels_temp' ,})
local status_rain_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/8' ,
name =
'rain_today' ,})
local status_snow_today =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/9' ,
name =
'snow_today' ,})
local status_min_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/10' ,
name =
'today_temp_min' ,})
local status_max_temp_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/11' ,
name =
'today_temp_max' ,})
local status_min_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/12' ,
name =
'today_press_min' ,})
local status_max_pressure_today =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/13' ,
name =
'today_press_max' ,})
local status_min_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/14' ,
name =
'today_wind_min' ,})
local status_max_wind_speed_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/15' ,
name =
'today_wind_max' ,})
local status_min_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/16' ,
name =
'today_uv_min' ,})
local status_max_uv_today =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/17' ,
name =
'today_uv_max' ,})
local status_rain_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/18' ,
name =
'rain_tomor' ,})
local status_snow_tomor =
grp.create ({
datatype =
dt.bool ,
address =
'33/1/19' ,
name =
'snow_tomor' ,})
local status_min_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/20' ,
name =
'tomor_temp_min' ,})
local status_max_temp_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/21' ,
name =
'tomor_temp_max' ,})
local status_min_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/22' ,
name =
'tomor_press_min' ,})
local status_max_pressure_tomor =
grp.create ({
datatype =
dt.uint16 ,
address =
'33/1/23' ,
name =
'tomor_press_max' ,})
local status_min_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/24' ,
name =
'tomor_wind_min' ,})
local status_max_wind_speed_tomor =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/25' ,
name =
'tomor_wind_max' ,})
local status_min_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/26' ,
name =
'tomor_uv_min' ,})
local status_max_uv_tomor =
grp.create ({
datatype =
dt.uint8 ,
address =
'33/1/27' ,
name =
'tomor_uv_max' ,})
local status_precipitation_amount_6h =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/28' ,
name =
'precipitation_amount_6h' ,})
local status_precipitation_amount_today =
grp.create ({
datatype =
dt.float16 ,
address =
'33/1/29' ,
name =
'precipitation_amount_today' ,})
local rain_tod_YR =
false
local snow_tod_YR =
false
local rain_tom_YR =
false
local snow_tom_YR =
false
local temperature_YR = -
273
local air_pressure_YR = -
1
local humidity_YR = -
1
local wind_direction_YR = -
1
local wind_speed_YR = -
1
local uv_index_YR = -
1
local feelslike_temp_YR = -
273
local precipitation_amount_6h = -
1
local precipitation_amount_today =
0
function init_min_max_table ()
local min_max = {}
min_max.min_t =
8000
min_max.max_t = -
273
min_max.min_p =
8000
min_max.max_p = -
1
min_max.min_w =
8000
min_max.max_w = -
1
min_max.min_uv =
8000
min_max.max_uv = -
1
return min_max
end
function set_timestamp (
day )
local date =
os.date (
'*t' )
date.day =
date.day +
day
local time =
os.time (
date )
return os.date (
'%Y-%m-%d' ,
time ),
date.hour
end
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
local a =
0.62
local b =
0.51
local T_1 =
13.1
local T_2 =
14.6
local M_0 =
1.3333
local M =
wind_speed
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
T_feelslike =
calc_wind_chill (
temperature ,
wind_speed )
elseif temperature >=
26.7 then
T_feelslike =
calc_heat_index (
temperature ,
humidity )
else
T_feelslike =
temperature
end
return T_feelslike
end
local min_max_today =
init_min_max_table ()
local min_max_tomor =
init_min_max_table ()
local latitude =
45.921373
local longitude =
9.314482
https =
require (
'ssl.https' )
json =
require (
'json' )
ltn12 =
require (
'ltn12' )
args =
'lat=' ..
latitude ..
'&lon=' ..
longitude
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 )
response = {}
res ,
code =
https.request ({
url =
url ,
protocol =
'tlsv12' ,
headers = {
[
'user-agent' ] =
'LM ' ..
mac
},
sink =
ltn12.sink.table (
response )
})
if res and code ==
200 then
data =
json.pdecode (
table.concat (
response ))
else
log (
'request error' ,
res ,
code )
end
if type (
data ) ==
'table' then
timestamp ,
hour =
set_timestamp (
0 )
if hour <
10 then
timestamp_current_hour =
timestamp ..
'T0' ..
hour ..
':00:00Z'
else
timestamp_current_hour =
timestamp ..
'T' ..
hour ..
':00:00Z'
end
timestamp_next =
set_timestamp (
1 )
for i ,
entry in ipairs (
data.properties.timeseries )
do
if entry.time ==
timestamp_current_hour then
current_data =
entry.data.instant.details
if type (
current_data ) ==
'table' then
temperature_YR =
current_data.air_temperature or -
273
air_pressure_YR =
current_data.air_pressure_at_sea_level or -
1
humidity_YR =
current_data.relative_humidity or -
1
wind_direction_YR =
current_data.wind_from_direction or -
1
wind_speed_YR =
current_data.wind_speed or -
1
uv_index_YR =
current_data.ultraviolet_index_clear_sky or -
1
feelslike_temp_YR =
calc_feelslike (
temperature_YR ,
wind_speed_YR ,
humidity_YR )
end
next_6h =
entry.data.next_6_hours.details
if type (
next_6h ) ==
'table' then
precipitation_amount_6h =
next_6h.precipitation_amount or -
1
end
end
if entry.time :
sub (
1 , #
timestamp ) ==
timestamp then
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
rain_tod_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tod_YR ==
false then
snow_tod_YR =
check_for_snow (
entry.data.next_1_hours )
end
precipitation_amount_today =
precipitation_amount_today + (
entry.data.next_1_hours.details.precipitation_amount or 0 )
end
if entry.time :
sub (
1 , #
timestamp_next ) ==
timestamp_next then
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
rain_tom_YR =
check_for_rain (
entry.data.next_1_hours )
end
if snow_tom_YR ==
false then
snow_tom_YR =
check_for_snow (
entry.data.next_1_hours )
end
end
end
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 )
grp.write (
status_precipitation_amount_6h ,
precipitation_amount_6h )
grp.write (
status_precipitation_amount_today ,
precipitation_amount_today )
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 )
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
Attached Files
Posts: 49
Threads: 3
Joined: May 2018
Reputation:
0
Posts: 11
Threads: 4
Joined: Jan 2020
Reputation:
0
17.01.2023, 09:15
(This post was last modified: 17.01.2023, 09:16 by P_marienborg .)
Hello.
I have tried the latest version on my spacelynk with vr 2.8.0
I am getting this error in the log:
* arg: 1
* string: request error
* arg: 2
* nil
* arg: 3
* string: Try again
Could someone point me in the right direction?
I think it something here that's not right:
https = require('ssl.https')
json = require('json')
ltn12 = require('ltn12')
args = 'lat=' .. latitude .. '&lon=' .. longitude
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)
This is the only changes I have done:
--local latitude = 69.6489 -- 'Tromso'
--local longitude = 18.95508 -- 'Tromso'
local latitude = 69.6489 -- 'Tromso'
local longitude = 18.95508 -- 'Tromso'
Posts: 8075
Threads: 43
Joined: Jun 2015
Reputation:
471
Check that you have correct gateway and DNS settings in System config > Network > Interfaces.
Posts: 5
Threads: 2
Joined: Jan 2022
Reputation:
0
is working for me, thanks