142 lines
4.6 KiB
Python
142 lines
4.6 KiB
Python
# -*- 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))
|
||
|