Skip to content

Управление котлом по кривым отопления (DRAFT)

Это заготовка статьи.

Управление по заданному массиву ПЗА

Сценарий:

lua
--функция для поиска уставки в кривой отопления
function getust(tbl, val)
    for i = 1, #tbl do
        if        (tbl[i][1] >= val )  then  return  tbl[i][2]  end 
    end return 30
end

--функция для получения значения температуры с другого контроллера SLS. В примере используется Zigbee датчик температуры, размещенный на веранде. 
function getrequest(url, ieee,name)
  return http.request2(url.."/api/zigbee?dev="..ieee.."&action=getStateValue&name="..name.."&token=e9d38bedb6412e.....ed9575","POST", "Content-Type: text/text; charset=utf-8\r\n", "body")
end

local url = "http://192.168.1.48"
local  temp_veranda = getrequest(url, "0xA4C138A5A7994B63","temperature")

--функция расчета среднего значения.
function math.average(t)
  local sum = 0
  for _,v in pairs(t) do -- Get the sum of all numbers in t
    sum = sum + v
  end
  return sum / #t
end

--кривая отопления, может быть изменена в зависимости от теплоемкости помещения
local krivaya = {    
 {-31,52},{-30,51},{-29,50},{-28,49},{-27,48.5},{-26,48},{-25,47.5}, {-24,47},{-23,46.5},{-22,46}, {-21,45.5},{-20,45},{-19,44.5},{-18,44}, {-17,43.5},{-16,43},{-15,42.5},{-14,42},{-13,41.5},{-12,41},{-11,40.5},
 {-10,40}, {-9,39.5}, {-8,39}, {-7,38.5},{-6,38}, {-5,37.5},{-4,37}, {-3,36.5},{-2,36},{-1,35.5},{0,34},{1,33.5},{2,33},{3,33},{4,33},{5,32.5},{6,32.5},{7,32},{8,32},{9,31.5},{10,31.5},{11,31},{12,31},{13,30},{14,25},
 {15,25},{16,25},{17,25},{18,25},{19,25}}

--
local ul  = '1w.28-96A907D6013C/temperature'  						  --датчик ds18b2, подключенный к SLS DIN MIN
local ul_temp, prev_ul_temp = obj.get(ul)    						  --получение старого и нового значения уличной температуры
local new_ust, prev_ust = obj.get('thermo.boiler.target_temperature') --получение текущего значения уставки 
local ul_ot, prev_ul_ot = obj.get('thermo.boiler.temperature_outside')--получение уличной температуры с котла по ОТ

--берем средние значения уличной температуры
local ul_average=math.average({ul_temp,ul_ot,temp_veranda})
local temp_average, prev_temp_average   	  = obj.get("average_temp")

--вводим коэффициент теплоемкости
local k=1.1
local ust=getust(krivaya, ul_temp)*k   --расчет необходимой температуры для внесения уставки

--меняем уставку при необходимости 
if (ust~=new_ust) then
telegram.send("На улице ".. string.format ("%.2f", ul_average) .."("..ul_temp..","..ul_ot..","..temp_veranda.."), установлена уставка котла "..ust.." градусов, средняя температура в доме "..string.format ("%.2f", temp_average))
thermo.setBoilerTemperature(ust)
end
--функция для поиска уставки в кривой отопления
function getust(tbl, val)
    for i = 1, #tbl do
        if        (tbl[i][1] >= val )  then  return  tbl[i][2]  end 
    end return 30
end

--функция для получения значения температуры с другого контроллера SLS. В примере используется Zigbee датчик температуры, размещенный на веранде. 
function getrequest(url, ieee,name)
  return http.request2(url.."/api/zigbee?dev="..ieee.."&action=getStateValue&name="..name.."&token=e9d38bedb6412e.....ed9575","POST", "Content-Type: text/text; charset=utf-8\r\n", "body")
end

local url = "http://192.168.1.48"
local  temp_veranda = getrequest(url, "0xA4C138A5A7994B63","temperature")

--функция расчета среднего значения.
function math.average(t)
  local sum = 0
  for _,v in pairs(t) do -- Get the sum of all numbers in t
    sum = sum + v
  end
  return sum / #t
end

