Shedule State Card + Vtherm

Si, pour moi c’est parfaitement OK (aux espaces près).
Schedule_state traite les planifications dans l’ordre de lecture, donc :
#1 est active, mais elle se fait écraser par #2 dès que la fenêtre est ouverte.
Et dans la vraie vie, c’est à mon avis exactement l’objectif : peu importe la consigne en cours, pas besoin de chauffer l’extérieur.
Quand la fenêtre se fermera, la règle #2 sera inactive et tu retrouveras la règle #1 à la place.

Si le status change (ouvert), l’automatisation détecte et envoie frost à vtherm, quand c’est refermé, ça réenvoie eco

Là à mon avis c’est clairement une question de préférences

oui, les conditions sont toutes traitées en temps réel par schedule_state + un recalcul périodique en option. Et la carte se mets à jour au moindre changement

Et tu peux te passer des 0h/24H c’est implicite

- platform: schedule_state
  name: "Chauffage de ma salle de bain"
  default_state: "eco"
  events:
    - start: "08:00"
      end: "10:00"
      state: "confort"
      condition:
        - condition: time
          weekday: [mon, tue, wed, thu, fri]
    - start: "18:00"
      end: "23:00"
      state: "boost"
    - state: "frost"
      condition:
        - condition: state
          entity_id: binary_sensor.f_ch_bm_contact
          state: "on"

Disons que si on veut le voir apparaitre dans la carte schedule state alors il faut l’enlever du Vtherm et le mettre là ?

Idem pour le boolean absence globale ou partielle d’ailleurs…

Oui, effectivement, si une info n’est pas dans schedule_state ça ne sera jamais visible dans la carte.
vtherm est très bien mais ça se limite au pilotage du chauffage. schedule_state c’est en principe valable pour n’importe quoi (On pourrait faire ça avec un template jinja aussi d’ailleurs)

Là par exemple avec la future définition des HP/HC je me suis fais un truc qui détermine la valeur du tarif.

- platform: schedule_state
  name: tarif_actuel_ttc
  refresh: "00:01:00"
  default_state: "{{ states('sensor.tarif_heures_pleines_ttc') }}"
  allow_wrap: true
  events:
    - start: "02:00"
      end: "07:00"
      months: &label_cond_ete [4, 5, 6, 7, 8, 9, 10]
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

    - start: "11:00"
      end: "14:00"
      months: *label_cond_ete
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

    - start: "23:30"
      end: "07:30"
      months: &label_cond_hiver [11, 12, 1, 2, 3]
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

Avec les ancres yaml (anchor) on arrive à éviter de recopier du code => les mois été/hiver et donc d’un coup on a une visu


c’est intéressant tout ça, et tu as déjà évoqué les ancres yaml, mais là je sèche, je ne sais pas ce que c’est, faut que je me trouve un peu d’explication :sweat_smile:

Ah j’ai trouvé, Gemini m’a fait un petit cours là dessus…

Les ancres sont ni plus ni moins que des sortes de copiés/collés

Sans les ancres on écrirait ça

    - start: "02:00"
      end: "07:00"
      months: [4, 5, 6, 7, 8, 9, 10]
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

    - start: "11:00"
      end: "14:00"
      months: [4, 5, 6, 7, 8, 9, 10]
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

Avec on écrit l’équivalent ainsi

    - start: "02:00"
      end: "07:00"
      months: &label_cond_ete [4, 5, 6, 7, 8, 9, 10]
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

    - start: "11:00"
      end: "14:00"
      months: *label_cond_ete
      state: "{{ states('sensor.tarif_heures_creuses_ttc') }}"

Donc si je change le contenu de la définition de l’ancre &label_cond_ete, ça se répercute à chaque rappel de celle-ci *label_cond_ete
Quand on fait ça 2 fois, le gain est faible mais le contenu peut-être plus complexe, et répété à l’infini ce qui donne une belle simplification du code

1 « J'aime »

oups, mon HA ne va pas bien du tout, seul parametre, HACS, outils de dév semblent fonctionner, tous les autres onglets ne s’affichent plus

File Editor par exemple affiche : le module complémentaire démarre… et n’en sort pas

Y aurait il un lien avec ce appdaemon ? je redémarre en le gardant arrété pour voir

En fait ce sont tous les modules complémentaires qui semblent en carafe… Mais je vais peut être ouvrir un psot dédié pour ne pas pourrir le tien ici…

Tu n’aas pas plutôt raté un truc dans un fichier de config plutot ?
D’une façon générale, les addons ça ne casse pas HA (ça tourne à coté). Les risques ce sont les intégrations ET/OU les yaml pourris

Hmmm je n’ai rien modifié depuis notre dernière modif, et en plus là il refuse l’arrêt ou redémarrage
Je voudrais bien enlever le yaml que j’ai mis mais s’il redémarre pas…

