"رمادي ، ضربة ، بارد ..." ، أو منطق التحكم في المناخ في المنزل الذكي

المنزل الذكي

في الآونة الأخيرة ، يكتسب موضوع المنزل الذكي شعبية متزايدة ، وهناك المزيد والمزيد من المقالات والمراجعات والمناقشات وأي سؤال تقريبًا يمكنك العثور عليه على الفور بعض الآراء والإجابات. ولكن في جميع أنحاء هذا العالم من المعلومات ، لا يزال هناك منطقة بيضاء واحدة ، وهي منطق العمل. لم نكن خائفين وقررنا تقديم استعداداتنا بشأن هذه المسألة للجمهور.

بادئ ذي بدء ، بضع كلمات حول الكائن المراد تجهيزه بأنظمة أتمتة. إنه مبنى سكني صغير ، تم تجهيز كل شقة بتكييف هواء مستقل وأنظمة تهوية وتدفئة وتدفئة أرضية.

كمتطلبات رئيسية ، لاحظ العميل: واجهة واحدة لإدارة جميع أنظمة المنزل الذكي ، وميزانية محدودة والحد الأدنى من الأسلاك الإضافية. بعد القليل من البحث في سوق أنظمة الأتمتة ، توصلنا إلى حل من Fibaro ، حيث أن المزايا الرئيسية لهذا الحل تكرر تقريبًا ظروفنا.

في هذه المقالة ، سنصف عملية إنشاء شبه نظام HVAC لشقة تعتمد على بروتوكول Z-Wave. نأمل في الحصول على مجموعة من التعليقات من المجتمع للوصول بقرارنا إلى حالة صالحة للأكل. إذا تم تحقيق النتيجة المتوقعة ، فسوف يسعدنا مواصلة هذه الدورة مع المنشورات الأخرى التي سنشارك فيها تجربتنا باستخدام أجهزة Z-Wave.

لذا ، سنصف البيانات الأولية وظروف تشغيل نظامنا.

بادئ ذي بدء ، تساءلنا عما سيدير ​​جميع الأنظمة. كوحدة رئيسية ، استقرنا على وحدة تحكم Home Center 2. في البداية ، تم التخطيط لإنشاء شبكة من خمس وحدات تحكم وتنظيم النظام بحيث تتحكم وحدة تحكم واحدة في جميع الشقق في طابق واحد من المبنى. ولكن سرعان ما أصبح واضحًا أنه لا يمكن بناء النظام بهذه الطريقة ، نظرًا لأن HC2 له حد على عدد أجهزة الموجة z المتصلة ، ويؤدي دمج وحدات التحكم في شبكة واحدة إلى توسيع منطقة تغطية شبكة الموجة z فقط ، ولكنه لا يزيد الحد الأقصى المسموح به من الأجهزة المتصلة . في الوقت نفسه ، لا يمكن توصيل أكثر من 230 جهازًا بوحدة تحكم واحدة. وفقًا لذلك ، لا يزال من الممكن توصيل 230 جهازًا فقط بخمس وحدات تحكم مدمجة في شبكة واحدة.لذلك ، كان علينا مضاعفة عدد وحدات التحكم في المشروع ورفض دمجها في شبكة واحدة. الآن سيعمل HC2 واحد للشقق 4-5 ، مما يمنحنا الفرصة للاستخدام من 46 إلى 57 جهاز الموجة z في كل شقة.

بعد أن قررنا على وحدة التحكم الرئيسية ، نشأ السؤال عن البيانات التي يجب جمعها وكيفية القيام بذلك. لإدارة المناخ ، تحتاج إلى معرفة الوضع الحالي في الشقة ، وهي: درجة الحرارة داخل الغرفة وخارجها ، والرطوبة ، ومستوى ثاني أكسيد الكربون ، وموقع النوافذ والأبواب ، ووجود سكان المنزل. نظرًا لأن ميزانية المشروع محدودة ، فقد رفضنا مراقبة الرطوبة ومستويات ثاني أكسيد الكربون.

