"Gris, golpe, genial ...", o la lógica del control climático en una casa inteligente

Casa inteligente

Recientemente, el tema del hogar inteligente está ganando cada vez más popularidad, hay cada vez más artículos, reseñas, debates y casi cualquier pregunta en la que pueda encontrar de inmediato algunas opiniones y respuestas. Pero en todo este mundo de información, todavía hay un área blanca, a saber, la lógica del trabajo. No teníamos miedo y decidimos presentar nuestros preparativos sobre este tema al público.

Para empezar, algunas palabras sobre el objeto a equipar con sistemas de automatización. Este es un pequeño edificio de apartamentos, cada uno de los cuales está equipado con sistemas independientes de aire acondicionado, ventilación, calefacción y calefacción por suelo radiante.

Como requisitos principales, el cliente señaló: una interfaz única para administrar todos los sistemas domésticos inteligentes, un presupuesto limitado y una cantidad mínima de cableado adicional. Después de un poco de investigación en el mercado de los sistemas de automatización, nos decidimos por una solución de Fibaro, ya que las principales ventajas de esta solución son la repetición casi perfecta de nuestras condiciones.

En este artículo, describiremos el proceso de creación de una apariencia de un sistema HVAC para un departamento basado en el protocolo Z-Wave. Esperamos recibir un montón de comentarios de la comunidad para llevar nuestra decisión a un estado comestible. Si se logra el resultado esperado, estaremos encantados de continuar este ciclo con otras publicaciones en las que compartiremos nuestra experiencia utilizando dispositivos Z-Wave.

Entonces, describiremos los datos iniciales y las condiciones de operación de nuestro sistema.

En primer lugar, nos preguntamos qué gestionaría todos los sistemas. Como unidad principal, nos instalamos en el controlador Home Center 2. Inicialmente, se planeó crear una red de cinco controladores y organizar el sistema para que un controlador controle todos los apartamentos en un piso del edificio. Pero pronto quedó claro que el sistema no podía construirse de esta manera, ya que HC2 tiene un límite en el número de dispositivos de onda z conectados, y la combinación de los controladores en una red solo extiende el área de cobertura de la red de onda z, pero no aumenta el número máximo permitido de dispositivos conectados . Al mismo tiempo, no se pueden conectar más de 230 dispositivos a un controlador. En consecuencia, solo se pueden conectar 230 dispositivos a cinco controladores integrados en una sola red.Por lo tanto, tuvimos que duplicar el número de controladores en el proyecto y negarnos a integrarlos en una sola red. Ahora un HC2 funcionará para 4-5 apartamentos, lo que nos da la oportunidad de usar de 46 a 57 dispositivos de onda z en cada apartamento.

Después de decidir sobre el controlador principal, surgió la pregunta de qué datos se deben recopilar y cómo hacerlo. Para controlar el clima, debe conocer el estado actual de las cosas en el apartamento, a saber: la temperatura dentro y fuera de la habitación, la humedad, el nivel de CO2, la posición de las ventanas y puertas, la presencia de residentes de la casa. Como el presupuesto del proyecto es limitado, nos negamos a controlar los niveles de humedad y CO2.

Para controlar la temperatura interior, muchos dispositivos de onda z contienen sensores de temperatura integrados que complementan la funcionalidad básica del dispositivo. Y, por supuesto, hay sensores de temperatura en una versión separada. Según nuestro proyecto, en cada apartamento habrá aproximadamente 35 dispositivos que de alguna manera mostrarán el valor de la temperatura. Estos son tres sensores de fugas FIB_FGFS-101, tres transmisores IR REM_ZXT120, termostato RS 014G0160, sensores de movimiento y tres sensores de temperatura DS 18B20 para cada circuito de calefacción de piso y el sistema de calefacción. En primer lugar, es necesario controlar la temperatura del circuito de calefacción por suelo radiante para evitar el sobrecalentamiento del parquet, ya que La temperatura máxima permitida del parquet no excede los 27 grados.

Control de temperatura para proteger el piso del sobrecalentamiento


Control de temperatura para proteger el parquet del sobrecalentamiento

Dado que todos estos valores de temperatura pueden diferir bastante entre sí, dependiendo de dónde esté instalado el dispositivo, para determinar la temperatura en la habitación, calcularemos el valor promedio para todos los indicadores de esta habitación.

