मेजरडूमो में स्मार्ट होम ऑब्जेक्ट्स की प्रोग्रामिंग के मूल सिद्धांत

छवि

मेजरडोमो प्रणाली विभिन्न घटकों को जोड़ती है, जिनमें से कई की कार्रवाई में डेटा पढ़ना या बदलना शामिल है। सिस्टम के कुछ हिस्सों के बीच प्रभावी डेटा विनिमय को व्यवस्थित करने के लिए, एक ऑब्जेक्ट मॉडल बनाया गया था। यह मॉडल काफी हद तक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के प्रतिमान के अनुरूप है और इस प्रतिमान से परिचित लोग मौजूदा मॉडल को समझना मुश्किल नहीं होगा। हालाँकि, ओओपी सिद्धांतों का ज्ञान आवश्यक नहीं है, जैसा कि सिस्टम में निर्मित मॉडल काफी सरल है और इसे किसी भी प्रोग्रामिंग भाषा के गहन ज्ञान के बिना या इस अवधारणा को सीखने के पहले चरण के रूप में लागू किया जा सकता है। लेख इस मॉडल के मुख्य घटकों का वर्णन करता है।

भाग 1. सिद्धांत।


कक्षाएं

एक वर्ग मूल गुणों का वर्णन है जो इस वर्ग से संबंधित सभी वस्तुओं के पास होना चाहिए। एक वर्ग एक वस्तु नहीं है और न ही इन गुणों के मूल्यों को शामिल कर सकता है; यह केवल वस्तुओं के संकेत और व्यवहार का वर्णन करता है। एक उदाहरण के रूप में एक सरल वर्गीकरण का उपयोग करके एक भौतिक सादृश्य प्रस्तुत किया जा सकता है - उदाहरण के लिए, "बाथरूम का दरवाजा" ऑब्जेक्ट "दरवाजे" वर्ग से संबंधित हो सकता है, जबकि "दरवाजे" में "स्थिति" संपत्ति का विवरण हो सकता है (दरवाजा खुला या बंद है, लेकिन इसका तत्काल मूल्य है) केवल एक विशिष्ट वस्तु के लिए निर्धारित किया जाए, लेकिन एक वर्ग के लिए नहीं।

वर्गों की एक महत्वपूर्ण विशेषता उपवर्ग बनाने की क्षमता है जो "माता-पिता" वर्ग के सभी गुणों और विधियों को विरासत में देती है, लेकिन एक ही समय में अपने स्वयं के गुणों और विधियों में सक्षम होती है। या "माता-पिता" विधियों का अपना विशेष कार्यान्वयन है।

एक उदाहरण:
छवि

वस्तुएं

एक वस्तु एक वास्तविक (या आभासी) वस्तु की स्थिति है। किसी वस्तु के गुणों में विशिष्ट मूल्य हो सकते हैं (उदाहरण के लिए, "स्थिति", "तापमान", आदि)। इसके अलावा, गुणों को उस ऑब्जेक्ट में सेट किया जा सकता है जो उस वर्ग के गुणों के सेट को पूरक करता है जिसमें ऑब्जेक्ट संबंधित है। साथ ही, किसी ऑब्जेक्ट को कक्षा में वर्णित विधियों का अपना कार्यान्वयन दिया जा सकता है।

एक उदाहरण:
छवि

एक वर्ग से संबंधित एक वस्तु, जो बदले में, एक उपवर्ग है, सभी मूल वर्गों के गुणों और विधियों को विरासत में मिला है।

गुण

एक संपत्ति एक विशिष्ट पैरामीटर है जो किसी वस्तु की स्थिति का वर्णन करता है। जैसा कि पहले ही ऊपर उल्लेख किया गया है, कक्षाएं केवल गुणों (नाम, विवरण, आदि) का वर्णन कर सकती हैं, लेकिन संपत्ति का मूल्य केवल एक विशिष्ट वस्तु के लिए निर्धारित किया जा सकता है।

