تحكم في مناخك باستخدام هذا البرنامج التعليمي Raspberry Pi Thermostat

نشرت: 2022-03-11

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

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

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

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

كمهندس ومتحمس لإنترنت الأشياء (IoT) ، رأيت فرصة للقيام ببعض الأشياء المفيدة في وقت واحد:

  • ساعد في توفير الطاقة عن طريق تحسين كفاءة وحدة تكييف الهواء المستقلة لدي
  • اجعل منزلي أكثر راحة من خلال الأتمتة وتكامل Google Home
  • قم بتخصيص الحل الخاص بي بالطريقة التي أردتها تمامًا ، بدلاً من أن يقتصر على الخيارات المتاحة تجاريًا
  • صقل بعض مهاراتي المهنية باستخدام أجهزة مجربة ومختبرة

مكيف الهواء الخاص بي هو جهاز أساسي به جهاز تحكم عن بعد بسيط بالأشعة تحت الحمراء. كنت على دراية بالأجهزة التي تتيح استخدام وحدات التكييف مع أنظمة المنزل الذكي ، مثل Sensibo أو Tado. بدلاً من ذلك ، اتبعت نهج DIY وأنشأت منظم حرارة Raspberry Pi ، مما يسمح بتحكم أكثر تعقيدًا بناءً على مدخلات المستشعر من غرف مختلفة.

جهاز ترموستات Raspberry Pi

كنت أستخدم بالفعل العديد من Raspberry Pi Zero Ws ، إلى جانب وحدات استشعار DHT22 ، لمراقبة درجة الحرارة والرطوبة في الغرف المختلفة. بسبب مخطط الأرضية المجزأة ، قمت بتثبيت المستشعرات لمراقبة درجة الحرارة في أجزاء مختلفة من منزلي.

لدي أيضًا نظام مراقبة منزلي (غير مطلوب لهذا المشروع) على جهاز كمبيوتر يعمل بنظام Windows 10 مع WSL 2. كنت أرغب في دمج قراءات المستشعر في مقاطع فيديو المراقبة ، كتراكب نص على تغذية الفيديو.

توصيل جهاز الاستشعار

كانت المستشعرات مباشرة في الأسلاك ، ولديها ثلاثة وصلات فقط:

الاتصال الأول هو "VCC from sensor إلى PIN1 - 3v3" ، والثاني هو "DATA from sensor إلى PIN7 - GPIO4" ، والثالث هو "GND from sensor إلى PIN9 - GND."
مخطط الأسلاك لوحدة DHT22 ، يُظهر المسامير المستخدمة لتوصيله بـ Raspberry Pi.

لقد استخدمت Raspberry Pi OS Lite ، حيث قمت بتثبيت Python 3 مع PiP ومكتبة Adafruit_DHT لـ Python لقراءة بيانات المستشعر. إنه مهمل تقنيًا ولكن من الأسهل تثبيته واستخدامه. بالإضافة إلى ذلك ، يتطلب موارد أقل لحالة الاستخدام الخاصة بنا.

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

 import requests import time import random import Adafruit_DHT KEY = 'api key' def pushData(temp:float, hum:float): '''Takes temp and humidity and pushes to ThingsSpeak''' url = 'https://api.thingspeak.com/update' params = {'api_key': KEY, 'field5': temp, 'field6': hum} res = requests.get(url, params=params) def getData(sensor:int, pin:int): ''' Input DHT sensor type and RPi GPIO pin to collect a sample of data Parameters: sensor: Either 11 or 22, depending on sensor used (DHT11 or DHT22) pin: GPIO pin used (eg 4) ''' try: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) return humidity, temperature except: Exception("Error reading sensor data") return False if __name__ == "__main__": sensor = 22 # Change to 11 if using DHT11 pin = 4 # I used GPIO pin 4 while True: h, t = getData(sensor, pin) pushData(t, h) time.sleep(300)

على جهاز الكمبيوتر المخصص للمراقبة ، والذي يعمل على WSL 2 ، قمت بإعداد برنامج PHP يقوم بجلب البيانات من ThingSpeak وتنسيقها وكتابتها في ملف .txt بسيط. هذا الملف .txt مطلوب لبرنامج المراقبة الخاص بي لتراكبها فوق دفق الفيديو.

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

صورة لجهاز أسود على شكل قرص.
وحدة التحكم عن بعد الذكية PNI SafeHome PT11IR Wi-Fi.

تتطلب حلول الكل في واحد الأكثر سعراً مثل تلك التي تقدمها Sensibo و Tado إعدادًا تقنيًا أقل ، ولكن مقابل جزء بسيط من التكلفة ، مكنني PNI SafeHome PT11IR من استخدام هاتفي للتحكم في أي عدد من أجهزة الأشعة تحت الحمراء ضمن نطاقها. يتكامل تطبيق التحكم Tuya مع Google Home.

