Créer une minuterie pour les systèmes climatiques sur Home Assistant

6 minutes de lecture
BUTS DE PROJET:
  • création une minuterie planifier l’activation d’un thermostat intégré à Home Assistant
  • Niveau de difficulté: moyen / faible
  • coût: nul
CONCEPTS FACE:
  • Configuration du logiciel
COMPOSANTS LOGICIELS UTILISÉS:
Pré-requis:
DISPOSITIFS PHYSIQUES UTILISÉS:
GUIDE plus indiqué pour:

Tous les environnements

Notes et avertissement
  • qualsiasi modifica all'impianto elettrico dev'essere progettata ed effettuata da personale qualificato;
  • tout changement mis en œuvre dans proavant est un prola responsabilité personnelle, ainsi que propremier risque et danger (le contenu de la présente page est purement pédagogique);
  • tout changement mis en œuvre dans proavant un appareil, il annule la garantie, les approbations de qualité et les certifications.
Avis de conduite: 1.1

Abstrait

Une des limitations les plus importantes et les plus évidentes du composant "Climate"- auquel appartiennent toutes les plateformes dédiées à l'intégration des thermostats et plus généralement des systèmes de climatisation disponible sur Home Assistant - c'est l'absence d'un planificateur, ou d'un minuteur qui permet la entité de ce type (tous deux dédiés à la gestion du chauffage et du refroidissement) pour allumer / éteindre non seulement en fonction de la température, mais également en fonction des spécifications créneaux horaires quotidiens / hebdomadaires.

Thermostat avant
un thermostat-minuterie.

En attendant ça Home Assistant il a évolué dans ce sens proNous verrons à travers cela procoulée, mise en œuvre du composant "Scripts Python“, Qui génère un ou plusieurs entité type de service à partir de scripts écrits en langage Python. De tels scripts peuvent personnaliser le comportement de Home Assistant: dans ce cas nous allons les exploiter, appoint, pour créer une minuterie.

Pour activer l'entité "Climate"Le script proplace dans le projet utilise une logique simple, à savoir celle de faire varier la température "cible" du thermostat basé sur le jour et l'heure. Le comportement du thermostat, lorsque la température cible varie, sera évidemment celui ordinaire (il active le système en se basant sur la comparaison avec la température ambiante).

Nous allons donc aussi créer deux entités "Numéro d'entrée"Convient à la" collecte "de deux températures" cibles ":

  • pour les plantes de chauffage, Ce haut (cible de chauffage ordinaire) et le seuil un faible (température minima de toujours garantir, peu importe - parfois appelée "température ECO");
  • pour les plantes de refroidissement (Condizionatori), le seuil un haut (température maxime être garanti toujours, peu importe) et que faible (cible de refroidissement ordinaire).

Scripts Python

Comme prévu, le composant "Scripts Python”Sert à définir le entité que, si évoqué (en tant que service), exécuter des scripts écrits en Python.

Pour activer ce composant, vous devez créer un dossier appelé:

python_scripts /

dans le dossier principal de Home Assistant (sur Raspbian, « /home/homeassistant/.homeassistant« ); plus tard, changer la configuration en entrant:

python_scripts:

et enfin recommencer Home Assistant. Le redémarrage doit également être effectué à tout ajout de script (sous la forme d'un fichier texte avec l'extension ".py") dans le dossier ci-dessus; au redémarrage, une nouvelle entité appelée "python_scripts.nomedelfile" appapparaîtra dans la liste des services présents sur Home Assistant.

hypothèses

Nous prendrons pour acquis l'existence d'une entité de type "Climate"Appel"climate.termostato“, Ainsi que la présence d'une lecture de la température ambiante, à choisir parmi:

  • l'attribut "temperature"De l'entité"climate.termostato";
  • un capteur "sensor.temperature».

Quelques plateformes d'intégration de composants "Climate", En fait, générer des entités sans l'attribut"température“, Ce qui nous oblige à enregistrer les données directement à partir d'une autre entité.

Températures cibles

On définit en configuration deux "Numéro d'entrée"Afin de collecter les deux températures cibles depuis le frontend:

