이 Raspberry Pi 온도 조절기 자습서로 기후를 제어하십시오.
게시 됨: 2022-03-11많은 가정의 에어컨에는 중앙 자동화, 프로그래밍 가능한 온도 조절기, 다중 센서 또는 Wi-Fi 제어와 같은 최신 기능이 부족합니다. 그러나 오래된 에어컨 기술은 여전히 신뢰할 수 있으므로 많은 경우에 곧 업그레이드되지 않을 것입니다.
그러나 이를 위해서는 사용자가 에어컨을 켜거나 끄기 위해 자주 작업을 중단하거나 잠을 자야 합니다. 이것은 저와 같이 레이아웃이 좁은 집에서 특히 그렇습니다.
미국 가정에는 일반적으로 중앙 에어컨이 있지만 전 세계적으로는 그렇지 않습니다. 중앙 AC가 없으면 자동화 옵션이 제한되어 집 전체에서 동일한 온도를 유지하기가 더 어려워집니다. 특히 수동 개입이 필요할 수 있는 온도 변동을 피하기가 어렵습니다.
엔지니어이자 사물 인터넷(IoT) 애호가로서 저는 몇 가지 유용한 작업을 한 번에 수행할 수 있는 기회를 보았습니다.
- 독립형 에어컨 장치의 효율성을 개선하여 에너지 절약에 도움
- 자동화 및 Google Home 통합을 통해 내 집을 더 편안하게 만드세요
- 상업적으로 사용 가능한 옵션에 국한되지 않고 원하는 방식으로 솔루션을 사용자 정의합니다.
- 검증된 하드웨어를 사용하여 내 전문 기술을 연마합니다.
내 에어컨은 간단한 적외선 리모컨이 있는 기본 기기입니다. 나는 Sensibo나 Tado와 같은 스마트 홈 시스템과 함께 에어컨 장치를 사용할 수 있는 장치를 알고 있었습니다. 대신 DIY 방식으로 라즈베리 파이 온도 조절기를 만들어 다양한 방의 센서 입력을 기반으로 보다 정교한 제어가 가능하도록 했습니다.
라즈베리 파이 온도 조절기 하드웨어
나는 이미 여러 방의 온도와 습도를 모니터링하기 위해 DHT22 센서 모듈과 결합된 여러 Raspberry Pi Zero W를 사용하고 있었습니다. 분할된 평면도 때문에 센서를 설치하여 집의 여러 부분에서 얼마나 따뜻한지 모니터링했습니다.
또한 WSL 2가 설치된 Windows 10 PC에 가정용 감시 시스템(이 프로젝트에는 필요하지 않음)이 있습니다. 센서 판독값을 비디오 피드의 텍스트 오버레이로 감시 비디오에 통합하고 싶었습니다.
센서 배선
센서는 배선이 간단하고 연결이 3개뿐입니다.
Raspberry Pi OS Lite를 사용하여 PiP가 포함된 Python 3 및 Python용 Adafruit_DHT 라이브러리를 설치하여 센서 데이터를 읽습니다. 기술적으로 더 이상 사용되지 않지만 설치 및 사용이 더 간단합니다. 또한 사용 사례에 더 적은 리소스가 필요합니다.
또한 모든 판독값에 대한 로그를 갖고 싶었기 때문에 타사 서버인 ThingSpeak를 사용하여 내 데이터를 호스팅하고 API 호출을 통해 제공했습니다. 비교적 간단하고 실시간 판독이 필요하지 않았기 때문에 5분마다 데이터를 전송하기로 했습니다.
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를 실행하는 전용 감시 PC에서 ThingSpeak에서 데이터를 가져와 형식을 지정하고 간단한 .txt 파일에 쓰는 PHP 스크립트를 설정했습니다. 이 .txt 파일은 내 감시 소프트웨어가 비디오 스트림 위에 오버레이하는 데 필요합니다.
스마트 전구와 Google Home의 여러 루틴을 포함하여 이미 집에 자동화가 있었기 때문에 센서 데이터를 Google Home의 스마트 온도 조절기로 사용하게 되었습니다. 내 계획은 사용자 입력 없이도 실내 온도에 따라 자동으로 에어컨을 켜거나 끄는 Google Home 루틴을 만드는 것이었습니다.
Sensibo 및 Tado와 같은 더 비싼 올인원 솔루션은 기술 설정이 덜 필요하지만 PNI SafeHome PT11IR을 사용하면 범위 내에서 원하는 수의 적외선 장치를 제어하는 데 전화기를 사용할 수 있습니다. 제어 앱 Tuya는 Google Home과 통합됩니다.
Google 홈 통합 문제 극복
스마트 지원 에어컨과 센서 데이터를 사용할 수 있는 상황에서 라즈베리를 Google Home에서 온도 조절기로 인식하도록 하려고 했지만 소용이 없었습니다. 센서 데이터를 Google IoT Cloud 및 해당 Pub/Sub 서비스로 보낼 수 있었지만 Google Home으로 보내 해당 데이터를 기반으로 루틴을 생성할 방법이 없었습니다.
이것을 며칠 동안 숙고한 후, 나는 새로운 접근 방식을 생각했습니다. 데이터를 Google Home으로 보낼 필요가 없다면 어떻게 합니까? 로컬에서 데이터를 확인하고 Google Home에 명령을 보내 에어컨을 켜거나 끌 수 있다면 어떨까요? 음성 명령을 성공적으로 테스트했기 때문에 이 접근 방식이 유망해 보였습니다.