Lance la vérification déjà avant de toucher

j’ai ça

Donc il y a une erreur dans le/les fichier(s) sensors ça ressemble au modif de ce midi quand même

bon, rectifié
Deux erreurs :

  • sensor : le yaml de l’inclusion commençait par sensor: donc j’ai enlevé la 1ère ligne et décalé à gauche de 2 esp toute la suite en commençant par le - platform: schedule_state
  • influxdb : un décalage à gauche était présent en milieu de la config sur l’include, pourquoi, je ne sais pas, mauvaise manip de ma part ce matin ? l’ignore_attributes était aussi mal indenté…
    Modifs via file explorer windows et samba, rechargement des yaml, et plus d’erreurs, tout refonctionne, redémarrage HA aussi, ouf…
1 « J'aime »

Hello @Pulpy-Luke ,

C’est vrai que le résultat est carrément sympa. Un simple mapping trigger → preset configuré directement dans Vtherm serait pas très difficile à faire et permettrait d’éviter l’automatisation.

C’est bien plus souple et visuel que le Scheduler natif.

:thinking:

Mettez un pouce si ça pourrait vous intéresser dans le futur (pour voir).

10 « J'aime »

ben carrément !
la seule chose qu’il me semble à retrouver aussi c’est d’avoir une UI graphique pour faire les programmations, sinon il faut les faire dans le code en yaml, mais une fois qu’un exemple est fait c’est pas trop compliqué, mais ça serait au top de l’ergonomie.
Quant à la représentation, là elle est vraiment top !

Edit :
Mais j’ai créé l’automatisation qui transmet le state au VTherm, désactivé le scheduler de ce Vtherm, enlevé la détection d’ouverture dans le Vtherm.

Test ouverture fenetre : passage immédiat en frost ce qui est bien la consigne côté schedule-card.
Fermeture : retour en eco alors qu’il était en boost à l’ouverture, eco est le default
J’ai aussi créé des petites plages pour changer le preset côté schedule-card mais j’ai l’impression qu’il reprenait toujours le default, eco, qui est affiché en ligne 0.

certainement à retester pour valider le constat.
sauf pour l’ouverture ou là il revient systématiquement au default et pas à la consigne précédente ou en cours si on est passé sur une autre plage du schedule_card.

A reprendre en test…

Salut,

Plusieurs trucs :

  • Dans ta capture, c’est la consigne du petit bloc en bas à droite qui est normalement envoyée, tu peux le voir dans le sensor, dans l’automatisation aussi. Attention quelques minutes avant, tu étais bien en boost, mais là on ne voit pas la valeur (il faut vérifier le tooltips). Il faut vérifier que le cheminement que l’info schedule_state => automatisation => vterm se passe bien

  • Sur la ligne 1 (la seule active) c’est pas la peine de redéfinir une plage eco , c’est déjà la valeur par défaut…

  • Les lignes 2 et 3 sont sans doute fusionnables

Je note 1 truc à améliorer de mon coté : boost et eco sont tous les 2 verts, ça ne facilite pas la lecture

Alors j’ai refait mes tests ce matin, juste sur détections ouverture et présence et ça semble etre ok.
J’ai modifié le default en frost, enlevé mes plages minuscules de test de planification d’hier soir.
Enlevé les détections côté Vtherm, et désactivé le schduler Vtherm.
Le code Yaml du schedule-card

- platform: schedule_state
  name: "Chauffage du Salon"
  default_state: "frost"
  events:
    - start: "00:00"
      end: "01:30"
      state: "boost"
    - start: "01:30"
      end: "11:00"
      state: "eco"
    - start: "11:00"
      end: "19:00"
      state: "comfort"
    - start: "19:00"
      end: "24:00"
      state: "boost"
      condition:
        - condition: state
          entity_id: binary_sensor.f_ch_bm_contact
          state: "off"
    - state: "frost"
      condition:
        - condition: state
          entity_id: binary_sensor.f_ch_bm_contact
          state: "on"
    - state: "frost"
      condition:
        - condition: state
          entity_id: input_boolean.presence
          state: "off"

Le statut Planning et Vtherm en normal :

Le statut Planning et Vtherm avec absence, ligne 4


Si je réactive la présence, je reviens en Comfort, donc ok

Le statut Planning et Vtherm avec ouverture


Si je ferme, je reviens en Comfort donc ok aussi

Là ça semble parfait

J’ai quand même ajouté une condition de présence ON pour la dernière plage du planning , d’ou le fait qu’elle apparait en ligne 2, mais ça ne me semble pas nécessaire vu que ça a fonctionné sur une plage qui n’a pas cette condition.

Question : Je ne comprends pas pourquoi la 1ère plage de 0h à 1h30 est resté en vert dans les deux tests absence et ouverture… Elle aurait dû passer en frost aussi ?

