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.

How to run a scheduled event at Solar Noon?
#1
With solar panels installed there is an advantage to schedule events when solar generation is likely at a maximimum.

There are advanced approaches using solar forecasts, but a simple approach is to use a scheduler event to run at SolarNoon +/- offset, similar to current run at Sunrise +/- offset.

I realise this can be done wholly by scripting but would prefer to retain the ability to use the scheduler gui.

If an event is configured to run at Sunrise +/- offset via the GUI, is it possible to script an replacement of the start time with some other value such as a simplified solarNoon = (sunrise + sunset)/2?

Any ideas?

This is a little clumsy, but using event name is one way of adding solarNoon by the existing gui.
What would be the equivalent of ' io.writefile('/tmp/lm-scheduler-clear', '')' for the clipsal/schneider firmware?
Code:
local name = 'solarNoon%' local maxOffsetHours = 6    -- avoid 24hr boundaries for _, evt in ipairs(db:getall('SELECT * FROM scheduler_events WHERE name LIKE ?', name)) do   if evt then      local _, _, plusMinus, offsetHour, offsetMin = string.find(evt.name, "^solarNoon%s*([+-])%s*(0[0-"..maxOffsetHours.."])([0-5]%d)%D*")     if plusMinus and offsetHour and offsetMin and evt.type == '' then       local sunrise, sunset = rscalc(latitudeMel, longitudeMel)       local solarNoon = math.floor(((sunset + sunrise) / 2) + 0.5)       local offsetMinutes = (offsetHour * 60) + offsetMin       local eventMinutes       if plusMinus == '+' then         eventMinutes = solarNoon + offsetMinutes       else         eventMinutes = solarNoon - offsetMinutes       end       local eventStartHour = math.floor(eventMinutes / 60)       local eventStartMin = math.floor(eventMinutes % 60)             db:update('scheduler_events', {         start_hour = eventStartHour,         start_min = eventStartMin       }, { id = evt.id })             -- io.writefile('/tmp/lm-scheduler-clear', '')     else       log("Error. '"..evt.name.."' event name must begin with 'solarNoon[+-]HHMM ...' where max HH = 0"..maxOffsetHours..", and event setting 'Run at:' = 'Specific time'")     end   end end
Reply
#2
revised script

Code:
--[[ Warning: database functions are subject to change with firmware updates. ]]-- -- Update the start time for any solarNoon scheduler events. local namePrefix = 'solarNoon%' local maxOffsetHours = 8    -- avoid 24hr boundaries local namePattern = "^solarNoon%s*([+-])%s*(0[0-"..maxOffsetHours.."])([0-5]%d)%D*" local typeSpecificTime = '' for _, evt in ipairs(db:getall('SELECT * FROM scheduler_events WHERE name LIKE ?', namePrefix)) do   if evt then     if (type(evt.start_hour) == "number") and (evt.start_hour % 1 == 0) and (type(evt.start_min) == "number") and (evt.start_min % 1 == 0) and (type(evt.type) == 'string') then           local _, _, plusMinus, offsetHour, offsetMin = string.find(evt.name, namePattern)       if plusMinus and offsetHour and offsetMin and (evt.type == typeSpecificTime) then         local sunrise, sunset = rscalc(latitudeMel, longitudeMel)         local solarNoon = math.floor(((sunset + sunrise) / 2) + 0.5) -- approximation         local offsetMinutes = (offsetHour * 60) + offsetMin         local eventMinutes         if plusMinus == '+' then           eventMinutes = solarNoon + offsetMinutes         else           eventMinutes = solarNoon - offsetMinutes         end         local eventStartHour = math.floor(eventMinutes / 60)         local eventStartMin = math.floor(eventMinutes % 60)         if (evt.start_hour ~= eventStartHour) or (evt.start_min ~= eventStartMin) then           db:update('scheduler_events', {             start_hour = eventStartHour,             start_min = eventStartMin           }, { id = evt.id })           io.writefile('/tmp/lm-scheduler-clear', '')         end       else         log("Error. '"..evt.name.."' event name must begin with 'solarNoon[+-]HHMM' where max HH = 0"..maxOffsetHours..", and event setting 'Run at:' must be 'Specific time'")       end           else       log("Error. Firmware change, check evt.start_hour and evt.start_min are integers, and evt.type is a string.", evt)     end   end end
Reply


Forum Jump: