# -*- coding: utf-8 -*- from __future__ import annotations __title__ = "sensor_dht11" __author__ = 'Mehmet Karatay & "Saraswati" (ChatGPT)' __purpose__ = "DHT11 tabanlı dış ortam sıcaklık / nem sensörü sürücüsü" __version__ = "0.1.0" __date__ = "2025-11-21" """ ebuild/io/sensor_dht11.py Revision : 2025-11-21 Authors : Mehmet Karatay & "Saraswati" (ChatGPT) Amaç ----- - DHT11 sensöründen sıcaklık (°C) ve bağıl nem (%) okumak. - Varsayılan olarak config_statics.DHT11_OUTSIDE_PIN üzerinde çalışır. - Adafruit_DHT kütüphanesi mevcut değilse veya donanım erişiminde sorun varsa, mock / güvenli modda çalışarak None veya sabit değerler döndürür; böylece sistemin geri kalanı göçmez. Notlar ------ - DHT11, tek data pini üzerinden dijital haberleşme kullanır; ADC gerekmez. - Bu sürücü yalnızca ham okuma yapar. Filtreleme, smoothing, alarm üretimi gibi üst seviye işlemler Environment/HeatEngine katmanına bırakılır. """ from typing import Optional, Tuple try: import Adafruit_DHT # type: ignore except ImportError: Adafruit_DHT = None # type: ignore try: from .. import config_statics as cfg except ImportError: cfg = None # type: ignore class DHT11Sensor: """ Tek bir DHT11 sensörünü temsil eder. Özellikler: ----------- - BCM pin numarası (örn: config_statics.DHT11_OUTSIDE_PIN) - read() ile (temperature_c, humidity_percent) döndürür. - Donanım veya kütüphane sorunu durumunda mock moda geçer. """ def __init__( self, bcm_pin: Optional[int] = None, sensor_type: int = 11, name: str = "DHT11_Outside", ) -> None: """ Parametreler: bcm_pin : BCM pin numarası. None ise configten okunur. sensor_type: Adafruit_DHT sensör tipi (11 → DHT11). name : Sensörün mantıksal adı (log / debug için). """ if bcm_pin is None and cfg is not None: bcm_pin = int(getattr(cfg, "DHT11_OUTSIDE_PIN", 5)) if bcm_pin is None: raise ValueError("DHT11Sensor için BCM pin numarası verilmeli veya configte DHT11_OUTSIDE_PIN tanımlı olmalı.") self.bcm_pin = int(bcm_pin) self.sensor_type = sensor_type self.name = name self.mock_mode = Adafruit_DHT is None # Son başarı/başarısızlık bilgisi self.last_temperature: Optional[float] = None self.last_humidity: Optional[float] = None self.last_ok: bool = False # ------------------------------------------------------------------ # Okuma # ------------------------------------------------------------------ def read(self, retries: int = 3) -> Tuple[Optional[float], Optional[float]]: """ Sensörden sıcaklık ve nem okur. Dönüş: (temperature_c, humidity_percent) - Başarı durumunda her iki değer de float (örn: 23.4, 45.0) - Başarısızlıkta (None, None) - Mock modda -> (None, None) veya ileride sabit test değeri """ if self.mock_mode: # Donanım veya Adafruit_DHT yok → güvenli fallback. self.last_temperature = None self.last_humidity = None self.last_ok = False return (None, None) # Gerçek okuma temperature: Optional[float] = None humidity: Optional[float] = None for _ in range(retries): # Adafruit_DHT.read_retry(DHT11, pin) → (humidity, temperature) hum, temp = Adafruit_DHT.read_retry(self.sensor_type, self.bcm_pin) # type: ignore if hum is not None and temp is not None: humidity = float(hum) temperature = float(temp) break self.last_temperature = temperature self.last_humidity = humidity self.last_ok = (temperature is not None and humidity is not None) return (temperature, humidity) # ------------------------------------------------------------------ # Bilgiler # ------------------------------------------------------------------ def summary(self) -> str: """ Sensör hakkında kısa bir özet döndürür. """ mode = "MOCK" if self.mock_mode else "HW" return f"DHT11Sensor(name={self.name}, pin=BCM{self.bcm_pin}, mode={mode})" # ---------------------------------------------------------------------- # Basit test # ---------------------------------------------------------------------- if __name__ == "__main__": sensor = DHT11Sensor() print(sensor.summary()) t, h = sensor.read() print("Okuma sonucu: T={0}°C, H={1}%".format(t, h))