# dht20.py として保存されるライブラリのソースコード
import time

class DHT20:
    def __init__(self, i2c, address=0x38):
        """初期化：I2Cオブジェクトとアドレス（基本は0x38）を受け取る"""
        self.i2c = i2c
        self.address = address
        # 起動直後にセンサーが安定するまで少し待つ
        time.sleep(0.1)

    def _read_raw_data(self):
        """【内部処理】センサーから7バイトの生データを読み出す"""
        # トリガーコマンドを送信
        self.i2c.writeto(self.address, bytes([0xAC, 0x33, 0x00]))
        # 測定完了まで80ms待機
        time.sleep(0.08)
        # 7バイト取得して返す
        return self.i2c.readfrom(self.address, 7)

    @property
    def temperature(self):
        """【外部用】温度（C）を計算して返すプロパティ"""
        try:
            data = self._read_raw_data()
            # 20ビットの温度データをパズル（ビット演算）する
            raw_temp = (((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5])
            # データシートの公式換算
            actual_temp = (raw_temp / 1048576.0) * 200.0 - 50.0
            return round(actual_temp, 1)
        except:
            return None

    @property
    def humidity(self):
        """【外部用】湿度（%）を計算して返すプロパティ"""
        try:
            data = self._read_raw_data()
            # 20ビットの湿度データをパズルする
            raw_humi = ((data[1] << 12) | (data[2] << 4) | (data[3] >> 4))
            # データシートの公式換算
            actual_humi = (raw_humi / 1048576.0) * 100.0
            return round(actual_humi, 1)
        except:
            return None