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: