import time
import machine
import dht
from umqtt.simple import MQTTClient

# Paramètres MQTT
SERVER = "192.168.1.2"  # Adresse IP du serveur MQTT
CLIENT_ID = "esp32_001"  # Identifiant du client MQTT
TOPIC_TEMPERATURE = "maison/salon/temperature"
TOPIC_RELAY = "maison/salon/relay"
MQTT_USER = "client1"
MQTT_PASSWORD = "client1234"
# Paramètres de connexion au réseau WiFi
WIFI_SSID = "nyhome"
WIFI_PASSWORD = "bm@1574d"

# Broche du relais et du capteur DHT11
RELAY_PIN = 12
DHT_PIN = 27

# Fonction de connexion au réseau WiFi
def connect_wifi():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print("Connexion au réseau WiFi...")
        wlan.connect(WIFI_SSID, WIFI_PASSWORD)
        while not wlan.isconnected():
            pass
    print("Connecté au réseau WiFi :", wlan.ifconfig())

# Fonction de lecture de la température
def read_temperature():
    dht_sensor = dht.DHT11(machine.Pin(DHT_PIN))
    dht_sensor.measure()
    return dht_sensor.temperature()

# Fonction de contrôle du relais
def control_relay(state):
    relay = machine.Pin(RELAY_PIN, machine.Pin.OUT)
    relay.value(state)

# Fonction de publication de la température via MQTT
def publish_temperature(temperature):
    mqtt_client.publish(TOPIC_TEMPERATURE, str(temperature))

# Fonction de souscription au sujet MQTT pour le contrôle du relais
def on_message(topic, message):
    print("Topic:",topic,"message:",message)
    message_str = message.decode('UTF-8')
    topic_str = topic.decode('UTF-8')
    if topic_str == TOPIC_RELAY:
        if message_str == "on":
            control_relay(1)
            print("Relais activé")
        elif message_str == "off":
            control_relay(0)
            print("Relais désactivé")

# Connexion au réseau WiFi
connect_wifi()

# Connexion au serveur MQTT
mqtt_client = MQTTClient(CLIENT_ID, SERVER, user=MQTT_USER, password=MQTT_PASSWORD)
topiclast = b"home/esp32/last"
msglast = b"ESP32 deconnectée !!!!"
mqtt_client.set_last_will(topiclast, msglast, retain=False, qos=0)
mqtt_client.set_callback(on_message)
mqtt_client.connect()
mqtt_client.subscribe(TOPIC_RELAY)

print("Connecté au serveur MQTT :", SERVER)

# Boucle principale
while True:
    try:
        # Lecture de la température
        temperature = read_temperature()
        print("Température :", temperature)
        
        # Publication de la température via MQTT
        publish_temperature(temperature)

        # Attente de 2 secondes avant de lire à nouveau la température
        time.sleep(2)

        # Vérification des messages MQTT
        mqtt_client.check_msg()
    except Exception as e:
        print("Erreur :", e)
        time.sleep(1)