La Carte-Timer ou "ce qui se passe dans ma tête quand je suis le tuto"

Mon problème

C’est comment qu’on fait ?

Le tutoriel d’origine

J’ai reçu une seconde carte zigbee à 2 contact sec, pour automatiser un petit ventilateur portable qui m’a bien servi cet été.

Premier souci, ne pas alimenter le moteur 220 AC avec les deux enroulements.
problème résolu avec le câblage des 2 contacts en série:
le premier relais a le 220 sur le Common et est branché par le NO (Normaly Open) sur le Commun du second relais. en sortie NC (Normaly Closed), je branche l’enroulement basse vitesse et sur la sortie NO l’enroulement haute vitesse.

Ca me donne 2 interrupteurs, le Marche / Arrêt et le réglage Vitesse 1 / Vitesse 2
image

Content le Benoit, plus besoin d’aller se lever pour allumer ou éteindre cet accessoire bien utile en temps de canicule, le soir pour s’endormir. C’est quand même dommage de le laisser tourner toute la nuit, surtout qu’en principe la température devrait baisser.

c’est alors que je tombe sur le Tuto de la Carte Timer.
Bien fait, avec des images et des pointes d’humour pour détendre l’atmosphère.
En plus, c’est pile ce que je veux !!!

On commence.

et je bloque pas bien loin…


Là, j’ai pas compris de quoi on parle.
c’est un fichier à créer ou un existant à modifier ? je suis passé à la suite en pensant on verra plus tard.
ça ressemble pas à du code Lovelace, c’est plutôt du :ninja: 2
au hasard, je collerai ca plus tard au fond de mon fichier <config>/configuration.yaml

'tain, ca commence bien… Ah oui, c’est marqué « Niveau Intermédiaire »… je suis loin du compte alors… J’ai pas envie de croiser un « Avancé » un soir au coin d’un bois, ca doit faire peur !!! :crazy_face:

allez, on continue.

Ah une autre truc à mettre.
mais avec la syntaxe

sensor:
  - platform: template
    sensors:

ca ressemble a du <config>/configuration.yaml section sensor
copié coolé, ca roule.
on avance, on avance. tiens des explications !!! dans un tuto ? c’est pas fréquent. on va lire, y’a peut être des trucs à choper là-dedans.


Ah oui mais non, c’est du 100% théorique, j’aurais préféré un truc dans le machin avancé, vous savez, en bas de la colonne, ah oui, les outils de développement, là ou y’a les valeurs d’un script, pour voir si ca baigne… si si ah… les modèles.
ben non. je lis plus ou moins vite, mais comme y’a pas de cambouis, je zappe un peu.
J’aime bien le cambouis, z’auriez du me voir quand j’ai refait ma moto, une 350 2-temps qui (en)fume.
il a fallu 1/2 journée pour que le nuage se dissipe dans le garage de l’immeuble !!!
J’en étais où ???
ah si :

automation, ca me dis quelque chose, mais quand je rajoute ca au bout de mon <config>/automation.yaml le « studio Code Server » me sort tout un paquet d’insultes, que j’ai bien du mal à analyser.
en fait, j’ai 2 erreurs différentes:
la première est qu’il faut que je vire la première ligne et que je retire 2 espaces sur toutes les lignes,
la seconde est qu’il faut rajouter [] après condition: à cause de l’évolution de la version.
une bonne heure de perdue, heureusement que le studio code machin signale les erreurs, sinon j’étais pas sorti le cul des ronces. mais de toutes manières, vu où j’en suis je sais toujours pas si je suis dans le vrai…
faudrait pouvoir vérifier si ce qu’on a déjà tapé est bon ou pas…

Et c’est pas fini.

