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.

Resident script pump circulation
#59
(27.10.2018, 14:44)buuuudzik Wrote: Here updated version (there was a lack of "." after tablename):

Code:
------------------------------------------------------
-- DEFINE GLOBAL VARIABLES AND ZONES------------------
------------------------------------------------------
seasonGA = '2/0/100'
logging = true

zones = {
    {
        summer = 'pompa_circolazione_giorno_estate',
        winter = 'pompa_circolazione_giorno_inverno',
        pump = '2/0/1',
        offset = 60,
        minimum = 30
    }
}


------------------------------------------------------
-- DONT CHANGE NOTHING BELOW--------------------------
------------------------------------------------------
season = grp.getvalue(seasonGA)
nextCalculationAfter = 30 -- it will be changed by first zone

if logging then logs = {season = season} end -- #TO DELETE

function calcOutOfTheSeason(tag)
    local opened = false
    local firstTimestamp = 0
    local valves = grp.tag(tag)
    
    if logging then logs.zones[#logs.zones].valvesInWinter = {} end -- #TO DELETE
    
    for v = 1, #valves, 1 do
        local valve = valves[v]
        
        if valve.value then
            opened = true
            if firstTimestamp > 0 then
                if firstTimestamp > valve.updatetime then firstTimestamp = valve.updatetime end
            else
                firstTimestamp = valve.updatetime
            end
        end
        
        if logging then logs.zones[#logs.zones].valvesInWinter[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end -- #TO DELETE
    end
    
    return opened, firstTimestamp
end

function calcDuringTheSeason(tag)
    local opened = false
    local firstTimestamp = 0
    local valves = grp.tag(tag)
    
    if logging then logs.zones[#logs.zones].valvesInSummer = {} end -- #TO DELETE
    
    valves = grp.tag(tag)
    for v = 1, #valves, 1 do
      valve = valves[v]
      
      if valve.value then
        opened = true
        if firstTimestamp > 0 then
          if firstTimestamp > valve.updatetime then firstTimestamp = valve.updatetime end
        else
          firstTimestamp = valve.updatetime
        end
      end
      
      if logging then logs.zones[#logs.zones].valvesInSummer[v] = {name = valve.name, value = valve.value, tags = valve.tags, opened = opened, firstTimestamp = firstTimestamp} end -- #TO DELETE
    end
    
    return opened, firstTimestamp
end

if logging then
    logs.season = season
    logs.zones = {}
end -- #TO DELETE

for z, zone in ipairs(zones) do
    local summerTag = zone.summer
    local winterTag = zone.winter
    local pumpGA = zone.pump
    local openingValveTime = zone.offset
    local minInterval = zone.minimum
    
    if logging then
        logs.zones[z] = {
            settings = {
                summerTag = summerTag,
                winterTag = winterTag,
                pumpGA = pumpGA,
                pumpBeforeCmd = grp.getvalue(pumpGA),
                openingValveTime = openingValveTime,
                minInterval = minInterval
            }
        }
    end -- #TO DELETE
    
    -- CALCULATE SINGLE
    
    local opened, firstTimestamp = false, 0
    
    -- Calc valve state and firsttimestamp for update
    if season then
        opened, firstTimestamp = calcDuringTheSeason(winterTag)
    else
        opened, firstTimestamp = calcOutOfTheSeason(summerTag)
    end
    
    if logging then
        logs.zones[z].opened = opened
        logs.zones[z].firstTimestamp = firstTimestamp
    end -- # TO DELETE
    
    -- Find nextZoneCalculationAfter for current zone
    local nextZoneCalculationAfter = 0
    
    if logging then
        local pump = grp.find(pumpGA)
        local pumpState = { name = pump.name, value = pump.value, lastupdate = os.time() - pump.updatetime }
        logs.zones[z].pumpState = {before = pumpState}
    end
    
    if opened then
        local fullyOpened = os.microtime() - firstTimestamp >= openingValveTime
        
        if fullyOpened then
            grp.write(pumpGA, true)
            nextZoneCalculationAfter = minInterval
            if logging then logs.zones[z].info = 'Turn on pump because valve is fully opened. Next calculation after ' .. nextZoneCalculationAfter .. 's.' end -- # TO DELETE
        else
            grp.write(pumpGA, false)
            nextZoneCalculationAfter = openingValveTime + 1 - (os.microtime() - firstTimestamp) -- run a little after possible change
            if logging then logs.zones[z].info = "Turn off pump because valve isn't yet fully opened. Next calculation after " .. nextZoneCalculationAfter .. 's.' end -- # TO DELETE
        end
    else
        grp.write(pumpGA, false)
        nextZoneCalculationAfter = openingValveTime + 1
        if logging then logs.zones[z].info = 'Turn off pump because valve is closed. Next calculation after ' .. nextZoneCalculationAfter .. 's.' end -- # TO DELETE
    end
    
    if logging then
        local pump = grp.find(pumpGA)
        local pumpState = { name = pump.name, value = pump.value, lastupdate = os.time() - pump.updatetime }
        logs.zones[z].pumpState.after = pumpState
    end
    
    -- Update nextCalculationAfter (global)
    if z == 1 or nextCalculationAfter < nextZoneCalculationAfter then
        nextCalculationAfter = nextZoneCalculationAfter
        if logging then logs.zones[z].info = logs.zones[z].info .. ' Variable nextCalculationAfter was changed to ' .. nextZoneCalculationAfter .. '.' end -- # TO DELETE
    end

end

-- log('Next calculation after: ' .. nextCalculationAfter .. 's.')
if nextCalculationAfter and nextCalculationAfter > 5 then
    if logging then
        logs.sleepDescription = 'Calculated ' .. nextCalculationAfter .. 's'
        log(logs)
    end -- # TO DELETE
    os.sleep(nextCalculationAfter)
else
    if logging then
        logs.sleepDescription = 'Default ' .. nextCalculationAfter .. 's (calculated value is 0 or other equal to false)'
        log(logs)
    end -- # TO DELETE
    os.sleep(30)
end

Unfortunately not working.

Here below log:

Circolazione mansarda 29.10.2018 17:10:50
* table:
[zones]
 * table:
  [1]
   * table:
    [info]
     * string: Turn off pump because valve is closed. Next calculation after 61s. Variable nextCalculationAfter was changed to 61.
    [settings]
     * table:
      [pumpGA]
       * string: 2/0/2
      [summerTag]
       * string: summer_pump
      [pumpBeforeCmd]
       * bool: false
      [winterTag]
       * string: winter_pump
      [minInterval]
       * number: 30
      [openingValveTime]
       * number: 60
    [pumpState]
     * table:
      [after]
       * table:
        [lastupdate]
         * number: 0
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
      [before]
       * table:
        [lastupdate]
         * number: 60
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
    [firstTimestamp]
     * number: 0
    [valvesInSummer]
     * table:
      [1]
       * table:
        [value]
         * bool: false
        [firstTimestamp]
         * number: 0
        [name]
         * string: T7 FB Heating floor attic valve
        [opened]
         * bool: false
    [opened]
     * bool: false
[sleepDescription]
 * string: Calculated 61s
[season]
 * bool: true



[size=undefined]
Circolazione mansarda 29.10.2018 17:11:51
* table:
[zones]
 * table:
  [1]
   * table:
    [info]
     * string: Turn off pump because valve isn't yet fully opened. Next calculation after 43s. Variable nextCalculationAfter was changed to 43.
    [settings]
     * table:
      [pumpGA]
       * string: 2/0/2
      [summerTag]
       * string: summer_pump
      [pumpBeforeCmd]
       * bool: false
      [winterTag]
       * string: winter_pump
      [minInterval]
       * number: 30
      [openingValveTime]
       * number: 60
    [pumpState]
     * table:
      [after]
       * table:
        [lastupdate]
         * number: 0
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
      [before]
       * table:
        [lastupdate]
         * number: 61
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
    [firstTimestamp]
     * number: 1540829493
    [valvesInSummer]
     * table:
      [1]
       * table:
        [value]
         * bool: true
        [firstTimestamp]
         * number: 1540829493
        [name]
         * string: T7 FB Heating floor attic valve
        [opened]
         * bool: true
    [opened]
     * bool: true
[sleepDescription]
 * string: Calculated 43s
[season]
 * bool: true
[/size]


[size=undefined]
Circolazione mansarda 29.10.2018 17:12:34
* table:
[zones]
 * table:
  [1]
   * table:
    [info]
     * string: Turn off pump because valve isn't yet fully opened. Next calculation after 59s. Variable nextCalculationAfter was changed to 59.
    [settings]
     * table:
      [pumpGA]
       * string: 2/0/2
      [summerTag]
       * string: summer_pump
      [pumpBeforeCmd]
       * bool: false
      [winterTag]
       * string: winter_pump
      [minInterval]
       * number: 30
      [openingValveTime]
       * number: 60
    [pumpState]
     * table:
      [after]
       * table:
        [lastupdate]
         * number: 0
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
      [before]
       * table:
        [lastupdate]
         * number: 43
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
    [firstTimestamp]
     * number: 1540829552
    [valvesInSummer]
     * table:
      [1]
       * table:
        [value]
         * bool: true
        [firstTimestamp]
         * number: 1540829552
        [name]
         * string: T7 FB Heating floor attic valve
        [opened]
         * bool: true
    [opened]
     * bool: true
[sleepDescription]
 * string: Calculated 59s
[season]
 * bool: true
[/size]


[size=undefined]
Circolazione mansarda 29.10.2018 17:13:33
* table:
[zones]
 * table:
  [1]
   * table:
    [info]
     * string: Turn off pump because valve isn't yet fully opened. Next calculation after 60s. Variable nextCalculationAfter was changed to 60.
    [settings]
     * table:
      [pumpGA]
       * string: 2/0/2
      [summerTag]
       * string: summer_pump
      [pumpBeforeCmd]
       * bool: false
      [winterTag]
       * string: winter_pump
      [minInterval]
       * number: 30
      [openingValveTime]
       * number: 60
    [pumpState]
     * table:
      [after]
       * table:
        [lastupdate]
         * number: 0
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
      [before]
       * table:
        [lastupdate]
         * number: 59
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
    [firstTimestamp]
     * number: 1540829612
    [valvesInSummer]
     * table:
      [1]
       * table:
        [value]
         * bool: true
        [firstTimestamp]
         * number: 1540829612
        [name]
         * string: T7 FB Heating floor attic valve
        [opened]
         * bool: true
    [opened]
     * bool: true
[sleepDescription]
 * string: Calculated 60s
[season]
 * bool: true
[/size]


[size=undefined]
Circolazione mansarda 29.10.2018 17:14:33
* table:
[zones]
 * table:
  [1]
   * table:
    [info]
     * string: Turn off pump because valve isn't yet fully opened. Next calculation after 60s. Variable nextCalculationAfter was changed to 60.
    [settings]
     * table:
      [pumpGA]
       * string: 2/0/2
      [summerTag]
       * string: summer_pump
      [pumpBeforeCmd]
       * bool: false
      [winterTag]
       * string: winter_pump
      [minInterval]
       * number: 30
      [openingValveTime]
       * number: 60
    [pumpState]
     * table:
      [after]
       * table:
        [lastupdate]
         * number: 0
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
      [before]
       * table:
        [lastupdate]
         * number: 60
        [name]
         * string: Pompa Circolazione Mansarda
        [value]
         * bool: false
    [firstTimestamp]
     * number: 1540829672
    [valvesInSummer]
     * table:
      [1]
       * table:
        [value]
         * bool: true
        [firstTimestamp]
         * number: 1540829672
        [name]
         * string: T7 FB Heating floor attic valve
        [opened]
         * bool: true
    [opened]
     * bool: true
[sleepDescription]
 * string: Calculated 60s
[season]
 * bool: true[/size]
Reply


Messages In This Thread
RE: Resident script pump circulation - by Domoticatorino - 29.10.2018, 16:37

Forum Jump: