Bu Raspberry Pi Termostat Eğitimi ile İkliminizi Kontrol Edin
Yayınlanan: 2022-03-11Birçok evdeki klima, merkezi otomasyon, programlanabilir termostatlar, çoklu sensörler veya Wi-Fi kontrolü gibi modern özelliklerden yoksundur. Ancak eski klima teknolojisi hala güvenilirdir, bu nedenle çoğu durumda yakında yükseltilmesi pek olası değildir.
Ancak bu, kullanıcıların bir klimayı açmak veya kapatmak için sık sık işi veya uykuyu kesmesini gerektirir. Bu, özellikle benimki gibi dar yerleşimlere sahip evlerde geçerlidir:
ABD evlerinde genellikle merkezi klima bulunur, ancak küresel olarak durum böyle değildir. Merkezi AC'nin olmaması otomasyon seçeneklerini sınırlar, bu da tüm evde aynı sıcaklığın elde edilmesini zorlaştırır. Özellikle, ele alınması için manuel müdahale gerektirebilecek sıcaklık dalgalanmalarından kaçınmayı zorlaştırır.
Bir mühendis ve Nesnelerin İnterneti (IoT) meraklısı olarak, birkaç yararlı şeyi aynı anda yapma fırsatı gördüm:
- Bağımsız klima ünitemin verimliliğini artırarak enerji tasarrufuna yardımcı olun
- Otomasyon ve Google Home entegrasyonu ile evimi daha konforlu hale getirin
- Ticari olarak mevcut seçeneklerle sınırlı kalmak yerine, çözümümü tam olarak istediğim gibi özelleştirin
- Denenmiş ve test edilmiş donanımları kullanarak bazı profesyonel becerilerimi tazeleyin
Klimam basit bir kızılötesi uzaktan kumandaya sahip temel bir cihazdır. Sensibo veya Tado gibi klima ünitelerinin akıllı ev sistemleriyle kullanılmasını sağlayan cihazlardan haberdardım. Bunun yerine, bir DIY yaklaşımı benimsedim ve çeşitli odalardan gelen sensör girişine dayalı daha karmaşık kontrole izin veren bir Raspberry Pi termostatı oluşturdum.
Raspberry Pi Termostat Donanımı
Farklı odalarda sıcaklık ve nemi izlemek için DHT22 sensör modülleriyle birleştirilmiş birkaç Raspberry Pi Zero W kullanıyordum. Bölünmüş kat planı nedeniyle, evimin farklı yerlerine ne kadar sıcak olduğunu izlemek için sensörler kurdum.
Ayrıca WSL 2'li bir Windows 10 PC'de bir ev gözetleme sistemim var (bu proje için gerekli değil). Sensör okumalarını, video beslemesinde bir metin yerleşimi olarak gözetleme videolarına entegre etmek istedim.
Sensörü Kablolama
Sensörler, yalnızca üç bağlantıya sahip olduklarından kablolanması kolaydı:
Sensör verilerini okumak için Raspberry Pi OS Lite kullandım, Python 3'ü PiP ile kurdum ve Python için Adafruit_DHT kütüphanesini kurdum. Teknik olarak kullanımdan kaldırılmıştır ancak kurulumu ve kullanımı daha kolaydır. Ayrıca, kullanım durumumuz için daha az kaynak gerektirir.
Ayrıca tüm okumaların bir günlüğüne sahip olmak istedim, bu yüzden verilerimi barındırmak ve API çağrıları aracılığıyla sunmak için üçüncü taraf bir sunucu olan ThingSpeak'i kullandım. Nispeten basit ve gerçek zamanlı okumalara ihtiyacım olmadığı için her beş dakikada bir veri göndermeyi seçtim.
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 çalıştıran özel gözetim bilgisayarımda, verileri ThingSpeak'ten alan, biçimlendiren ve basit bir .txt dosyasına yazan bir PHP betiği kurdum. Bu .txt dosyası, gözetim yazılımımın onu video akışının üzerine yerleştirmesi için gerekli.
Evde akıllı ampuller ve Google Home'daki çeşitli rutinler de dahil olmak üzere bazı otomasyonlara zaten sahip olduğum için, sensör verilerini Google Home'da akıllı termostat olarak kullanacaktım. Planım, kullanıcı girişi gerekmeden klimayı oda sıcaklığına göre otomatik olarak açıp kapatacak bir Google Home rutini oluşturmaktı.
Sensibo ve Tado'nunkiler gibi daha pahalı hepsi bir arada çözümler daha az teknik kurulum gerektirir, ancak maliyetin bir kısmı için PNI SafeHome PT11IR, telefonumu menzilindeki herhangi bir sayıda kızılötesi cihazı kontrol etmek için kullanmamı sağladı. Kontrol uygulaması Tuya, Google Home ile entegre olur.
Google Home Entegrasyon Sorunlarının Üstesinden Gelmek
Akıllı özellikli bir klima ve mevcut sensör verileriyle, Raspberry'nin Google Home'da bir termostat olarak tanınmasını sağlamaya çalıştım ama boşuna. Sensör verilerini Google IoT Cloud'a ve onun Pub/Sub hizmetine gönderebildim, ancak bu verilere dayalı bir rutin oluşturmak için Google Home'a göndermenin bir yolu yoktu.
Bunu birkaç gün düşündükten sonra, yeni bir yaklaşım düşündüm. Ya verileri Google Home'a göndermem gerekmiyorsa? Verileri yerel olarak kontrol edip klimayı açmak veya kapatmak için Google Home'a bir komut gönderebilirsem ne olur? Ses komutlarını başarıyla test ettim, bu yüzden bu yaklaşım umut verici görünüyordu.