لمراقبة درجة الحرارة الداخلية ، تحتوي العديد من أجهزة الموجات z على مستشعرات حرارة مدمجة تكمل الوظائف الأساسية للجهاز. وبالطبع ، هناك أجهزة استشعار درجة الحرارة في إصدار منفصل. وفقًا لمشروعنا ، سيكون هناك حوالي 35 جهازًا في كل شقة ستعرض قيمة درجة الحرارة بطريقة أو بأخرى. هذه هي ثلاثة أجهزة استشعار التسرب FIB_FGFS-101 ، وثلاث أجهزة إرسال IR REM_ZXT120 ، ترموستات RS 014G0160 ، وأجهزة استشعار الحركة ، وثلاثة أجهزة استشعار درجة الحرارة DS 18B20 لكل دائرة تسخين أرضية ونظام التدفئة. مراقبة درجة حرارة دائرة التدفئة الأرضية ضروري في المقام الأول من أجل منع ارتفاع درجة حرارة الباركيه ، مثل الحد الأقصى المسموح به لدرجة حرارة الباركيه لا يتجاوز 27 درجة.

التحكم في درجة الحرارة لحماية الأرضية من الحرارة الزائدة


التحكم في درجة الحرارة لحماية الباركيه من الحرارة الزائدة

نظرًا لأن جميع قيم درجات الحرارة هذه يمكن أن تختلف اختلافًا شديدًا عن بعضها البعض ، اعتمادًا على مكان تركيب الجهاز - لتحديد درجة الحرارة في الغرفة ، سنقوم بحساب متوسط ​​القيمة لجميع المؤشرات من هذه الغرفة.

هناك خياران لتحديد درجة الحرارة الخارجية. في HC2 ، هناك وظيفة للحصول على توقعات الطقس لمدينة ، والتي يتم تعيينها أثناء إعداد وحدة التحكم الأولية. ومع ذلك ، لا تختلف طريقة تحديد درجة الحرارة في الدقة المقبولة ، وبالتالي ، لهذه الأغراض ، سنستخدم العديد من أجهزة الاستشعار DS 18B20 المثبتة على الواجهة الخارجية للمبنى. يجب أن يوضع في الاعتبار أنه يجب عدم وضع أجهزة الاستشعار مباشرة على الواجهة وتجنب أشعة الشمس المباشرة.

في أي منزل ذكي ، فإن أحد الأهداف الرئيسية لإنشاءه هو تقليل تكلفة التدفئة والتبريد ، لذلك يصبح من المهم جدًا فهم الوضع الحالي للنوافذ والأبواب. من أجل إيقاف التدفئة وتكييف الهواء ، إذا كانت النافذة أو الباب مفتوحًا ، فسوف نستخدم أجهزة استشعار مغناطيسية تقليدية تقليدية ، ولكي يتم دمجها في شبكة الموجة z سيتم توصيلها بأجهزة استشعار ثنائية عالمية FIB_FGBS-001.

توصيل أجهزة استشعار درجة الحرارة DS18B20

توصيل مستشعرات درجة حرارة DS18B20

لتحديد وجود السكان ، قمنا بإنشاء جهاز افتراضي ، وهو زر. بالضغط على هذا الزر ، يقوم المستخدم بإبلاغ النظام بأنه لا يوجد أحد في المنزل.

الجهاز الظاهري - وضع تمكين المنزل / العمل الأزرار


أزرار افتراضية للجهاز الظاهري - وضع المنزل / العمل

عند تلقي إشارة بأن النظام فارغ ، تقوم وحدة التحكم بإيقاف تشغيل جميع أنظمة التدفئة والتهوية وتكييف الهواء والتبديل إلى وضع توفير الطاقة حتى يصبح المستخدم جاهزًا للعودة إلى المنزل. بينما في وضع توفير الطاقة ، يستمر النظام في التحكم في درجة الحرارة ، ولن يسمح بتبريد الغرفة وانخفاض درجة الحرارة إلى أقل من علامة 18 درجة.

عنصر آخر مهم للتحكم في المناخ في غرفة المعيشة هو إعداد درجة الحرارة. في حلنا ، يمكن للمستخدمين تغييره بطريقتين. استخدام منظم حرارة الجدار أو استخدام جهاز افتراضي تم إنشاؤه خصيصًا باستخدام هاتف ذكي أو جهاز لوحي.

