O ar condicionado em muitas casas carece de detalhes modernos, como automação central, termostatos programáveis, vários sensores ou controle de Wi-Fi. Mas a tecnologia de ar condicionado mais antiga ainda é confiável, portanto, em muitos casos, é improvável que seja atualizada em breve.
Isso, no entanto, exige que os usuários interrompam frequentemente o trabalho ou o sono para ligar ou desligar um ar condicionado. Isso é particularmente verdadeiro em casas com layouts apertados, como a minha:

As casas dos EUA geralmente têm ar condicionado central, mas esse não é o caso globalmente. Não ter AC central limita as opções de automação, tornando mais difícil atingir a mesma temperatura em toda a casa. Em particular, torna difícil evitar flutuações de temperatura que podem exigir intervenção manual para resolver.
Como engenheiro e entusiasta da Internet das Coisas (IoT) , vi uma oportunidade de fazer algumas coisas úteis de uma só vez:
- Ajude a economizar energia melhorando a eficiência do meu aparelho de ar condicionado autônomo
- Torne minha casa mais confortável por meio da automação e da integração com o Google Home
- Personalize minha solução exatamente do jeito que eu queria, em vez de ficar limitado às opções disponíveis comercialmente
- Aprimore algumas das minhas habilidades profissionais, usando hardware testado e aprovado
Meu ar condicionado é um aparelho básico com um simples controle remoto infravermelho. Eu estava ciente de dispositivos que permitem que unidades de ar condicionado sejam usadas com sistemas domésticos inteligentes, como Sensibo ou Tado. Em vez disso, adotei uma abordagem DIY e criei um termostato Raspberry Pi, permitindo um controle mais sofisticado com base na entrada do sensor de várias salas.
Hardware do termostato Raspberry Pi
Eu já estava usando vários Raspberry Pi Zero Ws, acoplados a módulos de sensores DHT22 , para monitorar a temperatura e a umidade em diferentes salas. Por causa da planta segmentada, instalei os sensores para monitorar o calor em diferentes partes da minha casa.
Eu também tenho um sistema de vigilância doméstica (não necessário para este projeto) em um PC Windows 10 com WSL 2. Eu queria integrar as leituras do sensor nos vídeos de vigilância, como uma sobreposição de texto no feed de vídeo.
Fiação do sensor
Os sensores eram fáceis de conectar, tendo apenas três conexões:

Usei o Raspberry Pi OS Lite, instalando o Python 3 com PiP e a biblioteca Adafruit_DHT para Python ler os dados do sensor. É tecnicamente obsoleto, mas mais simples de instalar e usar. Além disso, requer menos recursos para nosso caso de uso.
Eu também queria ter um log de todas as leituras, então usei um servidor de terceiros, ThingSpeak, para hospedar meus dados e servi-los por meio de chamadas de API. É relativamente simples e, como não precisava de leituras em tempo real, optei por enviar dados a cada cinco minutos.
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 (e.g. 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)
No meu PC de vigilância dedicado, executando o WSL 2, configurei um script PHP que busca os dados do ThingSpeak, os formata e os grava em um .txt
arquivo simples. Esse .txt
arquivo é necessário para que meu software de vigilância o sobreponha ao fluxo de vídeo.
Como eu já tinha alguma automação na casa, incluindo lâmpadas inteligentes e várias rotinas no Google Home, seguia-se que eu usaria os dados do sensor como um termostato inteligente no Google Home. Meu plano era criar uma rotina do Google Home que ligasse ou desligasse o ar condicionado automaticamente com base na temperatura ambiente, sem a necessidade de entrada do usuário.
Soluções all-in-one mais caras, como as da Sensibo e Tado, exigem menos configuração técnica, mas por uma fração do custo, o PNI SafeHome PT11IR me permitiu usar meu telefone para controlar qualquer número de dispositivos infravermelhos dentro de seu alcance. O aplicativo de controle, Tuya, integra-se ao Google Home.
Como superar problemas de integração do Google Home
Com um ar condicionado habilitado para inteligência e dados do sensor disponíveis, tentei fazer com que o Raspberry fosse reconhecido como um termostato no Google Home, mas sem sucesso. Consegui enviar os dados do sensor para o Google IoT Cloud e seu serviço Pub/Sub, mas não havia como enviá-los para o Google Home para criar uma rotina com base nesses dados.
Depois de refletir sobre isso por alguns dias, pensei em uma nova abordagem. E se eu não precisar enviar os dados para o Google Home? E se eu pudesse verificar os dados localmente e enviar um comando para o Google Home para ligar ou desligar o ar condicionado? Testei comandos de voz com sucesso, então essa abordagem parecia promissora.
Uma pesquisa rápida revelou o Assistant Relay, um sistema com tecnologia Node.js que permite que um usuário envie comandos ao Google Assistant, permitindo que o usuário vincule qualquer coisa ao Google Assistant, desde que saiba o que fazer com a entrada recebida.
Melhor ainda, com o Assistant Relay, eu poderia encerrar comandos para meu Google Assistant simplesmente enviando solicitações POST para o dispositivo que executa o servidor Node.js (neste caso, meu Raspberry Pi Zero W) com alguns parâmetros necessários. É isso. O script está bem documentado, então não entrarei em muitos detalhes aqui.
Como os dados do sensor já estavam sendo lidos no PC de vigilância, imaginei que poderia integrar a solicitação ao script PHP para manter as coisas em um só lugar.
Como você provavelmente não tem o .txt
requisito de arquivo, pode simplificar o processo lendo diretamente os dados do sensor e emitindo comandos com base nesses dados para o serviço Google Assistant, por meio do Assistant Relay. Tudo isso pode ser feito a partir de um único dispositivo Raspberry Pi, sem a necessidade de hardware adicional. No entanto, como já tinha feito metade do trabalho, fazia sentido usar o que tinha. Ambos os scripts neste artigo podem ser usados em uma única máquina; além disso, o script PHP pode ser reescrito em Python, se necessário.
Configurando Condições e Automatizando a Operação
Eu queria que o ciclo automático de energia acontecesse apenas durante a noite, então defini as horas para as quais eu queria automatizar a operação – 22h às 7h – e defini a temperatura preferida. Identificar os intervalos de temperatura corretos – para alcançar uma faixa confortável sem diminuir a vida útil da unidade de ar condicionado desligando sua energia com muita frequência – exigiu algumas tentativas para acertar.
O script PHP que criou a sobreposição de dados do sensor foi configurado para ser executado a cada cinco minutos por meio de um cron job, então as únicas coisas que adicionei a ele foram as condições e a solicitação POST.
No entanto, isso criou um problema. Se as condições fossem atendidas, o script enviaria um comando “ligar” a cada cinco minutos, mesmo que o ar condicionado já estivesse ligado. Isso fez com que a unidade apitasse irritantemente, mesmo no comando “desligar”. Para corrigir isso, eu precisava de uma maneira de ler o status atual da unidade.
A elegância não era uma prioridade, então criei um arquivo JSON contendo um array. Sempre que os comandos “ligar” ou “desligar” fossem concluídos com êxito, o script anexaria o último status a essa matriz. Isso resolveu a redundância; no entanto, dias particularmente quentes ou aquecimento excessivo durante o inverno podem fazer com que as condições sejam atendidas novamente. Decidi que uma substituição manual seria suficiente nessas situações. Deixarei a adição de um retorno antes do trecho de troca para este fim como um exercício para o leitor:
<?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, Y H: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];
}
Isso funcionou, mas não na primeira tentativa. Eu tive que descobrir as coisas ao longo do caminho e ajustá-las conforme necessário. Espero que, com o benefício da minha experiência, você não precise fazer tanto para acertar na primeira vez.
O valor de um controlador de termostato Raspberry Pi
Fiquei motivado a automatizar meu ar condicionado porque o layout não convencional da minha casa às vezes resultava em temperaturas muito diferentes em diferentes cômodos. Mas automatizar o aquecimento e o resfriamento traz benefícios mesmo para quem não enfrenta esse problema específico.
Pessoas em todo o mundo vivem em vários climas e pagam preços diferentes pela energia (e taxas diferentes em diferentes momentos do dia), portanto, mesmo melhorias modestas na eficiência energética podem fazer a automação valer a pena em determinadas regiões.
Além disso, à medida que mais e mais casas se tornam automatizadas, há motivos para explorar o potencial de automatizar dispositivos e aparelhos mais antigos que consomem energia, como condicionadores de ar, aquecedores elétricos e aquecedores de água. Como esses dispositivos são geralmente volumosos, difíceis de instalar e caros para atualizar, muitas pessoas ficarão presas a eles nos próximos anos. Tornar esses dispositivos “burros” um pouco mais inteligentes pode não apenas melhorar o conforto e a eficiência energética, mas também prolongar sua vida útil.