là, je me dis:
Rhoo y’a 2 trucs différents
y’a python_script et python_scripts si si, regardez … (remarquez, j’ai bien des python_tuile pour ma moto, comme ils disent en Alsace) mais alors avec ou sans ‹ s › le script ? faute de frappe, vu ma dyslexie je fais surtout du copier/coller, alors peut etre que les gens normaux n’auraient pas vu la faute ???
je crée donc le répertoire <config>/python_scripts et je met une entrée du même métal dans mon configuration.yaml.
heureusement qu’a la demande de reboot, j’ai un warning que l’intégration python_scripts n’est pas trouvée (ou qq chose dans le genre). (je lis les messages d’erreurs mais j’ai une toute petite mémoire tampon de 2 octets qui me donne généralement « .CR/LF »)
alors, je modifie le python_scripts en python_script.
et au reboot suivant, j’ai des ralentissements, des erreurs comme quoi y’aurais un problème et que dans python_script y’avais pas ecrire_etat_entite.py
et avec la nouvelle interface 2022-08, va sélectionner les 3 points pour choisir d’arrêter une tache qui te resette l’interface toutes les secondes… (d’ailleurs je l’ai mis toutes les 5 secondes tant que la peinture est pas sèche)

en fait, les gars de chez HA sont farceurs, c’est <config>/python_scripts et python_script: dans configuration.yaml c’est des blagues que se font les « Avancés » entre eux !!!

Et c’est pas fini !!!

image

??? on est où là ??? et c’est ou qu’il faut ecrire l'état de l'entité py ???
faut éditer quoi ?

je lâche l’affaire, une demi journée à éditer les fichiers de config, un coup à flinguer son HA, heureusement que je sauvegarde tous les soirs…
dans un dernier sursaut d’énergie, je tente un mail à un ami… ou plutôt à l’auteur de cette prose pour laquelle je n’ai pas trouvé l’ouvre boite, à savoir Clemalex et je vais me reposer.

deux heures plus tard, je regarde et je vois que j’étais pas loin de la conclusion.
et c’est là que jai découvert la solution, sous la forme d’un petit triangle:

Oh une carte Lovelace !!!
et une méthode inconnue à ce jours, celle des packages ): z’avez vu, je fais bien la méthode packages !!!
1/4 d’heure pour voir qu’il est urgent de ne rien faire et je créée mon interface Lovelace.
bien sur, rien ne marche, j’ai 6 triangles jaunes façon chantier sur un fond grisâtre, c’est pas top.
et pas un message.
le script lovelace est complètement incompréhensible
pourtant j’ai bien mis le fichier transparent là ou il faut, jusqu’à ce que je décide de mettre une image que j’avais déjà dans une autre interface…
image: /local/custom-lovelace/CRW_9840.jpg au lieu de
image: /local/image/transparent/transparent.png (image sans s parce que j’avais déjà un répertoire image et que j’ai créé un répertoire transparent, mais ca ne marchais pas).
et là, ca commence à prendre forme.

je modifie l’entité de la carte pour mettre celle de mon ventilo, je clique un peu partout et je vois qu’il s’agit d’une carte timer, un peu comme dans le titre du tuto, marrant, non?

le lendemain, un petit mot de Clemalex qui me suggère d’épancher ma logorrhée ici, je m’exécute.

c’est la première fin de mon histoire et de mes états d’âme.

Concernant ce tuto, je suis un peu partagé.
il est clair et détaillé mais il manque 3 ou 4 lignes, du genre ca va sans dire, mais ca va mieux en le disant.
Ecrit il y a un an, on peut voir qu’il y en a eu des octets qui ont coulés sous les interfaces.
il aurait fallu mettre un petit passage sur ce qui change dans les fichiers suivant qu’on ait (ou pas) les fameux packages.
il aurait été génial de pouvoir suivre les différentes phases en voyant ce que ca donne depuis une autre interface (par exemple, on ne parle de l’interface Lovelace que dans la conclusion) histoire de voir si on n’est par parti complètement de travers.
et la conclusion, c’aurait été d’expliquer comment intégrer cette superbe carte dans des applications concrètes.
Y parait que tous les fichiers se trouvent dans le résumé :stuck_out_tongue_winking_eye:

Surtout ne voyez pas ce post comme un coup de gueule, mais plutôt comme celui de mon état d’esprit quand j’ai suivi ce tuto à 99.9% parfait.
parfait pour les intermédiaires, j’aurais aimé en être. soupir.

mais j’ai quand même besoin d’aide:
je veux transformer cette carte timer en interface de commande de mon ventilo en mode timer, à savoir cliquer sur l’icone du ventilateur désactivé pour le passer en activé et lancer le décompte et qu’il s’arrête à la fin du timer.
Pour l’instant, j’arrive à le lancer depuis l’interface, mais je ne lance plus le timer…
et comme je voudrais faire quelque chose de propre, j’ai pensé à vous…

elements:
  - type: conditional
    conditions:
      - entity: fan.ventilateur_parents_right
        state_not: idle
    elements:
      - entity: fan.ventilateur_parents_right
        icon: mdi:fan
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': green
          font-size: 20px
          font-variant: small-caps
          left: 17%
          top: 20%
        tap_action:
          action: call-service
          service: fan.turn_on
          service_data:
            entity_id: fan.ventilateur_parents_right
        type: state-icon
  - entity: sensor.timer_1h_temps_restant
    style:
      color: var(--primary-color)
      font-size: 200%
      font-variant: small-caps
      left: 50%
      pointer-events: none
      top: 40%
    tap_action:
      action: none
    type: state-label
  - type: conditional
    conditions:
      - entity: timer.timer_1h_temps
        state: idle
    elements:
      - entity: timer.timer_1h_temps
        icon: mdi:play
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 50%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.start
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
  - type: conditional
    conditions:
      - entity: timer.timer_1h_temps
        state_not: idle
    elements:
      - entity: timer.timer_1h_temps
        icon: mdi:pause
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 20%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.pause
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
      - entity: timer.timer_1h_temps
        icon: mdi:close
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': red
          font-size: 20px
          font-variant: small-caps
          left: 40%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.cancel
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
      - entity: timer.timer_1h_temps
        icon: mdi:checkbox-marked-circle-outline
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': green
          font-size: 20px
          font-variant: small-caps
          left: 60%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.finish
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
      - entity: timer.timer_1h_temps
        icon: mdi:play
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 80%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.start
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
image: /local/custom-lovelace/transparent.png
type: picture-elements

image
image

j’aurais aimé mettre le nom du ventilateur à coté de l’icone et qu’il démarre (enfin le timer + le ventilo) quand on clique dessus ou sur le bouton run en bas et surtout qu’il s’arrête à la fin du timer.
je suppose que si on l’arrête manuellement avec le marche/arrêt (via HA quand même), le timer vivra sa vie pour arriver jusqu’à la fin du décompte.
le ventilo doit avoir sa vie propre et quand on active le timer, il est géré par le timer.

dernière question, si je veux faire un second timer, je suppose que je dois créer tous ces services en double?

Ma configuration


image

Salut,

Il y a plusieurs sujets dans le sujet à mon avis :

Point 1 : Date du tuto Octobre 2020. Donc autant dire que sauf remise à jour régulière, on est pas sur un truc tout jeune tout jeune. D’autant plus que HA avance TRES vite !

Point 2 : Tu veux faire quoi une carte ??? Pas forcement besoin de faire des automatisations, des scripts et de se battre avec les Jinja :wink:
Sans aller trop loin avec le cambouis ou avec la baston des ninjas. Une base efficace c’est HACS. Par exemple : Home Assistant
Si l’idée c’est de faire un truc complet (affichage, allumage / arrêt automatique)

Point 3 : Malheureusement et comme tu le découvrira souvent, les tutos sont compliqués à faire : c’est assez dépendant de comment on à l’habitude de faire et c’est extrêmement difficile de faire un truc complétement générique, mais assez technique et précis pour obtenir un truc au bout. Et puis fixer la limite entre repartir des toutes les bases ou bien de considérer que ça fait partie des prérequis … Quant les maintenir :bomb:

