#!/usr/bin/lua require "uci" local cur = uci.cursor() local socket = require "socket" local lfs = require "lfs" local json = require "json" require "wm_util" function get_levels_list(config_name) local levels, engage, engage_mode, disengage_mode, levels_idx levels = {} levels_idx = {} engage = {} engage_mode = {} disengage_mode = {} cur.foreach(config_name, "alarm", function(s) local idx = #levels+1 levels[idx] = s["name"] engage[idx] = s["engage"] engage_mode[idx] = s["engage_mode"] disengage_mode[idx] = s["disengage_mode"] levels_idx[s[".name"]] = idx end) return levels, engage, engage_mode, disengage_mode, levels_idx end function get_params(config_name,levels_idx) local a_names, a_formats, a_limits a_names = {} a_formats = {} a_limits = {} cur.foreach(config_name,"params", function(s) if s["name"] then a_names[s["param"]] = s["name"] end if s["format"] or s["scale"] then local format, scale if s["scale"] then scale = s["scale"] else scale = 1 end if s["format"] then format = s["format"] else format = "4s" end a_formats[s["param"]] = {format,scale} end if s["limits"] then for i,record in pairs(s["limits"]) do rec = split(record,":") idx = levels_idx[rec[1]] low = tonumber(rec[2]) high = tonumber(rec[3]) if not a_limits[s["param"]] then a_limits[s["param"]] = {} end if not a_limits[s["param"]][idx] then a_limits[s["param"]][idx] = {} end rec = a_limits[s["param"]][idx] a_limits[s["param"]][idx][#rec+1] = {low,high} end end end) return a_names,a_formats,a_limits; end function check_limit(param,value,limits) limit = limits[param] if limit then for level,ranges in pairs(limit) do for key,range in pairs(ranges) do if value>=range[1] and value (os.time() - mute_time)) if mod then if last < mod then last = mod res,sensor_data = pcall(function () local f = io.open(watch_file,"r") content = f:read("*all") io.close(f) return json.decode(content) end) write_file(w_led,w_engage) else write_file(w_led,w_disengage) end local values = {} local printable = {} for sensor,sensor_params in pairs(sensor_data[web_id]) do if sensor ~= "timestamp" then for param,value in pairs(sensor_params) do local name = sensor.."."..param values[name]=value if a_formats[name] then printable[name]=string.format("%"..a_formats[name][1],value*a_formats[name][2]) end end end end level = 1 alarms = "" if not muted_beep then for key,value in pairs(values) do value_level = check_limit(key,value,limits) if value_level > level then level = value_level alarms = a_names[key] elseif value_level == level then alarms = alarms.." "..a_names[key] end end end leds_engage = {} for key,value in pairs(a_engage[level]) do leds_engage[value] = a_engage_mode[level] end for led,mode in pairs(a_leds) do if leds_engage[led] then write_file(led,leds_engage[led]) else write_file(led,mode) end end alarms = trim(alarms) alarmstr = a_levels[level]..": "..alarms if alarmstr:len()>alarmstr_len then alarmstr=alarmstr:sub(1,alarmstr_len) elseif alarmstr:len()=alarm_raise) then data = alarmstr..sensstr else data = timestr..sensstr end if old_data ~= data then old_data = data print(data) write_file(out_file,data) end end end) local t = os.date("*t",os.time()+60) t["sec"] = 0 local sec = os.time(t)-os.time() if sec>0 then if sec>5 then sec=5 end socket.sleep(sec) end end