--кривая отопления, может быть изменена в зависимости от теплоемкости помещения
local krivaya = {    
 {-31,52},{-30,51},{-29,50},{-28,49},{-27,48.5},{-26,48},{-25,47.5}, {-24,47},{-23,46.5},{-22,46}, {-21,45.5},{-20,45},{-19,44.5},{-18,44}, {-17,43.5},{-16,43},{-15,42.5},{-14,42},{-13,41.5},{-12,41},{-11,40.5},
 {-10,40}, {-9,39.5}, {-8,39}, {-7,38.5},{-6,38}, {-5,37.5},{-4,37}, {-3,36.5},{-2,36},{-1,35.5},{0,34},{1,33.5},{2,33},{3,33},{4,33},{5,32.5},{6,32.5},{7,32},{8,32},{9,31.5},{10,31.5},{11,31},{12,31},{13,30},{14,25},
 {15,25},{16,25},{17,25},{18,25},{19,25}}

--
local ul  = '1w.28-96A907D6013C/temperature'  						  --датчик ds18b2, подключенный к SLS DIN MIN
local ul_temp, prev_ul_temp = obj.get(ul)    						  --получение старого и нового значения уличной температуры
local new_ust, prev_ust = obj.get('thermo.boiler.target_temperature') --получение текущего значения уставки 
local ul_ot, prev_ul_ot = obj.get('thermo.boiler.temperature_outside')--получение уличной температуры с котла по ОТ

--берем средние значения уличной температуры
local ul_average=math.average({ul_temp,ul_ot,temp_veranda})
local temp_average, prev_temp_average   	  = obj.get("average_temp")

--вводим коэффициент теплоемкости
local k=1.1
local ust=getust(krivaya, ul_temp)*k   --расчет необходимой температуры для внесения уставки

--меняем уставку при необходимости 
if (ust~=new_ust) then
telegram.send("На улице ".. string.format ("%.2f", ul_average) .."("..ul_temp..","..ul_ot..","..temp_veranda.."), установлена уставка котла "..ust.." градусов, средняя температура в доме "..string.format ("%.2f", temp_average))
thermo.setBoilerTemperature(ust)
end

Управление по аппроксимированным кривым отопления ПЗА от @Deimon9603 на основе статьи

lua
local ul  = "1w.28-D16D2A4E2001/temperature"    --установленный на улице датчик температуры  
local ul_temp = obj.get(ul)  
local k = 0.4                                   --коэффициент отопительной кривой (изменяется в зависимости от теплового контура дома)
local a = -0.21 * k - 0.06
local b = 6.04 * k + 1.98
local c = -5.06 * k + 18.06
local x = -0.2 * ul_temp + 5     
local new_ust = math.floor ((a * x ^ 2) + (b * x) + c)
local ust = obj.get("thermo.boiler.target_temperature")
local min_temp = 35                             -- уставка минимальной температуры теплоносителя
if new_ust == min_temp then                     
  end
if new_ust < min_temp then
   thermo.setBoilerTemperature(min_temp)
end
if ust ~= new_ust then
   thermo.setBoilerTemperature(new_ust)
end
local ul  = "1w.28-D16D2A4E2001/temperature"    --установленный на улице датчик температуры  
local ul_temp = obj.get(ul)  
local k = 0.4                                   --коэффициент отопительной кривой (изменяется в зависимости от теплового контура дома)
local a = -0.21 * k - 0.06
local b = 6.04 * k + 1.98
local c = -5.06 * k + 18.06
local x = -0.2 * ul_temp + 5     
local new_ust = math.floor ((a * x ^ 2) + (b * x) + c)
local ust = obj.get("thermo.boiler.target_temperature")
local min_temp = 35                             -- уставка минимальной температуры теплоносителя
if new_ust == min_temp then                     
  end
if new_ust < min_temp then
   thermo.setBoilerTemperature(min_temp)
end
if ust ~= new_ust then
   thermo.setBoilerTemperature(new_ust)
end

Управление PID-регулированием

Это заготовка статьи.

Полезные ссылки

Логика управления котлом Vaillant

ПИД-регулятор своими руками

ПИД РЕГУЛЯТОР (урок от AlexGyver)

Кривая отопления. Что это и как ее настроить? (заметка на Дзене)

SLS: управление газовым котлом (заметка от Igor Kandaurov)