Point 4 : Bon, tu ne vas pas y couper, il faut apprendre les bases HA. C’est la seule solution pour se sortir facilement des pièces que tu montres. Pas facile, long, mais efficace. Il ne faut pas hésiter non plus à utiliser outils à ta disposition. Pas à l’aise avec le yaml et les automatisations ? Il y a l’éditeur intégré. Tester un bout de code ? Les outils de dev ! Les élements de base ? Jeter un oeil aux helpers ! Et la doc officielle, il ne faut pas l’oublier.

Point 5 : Quand c’est trop gros/compliquer => il faut découper !

  • créer un timer
  • créer une carte
  • créer une automatisation (et encore un bouton ça marche aussi)
  • la customisation (les trucs jolis on s’en fiche au début, c’est compliqué et ça rends pas les choses lisibles)

Et on ne passe pas à la suite tant que l’étape précédente n’est pas terminée et fonctionnelle

ça fait pas avancer ton schmilblick ni ta moto, mais bon

Non c’est du yaml, le jinja est facile à reconnaitre, il a toujours 2 katanas { }, lovelace c’est le nom de l’interface graphique…

Tu m’étonnes :sweat_smile:

Typiquement un cas ou les outils sont mieux que le yaml

Là, à mon avis plus besoin de passer par ça dérsomais

C’est un peu écrit quand même fichier python s’il n’existe pas encore à toi de le faire

Oui, si tu veux gérer tes 2 switchs indépendamment, tu dois faire 2 timers, 2 automatisations etc

J’ai pas voulu dire Lovelace, c’est mon clavier qui a fourché.

pour le fichier Python, c’est la présentation qui m’a surpris.
genre mon code wifi c’est un deux trois quatre cinq six mais faut comprendre 1 fois 2, 3 fois 4 et 5 fois 6… ca fait : 244466666
ou crée un fichier ton_login.txt je me demande si je met ton_login.txt ou bentou.txt

mon souci n’est plus là puisque mon timer fonctionne avec la bonne valeur.
reste à l’intégrer intelligemment dans une carte.
j’ai cherché un peu partout, mais il me manque des billes…

jusque là, j’ai modifié ma carte pour :

  1. n’avoir que les boutons nécessaires:
    arrêt et pause si le timer tourne.
    run si le timer ne tourne pas.
    (J’aurais voulu n’avoir que run et arret si le timer est en pause mais j’ai pas encore trouvé)
  2. avoir l’état de mon ventilateur en haut à gauche. (marche ou arrêt, on se fiche de la vitesse)

il me manque :

  • la différence entre timer.cancel et timer.finish, je vois bien la différence au niveau sémantique, mais là, je ne vois pas de différences.
  • comment lancer mon ventilateur quand le timer tourne et l’arrêter quand il s’arrête…
  • où trouver les mots et la syntaxe des fichiers Lovelace, par exemple, est ce que je peux avoir un troisième choix avec un timer.timer_1h_temps en state: pause en plus du state: idle et state_not: idle, ce genre de trucs…

voila mon interface:

elements:
  - entity: fan.ventilateur_parents_right
    prefix: "Ventilo "
    style:
      color: var(--primary-color)
      font-size: 20px
      font-variant: small-caps
      left: 19%
      pointer-events: none
      top: 20%
    tap_action:
      action: none
    type: state-label

  - entity: sensor.timer_1h_temps_restant
    style:
      color: var(--primary-color)
      font-size: 200%
      font-variant: small-caps
      left: 50%
      pointer-events: none
      top: 40%
    tap_action:
      action: none
    type: state-label

  - type: conditional
    conditions:
      - entity: timer.timer_1h_temps
        state: idle
    elements:
      - entity: timer.timer_1h_temps
        icon: 'mdi:play'
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 50%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.start
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon

  - type: conditional
    conditions:
      - entity: timer.timer_1h_temps
        state_not: idle
    elements:
      - entity: timer.timer_1h_temps
        icon: 'mdi:pause'
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 33%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.pause
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon

      - entity: timer.timer_1h_temps
        icon: 'mdi:close'
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': red
          font-size: 20px
          font-variant: small-caps
          left: 66%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.cancel
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon

      - entity: timer.timer_1h_temps
        icon: 'mdi:play'
        style:
          color: var(--primary-color)
          '--paper-item-icon-active-color': var(--primary-color)
          font-size: 20px
          font-variant: small-caps
          left: 80%
          bottom: 0%
        tap_action:
          action: call-service
          service: timer.start
          service_data:
            entity_id: timer.timer_1h_temps
        type: state-icon
