[ConcoursDash] Ma carte robot tondeuse, aussi!

Coucou !

A mon tour de me lancer, petit introduction rapide du contexte pour mettre les choses en perspectives.

Le pourquoi ?
J’ai un robot Landroid intégré via HACS, et forcément pilotable via leur app.
L’intégration est plutôt bien faite, mais !

  • L’appli à tendance à redemander (trop souvent) de se reconnecter à base de token via email, et ça me gave !
  • L’appli sait gérer un planning de tonte basique, et un mode absence, mais ça reste limité.
  • L’intégration HACS à tendance à planter quand le robot est indispo, et parfois ne redémarre pas, dans le plus grand silence.
  • Je n’aime pas les grand dashboard, je préfère les informations ciblées, compactes. D’où le fait d’avoir détesté la card landroid-card, trop grosse pour moi, trop bling-bling. Les gouts et les couleurs, vous savez bien !

Le besoin sans surplus
Partant du constat précédent, et d’une saison de tonte géré par l’appli et avec cette énorme card je suis parti sur la mise en place de ces quelques points :

HA doit gérer le planning

  • C’est pour moi essentiel, parce que HA sait quand je suis en vacance (donc pas de tonte, marre que le jour où je parte le robot se bloque quelque part dans le jardin)
  • HA peut faire un planning le matin, et un second l’après-midi avec les helpers schedule. Typiquement, en ce moment il y a besoin de tondre, mais le matin c’est trop humide, ça bourre, donc sans modifier toute ma programmation, je peux uniquement activer que l’après-midi

HA peut piloter comme l’appli
Via l’intégration HA reçoit énormément d’informations. Il est donc capable de démarrer au schedule si la batterie est pleine, qu’il n’y a pas de pluie, si on n’est pas en vacances … de redémarrer quand le robot est rechargé dans la plage autorisée. Et de faire revenir le robot à la fin de la plage.
Bref, comme l’appli, mais en amélioré !

Les petits trucs en plus
Je voulais pouvoir démarrer manuellement, ou même démarrer le mode coupe des bordures.
Je voulais voir directement si il y avait une erreur en cours.
Pouvoir passer la tondeuse en mode Hivernage et avoir quelques infos.
Et pour finir, je voulais que HA s’occupe du fallback si l’appli était HS, avec notif, et restart automatique, contrôlé pour ne pas relancer dans le vide.

La carte
Tous mes dashboard utilisent désormais les sections et leurs avantages. J’ai donc une section dédiée à cette tondeuse. Voici comment elle se présente lorsque tout fonctionne.

Quelques infos dans le titre, et la possibilité de la passer en mode hivernage.
Une première ligne permet :

  • D’avoir l’état de la tondeuse (sur la base, tonte, capteur de pluie, erreur, …)
  • De pouvoir démarrer manuellement une tonte, ou une coupe des bordures.
  • Pouvoir manuellement couper la gestion auto au cas où.

Les deux lignes du dessous sont la gestion du planning. Je peux les activer/désactiver séparément. et je vois dans l’info si une plage est active.

En cas d’hivernage, cette carte disparait au profit d’un petit message.

Et souvent le plus utile, si il y a une erreur, des infos apparaissent. Vue compète en mode édition :

Dépendance et code
Pas de grosses dépendances, pas de button-card à cause de mon allergie, et pas de card-mod/uix non plus.
Seulement le custom multiple-entity-row à l’intérieur d’une card entities classique. Tout le reste utilise les composants de HA standards

Le code de cette section :