Hay dos opciones para determinar la temperatura exterior. En HC2 existe la función de obtener un pronóstico del tiempo para una ciudad, que se establece durante la configuración inicial del controlador. Sin embargo, este método para determinar la temperatura no difiere en una precisión aceptable, por lo que utilizaremos varios sensores DS 18B20 instalados en la fachada externa del edificio para estos fines. Debe tenerse en cuenta que los sensores no deben colocarse directamente en la fachada y evitar la luz solar directa.

En cualquier hogar inteligente, uno de los principales objetivos de su creación es reducir el costo de calefacción y refrigeración de las habitaciones, por lo que es muy importante comprender la posición actual de las ventanas y puertas. Para apagar la calefacción y el aire acondicionado, si una ventana o puerta está abierta, utilizaremos sensores de contacto magnéticos convencionales, y para su integración en la red de ondas z se conectarán a sensores binarios universales FIB_FGBS-001.

Conexión de sensores de temperatura DS18B20

Conexión de sensores de temperatura DS18B20

Para determinar la presencia de residentes, creamos un dispositivo virtual, que es un botón. Al hacer clic en este botón, el usuario informa al sistema que no hay nadie en casa.

Dispositivo virtual: botones de activación del modo hogar / trabajo


Dispositivo virtual: botones de

activación del modo hogar / trabajo Cuando se recibe una señal de que el sistema está vacío, el controlador apaga todos los sistemas HVAC y cambia al modo de ahorro de energía hasta que el usuario esté listo para volver a casa. Mientras está en el modo de ahorro de energía, el sistema continúa controlando la temperatura y no permitirá que la habitación se enfríe y la temperatura caiga por debajo de la marca de 18 grados.

Otro elemento importante del control climático en una sala de estar es el ajuste de temperatura. En nuestra solución, los usuarios pueden cambiarlo de dos maneras. Usando un termostato de pared o usando un dispositivo virtual especialmente creado usando un teléfono inteligente o tableta.

Habiendo tratado de monitorear el estado actual del microclima en el departamento, procedimos a estudiar directamente aquellos dispositivos que teníamos que controlar.

Cada apartamento estará equipado con 3 aires acondicionados fabricados por Mitsubishi Electric. Están planificados para ser controlados utilizando convertidores IR REM_ZXT120. Estos dispositivos tienen configuraciones predefinidas para controlar los modelos más comunes de aires acondicionados de los principales fabricantes, así como la capacidad de aprender comandos IR desde el control remoto.

Además de los aires acondicionados, cada apartamento estará equipado con un sistema independiente de suministro y ventilación por extracción, y el control se organizará mediante relés de dos canales FIB_FGS-222.

Además, todos los apartamentos tendrán siete pisos de calefacción y un circuito de calefacción central. Cada circuito está equipado con una válvula de tres posiciones con un servo actuador. Está controlado por el módulo RGBW FIB_FGRGB-101.

Después de seleccionar y estudiar todo el equipo necesario, nuestra siguiente tarea fue desarrollar el algoritmo de control climático más efectivo y autosuficiente.

Clickable:

Diagrama de bloques con el algoritmo de control climático en el apartamento.

El diagrama de flujo muestra un algoritmo que representa la lógica básica de todo el sistema de control HVAC.

El algoritmo resultante se implementa como un script principal y varios auxiliares. En HC2, estos scripts se llaman escenas y están escritos en lua.
Para no cargar demasiado el controlador, las escenas se activan solo cuando se activan los llamados disparadores.

Para la escena principal, los siguientes eventos actúan como desencadenantes:

  • uno de los indicadores de temperatura cambiará en más de un grado
  • el usuario cambió el punto de ajuste de temperatura
  • el usuario activó / desactivó el modo en el trabajo
  • la ventana o puerta (a la logia o entrada) estaban abiertas / cerradas

Código de script principal
--[[
%% properties
3 Temperature   --  
85 value		--  1
86 value		--  2
87 value		--  3

%% events

%% globals
tempSet
--]]