image: local/custom-lovelace/transparent.png
type: picture-elements

Rien sauf peut-être ce que tu mets derrière par exemple : avec le finished tu forces l’arrêt du ventillo. Avec le cancel, tu laisses tourner.
Pour tes 2 autres points : comme d’hab : timer en tant que trigger d’une(des) automatisation(s), et un coup d’oeil à la doc pour voir toutes fonctions et les exemples

Ok, j’ai tout effacé.

j’ai créé un timer.test de 00:01:10

quatre scripts:
start_timer
pause_timer
cancel_timer
finish_timer

qui influent sur mon timer.test qui passe de idle en active, en pause, etc…
pile poil comme dans Timer - Home Assistant.
j’ai juste ajouté des actions de démarrage ou d’arrêt de mon ventilateur:

start_timer:
  alias: Start timer
  sequence:
  - service: timer.start
    target:
      entity_id: timer.test
    data: {}
  - type: turn_on
    device_id: b8e1c797ddc0dd4d7529477afaa81955
    entity_id: fan.ventilateur_parents_right
    domain: fan
  mode: single
  icon: mdi:play

pause_timer:
  alias: Pause timer
  sequence:
  - service: timer.pause
    target:
      entity_id: timer.test
  mode: single
  icon: mdi:pause

cancel_timer:
  alias: Cancel timer
  sequence:
  - service: timer.cancel
    target:
      entity_id: timer.test
    data: {}
  - type: turn_off
    device_id: b8e1c797ddc0dd4d7529477afaa81955
    entity_id: fan.ventilateur_parents_right
    domain: fan
  mode: single
  icon: mdi:checkbox-marked-circle-outline

finish_timer:
  alias: Finish timer
  sequence:
  - service: timer.finish
    target:
      entity_id: timer.test
    data: {}
  - type: turn_off
    device_id: b8e1c797ddc0dd4d7529477afaa81955
    entity_id: fan.ventilateur_parents_right
    domain: fan
  mode: single
  icon: mdi:close

mais y’a un loup…

si je lance le script start_timer, le ventilateur démarre.
si je lance les scripts cancel_timer et finish_timer, il s’arrête.
mais il ne s’arrête pas tout seul à la fin du timer… certainement que je me branche pas au bon endroit…

en gros une automatisation qui fait tourner le bouzin quand timer.test est actif ou en pause…

j’ai fait deux automatisations Fan_start et Fan_stop
a priori ca a l’air de tourner, mais je sais pas si ca sera boulet-proof…

alias: Fan_start
description: ""
trigger:
  - platform: state
    entity_id:
      - timer.test
    from: idle
    to: active
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition: []
action:
  - type: turn_on
    device_id: b8e1c797ddc0dd4d7529477afaa81955
    entity_id: fan.ventilateur_parents_right
    domain: fan
mode: single
alias: Fan_stop
description: ""
trigger:
  - platform: state
    entity_id:
      - timer.test
    from: active
    to: idle
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition: []
action:
  - type: turn_off
    device_id: b8e1c797ddc0dd4d7529477afaa81955
    entity_id: fan.ventilateur_parents_right
    domain: fan
mode: single
1 « J'aime »