type: grid
cards:
  - type: heading
    heading: Tondeuse
    heading_style: subtitle
    icon: mdi:robot-mower
    badges:
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.lando_battery
        color: orange
        visibility:
          - condition: state
            entity: input_boolean.hibernation_tondeuse
            state: "off"
      - type: entity
        show_state: true
        show_icon: true
        entity: sensor.lando_battery_temperature
        color: green
        visibility:
          - condition: state
            entity: input_boolean.hibernation_tondeuse
            state: "off"
      - type: entity
        show_state: false
        show_icon: true
        entity: binary_sensor.lando_online
        color: state
        visibility:
          - condition: state
            entity: binary_sensor.lando_online
            state_not: "on"
      - type: entity
        show_state: true
        show_icon: true
        entity: input_boolean.hibernation_tondeuse
        tap_action:
          action: toggle
        color: primary
        icon: mdi:snowflake
        name: Hivernage
        state_content: state
  - type: markdown
    content: La tondeuse est en mode hibernation pour l'hiver 😴
    visibility:
      - condition: state
        entity: input_boolean.hibernation_tondeuse
        state: "on"
  - type: entities
    entities:
      - entity: input_boolean.landroid_tonte_automatique
        type: custom:multiple-entity-row
        toggle: true
        state_color: true
        secondary_info:
          entity: lawn_mower.lando
        name: Tonte automatique
        entities:
          - entity: binary_sensor.lando_rainsensor_triggered
            state_color: true
            name: false
            icon: true
            hide_if: "off"
          - entity: lawn_mower.lando
            state_color: true
            name: false
            icon: true
            tap_action:
              action: call-service
              service: lawn_mower.start_mowing
              service_data:
                entity_id: lawn_mower.lando
              confirmation:
                text: Démarrer la tonte ?
          - entity: button.lando_start_cutting_edge
            state_color: true
            name: false
            icon: true
            tap_action:
              action: call-service
              service: button.press
              service_data:
                entity_id: button.lando_start_cutting_edge
              confirmation:
                text: Démarrer la coupe des bords ?
      - type: divider
      - entity: input_boolean.landroid_tonte_matin
        name: Planning Matin
        type: custom:multiple-entity-row
        toggle: true
        state_color: true
        secondary_info:
          entity: schedule.landroid_planning_matin
          name: Actuellement
      - entity: input_boolean.landroid_tonte_apres_midi
        name: Planning Après-midi
        type: custom:multiple-entity-row
        toggle: true
        state_color: true
        secondary_info:
          entity: schedule.landroid_planning_apres_midi
          name: Actuellement
    show_header_toggle: false
    state_color: true
    visibility:
      - condition: state
        entity: input_boolean.hibernation_tondeuse
        state: "off"
  - type: tile
    entity: sensor.lando_error
    features_position: bottom
    vertical: false
    name: Erreur Landroid
    color: red
    state_content:
      - state
      - last_changed
    tap_action:
      action: more-info
    grid_options:
      columns: 12
      rows: 1
    visibility:
      - condition: state
        entity: sensor.lando_error
        state_not: no_error
      - condition: state
        entity: input_boolean.hibernation_tondeuse
        state: "off"
  - type: markdown
    content: >-
      ⚠️ **Attention !** L'automation de restart de l'integration Landroid s'est
      déclenchée plusieurs fois.
    visibility:
      - condition: and
        conditions:
          - condition: numeric_state
            entity: sensor.counter_fail_landroid_reload_integration
            above: 1
          - condition: state
            entity: input_boolean.hibernation_tondeuse
            state: "off"

Pour conclure, l’appli ne me sert que pour les mises à jour aujourd’hui (et il n’y en a pas souvent) et réinitialiser le compteur des lames, rien de plus !
Game changer pour moi parce que je n’ai plus besoin de penser à la couper quand on pars quelques jours, et que je vois juste ce que j’ai besoin.
M’en moque de savoir combien elle a parcouru de kilomètres, ou qu’elle a actuellement un angle de 3.28°, … Que ce qui m’est utile au final !

Voila pour moi !

4 « J'aime »

Bravo, c’est propre !

Une belle utilisation de la visibilité pour n’avoir que l’utile sous les yeux.

Quelques questions:

  • pourquoi ta dernière carte est une conditional card alors que pour les autres tu utilises la visibilité? un choix, un reste d’une implementation précédente?
  • Tu utilises des cartes markdown, elles sont capables de prendre des templates, tu n’as pas pensé t’en servir pour donner des messages en clair plus interactifs ?
  • Tu n’utilise pas l’entité lawn-mover et ses fonctions (démarrer - retour base) ou c’est juste tes images qui ne le montrent pas ?