local temp1 = tonumber(fibaro:getValue(85, "value")) --   1
local temp2 = tonumber(fibaro:getValue(86, "value"))--   2
local temp3 = tonumber(fibaro:getValue(87, "value"))--   3
local tempOUT = tonumber(fibaro:getValue(3, "Temperature"))--    
local IDCooler = 99   -- 
local IDCond = 100 -- 
local IDCondHeat = 102 --   ( )
local IDFloor = 23 --  
local IDHeat = 24 -- 

local tempset = fibaro:getGlobalValue("tempSet")
local workmode = fibaro:getGlobalValue("Workmode")


local tempInside = (temp1 + temp2 + temp3) / 3
local date = os.date("!*t", now)
local currtime = date.hour*60 + date.min --   
local d = tempset - tempInside
local w = tempset - tempOUT


--globals:  
--	Workmode
--	TempSet
-- 	WinStatus
--	Isventnow
--	CHeating

local cHeating = "on"
local winStatus = "closed"

print("Starting Climate Control")
print("t   = "..tempInside..",  t  = "..tempset)
print("Workmode: "..workmode..",  Windows: "..winStatus,",  Central Heating: "..cHeating)

--   
if (fibaro:getGlobalValue("Workmode1") == "At work") 
then 
    -- 
	if (tempInside < 18) 
    then -- 
    	if (cHeating == "on")
    	then --  
    		print(" ")
      		fibaro:call(IDHeat, "turnOn")
      		if(Isventnow == "no")
        	then
      			fibaro:call(IDCooler, "turnOff")
      		end
            fibaro:call(IDCondHeat, "turnOff")
      		fibaro:call(IDCond, "turnOff")
      		fibaro:call(IDFloor, "turnOff")
      	elseif (windows == "closed")
      	then --   
     		print("  ")
      		fibaro:call(IDCondHeat, "turnOn")
      		fibaro:call(IDCond, "turnOn")
      		fibaro:call(IDFloor, "turnOff")
     		if(Isventnow == "no")
        	then
      			fibaro:call(IDCooler, "turnOff")
      		end      
      		fibaro:call(IDHeat, "turnOff")
      	end
    --    
    elseif (tempInside > 21)
    then -- 
		if(fibaro:getValue(IDHeat, value) >0)
		then
    		print(" ")
    		fibaro:call(IDHeat, "turnOff")
		else
        	fibaro:call(IDCondHeat, "turnOn")
      		fibaro:call(IDCond, "turnOn")
      		fibaro:call(IDFloor, "turnOff")
            if(Isventnow == "no")
        	then
      			fibaro:call(IDCooler, "turnOff")
      		end
		end
    end 
--    
elseif d < 1 and d > -1
then
  	print(" ")
    -- 
	fibaro:call(IDCondHeat, "turnOff")
    fibaro:call(IDCond, "turnOff")
	-- 
    if(Isventnow == "no")
    then
		fibaro:call(IDCooler, "turnOff")
    end
	-- 
	fibaro:call(IDHeat, "turnOff")
	--  
	fibaro:call(IDFloor, "turnOff")
--    
elseif (cHeating == "on")
then --  
    if (d >= 1)
    then  --
        if (d <= 3)
        then 
    		print("  ")
            --  
            fibaro:call(IDFloor, "turnOn")		
            fibaro:call(IDCondHeat, "turnOff")
            fibaro:call(IDCond, "turnOff")
            fibaro:call(IDHeat, "turnOff")
            fibaro:call(IDCooler, "turnOff")
        elseif (d > 3)
        then
    		print("    ")
			--  
    		fibaro:call(IDFloor, "turnOn")
            -- 
    		fibaro:call(IDHeat, "turnOn")
			fibaro:call(IDCondHeat, "turnOff")
      		fibaro:call(IDCond, "turnOff")
      	    if(Isventnow == "no")
    		then
				fibaro:call(IDCooler, "turnOff")
    		end
        end
    elseif (d <= -1)
    then --
  		print(" ")
        --  
  		if(Isventnow == "no")
   	 	then
			fibaro:call(IDCooler, "turnOn")
    	end
        lastCondition = currTime
    end
