"Gray, blow, cool ...", atau logika kontrol iklim di rumah pintar

Rumah pintar

Baru-baru ini, topik rumah pintar semakin populer, ada semakin banyak artikel, ulasan, diskusi, dan hampir semua pertanyaan Anda dapat segera menemukan beberapa pendapat dan jawaban. Namun di seluruh dunia informasi ini, masih ada satu area putih, yaitu logika kerja. Kami tidak takut dan memutuskan untuk menyerahkan persiapan kami tentang masalah ini kepada publik.

Untuk mulai dengan, beberapa kata tentang objek yang akan dilengkapi dengan sistem otomasi. Ini adalah bangunan apartemen kecil, masing-masing apartemen dilengkapi dengan AC, ventilasi, pemanas, dan sistem pemanas lantai independen.

Sebagai persyaratan utama, pelanggan mencatat: antarmuka tunggal untuk mengelola semua sistem rumah pintar, anggaran terbatas dan jumlah minimum kabel tambahan. Setelah sedikit riset ke pasar sistem otomasi, kami menetapkan solusi dari Fibaro, karena keunggulan utama dari solusi ini hampir sempurna mengulangi kondisi kami.

Pada artikel ini, kami akan menjelaskan proses menciptakan kemiripan sistem HVAC untuk apartemen berdasarkan protokol Z-Wave. Kami berharap mendapat banyak komentar dari komunitas untuk membawa keputusan kami ke kondisi yang dapat dimakan. Jika hasil yang diharapkan tercapai, maka kami akan dengan senang hati melanjutkan siklus ini dengan publikasi lain di mana kami akan berbagi pengalaman kami menggunakan perangkat Z-Wave.

Jadi, kami akan menjelaskan data awal dan kondisi operasi sistem kami.

Pertama-tama, kami bertanya-tanya apa yang akan mengatur semua sistem. Sebagai unit kepala, kami menetapkan pengontrol Home Center 2. Awalnya, direncanakan untuk membuat jaringan lima pengontrol dan mengatur sistem sehingga satu pengontrol mengendalikan semua apartemen di satu lantai gedung. Tetapi segera menjadi jelas bahwa sistem tidak dapat dibangun dengan cara ini, karena HC2 memiliki batasan pada jumlah perangkat gelombang-z yang terhubung, dan menggabungkan pengontrol ke dalam satu jaringan hanya memperluas area jangkauan jaringan gelombang-z, tetapi tidak meningkatkan jumlah maksimum perangkat yang terhubung yang diizinkan. . Pada saat yang sama, tidak lebih dari 230 perangkat dapat dihubungkan ke satu pengontrol. Dengan demikian, hanya 230 perangkat yang masih dapat dihubungkan ke lima pengontrol yang terintegrasi ke dalam satu jaringan.Oleh karena itu, kami harus menggandakan jumlah pengontrol dalam proyek dan menolak untuk mengintegrasikannya ke dalam satu jaringan. Sekarang satu HC2 akan bekerja untuk 4-5 apartemen, yang memberi kita kesempatan untuk menggunakan 46- 57 perangkat gelombang-z di setiap apartemen.

Setelah kami memutuskan pengendali utama, muncul pertanyaan tentang data apa yang harus dikumpulkan dan bagaimana melakukannya. Untuk mengelola iklim, Anda perlu mengetahui keadaan terkini di apartemen, yaitu: suhu di dalam dan di luar ruangan, kelembaban, tingkat CO2, posisi jendela dan pintu, keberadaan penghuni rumah. Karena anggaran proyek terbatas, kami menolak untuk memantau tingkat kelembaban dan CO2.

Untuk memantau suhu dalam ruangan, banyak perangkat gelombang-z yang berisi sensor suhu terpasang yang melengkapi fungsi dasar perangkat. Dan, tentu saja, ada sensor suhu dalam versi terpisah. Menurut proyek kami, di setiap apartemen akan ada sekitar 35 perangkat yang entah bagaimana akan menunjukkan nilai suhu. Ini adalah tiga sensor kebocoran FIB_FGFS-101, tiga pemancar IR REM_ZXT120, termostat RS 014G0160, sensor gerak, dan tiga sensor suhu DS 18B20 untuk setiap sirkuit pemanas lantai dan sistem pemanas. Pemantauan suhu dari sirkuit pemanasan lantai diperlukan di tempat pertama untuk mencegah terlalu panas parket, seperti suhu parket maksimum yang diijinkan tidak melebihi 27 derajat.

Kontrol suhu untuk melindungi lantai dari panas berlebih


Kontrol suhu untuk melindungi parket dari panas berlebih

Karena semua nilai suhu ini dapat sangat berbeda satu sama lain, tergantung di mana perangkat dipasang - untuk menentukan suhu di dalam ruangan, kami akan menghitung nilai rata-rata untuk semua indikator dari ruangan ini.

Ada dua opsi untuk menentukan suhu luar. Di HC2 ada fungsi untuk memperoleh prakiraan cuaca untuk suatu kota, yang diatur selama pengaturan pengontrol awal. Namun, metode penentuan suhu ini tidak berbeda dalam akurasi yang dapat diterima, oleh karena itu, untuk tujuan ini kami akan menggunakan beberapa sensor DS 18B20 yang dipasang pada fasad eksternal bangunan. Harus diingat bahwa sensor tidak harus ditempatkan langsung pada fasad dan menghindari sinar matahari langsung.