उदाहरण (किसी वस्तु वर्ग के गुणों का वर्णन):
छवि

उदाहरण (ऑब्जेक्ट गुण सेट करना / पढ़ना):
setGlobal('myObject.myProperty',12345); $value=getGlobal('myObject.myProperty'); 


तरीकों

विधियाँ किसी वस्तु के संभावित क्रियाओं (या किसी वस्तु पर क्रिया) का विवरण है। भौतिक सादृश्य की ओर लौटते हुए, हम यह संकेत कर सकते हैं कि कक्षा "दरवाजे" में "ओपन" और "क्लोज़", अर्थात। कक्षा के सभी ऑब्जेक्ट में भी यह विधि होगी, और हम "बाथरूम के लिए दरवाजा" कॉल करके दरवाजा खोल सकते हैं। विधि। पीएचपी प्रोग्रामिंग लैंग्वेज में मेथड इम्प्लीमेंटेशन खुद एक स्क्रिप्ट है। इस स्थिति में, स्क्रिप्ट का भाग ओपन स्टेट में स्थिति गुण सेट कर सकता है।

उदाहरण (वस्तु विधि):
छवि

उदाहरण (विधि कोड):
 if ($this->getProperty('status')) { say("  "); } 


उदाहरण (विधि कॉल):
 callMethod('myObject.myMethod',$params); // $params     


भाग 2. अभ्यास।


लेख के दूसरे भाग में मैं मेजरडोमो ऑब्जेक्ट सिस्टम में "एम्बेडिंग" वास्तविक उपकरण का एक उदाहरण दूंगा। उपकरणों के एक उदाहरण के रूप में, मैं नोलाइट सिस्टम के घटकों का उपयोग करूंगा, जो कि पहले से ही बार-बार हैबे पर प्रस्तुत किया गया है , इसलिए, सामान्य तौर पर, कई लोग इन घटकों की क्षमताओं के बारे में जानते हैं। स्रोत कोड या सिस्टम कॉन्फ़िगरेशन फ़ाइलों में कोई बदलाव किए बिना नीचे वर्णित सभी क्रियाएं ऑब्जेक्ट अनुभाग में मेजरडोमो कंट्रोल पैनल में की जाती हैं।

इसलिए, उदाहरण के लिए, हम उपयोग करेंगे:



आइटम योजना:
  1. हम अपने कार्यों के लिए सार कक्षाएं बनाते हैं।
  2. हम समर्थित उपकरणों के लिए अधिक विशिष्ट कक्षाएं बनाते हैं।
  3. वस्तुओं को जोड़ें
  4. हम प्रबंधन कर रहे हैं!


बिंदु 1

हम इस तथ्य से आगे बढ़ेंगे कि हमारे स्मार्ट हाउस में कुछ उपकरणों को चालू / बंद करने का कार्य अक्सर उठता है, इसलिए, हम उच्चतम स्तर पर स्थिति संपत्ति (1/0 - पर / बंद) के साथ रिले वर्ग बनाएंगे, साथ ही साथ तरीके टर्नऑफ, टर्नऑन, स्विच और रिफ्रेश।

टर्नऑफ विधि कोड (डिवाइस शटडाउन):
 $this->setProperty("status",0); 


टर्नऑन विधि कोड (डिवाइस चालू करना):
 $this->setProperty("status",1); 


स्विच विधि का कोड (डिवाइस स्विचिंग):
 $status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOff'); } else { $this->callMethod('turnOn'); } 

ताज़ा विधि का कोड (डिवाइस स्थिति अपडेट):
 $status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOn'); } else { $this->callMethod('turnOff'); } 


हम मानते हैं कि यह एक आवश्यक न्यूनतम है जो सभी प्रबंधित वस्तुओं में निहित होगा।

बिंदु 2