빠른 검색을 통해 사용자가 Google 어시스턴트에 명령을 보낼 수 있는 Node.js 기반 시스템인 어시스턴트 릴레이(Assistant Relay)가 나타났습니다. 이를 통해 사용자는 Google 어시스턴트가 수신한 입력으로 무엇을 해야 하는지 알고 있는 한 무엇이든 Google 어시스턴트에 연결할 수 있습니다.
게다가 어시스턴트 릴레이를 사용하면 몇 가지 필수 매개변수와 함께 Node.js 서버(이 경우 내 Raspberry Pi Zero W)를 실행하는 기기에 POST 요청을 전송하여 Google 어시스턴트에 대한 명령을 종료할 수 있습니다. 그게 다야 스크립트는 잘 문서화되어 있으므로 여기서 자세히 설명하지 않겠습니다.
감시 PC에서 센서 데이터를 이미 읽고 있었기 때문에 요청을 PHP 스크립트에 통합하여 한 곳에 보관할 수 있다고 생각했습니다.
.txt 파일 요구 사항이 없을 가능성이 높으므로 어시스턴트 릴레이를 통해 센서 데이터를 직접 읽고 해당 데이터를 기반으로 Google 어시스턴트 서비스에 명령을 실행하여 프로세스를 단순화할 수 있습니다. 이 모든 것은 추가 하드웨어 없이 단일 Raspberry Pi 장치에서 수행할 수 있습니다. 그러나 이미 작업의 절반을 완료했기 때문에 내가 가진 것을 사용하는 것이 합리적이었습니다. 이 기사의 두 스크립트는 단일 시스템에서 사용할 수 있습니다. 또한 필요한 경우 PHP 스크립트를 Python으로 다시 작성할 수 있습니다.
조건 설정 및 작동 자동화
자동 전원 주기가 야간에만 발생하기를 원했기 때문에 자동 작동을 원하는 시간(오후 10시~오전 7시)을 정의하고 원하는 온도를 설정했습니다. 에어컨 장치의 전원을 너무 자주 순환하여 에어컨 장치의 수명을 단축하지 않고 편안한 범위를 얻으려면 올바른 온도 간격을 식별하는 데 몇 번의 시도가 필요했습니다.
센서 데이터 오버레이를 생성한 PHP 스크립트는 cron 작업을 통해 5분마다 실행되도록 설정되었으므로 여기에 추가한 것은 조건과 POST 요청뿐이었습니다.
그러나 이로 인해 문제가 발생했습니다. 조건이 충족되면 스크립트는 에어컨이 이미 켜져 있더라도 5분마다 "켜기" 명령을 보냅니다. 이로 인해 "꺼짐" 명령에도 장치가 성가시게 삐 소리를 냈습니다. 이를 해결하기 위해 장치의 현재 상태를 읽을 수 있는 방법이 필요했습니다.
우아함이 우선이 아니어서 배열이 포함된 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 엔지니어링 블로그에 대한 추가 정보:
- 개발을 위해 Raspberry Pi 서버를 구축하는 방법
- 구형 스마트폰을 리모컨으로 활용하는 방법
