"Cinza, golpe, legal ...", ou a lógica do controle do clima em uma casa inteligente

Casa inteligente

Recentemente, o tópico de casa inteligente está ganhando cada vez mais popularidade, há mais e mais artigos, resenhas, discussões e quase todas as perguntas que você pode encontrar imediatamente algumas opiniões e respostas. Mas em todo o mundo da informação, ainda existe uma área branca, a lógica do trabalho. Não sentimos medo e decidimos enviar nossos preparativos para esse assunto ao público.

Para começar, algumas palavras sobre o objeto a ser equipado com sistemas de automação. Este é um pequeno prédio de apartamentos, cada apartamento equipado com sistemas independentes de ar-condicionado, ventilação, aquecimento e aquecimento de piso.

Como principais requisitos, o cliente observou: uma interface única para gerenciar todos os sistemas domésticos inteligentes, um orçamento limitado e uma quantidade mínima de fiação adicional. Após uma pequena pesquisa no mercado de sistemas de automação, decidimos por uma solução da Fibaro, já que as principais vantagens dessa solução são quase perfeitamente repetir nossas condições.

Neste artigo, descreveremos o processo de criação de uma aparência de um sistema HVAC para um apartamento com base no protocolo Z-Wave. Esperamos receber muitos comentários da comunidade para levar nossa decisão a um estado comestível. Se o resultado esperado for alcançado, teremos o maior prazer em continuar este ciclo com outras publicações nas quais compartilharemos nossa experiência usando dispositivos Z-Wave.

Portanto, descreveremos os dados iniciais e as condições operacionais do nosso sistema.

Primeiro de tudo, imaginamos o que gerenciaria todos os sistemas. Como unidade principal, instalamos o controlador Home Center 2. Inicialmente, planejava-se criar uma rede de cinco controladores e organizar o sistema para que um controlador controlasse todos os apartamentos em um andar do edifício. Mas logo ficou claro que o sistema não podia ser construído dessa maneira, uma vez que o HC2 tem um limite no número de dispositivos de onda z conectados, e a combinação dos controladores em uma rede apenas estende a área de cobertura da rede de ondas z, mas não aumenta o número máximo permitido de dispositivos conectados . Ao mesmo tempo, não é possível conectar mais de 230 dispositivos a um controlador. Assim, apenas 230 dispositivos ainda podem ser conectados a cinco controladores integrados em uma única rede.Portanto, tivemos que dobrar o número de controladores no projeto e nos recusar a integrá-los em uma única rede. Agora, um HC2 funcionará para 4-5 apartamentos, o que nos dá a oportunidade de usar de 46 a 57 dispositivos de onda z em cada apartamento.

Depois que decidimos sobre o controlador principal, surgiu a questão de quais dados deveriam ser coletados e como fazê-lo. Para gerenciar o clima, você precisa conhecer a situação atual do apartamento, a saber: temperatura dentro e fora da sala, umidade, nível de CO2, posição de janelas e portas, presença de moradores da casa. Como o orçamento do projeto é limitado, nos recusamos a monitorar os níveis de umidade e CO2.

Para monitorar a temperatura interna, muitos dispositivos de onda z contêm sensores de temperatura integrados que complementam a funcionalidade básica do dispositivo. E, é claro, existem sensores de temperatura em uma versão separada. De acordo com o nosso projeto, em cada apartamento, haverá aproximadamente 35 dispositivos que de alguma forma mostrarão o valor da temperatura. Estes são três sensores de vazamento FIB_FGFS-101, três transmissores IR REM_ZXT120, termostato RS 014G0160, sensores de movimento e três sensores de temperatura DS 18B20 para cada circuito de aquecimento de piso e sistema de aquecimento. É necessário monitorar a temperatura do circuito de aquecimento de piso para evitar o superaquecimento do parquet, como a temperatura máxima permitida do parquet não exceda 27 graus.

Controle de temperatura para proteger o piso contra superaquecimento


Controle de temperatura para proteger o parquet de superaquecimento

Como todos esses valores de temperatura podem diferir bastante um do outro, dependendo de onde o dispositivo está instalado - para determinar a temperatura na sala, calcularemos o valor médio para todos os indicadores desta sala.

Existem duas opções para determinar a temperatura externa. No HC2, existe a função de obter uma previsão do tempo para uma cidade, que é definida durante a configuração inicial do controlador. No entanto, esse método de determinação da temperatura não difere em precisão aceitável; portanto, para esses fins, usaremos vários sensores DS 18B20 instalados na fachada externa do edifício. Deve-se ter em mente que os sensores não devem ser colocados diretamente na fachada e evitar a luz solar direta.

