CoversManager - Piloter vos volets automatiquement d'après le soleil

Bonjour à tous,

Si comme moi vous vous demandez comment faire pour piloter vos volets en prenant en compte la chaleur, la position du soleil, etc… alors laissez-moi vous présenter CoversManager

Le projet AppDaemon - Covers Manager a pour objectif de fournir une solution complète pour la gestion des volets. Il vise à simplifier et à optimiser le processus de gestion des volets en automatisant diverses tâches et en offrant un outil efficace aux utilisateurs.

Principales fonctionnalités :

  • Ouverture des stores (en fonction de l’heure, de la luminosité, de l’heure de lever du soleil)
  • Fermeture des stores (en fonction de l’heure, de la luminosité, de l’heure de coucher du soleil)
  • Gestion adaptative des stores en fonction de la position du soleil, de la température intérieure et extérieure (en option)
  • Blocage des changements adaptatifs lorsqu’un changement manuel de position est détecté

Le projet fonctionne au travers de AppDaemon.
Vous pouvez retrouver la documentation ici : GitHub - mguyard/appdaemon-coversmanager: AppDaemon App to manage your covers with Home Assistant
Elle est je pense assez complète mais les remarques sont les bienvenues.

Le projet est publié depuis peu. Il est en test chez moi depuis maintenant quelques semaines, mais semble stable.
L’ouverture plus largement fera surement remontés des choses donc n’hésitez pas.

9 « J'aime »

Bonjour @mguyard,
tu pense pas que la section intégration conviendrais mieux que général ?

Comme ce n’est pas à proprement parlé une intégration HA… mais je me suis posé la question.
Si tu penses qu’elle a eu mieux sa place, n’hésitez pas à le changer.

Hello
J’ai ajouté le tag cover, je penche aussi pour la section intégration

2 « J'aime »

Un super boulot en tout
Félicitations

1 « J'aime »

Merci beaucoup. En espérant que ça serve à d’autre

Bonsoir,

Je viens de lire ton projet sur ton GitHub,
Je le trouve très intéressant et complet, super boulot :slight_smile: ,
J’ai une petite question, penses-tu qu’il serait judicieux d’ajouter un paramètre à ceux déjà existants; je pensais à l’ajout de la présence pour laisser les volets fermés et une gestion automatique dans le cas contraire,

Au plaisir, bonne soirée,
Toms,

1 « J'aime »

Bonjour,

Merci de ton message.
Je pense en effet que c’est une fonctionnalité judicieuse et déjà disponible.
Regarde le paramètre locker dans opening.

Ce paramètre locker est un binary_sensor. Si true alors on considère que le mouvement est bloqué. Je m’en sert avec le statut de l’alarme mais tu peux créer ce que tu veux avec un template qui prendra les conditions que tu souhaites.

Le paramètre locker existe au global, pour l’ouverture ou pour la fermeture.

1 « J'aime »

Salut Mguyard,

Merci pour ton retour, je n’avais remarqué cette subtilité,
Je vais mettre en place ton projet sur mon installation de test,
Je te ferai des retours si nécessaire,

Au plaisir,
Bon week-end, tchou,
Toms,

Salut,

Merci de partager ta solution. Depuis cet été, j’essaie de mettre en place le schéma de contrôle automatique des volets roulants suivant: ☀️ Cover Control Automation (CCA) - a comprehensive and highly configurable roller blind blueprint - Blueprints Exchange - Home Assistant Community , mais je rencontre souvent des difficultés à les faire fonctionner correctement.

Je vais essayer ta solution et je te remercie pour le partage.

Bonjour,

Merci. Tenez moi informé

Bonjour mguyard,
Depuis ce WE, j’essaie de mettre en place cette solution pour la gestion de mes volets roulants sans grand succès jusqu’à présent.
J’utilise déjà AppDaemon pour d’autres appli, donc pas de soucis de ce coté là. Mes volets sont des Somfy IO homecontrol qui remontent vers HA par Homekit.
J’ai noté une erreur après avoir activé les logs sur l’appli CoversManager :

