ebuild_rasp2/ebuild/io/sensor_dht11.py

142 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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))