अगला, हम nooLite उपकरण के लिए समर्थन जोड़ेंगे जो हमें nooLite चाइल्ड क्लास के निर्माण के माध्यम से चाहिए। माता-पिता से अलग होने के लिए, यह चैनल (कार्यकारी मॉड्यूल नियंत्रण चैनल) की एक विशिष्ट संपत्ति होगी। इसके अलावा, एक नया sendCommand मेथड (एक कमांड भेजना) जोड़ा जाएगा और टर्नऑफ और टर्नऑन के तरीकों के कोड को फिर से परिभाषित किया जाएगा।

नई SendCommand विधि के लिए कोड (एक Noolite डिवाइस के लिए एक आदेश भेजना):
 $cmdline='"c:\Program Files\nooLite\nooLiteCMD.exe" -api '.$params['command']; safe_exec($cmdline); 


ओवरराइड टर्नऑफ विधि का कोड:
 $this->setProperty("status",0); $this->callMethod("sendCommand",array('command'=>'-off_ch'.$this->getProperty("channel"))); 


ओवरराइड विधि का कोड बदल जाता है:
 $this->setProperty("status",1); $this->callMethod("sendCommand",array('command'=>'-on_ch'.$this->getProperty("channel"))); 


हम अन्य तरीकों को नहीं छूते हैं - वे अपरिवर्तित रहते हैं और नई कक्षा के साथ अपेक्षा के अनुसार काम करते हैं (धन्यवाद ओओपी!)।

वास्तव में, अब हम दिए गए वर्ग की कई वस्तुओं को जोड़ सकते हैं, जैसा कि हम उनमें से प्रत्येक के व्यवहार की प्रोग्रामिंग की अतिरिक्त लागत के बिना चाहते हैं।

बिंदु 3

ऑब्जेक्ट noo1 जोड़ें, ऑब्जेक्ट के विवरण में यह इंगित करता है कि यह "लिविंग रूम में छत को रोशन करना" है, इसके गुणों की सेटिंग पर जाएं और संपत्ति का मूल्य noo1.channel = 1, अर्थात देखें यह पावर मॉड्यूल पहले कंट्रोल चैनल पर स्थित है।

बिंदु 4

अब हम निम्नलिखित कोड के साथ किसी भी स्क्रिप्ट से इस मॉड्यूल को सक्षम / अक्षम कर सकते हैं:
 callMethod('noo1.turnOn'); //  callMethod('noo1.turnOff'); //  


या, निम्न रूप में मेनू से इस मॉड्यूल के नियंत्रण को पंजीकृत करने के लिए:
छवि

परिणामस्वरूप निम्नलिखित नियंत्रण प्राप्त किया:
छवि

हम एक और डिवाइस को जोड़ने के लिए अंक 2-4 के माध्यम से जो कुछ भी सीखते हैं उसे ठीक करते हैं - नोइलाइट लाइट यूनिट को डिमिंग समर्थन के साथ।

आइटम 2

ऊपर बनाई गई nooLite वर्ग से, हम अतिरिक्त संपत्ति चमक को जोड़ते हुए, एक बच्चा वर्ग, nooLiteDimmer बनाते हैं। हम एक नई मंद विधि भी जोड़ते हैं और रिफ्रेश, टर्नऑन, टर्नऑफ विधियों के कोड को फिर से लिखते हैं

नई मंद विधि के लिए कोड:
 if ($params['value']) { $this->setProperty("brightness",$params['value']); $this->callMethod("refresh"); } 


ओवरराइड रिफ्रेश विधि का कोड:
 $value=$this->getProperty("brightness"); $this->callMethod("sendCommand",array('command'=>'-set_ch'.$this->getProperty("channel").' -'.$value)); if ($value>0) { $this->setProperty('status',1); } else { $this->setProperty('status',0); } 


ओवरराइड टर्नऑफ विधि का कोड:
 $this->setProperty("status",0); $this->setProperty("brightness",0); $this->callMethod("refresh"); 


