10 hours ago
Good morning,
I'm having a problem with the functions and I don't know how to solve it.
Here's the problem:
I currently have three logic machines taking KNX data from temperature, humidity, and CO2 sensors. I need them to calculate the average temperature, CO2, and humidity. But I only want to calculate this for the sensors located in rented properties.
I have the following variables.
Rented or non-rented status of 27 dwellings in group addresses from 2/0/176 to 2/0/202:
- Rented = 1
- Non-rented = 0
Temperature values delivered by each dwelling sensor:
'0/0/11','0/0/27','0/0/43','0/0/59','0/0/75','0/0/91','0/0/107',
'0/0/123','0/0/139','0/0/155','0/0/171','0/0/187','0/0/203',
'0/0/219','0/0/235','0/0/251',
'0/1/11','0/1/27','0/1/43','0/1/59','0/1/75','0/1/91','0/1/107',
'0/1/123','0/1/139','0/1/155','0/1/171'
Variable where the average building temperature will be stored:
2/0/164
And now I'll show you the code I wrote:
-- Direcciones de estado de las 27 viviendas (0=libre, 1=alquilada, 2=mantenimiento, 3=ocupada)
local estados = {}
for i = 1, 27 do
estados[i] = '2/0/' .. (175 + i) -- 176 → 202
end
-- Direcciones de temperatura individuales
local direcciones_temp = {
'0/0/11','0/0/27','0/0/43','0/0/59','0/0/75','0/0/91','0/0/107',
'0/0/123','0/0/139','0/0/155','0/0/171','0/0/187','0/0/203',
'0/0/219','0/0/235','0/0/251',
'0/1/11','0/1/27','0/1/43','0/1/59','0/1/75','0/1/91','0/1/107',
'0/1/123','0/1/139','0/1/155','0/1/171'
}
-- Dirección donde guardar la temperatura media
local destino1 = '2/0/164'
-- Rango válido de temperaturas
local min_temp = -20
local max_temp = 60
-- Intervalo de espera: 5 minutos (300 segundos)
local INTERVALO = 300
-- ============================================================
-- BUCLE PRINCIPAL (TU MISMO CÓDIGO, REPITIÉNDOSE PARA SIEMPRE)
-- ============================================================
while true do
local suma = 0
local contador = 0
-- Recorrer las 27 viviendas
for i = 1, 27 do
local estado = grp.getvalue(estados[i])
local valor = grp.getvalue(direcciones_temp[i])
-- Solo usar temperatura si la vivienda está alquilada
if estado == 1 then
if valor ~= nil and type(valor) == "number" then
if valor >= min_temp and valor <= max_temp then
suma = suma + valor
contador = contador + 1
else
log("Temperatura fuera de rango en " .. direcciones_temp[i] .. ": " .. tostring(valor))
end
else
log("Valor de temperatura inválido o nulo en " .. direcciones_temp[i])
end
end
end
-- Guardar la media si hay datos válidos
if contador > 0 then
local media = suma / contador
grp.write(destino1, media)
log("Temperatura media (solo alquilados) actualizada en " .. destino1 .. ": " .. media)
else
log("No hay viviendas alquiladas con temperatura válida para calcular la media")
end
-- Esperar 5 minutos antes de repetir
os.sleep(INTERVALO)
end
Lo he intentado por todos los medios posibles y no me calcula la temperatura media y cuando lo hace satura la memoria de la logic machine.
I'm having a problem with the functions and I don't know how to solve it.
Here's the problem:
I currently have three logic machines taking KNX data from temperature, humidity, and CO2 sensors. I need them to calculate the average temperature, CO2, and humidity. But I only want to calculate this for the sensors located in rented properties.
I have the following variables.
Rented or non-rented status of 27 dwellings in group addresses from 2/0/176 to 2/0/202:
- Rented = 1
- Non-rented = 0
Temperature values delivered by each dwelling sensor:
'0/0/11','0/0/27','0/0/43','0/0/59','0/0/75','0/0/91','0/0/107',
'0/0/123','0/0/139','0/0/155','0/0/171','0/0/187','0/0/203',
'0/0/219','0/0/235','0/0/251',
'0/1/11','0/1/27','0/1/43','0/1/59','0/1/75','0/1/91','0/1/107',
'0/1/123','0/1/139','0/1/155','0/1/171'
Variable where the average building temperature will be stored:
2/0/164
And now I'll show you the code I wrote:
-- Direcciones de estado de las 27 viviendas (0=libre, 1=alquilada, 2=mantenimiento, 3=ocupada)
local estados = {}
for i = 1, 27 do
estados[i] = '2/0/' .. (175 + i) -- 176 → 202
end
-- Direcciones de temperatura individuales
local direcciones_temp = {
'0/0/11','0/0/27','0/0/43','0/0/59','0/0/75','0/0/91','0/0/107',
'0/0/123','0/0/139','0/0/155','0/0/171','0/0/187','0/0/203',
'0/0/219','0/0/235','0/0/251',
'0/1/11','0/1/27','0/1/43','0/1/59','0/1/75','0/1/91','0/1/107',
'0/1/123','0/1/139','0/1/155','0/1/171'
}
-- Dirección donde guardar la temperatura media
local destino1 = '2/0/164'
-- Rango válido de temperaturas
local min_temp = -20
local max_temp = 60
-- Intervalo de espera: 5 minutos (300 segundos)
local INTERVALO = 300
-- ============================================================
-- BUCLE PRINCIPAL (TU MISMO CÓDIGO, REPITIÉNDOSE PARA SIEMPRE)
-- ============================================================
while true do
local suma = 0
local contador = 0
-- Recorrer las 27 viviendas
for i = 1, 27 do
local estado = grp.getvalue(estados[i])
local valor = grp.getvalue(direcciones_temp[i])
-- Solo usar temperatura si la vivienda está alquilada
if estado == 1 then
if valor ~= nil and type(valor) == "number" then
if valor >= min_temp and valor <= max_temp then
suma = suma + valor
contador = contador + 1
else
log("Temperatura fuera de rango en " .. direcciones_temp[i] .. ": " .. tostring(valor))
end
else
log("Valor de temperatura inválido o nulo en " .. direcciones_temp[i])
end
end
end
-- Guardar la media si hay datos válidos
if contador > 0 then
local media = suma / contador
grp.write(destino1, media)
log("Temperatura media (solo alquilados) actualizada en " .. destino1 .. ": " .. media)
else
log("No hay viviendas alquiladas con temperatura válida para calcular la media")
end
-- Esperar 5 minutos antes de repetir
os.sleep(INTERVALO)
end
Lo he intentado por todos los medios posibles y no me calcula la temperatura media y cuando lo hace satura la memoria de la logic machine.