input_number:
  temp_high:
    name: Target alto
    min: 0
    max: 30
    step: 1
  temp_low:
    name: Target basso
    min: 0
    max: 30
    step: 1

Les deux entités ("input_number.temp_high"Et"input_number.temp_low") Sera utilisé par le script Python pour évaluer comment ajuster dynamiquement l'entité"climate.termostato».

scénario

Après avoir activé le composant "Script Python", Nous créons un nouveau fichier dans le dossier de script appelé"scheduler.py”Contenant le code suivant:

TEMP_HIGH = hass.states.get('input_number.temp_high')
TEMP_LOW = hass.states.get('input_number.temp_low')
climate_entity = 'climate.termostato' # definisce l'entità "Climate" da controllare
current_temp = hass.states.get(climate_entity).attributes['temperature']
# current_temp =  float(hass.states.get('sensor.temperature'))

WEEK_SCHEDULE = [
    [datetime.time( 0, 0), datetime.time( 1, 0)],     # dalle 00:00 alle 01:00
    [datetime.time( 7, 0), datetime.time( 9, 0)],     # dalle 07:00 alle 09:00
    [datetime.time(18, 0), datetime.time(23, 59, 59)] # dalle 18:00 alle 23:59
]
WEEKEND_SCHEDULE = [
    [datetime.time( 0, 0), datetime.time( 2, 0)],     # dalle 00:00 alle 01:00
    [datetime.time(10, 0), datetime.time(13, 0)],     # dalle 10:00 alle 13:00
    [datetime.time(18, 0), datetime.time(23, 59, 59)] # dalle 18:00 alle 23:59
]

now = datetime.datetime.now().time()
if datetime.datetime.now().date().weekday() < 5:
    current_schedule = WEEK_SCHEDULE
else:
    current_schedule = WEEKEND_SCHEDULE

in_high_time = False
for high_time in current_schedule:
    start = high_time[0]
    end = high_time[1]
    
    if start <= now <= end:        
        in_high_time = True
        break

new_temp = TEMP_HIGH if in_high_time else TEMP_LOW 
message = "Temperatura impostata a {} (era {})".format(new_temp.state, current_temp)
if str(new_temp.state) != str(current_temp):
    # imposta la nuova temperatura sul termostato
    hass.services.call('climate', 'set_temperature', {'entity_id': climate_entity, 'temperature': float(new_temp.state)})
    # invio inoltre una notifica di sistema
    hass.services.call('notify','notifications_send', {'title' : 'HA: Variazione al termostato', 'message': message})

N'oubliez pas de redémarrer Home Assistant générer l'entité "python_script.scheduler».
recommencer Assistante de maison.

Analyse

Bloc initial
TEMP_HIGH = hass.states.get('input_number.temp_high')
TEMP_LOW = hass.states.get('input_number.temp_low')
climate_entity = 'climate.termostato' # definisce l'entità "Climate" da controllare
current_temp = hass.states.get(climate_entity).attributes['temperature']
# current_temp = float(hass.states.get('sensor.temperature'))

WEEK_SCHEDULE = [
    [datetime.time( 0, 0), datetime.time( 1, 0)],     # dalle 00:00 alle 01:00
    [datetime.time( 7, 0), datetime.time( 9, 0)],     # dalle 07:00 alle 09:00
    [datetime.time(18, 0), datetime.time(23, 59, 59)] # dalle 18:00 alle 23:59
]
WEEKEND_SCHEDULE = [
    [datetime.time( 0, 0), datetime.time( 2, 0)],     # dalle 00:00 alle 01:00
    [datetime.time(10, 0), datetime.time(13, 0)],     # dalle 10:00 alle 13:00
    [datetime.time(18, 0), datetime.time(23, 59, 59)] # dalle 18:00 alle 23:59
]

Dans cette première partie, nous notons la collection des valeurs des deux "Numéro d'entrée" ("input_number.temp_high"Et"input_number.temp_low") Dans deux variables ad hoc ("temp_high"Et"temp_low") Et deux autres variables, une contenant le entity_id à vérifier ("climate_entity", Dans ce cas mis à"climate.termostato") Et le température ambiante actuelle ("current_temp") Recueilli à partir de l'état du capteur"sensor.temperature».