Remarque : la notation 24:00 fonctionne mais crée une erreur dans les logs système :

2025-12-12 13:13:51.600 ERROR (MainThread) [custom_components.schedule_state.sensor] Chauffage du Salon: FAILED - could not parse 'Template<template=(24:00) renders=8>'
2025-12-12 13:13:51.601 ERROR (MainThread) [custom_components.schedule_state.sensor] Chauffage du Salon: boost: error with start/end definition - skipping, will try again in 5 minutes

Je l’aie repassée en 23:59 et plus d’erreur.

Donc mon constat d’hier soir n’était pas correct apparemment.

Question : que faut il recharger / redémarre pour faire prendre en compte une nouvelle planification (modif du yaml) ? rechargement yaml mais apparemment aussi redémarrage du appdaemon ?

Question : j’ai quand même un souci majeur car tous les modules complémentaires ne veulent plus s’afficher, Z2M, Studio code, Sqlite, NodeRed, etc… le reste des TdB s’affichent normalement . J’ai aussi eu des lenteurs énormes sur studio code pour modifier le yaml, ensuite j’ai modifié en externe, et là aucun de ces modules ne veut s’afficher. Lié à cette implémentation ou pb dans mon HA pour autre raison ? je ne sais pas encore… Ça ressemble fort à ce que j’ai eu hier aussi… Je reverifie mes yaml

Edit : j’ai enlevé l’automatisation d’envoi des consignes au Vtherm et après redémarrage complet tout fonctionne, pour l’instant… J’attends un peu et je vais la réactiver

Cool

Oui à première vue, ça devrait être orange partout mais difficile à dire avec juste l’affichage, c’est basé sur la façon dont tu as codé ton schedule_state Partage ton code, je jetterai un oeil.

C’est bien l’idée de cette carte, pouvoir voir ce qui est nécessaire ou pas et éliminer les redondances

Oui, ça c’est le composant de base qui n’aime pas. Je n’en ai pas, uniquement des 23h59 ou des allow_wrap: true
Si tu veux juste voir la carte, il suffit de redémarrer appdaemon, si tu veux que les sensors de basechangent aussi, alors il faut passer par un redémarrrage globale ou l’action de recalcul des schedule_state

J’ai pas de solutions à ça mais des points de vigilance, parfois VS s’embale et prends beaucoup de mémoire. C’est surtout le cas quand tu ouvres/ferme plusieurs fois son affichage. Une fenetre d’un coté avec VS et l’autre avec HA sur le dashboard fonctionne mieux je trouve
Et pour le yaml, il faut systématiquement vérifier avant de redémarrer, c’est critique d’avoir un fichier mal formé. Et à voir si les lenteurs que tu vois ne sont pas liée également => lents à sauvegarder ton fichier, et donc données pas correctes

Regarde les traces, mais elle ne doivent pas prendres plus de quelques secondes à être executées.

Coté affichage pour les couleurs eco/boost en vert, peux-tu retester en remplaçant cette fonction dans le JS (attention au cache du navigateur pour la prise en compte)

   getColorForState(stateValue, unit) {
        let str = String(stateValue).trim();
        const numMatch = str.match(/^[\d.]+/);
        if (numMatch) str = String(parseFloat(numMatch[0]));
        if (unit) str = str + "|" + unit;

        let hash = 2166136261;
        const prime = 16777619;
        for (let i = 0; i < str.length; i++) {
            hash ^= str.charCodeAt(i);
            hash = (hash * prime) >>> 0;
        }

        hash = (hash ^ (hash >>> 16)) >>> 0;
        hash = (Math.imul(hash, 0x85ebca6b)) >>> 0;
        hash = (hash ^ (hash >>> 13)) >>> 0;
        hash = (Math.imul(hash, 0xc2b2ae35)) >>> 0;
        hash = (hash ^ (hash >>> 16)) >>> 0;

        const goldenAngle = 137.507764;
        const hue = (hash * goldenAngle) % 360;
        const sat = 60 + (hash % 30);
        const light = 40 + ((hash >>> 8) % 25);

        const hsl = `hsl(${hue.toFixed(1)}, ${sat}%, ${light}%)`;
        const textColor = this.getTextColorForBackground(hsl);

        return { color: hsl, textColor: textColor };
    }

j’ai réactivé l’automatisation d’envoi vers le Vtherm et tout continue à fonctionner…
peut etre le VS effectivement qui a des vapeurs…
d’ailleurs ne vaut il pas mieux éditer les yaml dans File Editor ? moins risqué peut etre car pas de modif en live ?
je regarde pour tester ton code aussi

J’ai l’habitude de VS un peu partout, donc FileEditor me semble pénible (le pire c’est dans la navigation).