Управляйте своим климатом с помощью этого учебника по термостату Raspberry Pi
Опубликовано: 2022-03-11Кондиционированию воздуха во многих домах не хватает современных тонкостей, таких как центральная автоматизация, программируемые термостаты, несколько датчиков или управление по Wi-Fi. Но старые технологии кондиционирования воздуха по-прежнему надежны, поэтому во многих случаях их вряд ли скоро обновят.
Это, однако, требует, чтобы пользователи часто прерывали работу или сон, чтобы включить или выключить кондиционер. Это особенно актуально в домах с плотной планировкой, как у меня:
Дома в США обычно имеют центральное кондиционирование воздуха, но во всем мире это не так. Отсутствие центрального кондиционера ограничивает возможности автоматизации, что затрудняет достижение одинаковой температуры во всем доме. В частности, трудно избежать колебаний температуры, для устранения которых может потребоваться ручное вмешательство.
Как инженер и энтузиаст Интернета вещей (IoT) я увидел возможность сделать сразу несколько полезных вещей:
- Помогите сохранить энергию, повысив эффективность моего автономного кондиционера.
- Сделайте мой дом более комфортным с помощью автоматизации и интеграции с Google Home
- Настройте мое решение именно так, как я хотел, вместо того, чтобы ограничиваться коммерчески доступными вариантами.
- Освежить в памяти некоторые из моих профессиональных навыков, используя проверенное оборудование
Мой кондиционер представляет собой базовое устройство с простым инфракрасным пультом дистанционного управления. Я знал об устройствах, которые позволяют использовать кондиционеры с системами умного дома, такими как Sensibo или Tado. Вместо этого я применил подход «сделай сам» и создал термостат Raspberry Pi, обеспечивающий более сложное управление на основе данных датчиков из разных комнат.
Аппаратное обеспечение термостата Raspberry Pi
Я уже использовал несколько Raspberry Pi Zero W в сочетании с сенсорными модулями 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 Home, которая автоматически включала бы или выключала кондиционер в зависимости от температуры в помещении, без необходимости ввода данных пользователем.
Более дорогие универсальные решения, такие как решения Sensibo и Tado, требуют меньшей технической настройки, но за небольшую часть стоимости PNI SafeHome PT11IR позволил мне использовать свой телефон для управления любым количеством инфракрасных устройств в пределах его диапазона. Приложение для управления Tuya интегрируется с Google Home.
Преодоление проблем с интеграцией Google Home
Имея умный кондиционер и данные датчиков, я попытался распознать Raspberry как термостат в Google Home, но безрезультатно. Мне удалось отправить данные датчиков в Google IoT Cloud и его службу Pub/Sub, но не было возможности отправить их в Google Home, чтобы создать процедуру на основе этих данных.

Поразмыслив над этим несколько дней, я придумал новый подход. Что, если бы мне не нужно было отправлять данные в 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 через 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
Меня побудило автоматизировать кондиционирование воздуха, потому что нетрадиционная планировка моего дома иногда приводила к совершенно разным температурам в разных комнатах. Но автоматизация отопления и охлаждения имеет преимущества даже для тех, кто не сталкивается с этой конкретной проблемой.
Люди во всем мире живут в разных климатических условиях и платят за энергию по разным ценам (и по разным тарифам в разное время суток), поэтому даже скромные улучшения в энергоэффективности могут сделать автоматизацию полезной в определенных регионах.
Кроме того, поскольку все больше и больше домов становятся автоматизированными, есть причина изучить потенциал автоматизации старых энергоемких устройств и приборов, таких как кондиционеры, электрические и водонагреватели. Поскольку эти устройства, как правило, громоздки, сложны в установке и дороги в обновлении, многие люди останутся с ними на долгие годы. Если сделать эти «тупые» устройства немного умнее, это может не только повысить комфорт и энергоэффективность, но и продлить срок их службы.
Дальнейшее чтение в блоге Toptal Engineering:
- Как создать сервер Raspberry Pi для разработки
- Как использовать старый смартфон в качестве пульта дистанционного управления
