ควบคุมสภาพอากาศของคุณด้วยการสอนเทอร์โมสตัท Raspberry Pi นี้
เผยแพร่แล้ว: 2022-03-11เครื่องปรับอากาศในบ้านหลายหลังขาดความทันสมัย เช่น ระบบอัตโนมัติส่วนกลาง ตัวควบคุมอุณหภูมิที่ตั้งโปรแกรมได้ เซ็นเซอร์หลายตัว หรือระบบควบคุม Wi-Fi แต่เทคโนโลยีเครื่องปรับอากาศแบบเก่ายังคงเชื่อถือได้ ดังนั้นในหลายกรณี จึงไม่น่าจะได้รับการอัปเกรดในเร็วๆ นี้
อย่างไรก็ตาม ผู้ใช้จำเป็นต้องขัดจังหวะการทำงานหรือการนอนหลับบ่อยๆ เพื่อเปิดหรือปิดเครื่องปรับอากาศ โดยเฉพาะอย่างยิ่งในบ้านที่มีเลย์เอาต์แคบ ๆ เช่นของฉัน:
บ้านในสหรัฐฯ มักมีเครื่องปรับอากาศส่วนกลาง แต่ทั่วโลกไม่เป็นเช่นนั้น การไม่มีไฟฟ้ากระแสสลับส่วนกลางจะจำกัดตัวเลือกการทำงานอัตโนมัติ ซึ่งทำให้อุณหภูมิเท่ากันทั่วทั้งบ้านทำได้ยากขึ้น โดยเฉพาะอย่างยิ่ง มันทำให้ยากต่อการหลีกเลี่ยงความผันผวนของอุณหภูมิที่อาจต้องมีการแทรกแซงด้วยตนเองเพื่อแก้ไข
ในฐานะวิศวกรและผู้ที่ชื่นชอบ Internet of Things (IoT) ฉันเห็นโอกาสที่จะทำบางสิ่งที่มีประโยชน์ในคราวเดียว:
- ช่วยประหยัดพลังงานโดยการปรับปรุงประสิทธิภาพของเครื่องปรับอากาศแบบสแตนด์อโลนของฉัน
- ทำให้บ้านของฉันสะดวกสบายยิ่งขึ้นด้วยระบบอัตโนมัติและการรวม Google Home
- ปรับแต่งโซลูชันของฉันในแบบที่ฉันต้องการ แทนที่จะจำกัดตัวเลือกที่มีจำหน่ายทั่วไป
- ปัดฝุ่นทักษะทางวิชาชีพของฉันโดยใช้ฮาร์ดแวร์ที่ผ่านการทดสอบและทดสอบแล้ว
เครื่องปรับอากาศของฉันเป็นอุปกรณ์พื้นฐานที่มีรีโมตคอนโทรลอินฟราเรดแบบธรรมดา ฉันรู้จักอุปกรณ์ที่เปิดใช้งานเครื่องปรับอากาศกับระบบบ้านอัจฉริยะ เช่น Sensibo หรือ Tado แต่ฉันใช้แนวทาง DIY และสร้างเทอร์โมสตัท Raspberry Pi ซึ่งช่วยให้สามารถควบคุมที่ซับซ้อนยิ่งขึ้นตามอินพุตเซ็นเซอร์จากห้องต่างๆ
ฮาร์ดแวร์เทอร์โมสตัท Raspberry Pi
ฉันเคยใช้ Raspberry Pi Zero Ws หลายตัว ร่วมกับโมดูลเซ็นเซอร์ DHT22 เพื่อตรวจสอบอุณหภูมิและความชื้นในห้องต่างๆ เนื่องจากแผนผังชั้นที่แบ่งเป็นส่วนๆ ฉันจึงติดตั้งเซ็นเซอร์เพื่อตรวจดูว่ามันอบอุ่นแค่ไหนในส่วนต่างๆ ของบ้านของฉัน
ฉันยังมีระบบเฝ้าระวังที่บ้าน (ไม่จำเป็นสำหรับโครงการนี้) บนพีซี Windows 10 ที่มี WSL 2 ฉันต้องการรวมการอ่านเซ็นเซอร์เข้ากับวิดีโอการเฝ้าระวัง เป็นข้อความซ้อนทับบนฟีดวิดีโอ
การเดินสายไฟเซนเซอร์
เซ็นเซอร์เดินสายได้ง่าย โดยมีเพียงสามจุดเชื่อมต่อ:
ฉันใช้ 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 ที่จะเปิดหรือปิดเครื่องปรับอากาศโดยอัตโนมัติตามอุณหภูมิห้อง โดยไม่ต้องป้อนข้อมูลจากผู้ใช้
โซลูชันแบบครบวงจรที่มีราคาแพงกว่า เช่น จาก Sensibo และ Tado ต้องการการตั้งค่าทางเทคนิคน้อยกว่า แต่ด้วยค่าใช้จ่ายเพียงเล็กน้อย PNI SafeHome PT11IR ทำให้ฉันสามารถใช้โทรศัพท์เพื่อควบคุมอุปกรณ์อินฟราเรดจำนวนเท่าใดก็ได้ภายในขอบเขตเดียวกัน แอปควบคุม Tuya ทำงานร่วมกับ Google Home
เอาชนะปัญหาการรวมหน้าแรกของ Google
ด้วยข้อมูลเครื่องปรับอากาศและเซ็นเซอร์ที่เปิดใช้งานอัจฉริยะ ฉันพยายามทำให้ Raspberry รู้จักว่าเป็นเทอร์โมสตัทใน Google Home แต่ก็ไม่มีประโยชน์ ฉันสามารถส่งข้อมูลเซ็นเซอร์ไปยัง Google IoT Cloud และบริการ Pub/Sub ของมันได้ แต่ไม่มีทางที่จะส่งข้อมูลนั้นไปที่หน้าแรกของ Google เพื่อสร้างกิจวัตรตามข้อมูลนั้น
หลังจากไตร่ตรองเรื่องนี้อยู่สองสามวัน ฉันก็คิดหาวิธีใหม่ ถ้าฉันไม่ต้องการส่งข้อมูลไปที่ Google Home ล่ะ จะเกิดอะไรขึ้นถ้าฉันสามารถตรวจสอบข้อมูลในพื้นที่และส่งคำสั่งไปที่ Google Home เพื่อเปิดหรือปิดเครื่องปรับอากาศ ฉันทดสอบคำสั่งเสียงด้วยความสำเร็จ ดังนั้นวิธีการนี้จึงดูมีความหวัง