التغلب على مشكلات Google Home Integration

مع توفر بيانات مكيف الهواء وأجهزة الاستشعار الذكية ، حاولت التعرف على Raspberry على أنه منظم حرارة في Google Home ولكن دون جدوى. تمكنت من إرسال بيانات المستشعر إلى Google IoT Cloud وخدمة Pub / Sub ، ولكن لم تكن هناك طريقة لإرسالها إلى Google Home لإنشاء روتين بناءً على تلك البيانات.

بعد التفكير في هذا الأمر لبضعة أيام ، فكرت في نهج جديد. ماذا لو لم أكن بحاجة إلى إرسال البيانات إلى Google Home؟ ماذا لو كان بإمكاني التحقق من البيانات محليًا وإرسال أمر إلى Google Home لتشغيل مكيف الهواء أو إيقاف تشغيله؟ لقد اختبرت الأوامر الصوتية بنجاح ، لذا بدا هذا الأسلوب واعدًا.

أظهر بحث سريع مساعد الترحيل ، وهو نظام يعمل بنظام Node.js يمكّن المستخدم من إرسال أوامر إلى مساعد Google ، مما يسمح للمستخدم بربط أي شيء بمساعد Google طالما أنه يعرف ما يجب فعله بالإدخال الذي يتلقاه.

أفضل من ذلك ، مع مساعد Google ، يمكنني إنهاء الأوامر إلى مساعد Google الخاص بي عن طريق إرسال طلبات POST ببساطة إلى الجهاز الذي يقوم بتشغيل خادم Node.js (في هذه الحالة ، Raspberry Pi Zero W) مع بعض المعلمات المطلوبة. هذا هو. البرنامج النصي موثق جيدًا ، لذا لن أخوض في تفاصيل كثيرة هنا.

نظرًا لأن بيانات المستشعر كانت تُقرأ بالفعل على كمبيوتر المراقبة ، فقد أدركت أنه يمكنني دمج الطلب في برنامج PHP النصي لإبقاء الأشياء في مكان واحد.

نظرًا لأنه من المحتمل ألا يكون لديك متطلبات ملف .txt ، يمكنك تبسيط العملية من خلال قراءة بيانات المستشعر مباشرةً وإصدار أوامر بناءً على تلك البيانات إلى خدمة مساعد Google ، عبر مساعد الترحيل. كل هذا يمكن القيام به من جهاز Raspberry Pi واحد ، دون الحاجة إلى أجهزة إضافية. ومع ذلك ، نظرًا لأنني أكملت بالفعل نصف العمل ، فمن المنطقي استخدام ما لدي. يمكن استخدام كلا البرنامجين في هذه المقالة على جهاز واحد ؛ علاوة على ذلك ، يمكن إعادة كتابة نص PHP بلغة Python ، إذا لزم الأمر.

ضبط الشروط وأتمتة العملية

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

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

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

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

 <?php switch(true) { case $temperature > 27: turnAc('on'); break; case $temperature < 24: turnAc('off'); break; } function turnAc($status) { $command = 'turn on hallway ac'; // hallway ac is the Google Home device name for my AC if ($status == 'off') { $command = 'turn off hallway ac'; } if ($status == 'on' && checkAc() == 'on') { return; } if ($status == 'off' && checkAc() == 'off') { return; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'local assistant server ip', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>'{ "command": '.$command.', "converse": false, "user": "designated user" }', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); $obj = null; try { $obj = json_decode($response); } catch (Exception $e) { } if (!$obj || $obj->success != true) { markAc($status == 'on' ? 'off' : 'on'); // if error, mark it as opposite status return; } markAc($status); } function markAc($status) { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $json[] = array(date('F j, YH:i:s'), $status); $handler = fopen($file, "w") or die("Unable to open file!"); $txt = json_encode($json); fwrite($handler, $txt); fclose($handler); } function checkAc() { $file = __DIR__ . "/markAc.json"; $json = json_decode(file_get_contents($file), true); $end = array_pop($json); return $end[1]; }

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

قيمة جهاز التحكم في ترموستات Raspberry Pi

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

يعيش الناس في جميع أنحاء العالم في مناخات مختلفة ويدفعون أسعارًا مختلفة للطاقة (ومعدلات مختلفة في أوقات مختلفة من اليوم) ، لذلك حتى التحسينات المتواضعة في كفاءة الطاقة يمكن أن تجعل الأتمتة جديرة بالاهتمام في مناطق معينة.

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


مزيد من القراءة على مدونة Toptal Engineering:

  • كيفية بناء خادم Raspberry Pi للتطوير
  • كيفية إعادة استخدام هاتفك الذكي القديم كجهاز تحكم عن بعد