Un cas d'école pour gérer le chauffage électrique avec Home Assistant

De Wiki de Mémoire Vive
Aller à la navigation Aller à la recherche


L'exercice consiste à réaliser une automatisation pour le chauffage électrique d'un logement avec séjour (2000 W), sdb1 (500 W), sdb 2 (750 W), couloir (900 W), ch1 (1000 W), ch 2 (1000 W), ch 3 (1000 W). La puissance à chauffer est déterminée au niveau du compteur par la puissance réellement disponible pour cet usage à un instant donné en fonction de l'utilisation d'autres appareils électriques (four, frigo, plaques, etc.) et de la puissance souscrite, il faut donc ne chauffer qu'une partie des pièces à un instant donné (on suppose que la puissance souscrite est inférieure à celle du total des pièces à chauffer).

L'automatisation doit se déclencher à chaque variation de la puissance disponible (à la hausse ou à la baisse). Les radiateurs disposent de leur propre thermostat et se coupent d'eux mêmes lorsque la température est atteinte. Un certain délai peut s'écouler entre le moment ou un radiateur est activé ou désactivé et le moment ou il est vraiment en marche ou arrêté.

En termes de priorité de chauffage, on considère que la priorité est décroissante dans la liste.

Par ailleurs, une pièce peut être déclarée occupée ou non occupée.

Ce script fonctionne.


# Configuration de la temporisation en secondes (par exemple, 3 secondes)
temporisation = 3

# Puissance de chaque pièce en watts
puissances = {
    "sejour": 2000,
    "sdb1": 500,
    "sdb2": 750,
    "couloir": 900,
    "ch1": 1000,
    "ch2": 1000,
    "ch3": 1000
}

# Priorité décroissante pour l'allumage (ordre d'activation)
priorite_allumage = ["sejour", "sdb1", "sdb2", "couloir", "ch1", "ch2", "ch3"]

# Fonction pour obtenir la puissance disponible (depuis input_number pour simulation)
def get_puissance_disponible():
    return float(hass.states.get("input_number.puissance_disponible").state)

# Fonction pour vérifier si une pièce est occupée (depuis input_boolean)
def est_occupee(piece):
    return hass.states.get(f"input_boolean.{piece}_occupancy").state == "on"

# Fonction pour allumer un radiateur (simulé avec input_boolean)
def allumer(piece):
    hass.services.call("input_boolean", "turn_on", {"entity_id": f"input_boolean.{piece}_radiateur"})

# Fonction pour éteindre un radiateur (simulé avec input_boolean)
def eteindre(piece):
    hass.services.call("input_boolean", "turn_off", {"entity_id": f"input_boolean.{piece}_radiateur"})

# Fonction pour gérer l'allumage progressif avec temporisation
def gerer_allumage_progressif():
    for piece in priorite_allumage:
        if est_occupee(piece) and hass.states.get(f"input_boolean.{piece}_radiateur").state == "off":
            puissance_disponible = get_puissance_disponible()
            if puissances[piece] <= puissance_disponible:
                allumer(piece)
                time.sleep(temporisation)  # Attendre avant d'allumer la pièce suivante

# Fonction pour gérer l'extinction  sans  temporisation
def gerer_extinction():
    for piece in priorite_allumage:
        if hass.states.get(f"input_boolean.{piece}_radiateur").state == "on":
            eteindre(piece)

# Déterminer la puissance disponible
puissance_disponible = get_puissance_disponible()

# Gestion des radiateurs en fonction de la puissance disponible
if puissance_disponible > 0:
    gerer_extinction()
    time.sleep(temporisation) # laisser reposer un peu au frais
    gerer_allumage_progressif()
else:
    gerer_extinction()