[TUTO] Domotiser la charge de ses batteries (electro portatif, robot tondeuse...)

Hello,

Je vous partage ma dernière réalisation. C’est pas grand chose mais ça me facilite la vie et ça aidera peut-être quelqu’un également.

Comme beaucoup j’utilise des batteries pour mes outils électro portatif (visseuse, rotofil, robot tondeuse…). Dans mon cas ces chargeurs sont stockés dans mon garage et c’est également là que je les mets en charge. Il m’est arrivé de les oublier en charge toute une nuit, ou volontairement de ne pas les mettre en charge car je devais partir pour le week end.

Je me suis dit que ce serait bien de pouvoir charger ce type de matériel en ayant l’esprit tranquille, quelque soit la marque, le type ou la puissance des batteries :thinking:

J’ai donc acheté une prise NOUS-A1Z-1 qui fonctionne en zigbee et je l’ai intégré à Home Assistant (dans mon cas en ZHA). Jusque là rien de sorcier.

Ensuite j’ai tâtonné avant de créer une automatisation qui m’indique que :

  1. la prise a commencé une charge
  2. les principaux indicateurs pendant la charge (puissance, consommation…)
  3. la charge est terminée
  4. la durée de cette charge
  5. la prise est éteinte

Voici les branchements avec mon plus gros chargeur (robot tondeuse) que j’ai fixé pour limité son encombrement. Vous apercevez la prise branchée.

Dés le début de la charge je reçois une notification :

Je peux consulter les données immédiates sur l’application HA :

Lorsque la charge est terminée je reçois une nouvelle notification :

Et le tableau de données ressemble maintenant à ça :

Je suis donc informé dés que ma batterie est prête à être utilisée et je peux partir ou aller me coucher l’esprit tranquille puisque la prise se coupera toute seule et le chargeur s’arrêtera en même temps.

Si cela vous intéresse voici le YAML :

alias: Gestion Charge Batterie - Version Optimisée
description: Notifie au début/fin, assure la coupure et calcule la durée.
triggers:
  - trigger: numeric_state
    entity_id: sensor.prise_noos_puissance
    above: 15
    for:
      seconds: 30
    id: debut
  - trigger: numeric_state
    entity_id: sensor.prise_noos_puissance
    below: 6
    for:
      minutes: 3
    id: fin
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: debut
        sequence:
          - action: input_datetime.set_datetime
            target:
              entity_id: input_datetime.debut_charge_batterie
            data:
              timestamp: "{{ as_timestamp(now()) }}"
          - action: notify.mobile_app_pixel_7a
            data:
              title: ⚡ Charge en cours
              message: "{{ now().strftime('%H:%M') }} - début de la charge"
      - conditions:
          - condition: trigger
            id: fin
        sequence:
          - action: switch.turn_off
            target:
              entity_id: switch.prise_noos
          - variables:
              t_debut: >-
                {{ state_attr('input_datetime.debut_charge_batterie',
                'timestamp') }}
              t_fin: "{{ as_timestamp(now()) }}"
              diff_sec: "{{ (t_fin - t_debut) | int if t_debut is not none else 0 }}"
              duree: >
                {% set h = (diff_sec // 3600) | int %} {% set m = ((diff_sec %
                3600) // 60) | int %} {% if h > 0 %}{{ h }}h {% endif %}{{ m
                }}min
          - action: notify.mobile_app_pixel_7a
            data:
              title: ✅ Charge terminée
              message: >
                {{ now().strftime('%H:%M') }} - fin de la charge (Durée : {{
                duree }}).  La prise NOUS est maintenant éteinte.
mode: restart

Voila, c’est tout pour ma part mais n’hésitez pas à me compléter si vous le souhaiter.

10 « J'aime »

C’est top, merci !

Très pragmatique…

Et du coup quand tu lance une charge tu te contente juste d’activer la prise et l’automatisation fait le reste ?

1 « J'aime »

Oui c’est ça. Je branche le chargeur sur la prise connectée, elle même branchée au secteur. Elle détecte une consommation électrique et l’automatisation se lance. Cela se voit car il y a un léger délai entre le branchement et le premier message reçu (qui n’a aucun impact sur le processus).