--   
elseif (cHeating == "off")
then --
    if (d >= 1)
    then
        if (w <= 0)
        then
    		print(" ")
            --  
    		if(Isventnow == "no")
      		then
				fibaro:call(IDCooler, "turnOn")
    		end
    		fibaro:call(IDCondHeat, "turnOff")    
			lastCondition = currTime
        elseif (d < 4)
        then 
    		print(" ")
			--  
    		fibaro:call(IDCondHeat, "turnOff")
      		if(Isventnow == "no")
    		then
				fibaro:call(IDCooler, "turnOn")
    		end
        	lastCondition = currTime
        elseif (winStatus == "closed")
        then
    		print("   ")
			--    
    		fibaro:call(IDCondHeat, "turnOn")
      		fibaro:call(IDCond, "turnOn")    
      		if(Isventnow == "no")
    		then
				fibaro:call(IDCooler, "turnOff")
    		end
        end
    elseif (d <= -1)
    then --
		if(w >= 0)
		then
	    	if(d > -4)
	    	then
     			print(" ")
	        	--  
                if(Isventnow == "no")
                then
                    fibaro:call(IDCooler, "turnOn")
                end
    			fibaro:call(IDCondHeat, "turnOff")
      			fibaro:call(IDCond, "turnOff")
	    	elseif (winStatus == "closed")
        	then
      			print(" ")
	        	--  
      			fibaro:call(IDCond, "turnOn")
      			fibaro:call(IDCondHeat, "turnOff")
                if(Isventnow == "no")
                then
                    fibaro:call(IDCooler, "turnOff")
                end
	    	end
		elseif (winStatus == "closed")
      	then
    		print(" ")
	    	--  
   			fibaro:call(IDCond, "turnOn")
      		fibaro:call(IDCondHeat, "turnOff")    
            if(Isventnow == "no")
            then
                fibaro:call(IDCooler, "turnOff")
            end
		end
    end
end     


Como puede ver en el código de la escena principal, en su trabajo utiliza variables globales:

  • Workmode {«at work», «at home»} //
  • TempSet //
  • WinStatus {'opened", «closed»} // ( )
  • CHeating {«on»,«off»} //

El monitoreo de la posición actual de ventanas y puertas en el departamento se llevará a cabo mediante una escena auxiliar. El resultado de su trabajo se almacena en la variable global WinStatus. Además, una escena separada controla el cambio de temperatura de los sensores cerca de las bombas de calefacción central en el sótano del edificio y determina si la calefacción central está encendida. El resultado de su trabajo se almacena en la variable global CHeating.

Dado que es muy importante para la comodidad que el aire en el apartamento sea fresco, decidimos que sería correcto hacer un sistema de ventilación forzada de las habitaciones a través de la ventilación de suministro y escape. Si durante las últimas tres horas la ventilación no funcionó, se iniciará automáticamente un escenario de ventilación de la habitación con una duración de 15 minutos. La ventilación forzada no se lleva a cabo si el modo "en el trabajo".

Escritura de ventilación forzada
function vent_forced()
  
local workmode = fibaro:getGlobal('Workmode')
local isventnow = fibaro:getGlobal('Isventnow')
local lastModified = fibaro:getGlobalModificationTime('Isventnow')
  if ((os.time() - lastModified) < 10800) then
    	print ("       "..(os.time() - lastModified))
    	print ("     3- ")
  end 
	if ( workmode == 'At home' and isventnow == 'no' and (os.time() - lastModified) > 10800 ) then
	 	print ("       "..(os.time() - lastModified))
    		fibaro:call(99, "turnOn")
		fibaro:setGlobal('Isventnow', 'yes')
 		print ("     3 ")
		print ("   ")
    		fibaro:sleep(900000)
		fibaro:call(99, "turnOff")
    		fibaro:setGlobal('Isventnow', 'no')
		print ("   ")
	end 
end

 local sourceTrigger = fibaro:getSourceTrigger()
	if (sourceTrigger["type"] == "autostart") then
   		while true do
       		fibaro:debug('  ')
        		local currentDate = os.date("*t")
			if (currentDate.min >= 0 and currentDate.min <= 60) then
          		vent_forced()
          		end
		fibaro:debug(' ,    1 ')
  		fibaro:sleep(3600*1000)
        end
end


Así es como planeamos resolver el problema. Todavía hay muchas preguntas en la agenda, muchos problemas por resolver y muchas dificultades por superar. Esta es nuestra prueba de la pluma, le pedimos que la trate con amabilidad y comprensión.

Source: https://habr.com/ru/post/es398391/


All Articles