2024-11-12 00:13:42.530443 WARNING CoversManager: ------------------------------------------------------------
2024-11-12 00:13:42.531086 WARNING CoversManager: Unexpected error in worker for App CoversManager:
2024-11-12 00:13:42.531894 WARNING CoversManager: Worker Ags: {'id': 'f3fbe33bbea949939945b6352ed55f40', 'name': 'CoversManager', 'objectid': 'cdb6261844ee4b2cabe8710014f81a67', 'type': 'state', 'function': <bound method CoversManager._callback_listenstate_sunleavewindow of <covers_manager.CoversManager object at 0x7fb0997934d0>>, 'attribute': 'azimuth', 'entity': 'sun.sun', 'new_state': 346.7, 'old_state': 336.48, 'pin_app': True, 'pin_thread': 1, 'kwargs': {'attribute': 'azimuth', 'old': <function CoversManager.initialize.<locals>.<lambda> at 0x7fb099809a80>, 'new': <function CoversManager.initialize.<locals>.<lambda> at 0x7fb099809ee0>, 'cover': 'cover.volet_cuisine', '__thread_id': 'thread-1'}}
2024-11-12 00:13:42.532420 WARNING CoversManager: ------------------------------------------------------------
2024-11-12 00:13:42.534028 WARNING CoversManager: Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/appdaemon/threading.py", line 1037, in worker
    funcref(
  File "/homeassistant/appdaemon/apps/appdaemon-coversmanager/apps/CoversManager/covers_manager.py", line 579, in _callback_listenstate_sunleavewindow
    if not self._get_islocked(config=kwargs["config"], action="open"):
                                     ~~~~~~^^^^^^^^^^
KeyError: 'config'

2024-11-12 00:13:42.534529 WARNING CoversManager: ------------------------------------------------------------

Bonjour,

Je viens de sortir une beta (2.0.0-beta.2) qui corrige ce problème.
Pour autant, cela ne doit poser souci uniquement pour l’action à la suite de la sortie du soleil de la fenêtre. Tout le reste devait être opérationnel.

Si ce n’est pas le cas, il faut passer les logs en debug et regarder ce qu’il se passe.

Attention, la version 2.0.0-beta.1 a changé la gestion du mode adaptive en sortant la configuration de closing pour la mettre dans une partie dédié. Se référer à la documentation de la BETA et necessite un redémarrage du container appdaemon pour qu’ils prenne en compte les modifications de syntaxe

OK, donc si tout le reste devait fonctionner et que je n’ai rien qui fonctionne, il doit y avoir un autre soucis. Pour commencer, j’ai simplement copié le 2nd exemple de configuration, en adaptant les noms des différents sensors pour coller à ma config. Il n’y a pas d’erreur de ce coté là. Je vais essayer de préparer une config très basique pour voir.

Comme les logs n’étaient pas très bavards, j’ai un doute sur l’activation du mode debug. Voici ce que j’ai mis en fin du fichier appdaemon.yaml :

logs:
  main_log:
    filename: /homeassistant/logs/appdaemon.log
  error_log:
    filename: /homeassistant/logs/appdaemon_error.log
  CoversManager:
    name: CoversManager
    log_level: DEBUG
    filename: /homeassistant/logs/appdaemon_CoversManager.log

J’ai un doute avec ça parce que la doc cite une rubrique « config: » que je n’ai pas implémenté. J’ai juste explicité le « filename: … »

Le log_level ne se met pas dans appdaemon.yaml mais apps.yaml

OK, je n’avais pas bien compris ce point dans la doc. ça explique pourquoi Covers Manager n’était pas très bavard.

J’ai chargé la beta2, corrigé le fichier de configuration, redémarré Appdaemon et l’erreur n’apparaît plus. Je vais laisser tourner quelques heures et voir comment ça se passe. En tout cas, merci pour ton aide !

Quelques heures plus tard…

Alors, j’ai passé un moment à éplucher le fichier log, à relire la doc, et je crois que je ne parviens pas à saisir le fonctionnement de l’application.

A la tombée de la nuit, aucun volet ne bouge malgré la présence de la partie « lux » dans le fichier de configuration, qui est censé déclencher la fermeture des volets lorsque la luminosité descend sous 10 lux. J’ai l’impression que l’application reste enfermée dans la boucle qui gère l’ouverture des volets en fonction de la position du soleil. Elle ne va jamais récupérer la donnée du capteur de luminosité.

Mon fichier de configuration :

CoversManager:
    module: covers_manager
    class: CoversManager
    use_dictionary_unpacking: true
    log: CoversManager
    log_level: DEBUG
    config:
        common:
            locker: "binary_sensor.alarm_status" # l’activation de l’alarme bloque l’état de volets
            position:
                opened: 100
                closed: 0
                min_ratio_change: 5 # % minimum de déplacement pour permettre une action
                min_time_change: 10 # durée minimale pour permettre une action
            opening:
                type: "lux"
            closing:
                type: "lux"
            adaptive:
                enable: True
            manual:
                allow: true     # activer la détection de commandes manuelles
                timer: 01:30:00 # combien de temps avant de laisser CoversManager reprendre la main
            temperature:
                indoor:
                    sensor: "sensor.bsb_lan_temperature_thermostat_salon"
                    setpoint: 23
                outdoor:
                    sensor: "sensor.gw1100_temp"
                    low_temperature: 24
                    high_temperature: 27
            lux:
                sensor: "sensor.outdoor_illuminance"
                open_lux: 23
                close_lux: 10
        covers:
            cover.volet_bureau:
                window_heigh : 210
                window_azimuth: 75
                positional:
                    action : True
                    status: True
                fov:
                    left: 20
                    right: 90
            cover.volet_cuisine:
                window_heigh : 210
                window_azimuth: 255
                positional:
                    action : True
                    status: True
                fov:
                    left: 90
                    right: 90
            cover.volet_salon:
                window_heigh : 210
                window_azimuth: 165
                positional:
                    action : True
                    status: True
                fov:
                    left: 90
                    right: 90

Il faudrait les logs en debug et l’heure vers laquelle ton sensor est passé sous les 10lux que je puisse regarder ce qu’il se passe

Voici le fichier log https://gist.github.com/christopheVia/0606337743267164e2a27add9aff13b9

Le capteur de luminance sensor.outdoor_illuminance est passé de 12,67 lux à 17h49:55 à 0 à 17h53:57
Jusqu’à 17h29, le log précise dans quel état CoversManager veut mettre les volets, en se basant sur l’état de sun.sun et des températures. Après cet horaire, plus rien. Par contre, sun.sun indique que le soleil est passé sous l’horizon.
Il n’y a pas erreur dans le fichier log des erreurs.

Oui mais sun.sun n’est pas utilisé pour la fermeture car selon la période, même le soleil sous l’horizon, on peut souhaiter garder ouvert (en été par exemple) encore quelques minutes.

J’ai regardé les logs.
Je vois 2 choses :

  • un bug dû à l’ajout de la notion de saison que tu n’utilises pas ce qui provoque des gros logs non prévu avec toute ta config => J’ai poussé un update en dev, j’attend avant de le passer en beta.

  • le bug précédent me fournit quelques infos utiles par chance. Je vois que ton sensor LUX ne semble pas avoir la bonne valeur à 17:29:32.196624

{
  'entity_id':'sensor.outdoor_illuminance',
  'state':'304.08',
  'attributes':{
    'state_class':'measurement',
    'unit_of_measurement':'lx',
    'device_class':'illuminance',
    'friendly_name':'illuminance'
  },
  'last_changed':'2024-11-12T16:27:45.146912+00:00',
  'last_reported':'2024-11-12T16:27:45.146912+00:00',
  'last_updated':'2024-11-12T16:27:45.146912+00:00',
  'context':{
    'id':'01JCGK7N3SS2SANE25TRWZ5PJV',
    'parent_id':None,
    'user_id':None
  }
}

On voit qu’à 17h27 (car l’heure indiqué et UTC et nous actuellement c’est UTC+1) la valeur était à 304.08lux donc c’est la raison pour laquelle je ne vois pas les actions de fermeture se lancer.

Avec ta configuration, l’action de fermeture ne peut se lancer que si HA informe AppDaemon d’un changement d’état pour la commande sensor.outdoor_illuminance qui passe d’une valeur > à 10 lux à une valeur <= à 10 lux.

Comment tu as vu 12,67lux de ton coté alors que HA ne donnait pas cette info ? Tu es certain de ne pas t’être trompé de commande pour les lux ?

Tu peux aussi vérifier que tu as bien une tâche dans AppDaemon qui ecoute le changement d’état de ton capteur de lux ?
Pour cela, tu vas dans ton module complementaire appdaemon et tu cliques sur Ouvrir l'interface utilisateur web


Puis tu vas dans State

Et enfin callback en haut dans le menu

Tu devrais avoir un State Callbacks qui écoute sur ton entity comme sur la capture (même 2, une pour open et une pour close) - Tu peux voir les details en cliquant sur les ... dans la colonne Kwargs.
Si c’est pas le cas, dit le moi

1 « J'aime »

Ouf ! Merci pour tes retours, j’ai plein de choses à regarder.
Pour le capteur de luminosité, je suis allé lire la courbe issue des données du capteur. J’ai une station météo, mais j’ai du créer un template sensor qui transforme les W/m2 du capteur de la station en Lux. ça me crée un nombre flottant. Est-ce que c’est ça qui peut faire dérailler le truc ?
Sinon, pour l’heure en UTC, HA est à l’heure de Paris, UTC+1. Je ne comprends pas qu’est ce qui est resté en UTC. AppDaemon est bien configuré avec time_zone: Europe/Paris.
Pour le reste, je crois que je vais regarder demain.