Lorsque qu’il n’y a plus de consommation électrique pendant 3 minutes, la batterie et logiquement chargée (quelque soit le chargeur, la marque ou la puissance de la batterie), l’automatisation arrête la charge et éteint la prise.

On peut relancer le processus en branchant un autre chargeur avec une batterie différente. On appuie sur le bouton ON/OFF de la prise (croix rouge) et l’automatisation repart automatiquement.

C’est très basique.

Très pragmatique !

Je me demandais sur quel info tu « relançais » la prise… mais en fait tu le fait manuellement lorsque tu branches physiquement ta batterie… pragmatique, logique, et rien de plus compliqué que les actions naturelles de mettre en charge une batterie…
:+1:

1 « J'aime »

Bonjour,
Merci pour le partage, j’ai eu le cas ce soir, ma batterie était restée toute la nuit et la journée branchée. Je dois avoir des prises à trainer :blush:

1 « J'aime »

J’ai un peu la même chose avec mon VTT par exemple.
Ou la trottinette du fiston, ou l’hoverboard de la petite.

Une carte TILE, avec graph sur la semaine.

Un tap action sur l’icon ouvre le graph de la conso, un tap action sur la carte ouvre le popup de la prise connectée.

Et une auto que voici qui ne m’a jamais posée le moindre problème :

alias: VTT prise
description: ""
triggers:
  - entity_id:
      - switch.vtt
    to:
      - "on"
    for:
      hours: 6
      minutes: 0
      seconds: 0
    trigger: state
  - entity_id:
      - switch.vtt
    to: "on"
    for:
      hours: 0
      minutes: 1
      seconds: 10
    trigger: state
  - entity_id:
      - sensor.vtt_active_power
    to: "0.0"
    for:
      hours: 0
      minutes: 1
      seconds: 10
    trigger: state
conditions: []
actions:
  - alias: Si pas conso 1 min ou allumé depuis 6h
    if:
      - condition: or
        conditions:
          - condition: state
            entity_id: switch.vtt
            state:
              - "on"
            for:
              hours: 6
              minutes: 0
              seconds: 0
          - condition: template
            value_template: >-
              {% if is_state('switch.vtt', 'on') and

              (as_timestamp(now()) -
              as_timestamp(states.switch.vtt.last_changed) > 60) and

              is_state('sensor.vtt_active_power', '0.0') and

              (as_timestamp(now()) -
              as_timestamp(states.sensor.vtt_active_power.last_changed) > 60) 
               %}true{% endif %}
    then:
      - data: {}
        target:
          entity_id: switch.vtt
        action: switch.turn_off
mode: single
1 « J'aime »

J’ai la même chose pour mon vélo électrique.

J’ai rajouté la quantité d’énergie injecter lors de la dernière charge, aussi bien dans le dashboard que dans la notification :

Bonjour,
J’ai fini par acheter une Nous Az1, intégrée, automatisation ok, ça marche super bien.
Ma fille n’arrête pas de me faire sauter le 30mA avec sa trotinette, je suis limite avec congélateur et … Du coup on branche proprement hors tension et on allume et là c’est nickel. Testé hier.
J’avais jamais pensé à faire cela, c’est top merci @DomoDam.

Bonne idée ! :+1:

C’est possible de rajouter le code yaml a ton post pour cette variante. Merci

La bubble-card en question:

type: custom:bubble-card
card_type: button
entity: switch.chargeur_velo
name: Velo
sub_button:
  main:
    - name: Activer
      show_arrow: true
      show_background: true
      show_icon: true
      state_background: false
      entity: switch.chargeur_velo
      show_name: true
      show_last_changed: false
      show_last_updated: false
      show_attribute: false
      show_state: false
      scrolling_effect: false
  bottom: []
modules:
  - get_state_attribute
force_icon: true
show_state: true
show_attribute: true
scrolling_effect: false
grid_options:
  columns: 12
  rows: auto
get_state_attribute:
  - entity: sensor.chargeur_velo_power
  - entity: sensor.velo_power_cycle
show_icon: true
show_name: true
button_type: switch
show_last_changed: false
show_last_updated: false

et pour les info de conso, c’est là :