การค้นหาอย่างรวดเร็วเปิดใช้งาน Assistant Relay ซึ่งเป็นระบบที่ขับเคลื่อนด้วย Node.js ที่ช่วยให้ผู้ใช้ส่งคำสั่งไปยัง Google Assistant ได้ ทำให้ผู้ใช้สามารถผูกอะไรก็ได้กับ Google Assistant ตราบใดที่รู้ว่าต้องทำอย่างไรกับอินพุตที่ได้รับ
ดียิ่งขึ้นไปอีก ด้วย Assistant Relay ฉันสามารถหยุดคำสั่งไปยัง Google Assistant ได้โดยเพียงแค่ส่งคำขอ POST ไปยังอุปกรณ์ที่รันเซิร์ฟเวอร์ Node.js (ในกรณีนี้คือ Raspberry Pi Zero W) พร้อมพารามิเตอร์ที่จำเป็นบางอย่าง แค่นั้นแหละ. สคริปต์ได้รับการจัดทำเป็นเอกสารอย่างดี ดังนั้นฉันจะไม่ขอลงรายละเอียดที่นี่มากนัก
เนื่องจากข้อมูลเซ็นเซอร์ถูกอ่านบนพีซีการเฝ้าระวังแล้ว ฉันคิดว่าฉันสามารถรวมคำขอเข้ากับสคริปต์ PHP เพื่อเก็บสิ่งต่าง ๆ ไว้ในที่เดียว
เนื่องจากคุณอาจไม่มีข้อกำหนดของไฟล์ .txt คุณจึงลดความซับซ้อนของกระบวนการได้โดยการอ่านข้อมูลเซ็นเซอร์โดยตรงและออกคำสั่งตามข้อมูลนั้นไปยัง Google Assistant Service ผ่าน Assistant Relay ทั้งหมดนี้สามารถทำได้จากอุปกรณ์ Raspberry Pi เครื่องเดียว โดยไม่ต้องใช้ฮาร์ดแวร์เพิ่มเติม อย่างไรก็ตาม เนื่องจากฉันทำงานเสร็จไปครึ่งหนึ่งแล้ว ฉันจึงควรใช้สิ่งที่ฉันมี สคริปต์ทั้งสองในบทความนี้สามารถใช้ได้ในเครื่องเดียว นอกจากนี้ สคริปต์ PHP สามารถเขียนใหม่ใน Python ได้ หากจำเป็น
การตั้งค่าเงื่อนไขและการทำงานอัตโนมัติ
ฉันต้องการให้การหมุนเวียนพลังงานอัตโนมัติเกิดขึ้นเฉพาะในตอนกลางคืน ดังนั้นฉันจึงกำหนดชั่วโมงที่ต้องการทำให้การทำงานเป็นอัตโนมัติ—22:00 น. ถึง 7:00 น.—และตั้งอุณหภูมิที่ต้องการ การระบุช่วงอุณหภูมิที่ถูกต้อง—เพื่อให้ได้ช่วงอุณหภูมิที่สะดวกสบายโดยไม่ทำให้อายุการใช้งานของเครื่องปรับอากาศสั้นลงโดยการวนรอบพลังงานบ่อยเกินไป—ต้องพยายามสองสามครั้งเพื่อให้ถูกต้อง
สคริปต์ PHP ที่สร้างการซ้อนทับข้อมูลเซ็นเซอร์ได้รับการตั้งค่าให้ทำงานทุก ๆ ห้านาทีผ่านงาน cron ดังนั้นสิ่งเดียวที่ฉันเพิ่มเข้าไปคือเงื่อนไขและคำขอ POST
อย่างไรก็ตาม สิ่งนี้ทำให้เกิดปัญหา หากตรงตามเงื่อนไข สคริปต์จะส่งคำสั่ง "เปิด" ทุกๆ ห้านาที แม้ว่าเครื่องปรับอากาศจะเปิดอยู่แล้วก็ตาม สิ่งนี้ทำให้เครื่องส่งเสียงบี๊บน่ารำคาญแม้จะเป็นคำสั่ง "ปิด" ในการแก้ไขปัญหานี้ ฉันต้องการวิธีอ่านสถานะปัจจุบันของหน่วย
ความสง่างามไม่ใช่สิ่งสำคัญ ดังนั้นฉันจึงสร้างไฟล์ 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 Thermostat
ฉันมีแรงจูงใจที่จะปรับเครื่องปรับอากาศของฉันให้เป็นแบบอัตโนมัติ เพราะบางครั้งการจัดวางบ้านที่ไม่ธรรมดาก็ส่งผลให้อุณหภูมิในห้องต่างๆ ต่างกันอย่างมาก แต่การให้ความร้อนและความเย็นแบบอัตโนมัติมีประโยชน์สำหรับผู้ที่ไม่พบปัญหานี้โดยเฉพาะ
ผู้คนทั่วโลกอาศัยอยู่ในสภาพอากาศที่หลากหลายและจ่ายในราคาพลังงานที่แตกต่างกัน (และอัตราที่แตกต่างกันในแต่ละช่วงเวลาของวัน) ดังนั้นแม้แต่การปรับปรุงประสิทธิภาพพลังงานเพียงเล็กน้อยก็สามารถทำให้ระบบอัตโนมัติคุ้มค่าในบางภูมิภาค
ยิ่งไปกว่านั้น เนื่องจากบ้านเรือนกลายเป็นระบบอัตโนมัติมากขึ้นเรื่อยๆ จึงมีเหตุผลที่จะสำรวจศักยภาพของการทำให้อุปกรณ์และเครื่องใช้รุ่นเก่าที่ใช้พลังงานสูงแบบอัตโนมัติ เช่น เครื่องปรับอากาศ เครื่องทำความร้อนไฟฟ้า และเครื่องทำน้ำอุ่น เนื่องจากอุปกรณ์เหล่านี้โดยทั่วไปแล้วจะเทอะทะ ติดตั้งยาก และอัพเกรดได้ยาก หลายคนคงติดอยู่กับอุปกรณ์เหล่านี้ไปอีกหลายปี การทำให้อุปกรณ์ “ใบ้” เหล่านี้ฉลาดขึ้นเล็กน้อยไม่เพียงแต่จะช่วยเพิ่มความสะดวกสบายและประหยัดพลังงาน แต่ยังช่วยยืดอายุการใช้งานอีกด้วย
อ่านเพิ่มเติมในบล็อก Toptal Engineering:
- วิธีสร้างเซิร์ฟเวอร์ Raspberry Pi สำหรับการพัฒนา
- วิธีนำสมาร์ทโฟนเครื่องเก่ามาใช้เป็นรีโมตคอนโทรล