Em qualquer casa inteligente, um dos principais objetivos de sua criação é reduzir o custo de aquecimento e refrigeração, tornando-se muito importante entender a posição atual de janelas e portas. Para desligar o aquecimento e o ar condicionado, se uma janela ou porta estiver aberta, usaremos sensores de contato magnéticos convencionais e, para sua integração na rede de ondas z, eles serão conectados aos sensores binários universais FIB_FGBS-001.

Conexão de sensores de temperatura DS18B20

Conexão de sensores de temperatura DS18B20

Para determinar a presença de moradores, criamos um dispositivo virtual, que é um botão. Ao clicar neste botão, o usuário informa ao sistema que não há ninguém em casa.

Dispositivo virtual - botões de ativação do modo de casa / trabalho


Botões de habilitação do dispositivo virtual - modo residencial / comercial

Quando é recebido um sinal de que o sistema está vazio, o controlador desliga todos os sistemas HVAC e passa para o modo de economia de energia até que o usuário esteja pronto para voltar para casa. Enquanto estiver no modo de economia de energia, o sistema continua a controlar a temperatura e não permitirá o resfriamento da sala e a temperatura cai abaixo da marca de 18 graus.

Outro elemento importante do controle do clima na sala de estar é o ajuste da temperatura. Em nossa solução, os usuários podem alterá-lo de duas maneiras. Usando um termostato de parede ou usando um dispositivo virtual especialmente criado usando um smartphone ou tablet.

Tendo lidado com o monitoramento do estado atual do microclima no apartamento, passamos a estudar diretamente os dispositivos que precisávamos controlar.

Cada apartamento será equipado com 3 aparelhos de ar condicionado fabricados pela Mitsubishi Electric. Eles estão planejados para serem controlados usando os conversores IR REM_ZXT120. Esses dispositivos têm configurações predefinidas para controlar os modelos mais comuns de aparelhos de ar condicionado dos principais fabricantes, além da capacidade de aprender comandos de infravermelho no controle remoto.

Além dos aparelhos de ar condicionado, cada apartamento será equipado com um sistema independente de ventilação de suprimento e exaustão e será controlado por relés de dois canais FIB_FGS-222.

Além disso, todos os apartamentos terão sete pisos de aquecimento e um circuito de aquecimento central. Cada circuito está equipado com uma válvula de três posições com um servo atuador. É controlado pelo módulo RGBW FIB_FGRGB-101.

Após selecionar e estudar todo o equipamento necessário, nossa próxima tarefa foi desenvolver o algoritmo de controle climático mais eficaz e auto-suficiente.

Clicável:

Diagrama de blocos com o algoritmo de controle climático no apartamento

O fluxograma mostra um algoritmo que representa a lógica básica de todo o sistema de controle de HVAC.

O algoritmo resultante é implementado como um script principal e vários auxiliares. No HC2, esses scripts são chamados de cenas e são escritos em lua.
Para não carregar muito o controlador, as cenas são acionadas apenas quando os chamados gatilhos são acionados.

Para a cena principal, os seguintes eventos atuam como gatilhos:

  • um dos indicadores de temperatura mudará em mais de um grau
  • usuário alterou o ponto de ajuste de temperatura
  • usuário ligado / desligado o modo no trabalho
  • janela ou porta (para a loggia ou entrada) foram abertas / fechadas

Código do 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 você pode ver no código da cena principal, em seu trabalho ela usa variáveis ​​globais:

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

O monitoramento da posição atual das janelas e portas do apartamento será realizado por uma cena auxiliar. O resultado do seu trabalho é armazenado na variável global WinStatus. Além disso, uma cena separada controla a mudança de temperatura dos sensores próximos às bombas de aquecimento central no porão do edifício e determina se o aquecimento central está ligado. O resultado do seu trabalho é armazenado na variável global CHeating.

Como é muito importante para o conforto que o ar do apartamento seja fresco, decidimos que seria correto fazer um sistema de ventilação forçada dos quartos através da ventilação de suprimento e exaustão. Se durante as últimas três horas a ventilação não funcionar, será iniciado automaticamente um cenário de arejamento da sala com duração de 15 minutos. A ventilação forçada não é realizada se o modo "no trabalho".

Script de ventilação forçada
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


É assim que planejamos resolver o problema. Ainda há muitas questões em pauta, muitos problemas a serem resolvidos e muitas dificuldades a serem superadas. Este é o nosso teste da caneta, pedimos que você trate com gentileza e compreensão.

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


All Articles