Raspberry Pi ile Akıllı Ev Otomasyon Sistemi
Giriş: Neden Raspberry Pi ile Ev Otomasyonu?
Akıllı ev sistemleri son yıllarda hızla yaygınlaşsa da, hazır çözümler genellikle pahalı, kapalı ekosistemlere bağımlı ve özelleştirme imkânı sınırlı oluyor. Raspberry Pi, düşük maliyeti, geniş topluluk desteği ve esnek yapısıyla kendi akıllı ev otomasyon sisteminizi sıfırdan kurmanıza olanak tanır. Bu yazıda, Raspberry Pi üzerinde çalışan kapsamlı bir ev otomasyon sistemi kurmayı adım adım inceleyeceğiz.
Gerekli Donanımlar
Projeye başlamadan önce aşağıdaki donanımlara ihtiyacınız olacak:
- Raspberry Pi 4 Model B (4GB RAM) — Ana kontrol ünitesi olarak görev yapacak
- 32GB veya 64GB microSD kart — İşletim sistemi ve veritabanı için
- DHT22 sıcaklık ve nem sensörü — Ortam koşullarını izlemek için
- Röle modülü (4 kanallı) — Aydınlatma ve cihaz kontrolü için
- PIR hareket sensörü (HC-SR501) — Hareket algılama için
- MQ-2 gaz sensörü — Güvenlik amaçlı gaz kaçağı tespiti için
- USB kamera veya Pi Camera modülü — Güvenlik kamerası olarak
- Breadboard ve jumper kablolar — Prototipleme için
Sistem Mimarisi
Otomasyon sistemimiz üç ana katmandan oluşacak:
- Sensör Katmanı: GPIO pinlerine bağlı sensörler aracılığıyla veri toplama
- İşleme Katmanı: Python tabanlı otomasyon mantığı ve MQTT mesajlaşma
- Arayüz Katmanı: Home Assistant veya özel web arayüzü ile kontrol ve izleme
Adım 1: Raspberry Pi OS Kurulumu ve Temel Yapılandırma
Raspberry Pi Imager aracını kullanarak microSD karta Raspberry Pi OS Lite (64-bit) sürümünü yazın. Masaüstü ortamına ihtiyacımız olmayacağı için Lite sürümü yeterli ve daha performanslı olacaktır.
İlk açılıştan sonra temel güncellemeleri yapın:
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv git mosquitto mosquitto-clients -y
GPIO erişimi için gerekli Python kütüphanelerini kurun:
python3 -m venv ~/ev-otomasyon
source ~/ev-otomasyon/bin/activate
pip install RPi.GPIO Adafruit-DHT paho-mqtt flask
Adım 2: MQTT Broker Kurulumu
MQTT (Message Queuing Telemetry Transport), IoT cihazları arasında hafif ve verimli mesajlaşma sağlayan bir protokoldür. Mosquitto'yu MQTT broker olarak kullanacağız.
Mosquitto yapılandırma dosyasını düzenleyin:
sudo nano /etc/mosquitto/mosquitto.conf
Aşağıdaki satırları ekleyin:
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
Kullanıcı oluşturun ve servisi yeniden başlatın:
sudo mosquitto_passwd -c /etc/mosquitto/passwd ev_admin
sudo systemctl restart mosquitto
sudo systemctl enable mosquitto
Adım 3: Sensör Okuma Modülü
Sensörlerden veri okuyup MQTT üzerinden yayınlayan Python modülünü oluşturalım:
import Adafruit_DHT
import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import json
import time
# GPIO ayarları
GPIO.setmode(GPIO.BCM)
DHT_PIN = 4
PIR_PIN = 17
GAS_PIN = 27
ROLE_PINS = [5, 6, 13, 19]
GPIO.setup(PIR_PIN, GPIO.IN)
GPIO.setup(GAS_PIN, GPIO.IN)
for pin in ROLE_PINS:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.HIGH) # Röleleri kapalı başlat
# MQTT bağlantısı
client = mqtt.Client(client_id="sensor_hub")
client.username_pw_set("ev_admin", "sifreniz")
client.connect("localhost", 1883, 60)
def sicaklik_nem_oku():
nem, sicaklik = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, DHT_PIN)
if nem is not None and sicaklik is not None:
veri = {
"sicaklik": round(sicaklik, 1),
"nem": round(nem, 1),
"zaman": time.strftime("%Y-%m-%d %H:%M:%S")
}
client.publish("ev/ortam/sicaklik_nem", json.dumps(veri))
return veri
return None
def hareket_kontrol():
if GPIO.input(PIR_PIN):
client.publish("ev/guvenlik/hareket", json.dumps({
"durum": "hareket_algilandi",
"zaman": time.strftime("%Y-%m-%d %H:%M:%S")
}))
return True
return False
def gaz_kontrol():
if GPIO.input(GAS_PIN) == 0:
client.publish("ev/guvenlik/gaz", json.dumps({
"durum": "gaz_algilandi",
"zaman": time.strftime("%Y-%m-%d %H:%M:%S")
}))
return True
return False
def role_kontrol(kanal, durum):
if 0 <= kanal < len(ROLE_PINS):
GPIO.output(ROLE_PINS[kanal], GPIO.LOW if durum else GPIO.HIGH)
client.publish(f"ev/cihaz/role_{kanal}", json.dumps({
"kanal": kanal,
"durum": "acik" if durum else "kapali"
}))
# Ana döngü
try:
while True:
sicaklik_nem_oku()
hareket_kontrol()
gaz_kontrol()
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()
Adım 4: Otomasyon Kuralları Motoru
Sensör verilerine göre otomatik aksiyon alan bir kural motoru yazalım. Bu modül MQTT mesajlarını dinleyerek belirli koşullar gerçekleştiğinde otomatik tepki verir:
import paho.mqtt.client as mqtt
import json
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
KURALLAR = {
"sicaklik_yuksek": {"esik": 28.0, "aksiyon": "klimayi_ac"},
"sicaklik_dusuk": {"esik": 18.0, "aksiyon": "isiticiyi_ac"},
"nem_yuksek": {"esik": 70.0, "aksiyon": "havalandirmayi_ac"},
}
def mesaj_geldi(client, userdata, msg):
veri = json.loads(msg.payload.decode())
konu = msg.topic
if konu == "ev/ortam/sicaklik_nem":
sicaklik = veri["sicaklik"]
nem = veri["nem"]
if sicaklik > KURALLAR["sicaklik_yuksek"]["esik"]:
logging.info(f"Sıcaklık yüksek: {sicaklik}°C — Klima açılıyor")
client.publish("ev/komut/role", json.dumps({"kanal": 0, "durum": True}))
elif sicaklik < KURALLAR["sicaklik_dusuk"]["esik"]:
logging.info(f"Sıcaklık düşük: {sicaklik}°C — Isıtıcı açılıyor")
client.publish("ev/komut/role", json.dumps({"kanal": 1, "durum": True}))
if nem > KURALLAR["nem_yuksek"]["esik"]:
logging.info(f"Nem yüksek: {nem}% — Havalandırma açılıyor")
client.publish("ev/komut/role", json.dumps({"kanal": 2, "durum": True}))
elif konu == "ev/guvenlik/gaz":
logging.warning("GAZ ALARMI! Tüm cihazlar kapatılıyor.")
for kanal in range(4):
client.publish("ev/komut/role", json.dumps({"kanal": kanal, "durum": False}))
client.publish("ev/bildirim/acil", json.dumps({
"mesaj": "Gaz kaçağı algılandı! Tüm cihazlar kapatıldı."
}))
client = mqtt.Client(client_id="kural_motoru")
client.username_pw_set("ev_admin", "sifreniz")
client.on_message = mesaj_geldi
client.connect("localhost", 1883, 60)
client.subscribe("ev/#")
client.loop_forever()
Adım 5: Web Arayüzü ile Kontrol Paneli
Flask kullanarak basit ama işlevsel bir web kontrol paneli oluşturalım:
from flask import Flask, render_template_string, jsonify, request
import paho.mqtt.client as mqtt
import json
app = Flask(__name__)
son_veriler = {"sicaklik": 0, "nem": 0, "hareket": False, "gaz": False}
mqtt_client = mqtt.Client(client_id="web_arayuz")
mqtt_client.username_pw_set("ev_admin", "sifreniz")
def mqtt_mesaj(client, userdata, msg):
veri = json.loads(msg.payload.decode())
if msg.topic == "ev/ortam/sicaklik_nem":
son_veriler["sicaklik"] = veri["sicaklik"]
son_veriler["nem"] = veri["nem"]
mqtt_client.on_message = mqtt_mesaj
mqtt_client.connect("localhost", 1883, 60)
mqtt_client.subscribe("ev/#")
mqtt_client.loop_start()
@app.route("/")
def anasayfa():
return render_template_string(ARAYUZ_HTML)
@app.route("/api/durum")
def durum():
return jsonify(son_veriler)
@app.route("/api/role", methods=["POST"])
def role_kontrol():
veri = request.json
mqtt_client.publish("ev/komut/role", json.dumps(veri))
return jsonify({"sonuc": "basarili"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Bu arayüze aynı ağdaki herhangi bir cihazdan http://raspberrypi_ip:5000 adresinden erişebilirsiniz.
Adım 6: Servislerin Otomatik Başlatılması
Raspberry Pi her açıldığında otomasyon sisteminin otomatik başlaması için systemd servisleri oluşturun:
# /etc/systemd/system/ev-sensor.service
[Unit]
Description=Ev Otomasyon Sensör Servisi
After=mosquitto.service
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi
ExecStart=/home/pi/ev-otomasyon/bin/python /home/pi/sensor_oku.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Servisleri etkinleştirmek için:
sudo systemctl daemon-reload
sudo systemctl enable ev-sensor.service
sudo systemctl start ev-sensor.service
Güvenlik Önerileri
Ev otomasyon sisteminizi dış tehditlere karşı korumak için şu önlemleri mutlaka alın:
- MQTT şifreleme: TLS/SSL sertifikaları kullanarak MQTT trafiğini şifreleyin
- Güvenlik duvarı:
ufwile yalnızca gerekli portları açın (sudo ufw allow 5000/tcp) - SSH anahtar tabanlı kimlik doğrulama: Parola ile SSH erişimini devre dışı bırakın
- Düzenli güncellemeler: Sistem ve paketleri düzenli olarak güncelleyin
- Ağ izolasyonu: IoT cihazlarını ayrı bir VLAN'a taşıyarak ana ağınızdan izole edin
- Varsayılan parolaları değiştirin: Raspberry Pi ve MQTT broker için güçlü, benzersiz parolalar kullanın
Home Assistant Entegrasyonu
Daha gelişmiş bir arayüz ve otomasyon için Home Assistant kurulumu yapabilirsiniz. MQTT entegrasyonu sayesinde yukarıdaki sensör altyapınızı doğrudan Home Assistant ile kullanabilirsiniz:
# Home Assistant configuration.yaml
mqtt:
broker: localhost
port: 1883
username: ev_admin
password: sifreniz
sensor:
- platform: mqtt
name: "Ev Sıcaklığı"
state_topic: "ev/ortam/sicaklik_nem"
value_template: "{{ value_json.sicaklik }}"
unit_of_measurement: "°C"
- platform: mqtt
name: "Ev Nemi"
state_topic: "ev/ortam/sicaklik_nem"
value_template: "{{ value_json.nem }}"
unit_of_measurement: "%"
İleri Seviye Geliştirmeler
Temel sisteminizi kurduktan sonra şu geliştirmeleri değerlendirebilirsiniz:
- Zigbee/Z-Wave desteği: USB dongle ile kablosuz akıllı cihaz kontrolü
- Sesli kontrol: Özel bir wake-word motoru ile sesli komut desteği
- Makine öğrenmesi: Kullanım alışkanlıklarınızı öğrenen otomasyon kuralları
- Enerji izleme: PZEM-004T modülü ile elektrik tüketimi takibi
- Telegram/bildirim entegrasyonu: Kritik olaylarda anlık bildirim gönderimi
- InfluxDB + Grafana: Sensör verilerinin uzun vadeli saklanması ve görselleştirilmesi
Sonuç
Raspberry Pi ile kuracağınız ev otomasyon sistemi, ticari çözümlere kıyasla çok daha esnek, özelleştirilebilir ve uygun maliyetli bir alternatif sunar. MQTT tabanlı mimari sayesinde sisteminize yeni sensörler ve cihazlar eklemek son derece kolaydır. Güvenlik önlemlerini ihmal etmeden, adım adım ilerleyerek evinizi gerçek anlamda "akıllı" bir hale getirebilirsiniz. Unutmayın: en iyi otomasyon sistemi, sizin ihtiyaçlarınıza göre şekillenen sistemdir.