بعد التعامل مع مراقبة الحالة الحالية للمناخ المحلي في الشقة ، شرعنا في دراسة تلك الأجهزة التي كان علينا السيطرة عليها مباشرة.

سيتم تجهيز كل شقة بثلاث مكيفات هواء من صنع شركة Mitsubishi Electric. تم التخطيط للتحكم فيها باستخدام محولات IR REM_ZXT120. تحتوي هذه الأجهزة على إعدادات محددة مسبقًا للتحكم في النماذج الأكثر شيوعًا لمكيفات الهواء من الشركات الرائدة ، بالإضافة إلى القدرة على تعلم أوامر IR من جهاز التحكم عن بعد.

بالإضافة إلى مكيفات الهواء ، سيتم تجهيز كل شقة بنظام مستقل للتهوية والتهوية ، وسيتم تنظيم التحكم باستخدام مرحلات ذات قناتين FIB_FGS-222.

كما ستحتوي جميع الشقق على سبعة طوابق للتدفئة ودائرة تدفئة مركزية. تم تجهيز كل دائرة بصمام ثلاثي الوضعية مع مشغل مؤازر. يتم التحكم فيه بواسطة وحدة RGBW FIB_FGRGB-101.

بعد اختيار ودراسة جميع المعدات اللازمة ، كانت مهمتنا التالية هي تطوير خوارزمية التحكم في المناخ الأكثر فعالية واكتفاء ذاتيًا.

قابل للنقر:

مخطط كتلة مع خوارزمية التحكم في المناخ في الشقة

يعرض المخطط الانسيابي خوارزمية تمثل المنطق الأساسي لنظام التحكم في التدفئة والتهوية وتكييف الهواء بالكامل.

يتم تنفيذ الخوارزمية الناتجة كنص رئيسي واحد والعديد من البرامج المساعدة. في HC2 ، تسمى هذه النصوص المشاهد ومكتوبة بلغة لوا.
لكي لا يتم تحميل وحدة التحكم كثيرًا ، يتم تشغيل المشاهد فقط عند تشغيل ما يسمى المشغلات.

بالنسبة للمشهد الرئيسي ، تعمل الأحداث التالية كمحفزات:

  • سوف يتغير أحد مؤشرات درجة الحرارة بأكثر من درجة واحدة
  • قام المستخدم بتغيير درجة الحرارة المحددة
  • قام المستخدم بتشغيل / إيقاف تشغيل الوضع في العمل
  • تم فتح / إغلاق النافذة أو الباب (إلى لوجيا أو المدخل)

كود البرنامج النصي الرئيسي
--[[
%% 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     


كما ترون من كود المشهد الرئيسي ، في عملها تستخدم المتغيرات العالمية:

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

سيتم مراقبة الوضع الحالي للنوافذ والأبواب في الشقة من خلال مشهد مساعد. يتم تخزين نتيجة عمله في المتغير العالمي WinStatus. أيضًا ، يتحكم مشهد منفصل في تغير درجة حرارة المستشعرات بالقرب من مضخات التدفئة المركزية في الطابق السفلي من المبنى ويحدد ما إذا كان التدفئة المركزية قيد التشغيل. يتم تخزين نتيجة عملها في المتغير العالمي الغش.

نظرًا لأنه من المهم جدًا للراحة أن يكون الهواء في الشقة منعشًا ، فقد قررنا أنه سيكون من الصحيح إنشاء نظام للتهوية القسرية للغرف من خلال تهوية العرض والعادم. إذا لم تعمل التهوية خلال الساعات الثلاث الأخيرة ، فسيبدأ تلقائيًا سيناريو تهوية الغرفة لمدة 15 دقيقة. لا يتم تنفيذ التهوية القسرية إذا كان الوضع "في العمل".

سيناريو التهوية القسرية
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


هكذا نخطط لحل المشكلة. لا يزال هناك العديد من الأسئلة على جدول الأعمال ، والعديد من المشاكل التي يتعين حلها والعديد من الصعوبات التي يتعين التغلب عليها. هذا هو اختبارنا للقلم ، نطلب منك أن تعامل بلطف وتفهم.

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


All Articles