La ligne commentée:

# current_temp = float (hass.states.get ('sensor.temperature'))

est utile pour ces entités "Climate"Que ne pas exposer une donnée réelle de la température ambiantepar exemple ceux proappris à travers intégration de la tête thermostatique «Eqiva eQ-3». Dans ces cas - depuis la valeur de lecture de la température c'est essentiel pour la fonctionnamede la minuterie - cela suffira eliminare le commentaire # (et le commentaire précédent) pour créer la variable ("current_temp") Est évalué via la valeur d'état d'un capteur de température présent dans la configuration (supposé ici "sensor.temperature").

Enfin, le bloc de code définit les heures de démarrage hebdomadaires ("WEEK_SCHEDULE") Et le week-end ("WEEKEND_SCHEDULE").


Évidemment ce bloc il est largement personnalisable sur la base de provos besoins (surtout le terrain "climate_entity").

BLOC OPERATIONNEL

C'est dans la deuxième partie que toute la magie se produit:

now = datetime.datetime.now().time()
if datetime.datetime.now().date().weekday() < 5:
    current_schedule = WEEK_SCHEDULE
else:
    current_schedule = WEEKEND_SCHEDULE

in_high_time = False
for high_time in current_schedule:
    start = high_time[0]
    end = high_time[1]
    
    if start <= now <= end:        
        in_high_time = True
        break


new_temp = TEMP_HIGH if in_high_time else TEMP_LOW 
message = "Temperatura impostata a {} (era {})".format(new_temp.state, current_temp)
if str(new_temp.state) != str(current_temp):
    # imposta la nuova temperatura sul termostato
    hass.services.call('climate', 'set_temperature', {'entity_id': climate_entity, 'temperature': float(new_temp.state)})
    # invio inoltre una notifica di sistema
    hass.services.call('notify','notifications_send', {'title' : 'HA: Variazione al termostato', 'message': message}

Le script détermine d'abord s'il s'agit d'un jour hebdomadaire ou d'un week-end; puis vérifiez que vous vous trouvez dans l'un des créneaux horaires définis par l'utilisateur: si vous vous trouvez dans une bande de puissance, définissez la valeur de la température cible de l'entité "Climate"("climate.termostato") A la température"temp_high", Sinon réglé"temp_low».

Évidemment c'est valide pour un système de chauffage. En présence de plantes de refroidissement, change la ligne:

new_temp = TEMP_HIGH si in_high_time sinon TEMP_LOW

dans:

new_temp = TEMP_LOW si in_high_time sinon TEMP_HIGH

automatisation

À ce stade, vous devez exécuter le script de manière cyclique.
Nous définissons donc automation de ce type:

automation:
  - alias: 'Temporizzatore'
    initial_state: True
    trigger:
      - platform: time      
        minutes: '/1' # ogni minuto
        seconds: 00
      - platform: homeassistant
        event: start
    condition: []
    action:
      service: python_script.scheduler

De cette façon, l’automatisation évoquera le script une fois par minute (ceci est également personnalisable), de manière à agir sur le thermostat. basé sur les règles établies.

Le champ "condition”A été laissé intentionnellement vide; une personnalisation supplémentaire pourrait être de vérifier (en utilisant le composant)Device Tracker») la présence réelle des locataires à la maison, afin de ne pas agir sur le système climatique en l'absence de ce dernier.

pensées finales

Ce type d'implémentation convient très bien avec projets e guide déjà publié, Parmi lesquels:


cette prole jet est inspiré au travail d'Abílio Costa la reconnaissance de notre communauté.

Domotique chauffage indépendant via contact propre e Home Assistant (sans thermostat physique)


Home Assistant Logo officielATTENZIONE: rappelez-vous qu'il y a sur notre communauté FORUM une section ad hoc dédiée à Home Assistantpour tout doute, question, information sur le mérite spécifique de ces composants.


Veuillez commenter ci-dessous