Di rumah pintar mana pun, salah satu tujuan utama penciptaannya adalah untuk mengurangi biaya pemanasan dan pendinginan ruangan, sehingga menjadi sangat penting untuk memahami posisi jendela dan pintu saat ini. Untuk mematikan pemanas dan pendingin udara, jika jendela atau pintu terbuka, kita akan menggunakan sensor kontak magnetik konvensional, dan untuk integrasi mereka ke dalam jaringan gelombang-z mereka akan terhubung ke sensor biner universal FIB_FGBS-001.

Menghubungkan sensor suhu DS18B20

Menghubungkan sensor suhu DS18B20

Untuk menentukan keberadaan penghuni, kami menciptakan perangkat virtual, yang merupakan tombol. Dengan mengklik tombol ini, pengguna memberi tahu sistem bahwa tidak ada seorang pun di rumah.

Perangkat virtual - mode rumah / kerja memungkinkan tombol


Perangkat virtual - mode rumah / kerja memungkinkan tombol

Ketika sinyal diterima bahwa sistem kosong, controller mematikan semua sistem HVAC dan beralih ke mode hemat energi hingga pengguna siap untuk pulang. Saat berada dalam mode hemat energi, sistem terus mengontrol suhu, dan tidak akan membiarkan pendinginan ruangan dan suhu turun di bawah tanda 18 derajat.

Elemen penting lain dari kontrol iklim di ruang tamu adalah pengaturan suhu. Dalam solusi kami, pengguna dapat mengubahnya dengan dua cara. Menggunakan termostat dinding atau menggunakan perangkat virtual yang dibuat khusus menggunakan smartphone atau tablet.

Setelah berurusan dengan memantau keadaan iklim mikro saat ini di apartemen, kami melanjutkan untuk mempelajari secara langsung perangkat yang harus kami kontrol.

Setiap apartemen akan dilengkapi dengan 3 pendingin udara yang diproduksi oleh Mitsubishi Electric. Mereka direncanakan akan dikontrol menggunakan konverter IR REM_ZXT120. Perangkat ini memiliki pengaturan yang telah ditentukan sebelumnya untuk mengendalikan model AC paling umum dari produsen terkemuka, serta kemampuan untuk mempelajari perintah IR dari remote control.

Selain pendingin udara, setiap apartemen akan dilengkapi dengan sistem ventilasi pasokan dan pembuangan independen, dan akan dikendalikan menggunakan relai dua saluran FIB_FGS-222.

Juga, semua apartemen akan memiliki tujuh lantai pemanas dan satu sirkuit pemanas sentral. Setiap sirkuit dilengkapi dengan katup tiga posisi dengan aktuator servo. Itu dikendalikan oleh modul RGBW FIB_FGRGB-101.

Setelah memilih dan mempelajari semua peralatan yang diperlukan, tugas kami selanjutnya adalah mengembangkan algoritma kontrol iklim yang paling efektif dan mandiri.

Dapat diklik:

Blok diagram dengan algoritma kontrol iklim di apartemen

Diagram alir menunjukkan algoritma yang mewakili logika dasar dari keseluruhan sistem kontrol HVAC.

Algoritma yang dihasilkan diimplementasikan sebagai satu skrip utama dan beberapa skrip bantu. Dalam HC2, skrip ini disebut adegan dan ditulis dalam lua.
Agar tidak memuat controller terlalu banyak, adegan dipicu hanya ketika apa yang disebut pemicu dipicu.

Untuk adegan utama, acara berikut bertindak sebagai pemicu:

  • salah satu indikator suhu akan berubah lebih dari satu derajat
  • pengguna mengubah setpoint suhu
  • pengguna menyalakan / mematikan mode di tempat kerja
  • jendela atau pintu (ke loggia atau pintu masuk) terbuka / tertutup

Kode skrip utama
--[[
%% 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     


Seperti yang dapat Anda lihat dari kode adegan utama, dalam karyanya ia menggunakan variabel global:

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

Pemantauan posisi jendela dan pintu saat ini di apartemen akan dilakukan oleh adegan tambahan. Hasil kerjanya disimpan dalam variabel global WinStatus. Juga, pemandangan terpisah memantau perubahan suhu sensor di dekat pompa pemanas sentral di ruang bawah tanah gedung dan menentukan apakah pemanasan sentral dihidupkan. Hasil karyanya disimpan dalam variabel global Cheating.

Karena sangat penting untuk kenyamanan bahwa udara di apartemen segar, kami memutuskan bahwa itu akan benar untuk membuat sistem ventilasi paksa kamar melalui pasokan dan ventilasi pembuangan. Jika selama tiga jam terakhir ventilasi tidak berfungsi, maka skenario penayangan ruangan dengan durasi 15 menit akan otomatis dimulai. Ventilasi paksa tidak dilakukan jika mode "bekerja".

Script ventilasi paksa
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


Itulah cara kami merencanakan untuk menyelesaikan masalah. Masih banyak pertanyaan dalam agenda, banyak masalah yang harus dipecahkan dan banyak kesulitan yang harus diatasi. Ini adalah ujian kami tentang pena, kami meminta Anda untuk memperlakukan dengan kebaikan dan pengertian.

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


All Articles