Je suis parti sur un concept proche, mais en mushroom template pour rester proche des tuiles. Mais du coup chez moi la complexité est dans le template, alors que toi tu utilises la visibilité pour ça. C’est une approche à conseiller en particulier à ceux qui débutent car tout peut être fait en interface graphique facilement ! Bravo !

Merci !

Je vais probablement faire une réponse en demi-teinte pour expliquer quelques choix. D’abord elle n’est pas 100% identique à ce que j’ai chez moi car effectivement il y a une notion de visibilité par utilisateur, que j’ai retiré ici.
En gros, et par choix, le dashboard complet est commun a toute la famille, mais adapté à l’utilisateur. Par exemple les cartes de lancement avec les schedule il n’y a que moi qui ait la visibilité, les autres ont une version adaptée avec l’état de la tondeuse. Idem pour les erreurs ca ne les concerne pas. C’est certainement pour ça qu’il y a des différences.
J’ai trouvé que ce n’était pas très utile de rajouter pour ce sujet cette surcouche utilisateur, mais du coup ca laisse probablement quelques artefacts.
Edit: Pour la markdown, oui effectivement, je sais plus pourquoi c’est une conditionnelle. Juste la markdown avec la visibilité est suffisante, merci, je vais modifier :smiley:

Effectivement j’aurais pu, et c’est certainement un truc que je ferais à l’avenir, regrouper la card erreur dont l’info est fourni par Landroid, et la card Markdown, qui lui est gérée par le fallback de l’automatisme qui controle que l’intégration est toujours connectée au robot.

J’utilise bien lawn_mower.start_mowing pour lancer la tonte (avec une confirm pour mes gros doigts). C’est pour le lancement manuel
Mais les automatisations derrière qui gère l’automatisme du lancement / retour.

L'automatisation du start
alias: Landroid - Auto schedule - Start
description: >-
  Utilisé à la place du programme de tonte Landroid de l'appli.

  L'utilité est de pouvoir gérer plus finement si le programme est utilisé, ou
  uniquement le matin, ou uniquement l'apres midi
triggers:
  - entity_id:
      - schedule.landroid_planning_matin
    to: "on"
    trigger: state
  - entity_id:
      - schedule.landroid_planning_apres_midi
    to: "on"
    trigger: state
  - entity_id:
      - sensor.lando_rainsensor_remaining
    for:
      hours: 0
      minutes: 10
      seconds: 0
    to: "0"
    trigger: state
  - entity_id:
      - sensor.lando_battery
    to: "100"
    for:
      hours: 0
      minutes: 10
      seconds: 0
    trigger: state
  - entity_id:
      - switch.lando_party_mode
    from: "off"
    to: "on"
    for:
      hours: 0
      minutes: 5
      seconds: 0
    trigger: state
  - entity_id:
      - input_boolean.landroid_tonte_matin
      - input_boolean.landroid_tonte_apres_midi
      - input_boolean.landroid_tonte_automatique
    from: "off"
    to: "on"
    for:
      hours: 0
      minutes: 5
      seconds: 0
    trigger: state
conditions:
  - condition: and
    conditions:
      - condition: state
        entity_id: input_boolean.landroid_tonte_automatique
        state: "on"
      - condition: numeric_state
        entity_id: sensor.lando_battery
        above: 90
      - condition: state
        entity_id: binary_sensor.lando_rainsensor_triggered
        state: "off"
      - condition: state
        entity_id: switch.lando_party_mode
        state: "off"
      - condition: state
        entity_id: sensor.lando_rainsensor_remaining
        state: "0"
      - condition: state
        entity_id: lawn_mower.lando
        state: docked
      - condition: state
        entity_id: input_select.abs_longue
        state: Désactivé
      - condition: state
        entity_id: input_boolean.hibernation_tondeuse
        state:
          - "off"