Mais en résumé, il faut 2 automatisation, une qui détecte la fin de charge et une autre le début de la charge :
Voici l’automatisation qui détecte la fin de charge : (je fait exprès d’arrête la charge un peut avant, genre la batterie doit être chargé a 98-99% :

alias: "Velo en Charge : Fin"
description: ""
triggers:
  - type: power
    device_id: f35b09b9ca7ec46170e81c8d18c9c55f
    entity_id: 1473d8f386dc9fd5af8959b5619a37ac
    domain: sensor
    below: 30
    for:
      hours: 0
      minutes: 5
      seconds: 0
    trigger: device
conditions:
  - condition: state
    entity_id: input_boolean.velo_en_charge
    state: "on"
actions:
  - action: switch.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: switch.chargeur_velo
  - action: input_boolean.turn_off
    data: {}
    target:
      entity_id: input_boolean.velo_en_charge
  - variables:
      time: >-
        {{ ( now() -
        (state_attr("automation.charger_velo_start","last_triggered"))).seconds
        | int }}
      hours: "{{ ((time % 86400) / 3600) | int }}"
      minutes: "{{ ((time % 3600) / 60) | round | int }}"
  - action: notify.mobile_app_xxx
    metadata: {}
    data:
      title: Batterie Vélo Pleine
      message: >-
        Le cycle de charge s"est déroulé de {{
        ((state_attr("automation.charger_velo_start", "last_triggered"))|
        as_local).strftime("%Hh%M") }} à {{ now().strftime("%Hh%M") }}\n Soit
        une durée de {{ "{:01}h{:02}m".format(hours, minutes) }}\n Le cycle a
        consommé {{ (states("sensor.velo_power_cycle") | float (default=0) ) |
        round }}Wh({{ (states("sensor.velo_power_cycle") | float (default=0) *
        (states("sensor.edf_tempo_info") | float(default=0) /1000 ) ) | round(2)
        }}€)
  - action: notify.send_message
    metadata: {}
    data:
      message: >-
        {{ now().strftime("%d/%m/%Y") }} ; {{
        ((state_attr("automation.charger_velo_start", "last_triggered")) |
        as_local).strftime("%Hh%M") }} ; {{ now().strftime("%Hh%M") }} ; {{
        "{:01}h{:02}m".format(hours, minutes) }} ; {{
        (states("sensor.velo_power_cycle") | float (default=0) ) | round }}Wh ;
        {{ (states("sensor.velo_power_cycle") | float(default=0) *
        (states("sensor.edf_tempo_info")| float(default=0) ) / 1000 ) | round(2)
        }}€ ;
    target:
      entity_id: notify.velo
  - action: switch.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: switch.interrupteur_garage_right
mode: single

et celle qui détecte le début de la charge :

alias: "Velo en Charge : Début"
description: >-
  Debut de la chargeur du velo, on est a 0 la conso et on pourras recuperer le
  debut de la charge via state_attr("automation.charger_velo_start",
  "last_triggered")
triggers:
  - type: power
    device_id: f35b09b9ca7ec46170e81c8d18c9c55f
    entity_id: 1473d8f386dc9fd5af8959b5619a37ac
    domain: sensor
    above: 100
    for:
      hours: 0
      minutes: 1
      seconds: 0
    trigger: device
conditions:
  - condition: state
    entity_id: input_boolean.velo_en_charge
    state: "off"
actions:
  - action: utility_meter.calibrate
    metadata: {}
    data:
      value: "0"
    target:
      entity_id: sensor.velo_power_cycle
  - action: input_boolean.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: input_boolean.velo_en_charge
mode: single

PS: le notify.velo enregistre dans un fichier csv like

1 « J'aime »

Salut @DomoDam

Lors d’un redémarrage de HA, je reçois de nouveau une notification

Qui forcément correspond a rien

Je me demande si il ne faudrait pas supprimer le « restart » dans l’automatisation et le remplacer par single.

J’ai eu le même problème, je n’ai pas encore regardé pourquoi cela se produit.
J’ai toujours mis mes automatisations en single, mais celle ci est en restart. Je vais tenter le single.

Hello,
J’avoue ne pas être un pro du code, je me suis fait aidé par l’ia. C’est suite à plusieurs tests que la piste du « restart » est venue.
De mon côté pas de notification fantôme même en redémarrant HA.