Hızlı bir arama, kullanıcının Google Asistan'a komut göndermesine olanak tanıyan ve aldığı girdiyle ne yapacağını bildiği sürece kullanıcının herhangi bir şeyi Google Asistan'a bağlamasına olanak tanıyan Node.js destekli bir sistem olan Assistant Relay'i açtı.
Daha da iyisi, Assistant Relay ile, bazı gerekli parametrelerle Node.js sunucusunu çalıştıran cihaza (bu durumda Raspberry Pi Zero W'm) POST istekleri göndererek Google Asistanıma komutları sonlandırabilirim. Bu kadar. Senaryo iyi belgelenmiştir, bu yüzden burada fazla ayrıntıya girmeyeceğim.
Sensör verileri gözetim bilgisayarında zaten okunmakta olduğundan, her şeyi tek bir yerde tutmak için isteği PHP betiğine entegre edebileceğimi düşündüm.
Muhtemelen .txt dosyası gereksiniminiz olmadığından, sensör verilerini doğrudan okuyarak ve bu verilere dayalı komutları Assistant Relay aracılığıyla Google Asistan Hizmetine vererek işlemi basitleştirebilirsiniz. Tüm bunlar ek bir donanıma ihtiyaç duymadan tek bir Raspberry Pi cihazından yapılabilir. Ancak işin yarısını zaten bitirdiğim için elimdekileri kullanmak mantıklı geldi. Bu makaledeki her iki komut dosyası da tek bir makinede kullanılabilir; ayrıca, gerekirse PHP betiği Python'da yeniden yazılabilir.
Koşulları Ayarlama ve İşlemi Otomatikleştirme
Otomatik güç çevriminin yalnızca gece olmasını istedim, bu yüzden çalışmayı otomatikleştirmek istediğim saatleri (22:00 - 07:00) belirledim ve tercih edilen sıcaklığı ayarladım. Doğru sıcaklık aralıklarını belirlemek - klima ünitesinin gücünü çok sık devirerek ömrünü kısaltmadan rahat bir aralık elde etmek için - doğru yapmak için birkaç deneme gerektirdi.
Sensör veri kaplamasını oluşturan PHP betiği, bir cron işi aracılığıyla her beş dakikada bir çalışacak şekilde ayarlandı, bu yüzden ona eklediğim tek şey koşullar ve POST isteğiydi.
Ancak bu bir sorun yarattı. Koşullar karşılanırsa, klima zaten açık olsa bile komut dosyası her beş dakikada bir "açma" komutu gönderir. Bu, ünitenin "kapat" komutunda bile rahatsız edici bir şekilde bip sesi çıkarmasına neden oldu. Bunu düzeltmek için ünitenin mevcut durumunu okumanın bir yoluna ihtiyacım vardı.
Elegance bir öncelik değildi, bu yüzden bir dizi içeren bir JSON dosyası yaptım. "Aç" veya "kapat" komutları başarıyla tamamlandığında, komut dosyası bu diziye son durumu ekler. Bu çözülmüş fazlalık; ancak özellikle sıcak günler veya kış aylarında aşırı ısınma koşulların tekrar sağlanmasına neden olabilir. Bu durumlarda manuel geçersiz kılmanın yeterli olacağına karar verdim. Bu amaçla, okuyucu için bir alıştırma olarak, anahtar parçacığından önce bir dönüş eklemeyi bırakacağım:
<?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]; }Bu işe yaradı ama ilk denemede olmadı. Yol boyunca bazı şeyleri çözmem ve gerektiği gibi düzeltmem gerekiyordu. Umarım, deneyimlerimden yararlanarak, ilk seferde doğru yapmak için çok fazla şey yapmanıza gerek kalmaz.
Raspberry Pi Termostat Kontrolörünün Değeri
Evimin sıra dışı yerleşimi bazen farklı odalarda çok farklı sıcaklıklara neden olduğu için klimamı otomatikleştirmeye motive oldum. Ancak ısıtma ve soğutmayı otomatikleştirmenin, bu sorunla karşılaşmayanlar için bile faydaları vardır.
Dünyanın dört bir yanındaki insanlar çeşitli iklimlerde yaşıyor ve enerji için farklı fiyatlar (ve günün farklı saatlerinde farklı oranlar) ödüyorlar, bu nedenle enerji verimliliğindeki mütevazı iyileştirmeler bile belirli bölgelerde otomasyonu değerli kılabilir.
Ayrıca, giderek daha fazla ev otomatik hale geldikçe, klimalar, elektrikli ısıtıcılar ve su ısıtıcıları gibi güce aç eski cihazları ve aletleri otomatikleştirme potansiyelini keşfetmek için nedenler var. Bu cihazlar genellikle hantal, kurulumu zor ve yükseltmesi pahalı olduğu için, birçok kişi önümüzdeki yıllarda onlarla birlikte kalacak. Bu "aptal" cihazları biraz daha akıllı hale getirmek, yalnızca konforu ve enerji verimliliğini artırmakla kalmaz, aynı zamanda kullanım ömürlerini de uzatır.
Toptal Mühendislik Blogunda Daha Fazla Okuma:
- Geliştirme için Raspberry Pi Sunucusu Nasıl Kurulur
- Eski akıllı telefonunuzu uzaktan kumanda olarak nasıl yeniden kullanabilirsiniz?