actions:
  - alias: Si on est le matin
    if:
      - condition: and
        conditions:
          - condition: state
            entity_id: schedule.landroid_planning_matin
            state: "on"
          - condition: state
            entity_id: input_boolean.landroid_tonte_matin
            state: "on"
    then:
      - target:
          entity_id: lawn_mower.lando
        data: {}
        action: lawn_mower.start_mowing
  - alias: Si on est l'après-midi
    if:
      - condition: and
        conditions:
          - condition: state
            entity_id: schedule.landroid_planning_apres_midi
            state: "on"
          - condition: state
            entity_id: input_boolean.landroid_tonte_apres_midi
            state: "on"
    then:
      - target:
          entity_id: lawn_mower.lando
        data: {}
        action: lawn_mower.start_mowing
mode: single

L'automatisation du retour
alias: Landroid - Auto schedule - Retour base
description: |-
  Utilisé à la place du programme de tonte Landroid de l'appli.
  Retour à la base
triggers:
  - entity_id:
      - schedule.landroid_planning_matin
    to: "off"
    trigger: state
  - entity_id:
      - schedule.landroid_planning_apres_midi
    to: "off"
    trigger: state
conditions:
  - condition: and
    conditions:
      - condition: state
        entity_id: input_boolean.landroid_tonte_automatique
        state: "on"
      - condition: state
        entity_id: lawn_mower.lando
        state: mowing
actions:
  - data: {}
    target:
      entity_id: lawn_mower.lando
    action: lawn_mower.dock
  - repeat:
      count: 2
      sequence:
        - delay:
            hours: 0
            minutes: 10
            seconds: 0
            milliseconds: 0
        - if:
            - condition: state
              entity_id: lawn_mower.lando
              state: mowing
          then:
            - data: {}
              target:
                entity_id: lawn_mower.lando
              action: lawn_mower.dock
          alias: "Essaie de nouveau si jamais la commande n’est pas passée. "
mode: single

A noter la boucle de réessaie dans le retour. Le robot n’a pas le wifi dans le fond du jardin, d’où le réessaie. Depuis 2 saisons, tout fonctionne parfaitement :smiley:

Le reload auto de l'intégration
alias: Landroid - Reload intégration si perte communication
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.lando_last_update
    for:
      hours: 0
      minutes: 15
      seconds: 0
    to:
      - unavailable
conditions:
  - condition: and
    conditions:
      - condition: numeric_state
        entity_id: sensor.counter_fail_landroid_reload_integration
        below: 4
      - condition: state
        entity_id: input_boolean.hibernation_tondeuse
        state:
          - "off"
actions:
  - data:
      titre: 🌱 Tondeuse 🌿
      msg: >-
        L'intégration Landroid est indisponible depuis un moment, reload en
        cours.
      qui: [REDACTED]
      urgent: "0"
      appli: "1"
      appli_url: /config/integrations/integration/landroid_cloud
      appli_tag: notif-landroid
    action: script.notifs_notifications_maitre
  - action: homeassistant.reload_config_entry
    metadata: {}
    data:
      entry_id: 01JTN6NEWTB5CYKD760CN11TAC
    enabled: true
mode: single

Nota le compteur est un un history stat dont l’entité de comptage est cette automation !

Et dernier truc que j’aurais peut-être du mettre dans l’intro. J’ai été un peu échaudé des cards qui étaient super, puis qui ne fonctionnaient plus. C’est aussi pour cela que j’essaie dans la mesure du possible de rester sur le core. Mais clairement je sais que si je mettais le petit doigt dans mushroom, je serais parti pour tout refaire !

1 « J'aime »

C’est donc encore plus complet !

Impec!

Je fais pareil => un seul dashboard à maintenir !

Je suis 100% d’accord… mais j’ai fait deux concessions: mushroom pour les template et custom-feature pour les boutons… Pour le reste ce n’est que du gadget…

1 « J'aime »