ओवरराइड विधि का कोड बदल जाता है:
 $this->setProperty("status",1); $this->setProperty("brightness",100); $this->callMethod("refresh"); 


मद ३

यह पिछले विकल्प के लगभग समान है - हम noo2 ऑब्जेक्ट को जोड़ते हैं, हम गुणों में नियंत्रण चैनल (2) को लिखते हैं। वस्तु तैयार है।

मद ४।

Noo2 ऑब्जेक्ट को noo1 की तरह ही नियंत्रित किया जा सकता है, लेकिन इसके अलावा हम स्टिंग सेट करने के लिए मंद विधि का उपयोग कर सकते हैं:
 callMethod('noo2.dim',array('value'=>50)); //    50% 


मेनू में दीपक को नियंत्रित करने के लिए, निम्नलिखित तत्व बनाएं:
छवि

उपयोगकर्ता के लिए नियंत्रण का प्रकार पारंपरिक पावर यूनिट को नियंत्रित करने के उदाहरण में पहले से ही ऊपर दिखाया गया है।

Nootehnika में RGB-backlight को नियंत्रित करने के लिए इस तरह के तीन-चैनल डिमर भी हैं:

मैं इसके एकीकरण को पर्दे के पीछे छोड़ दूंगा (या "होमवर्क", यदि आप चाहें), लेकिन सरल जोड़तोड़ के परिणामस्वरूप, जैसे ऊपर वर्णित है, आप इस इंटरफ़ेस को प्राप्त कर सकते हैं:
छवि

एक आफ्टरवर्ड के बजाय

एक ऑब्जेक्ट सिस्टम विशेष रूप से उपयोग करने के लिए सुविधाजनक है जब हमारे पास एक ही प्रकार की वस्तुओं (उदाहरण के लिए, सेंसर या एक्चुएटर) हैं जिनके समान गुण और व्यवहार हैं। उसी समय, हम एक वर्ग को निर्दिष्ट कर सकते हैं और केवल उन वस्तुओं को जोड़ सकते हैं जो नामों या कुछ अलग विशेषताओं में भिन्न होती हैं, लेकिन साथ ही साथ कक्षा पद्धति में वर्णित व्यवहार परिदृश्य का केवल एक ही कार्यान्वयन होता है।

इसके अलावा, सभी उपलब्ध मॉड्यूल जो सिस्टम के कनेक्शन को विशिष्ट "आयरन" (और ऐसा नहीं है) के साथ प्रदान करते हैं, आपको समर्थित उपकरणों के मापदंडों के "बाइंडिंग" को कुछ वस्तुओं के गुणों या विधियों को निर्दिष्ट करने की अनुमति देते हैं, जो आपको सभी जुड़े सिस्टम (एसएनएमपी) की वर्तमान स्थिति की अनुमति देता है। ZWave, 1-तार और अधिक)।

खैर, अंत में, मैं यह कहना चाहूंगा कि विशिष्ट कार्यान्वयन के उदाहरणों के साथ कई चीजों को सीखना आसान है, जिसके लिए एक विशेष परियोजना CONNECT को लॉन्च किया गया था, जिसके साथ आप अपने स्मार्ट होम के तैयार किए गए कॉन्फ़िगरेशन का आदान-प्रदान कर सकते हैं। मेरी प्रोफ़ाइल के उदाहरण पर , मैं उपयोग किए गए घटकों, नियंत्रण मेनू के कॉन्फ़िगरेशन, निर्मित स्क्रिप्ट, कक्षाएं और मेजरडोमो ऑब्जेक्ट्स दिखाता हूं। प्रोफ़ाइल वस्तुओं के गुणों के मूल्यों के बारे में जानकारी प्रकाशित नहीं करता है और निश्चित रूप से, उपकरणों को प्रबंधित करने का कोई तरीका नहीं है - सभी जानकारी केवल सूचना के प्रयोजनों के लिए प्रदान की जाती है।

अच्छा स्वचालन!

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


All Articles