Je teste le Smart Switch ZG-005-RF

J’ai longtemps cherchĂ© comment disposer de contacts secs (aussi appelĂ©s Libre de potentiel) avec des NO (Normalement Ouvert) et NF (Normalement FermĂ©) comme le fait de manière gĂ©niale les SONOFF 4CH (Pro ou pas).

Ce type d’Ă©quipement en contact sec est capable de tout faire, aussi bien commander des appareils Ă©lectriques, des lampes mais Ă©galement commander des vannes d’arrosage (quelque soit leur tension) ou encore envoyer une impulsion pour ouvrir un portail, une gâche Ă©lectrique ou une sirène.

J’ai commandĂ© cet Ă©quipement Zigbee pour le tester. Notez que mes tests ne sont jamais “sponsoriĂ©s”, aucun produit testĂ© n’est offert par telle ou telle marque ou tel ou tel distributeur de matĂ©riel. C’est achetĂ© avec mon argent Ă  moi, parfois financĂ© par des reventes comme ce qui se trouve dans mon vide-grenier.

La documentation prĂ©cise que la tension de votre choix peut aller jusqu’Ă  240V max. Jusqu’Ă  10 A (2200 W Ă  220 V) avec charge rĂ©sistive1 (220 W max. Ă  220 V avec des LED) Lire la suite

Sauvegarder les sessions de charge Wallbox d’un vĂ©hicule Ă©lectrique

Je regarde les donnĂ©es rĂ©cupĂ©rĂ©es de l’intĂ©gration Wallbox

Ici un petit rĂ©cap des donnĂ©es qui vont me permettre d’enregistrer les donnĂ©es de la dernière session de charge dans sensor.wallbox_charges.

J’ai dĂ©jĂ  dĂ©crit toutes les entitĂ©s de l’intĂ©gration Wallbox sur ce Retex :

Lire la suite

Comparaison des frais des sites de ventes

Ce mini Retex pour comparer le coĂ»t pour l’acheteur et le vendeur des sites.

Sur ce comparatif, je pars sur un produit vente 10€ et je compare avec Mondial Relais.

  Produit Port Commission Coût acheteur Coût vendeur Recette vendeur
Vente direct 10€ 4.40€ 0€ 14.40€ 0€ 10€
Le Bon Coin 10€ 3.49€ 0.99€ 14.48€ 0€ 10€
Vinted 10€ 2.88€ 0.9€ 13.78€ 0€ 10€
Le Bon Coin 80€ 6.49€ 3.20€ 89.69€ 0€ 80€

 

Utiliser un script Python pour enregistrer des données dans HA

Je prĂ©viens tout de suite, ce Retex n’est qu’Ă  vocation pĂ©dagogique, je le rĂ©dige pour partager une mĂ©thodologie, Ă  savoir que j’ai rĂ©alisĂ© cette fonctionnalitĂ© diffĂ©remment depuis, donc je n’ai pas ce process en prod.

L’intĂ©gration pour exĂ©cuter le script Python

Pour une raison que je n’ai jamais compris, les fonctionnalitĂ©s scripts python intĂ©grĂ©es Ă  HA sont archi-mini, aucun import n’est possible, je dois donc utiliser une intĂ©gration appelĂ©e pyscript.

La doc est ici.

Je passe les dĂ©tails pour l’installer, c’est très simple avec HACS et tout est dans la doc.

Dans configuration.yaml, j’ai bien ces lignes :

pyscript:
  allow_all_imports: true
  hass_is_global: true

Je récupère un jeton

J’ouvre l’interface utilisateur de Home Assistant.

Dans le coin infĂ©rieur gauche, je clique sur mon nom d’utilisateur (ou l’icĂ´ne du profil).

Je clique sur “Profil”.

Je fais dĂ©filer vers le bas jusqu’Ă  la section “Jetons d’accès longue durĂ©e”. 

Je clique sur “CrĂ©er un jeton” pour gĂ©nĂ©rer un nouveau jeton.

Je donne un nom Ă  mon jeton pour m’y retrouver plus facilement.

Une fois le jeton créé, je vois son contenu. Je copie la valeur du jeton, c’est-Ă -dire la sĂ©rie de caractères alphanumĂ©riques, et je la colle dans ma configuration (paragraphe suivant)

Déclaration de la plateforme qui fait le lien entre Python et le sensor

Dans configuration.yaml, j’ajoute ces lignes :

rest_command:
  send_data_to_api:
    url: 'http://homeassistant.local:8123/api/states/sensor.wallbox_charges'
    method: 'post'
    content_type: 'application/json'
    headers:
      Authorization: 'Bearer TOKEN'  # Remplacer TOKEN par le token cf paragraphe précédent
    payload: '{{ data | tojson }}'  

Il s’agit de la porte d’entrĂ©e qui sera approvisionnĂ© par le script Python (plus bas) et qui enverra les informations dans le sensor sensor.wallbox_charges.

Mon script Python

Je place le fichier wallbox_charges.py dans le dossier /config/pyscript

import datetime
import pytz
@service
def wallbox_charges(lastdata=None, action=None, prix="123", km="123", dateDebut="01/01/2000 12:00:00", valeur="123"):
    fuseau_horaire_paris = pytz.timezone("Europe/Paris")

    maintenant_timestamp = int(datetime.datetime.now().timestamp())
    maintenant_heure_paris = datetime.datetime.fromtimestamp(maintenant_timestamp, fuseau_horaire_paris)
    maintenant_formatee = maintenant_heure_paris.strftime("%d/%m/%Y %H:%M:%S")

    maintenantMoins20min = datetime.datetime.now() - datetime.timedelta(minutes=20)
    maintenantMoins20min_formatee = maintenantMoins20min.strftime("%H:%M")
    
    
    dateDebutRecue = datetime.datetime.strptime(dateDebut, '%d/%m/%Y %H:%M:%S').replace(tzinfo=fuseau_horaire_paris)
    debut_timestamp_formatee = dateDebutRecue.strftime("%d/%m/%Y %H:%M:%S")
    debut_timestamp_formatee_SansSecondes = dateDebutRecue.strftime("%d/%m/%Y %H:%M")
    
     # Transformez les chaînes en objets datetime
    maintenant_dt = datetime.datetime.strptime(maintenant_formatee, "%d/%m/%Y %H:%M:%S")
    debut_dt = datetime.datetime.strptime(debut_timestamp_formatee, "%d/%m/%Y %H:%M:%S")

    # Calculez la différence entre les objets datetime
    tempsDeCharge = maintenant_dt - debut_dt - datetime.timedelta(minutes=20)

    # Formatez la durée en heures, minutes et secondes
    heures, reste = divmod(tempsDeCharge.seconds, 3600)
    minutes, secondes = divmod(reste, 60)

    # Affichez la durée au format HH:MM:SS
    tempsDeCharge_formatee = f"{heures:02}:{minutes:02}"


    # Écrivez un message d'information dans le journal
    #log.info(action)




    if action == "enregistrer":
        valeuraajouter =  [{
                          "saved_at": maintenant_timestamp,
                          "début": debut_timestamp_formatee_SansSecondes,
                          "fin": maintenantMoins20min_formatee,
                          "durée": tempsDeCharge_formatee,
                          "consommation": valeur,
                          "km": km,
                          "coût": round(valeur * prix, 2)
                        }]
        if lastdata is not None:
            valeuraajouter = lastdata + valeuraajouter
        data =  {
                    "state": debut_timestamp_formatee_SansSecondes,  
                    "attributes": {
                      "updated_at": maintenant_dt.strftime("%d/%m/%Y %H:%M:%S"),
                      "sessionscharge": 
                      valeuraajouter
                    }
                }

    if action == "init":
        data =  {
                "state": "on",
                    "attributes": {
                      "updated_at": "14/10/2023 16:42:39",
                      "sessionscharge": [
                        {
                          "consommation": 2.14,
                          "coût": 0.43,
                          "durée": "00:27",
                          "début": "19/09/2023 20:36",
                          "fin": "21:03",
                          "km": 17,
                          "saved_at": 1695150359
                        },
                        {
                          "consommation": 23.29,
                          "coût": 4.66,
                          "durée": "04:19",
                          "début": "21/09/2023 21:06",
                          "fin": "01:25",
                          "km": 192,
                          "saved_at": 1695323159
                        },
                        {
                          "consommation": 7.68,
                          "coût": 1.54,
                          "durée": "01:23",
                          "début": "22/09/2023 08:45",
                          "fin": "10:08",
                          "km": 63,
                          "saved_at": 1695409559
                        },
                        {
                          "consommation": 23.80,
                          "coût": 4.76,
                          "durée": "04:26",
                          "début": "23/09/2023 16:57",
                          "fin": "21:23",
                          "km": 196,
                          "saved_at": 1695495959
                        }
                       ]
                    }
                }   



    # Appelez le service REST pour envoyer les données
    service_data = {
        "token": "xxxxxx",  # Remplacer par le token
        "data": data
    }

    if action == "enregistrer" or action == "init":
        # Appelez le service REST de manière asynchrone
        await hass.services.async_call('rest_command', 'send_data_to_api', service_data)
        
    # Écrivez un message d'erreur dans le journal
    #log.error("Fin script")

Ajouter deux automatisations

Une pour initialiser le sensor, l’autre pour ajouter une donnĂ©e

Initialiser les données

alias: Initialise les sessions de charge
description: ""
trigger: []
condition: []
action:
  - service: pyscript.wallbox_charges
    data:
      action: init
mode: single

Enregistrer les données

alias: Enregistre une session de charge
description: >-
  Cette automatisation se déclenche lorsque le capteur n'a pas changé de valeur
  depuis 20 minutes et n'est pas Ă  0
trigger:
  - platform: state
    entity_id:
      - sensor.wallbox_portal_added_range
    for:
      hours: 0
      minutes: 20
      seconds: 0
    enabled: true
condition:
  - condition: numeric_state
    entity_id: sensor.wallbox_portal_added_energy
    above: 0
  - condition: not
    conditions:
      - condition: state
        entity_id: sensor.wallbox_charges
        state: >-
          {{ as_timestamp(states('sensor.wallbox_portal_added_range_min')) | int
          |     timestamp_custom('%d/%m/%Y %H:%M:%S', true)}}
    enabled: false
action:
  - service: pyscript.wallbox_charges
    data:
      action: enregistrer
      valeur: "{{states('sensor.wallbox_portal_added_energy')}}"
      prix: "{{states('sensor.wallbox_portal_energy_price')}}"
      km: "{{states('sensor.wallbox_portal_added_range')}}"
      lastdata: "{{state_attr('sensor.wallbox_charges', 'sessionscharge')}}"
      dateDebut: >-
        {{ as_timestamp(states('sensor.wallbox_portal_added_range_min')) | int |
        timestamp_custom('%d/%m/%Y %H:%M:%S', true)}}
  - service: variable.update_sensor
    data:
      replace_attributes: false
      value: >-
        {{ as_timestamp(states('sensor.wallbox_portal_added_range_min')) | int
        |     timestamp_custom('%d/%m/%Y %H:%M:%S', true)}}
    target:
      entity_id: sensor.wallbox_charges
    enabled: false
mode: single

Pour avoir la valeur minimal de la charge, j’utilise statistic pour avoir la valeur min

Ce sensor est déclaré dans sensors.yaml

- platform: statistics
  name: "Wallbox Portal Added Range Min"
  entity_id: sensor.wallbox_portal_added_range
  state_characteristic: datetime_value_min
  max_age:
    hours: 10  
   

Résultat du stockage des infos

Carte d’affichage de toutes les sessions

<div>Sessions de charge</div> 
Dernière mise à jour : {{ state_attr('sensor.wallbox_charges','updated_at')}} <br><br>
{% set items = state_attr('sensor.wallbox_charges', 'sessionscharge') %}
<table width='100%'>
<tbody>
{% for i in range(0, items | count, 1) %}
<tr>
<td>{{ items[i].début }} à {{ items[i].fin }} ({{ items[i].durée }})</td>
<td>{{ items[i].consommation }} kWh</td>
<td>+{{ items[i].km }} km</td>
<td>{{ items[i].coût }} €</td>
</tr>

{% endfor %}
</tbody>
</table>

Carte d’affichage avec des totaux par annĂ©e, mois, semaine

type: markdown
content: >-
  <div><h1>Sessions de charge</div>  {%- set default_language = 'fr' %} Dernière
  mise Ă  jour : {{ state_attr('sensor.wallbox_charges','updated_at')}} <br><br>


  {% set items = state_attr('sensor.wallbox_charges', 'sessionscharge') %}

  {% set septjours = now() - timedelta(days=7) %}

  {% set power_semaine = namespace(value=0) %}

  {% set cout_semaine = namespace(value=0) %}

  {% set unmois = now() - timedelta(days=30) %}

  {% set power_mois = namespace(value=0) %}

  {% set cout_mois = namespace(value=0) %}

  {% set uneannee = now() - timedelta(days=365) %}

  {% set power_annee = namespace(value=0) %}

  {% set cout_annee = namespace(value=0) %}


  {% for i in range(0, items | count, 1) %}
    {% if items[i].saved_at | int >= as_timestamp(uneannee) %}
    {% set power_annee.value = power_annee.value + items[i].consommation %}
    {% set cout_annee.value = cout_annee.value + items[i].coût %}
      {% if items[i].saved_at | int >= as_timestamp(unmois) %}  
        {% set power_mois.value = power_mois.value + items[i].consommation %}
        {% set cout_mois.value = cout_mois.value + items[i].coût %}
        {% if items[i].saved_at | int >= as_timestamp(septjours) %}
          {% set power_semaine.value = power_semaine.value + items[i].consommation %}
          {% set cout_semaine.value = cout_semaine.value + items[i].coût %}        
        {% endif %}
      {% endif %}
    {% endif %}
  {% endfor %}

  </ha-alert> <ha-alert alert-type="info" title="Dernier mois : {{
  power_mois.value | int }} kWh - {{ cout_mois.value | float | round(2) }}
  &euro;"></ha-alert> <ha-alert alert-type="info" title="Dernière année : {{
  power_annee.value | int }} kWh - {{ cout_annee.value | float | round(2) }}
  &euro;"></ha-alert>


  <br> 


  {% set items = state_attr('sensor.wallbox_charges', 'sessionscharge') %}

  {% set septjours = now() - timedelta(days=7) %}

  <table width='100%'> <tbody>  {% for i in range(0, items | count, 1) %}  {% if
  items[i].saved_at | int >= as_timestamp(septjours) %} {% set datetime_obj =
  strptime(items[i].début, '%d/%m/%Y %H:%M') %}

  <tr> <td><h5>{{items[i].début }} à {{ items[i].fin }} ({{ items[i].durée
  }})</td> <td>{{
    items[i].consommation }} kWh</td> <td>+{{ items[i].km }} km</td> <td>{{
    items[i].coût }} €</td> </tr> {% endif %} {% endfor %} </tbody> </table>
    <ha-alert alert-type="success" title="Dernière semaine : {{
      power_semaine.value | int}} kWh - {{ cout_semaine.value | float | round(2)
      }}&euro;">    
style:
  .: |
    ha-card {
      margin: 0px 0px 0px 0px;
      box-shadow: none;
     }
  ha-markdown:
    $: |
      h5 {
        font-size: 15px !important;
        font-weight: normal !important;
        padding: 0px 0px 0px 8px !important;
        border-left: 3px solid #429f46;
        }

 

J’intègre la Wallbox Ă  Home Assistant

Pour l’instant sous forme dĂ©sorganisĂ©e, ce RetEx me permet de prendre des notes pour la comprĂ©hension des donnĂ©es qui remontent de l’intĂ©gration Wallbox

Les capteurs Wallbox

Je dĂ©cortique l’entitĂ© Wallbox Portal Added Energy

Voici les données relevées

L’unitĂ© est le kWh donc nous sommes bien une quantitĂ© d’Ă©nergie. Il s’agit de la quantitĂ© d’Ă©nergie injectĂ©e dans le vĂ©hicule lors de la dernière charge.

Je ne branche pas le véhicule à la Wallbox tous les jours, je constate donc que quand je ne fais rien, le portail Wallbox garde la dernière valeur, de la dernière charge.

Le reset de cette quantitĂ© d’Ă©nergie doit se faire Ă  l’heure Ă  laquelle j’ai branchĂ© le vĂ©hicule. Je ferai attention les prochains jours.

Dans le graphique ci dessus, je vois que le 3 octobre, 5 octobre et le 7 octobre, entre 20h30 et 21h, la valeur est réinitialisée à 0.

Ensuite la Wallbox attend que la première plage horaire de charge arrive, 2h10 chez moi.

La Wallbox s’arrĂŞte seule quand le vĂ©hicule lui confirme qu’il a assez mangĂ©, il est configurĂ© sur 80% de la batterie pour les trajets quotidiens.

Les plateaux Ă  17.3kWh, Ă  22,18kWh, 23.86kWh et 23.43kWh vont me permettre d’afficher sur une carte HA la dernière quantitĂ© d’Ă©nergie injectĂ©e dans le vĂ©hicule… parfait.

Je dĂ©cortique l’entitĂ© Wallbox Portal Added Range

Voici les données relevées

L’unitĂ© est le km. J’en dĂ©duis donc que c’est l’estimation du nombre de km ajoutĂ©s Ă  chaque charge.

Je ne sais pas trop comment la Wallbox peut savoir cela, je pensais que c’Ă©tait propre au vĂ©hicule et Ă©videmment Ă  la conduite, ce doit ĂŞtre une estimation.

Le fonctionnement de ces donnĂ©es est identique Ă  l’entitĂ© prĂ©cĂ©dente, je conclue immĂ©diatement que je vais pouvoir ajouter sur la carte HA le dernier nombre de km ajoutĂ©s dans le vĂ©hicule… parfait.

Je dĂ©cortique l’entitĂ© Wallbox Portal Charging Power

Voici les données relevées

L’unitĂ© est kW, c’est donc la puissance consommĂ©e par la Wallbox pour charger le vĂ©hicule.

On constate que c’est assez variable, cela est calculĂ© par l’EM112 placĂ© en dĂ©but d’installation qui informe la Wallbox de combien d’Ă©nergie elle peut disposer, cela en fonction des autres Ă©quipements qui sont dĂ©jĂ  allumĂ©s dans l’installation.

Je vais pouvoir ajouter cette information sur la carte HA, peut-ĂŞtre les dernière 24h car en principe, on n’est pas devant l’Ă©cran quand la charge est en cours.

Je dĂ©cortique l’entitĂ© Wallbox Portal Charging Speed

Cette entitĂ© est toujours Ă  zĂ©ro sur mon système, je ne dois pas utiliser ce mode. Peut ĂŞtre que cela est disponible en tri-phasĂ© ou avec des Ă©quipements supplĂ©mentaires Je ne sais pas, comme la (mini, archi-mini) doc de l’intĂ©gration ne dit rien, je laisse tomber, je vais mĂŞme dĂ©sactiver cette entitĂ©.

Je dĂ©cortique l’entitĂ© Wallbox Portal Cost

Cette entitĂ© est toujours Ă  zĂ©ro sur mon système, je pensais y trouver le coĂ»t de la dernière charge. Je laisse tomber, je n’en ai pas besoin, je ferai moi-mĂŞme la multiplication. Je dĂ©sactive l’entitĂ©.

Je dĂ©cortique l’entitĂ© Wallbox Portal Current Mode

Cette entitĂ© s’actualise mais toujours Ă  la mĂŞme valeur : 1, je ne dois utiliser que le Mode 1, de quoi, je n’en sais rien, comme cela ne m’apporte rien, je le dĂ©sactive.

Je décortique les entités Wallbox Portal Depot Price et Wallbox Portal Energy Price

Ces entitĂ©s me donne le prix du kWh, je l’ai fixĂ© Ă  0.20€ dans la configuration, il me donne donc en permanence 0.20€.

Je ne comprends pas trop ce que veut dire Depot Price, je ne vais conserver que Energy Price.

Je vais le garder que si un jour j’affine cette valeur, je le ferai dans l’application Wallbox et si tout va bien, cela arrivera dans HA. Je suis surpris que Wallbox ne permette pas de mettre un prix pour les Heures Creuses et un prix pour les HP, peut ĂŞtre une Ă©volution un jour.

Je dĂ©cortique l’entitĂ© Wallbox Portal Discharged Energy

L’unitĂ© est en kWh, je ne vois pas pourquoi on pourrait utiliser la Wallbox pour dĂ©charger une batterie. J’imagine que cette fonctionnalitĂ© est prĂ©vue quelque part, je ne l’ai pas vue. Sur certains chargeurs de piles, on a un bouton pour dĂ©charger les piles avant de les charger, c’est peut-ĂŞtre cette logique, cette entitĂ© me donne 0 en permanence, je vais la dĂ©sactiver Ă  ce stade.

Je décortique les entités Wallbox Portal Max Available Power et Wallbox Portal Max. Charging Current

L’unitĂ© est en A et les affichent en permanence 32A, c’est la valeur configurĂ© dans ma Wallbox (je suis en monophasĂ©). Je les dĂ©sactivent, cela n’apporte rien Ă  la carte HA.

Je dĂ©cortique l’entitĂ© Wallbox Portal State of Charge

Cette entitĂ© qui est en % n’affiche rien chez moi. Peut etre utile en tri-phasĂ©, je ne sais pas, je la dĂ©sactive.

Je dĂ©cortique l’entitĂ© Wallbox Portal Status Description

EntitĂ© particulièrement importante, elle me donne l’Ă©tat de la Wallbox, c’est elle qui va rendre mon Ă©cran intĂ©ressant.

A ce stade, j’ai repĂ©rĂ© 5 Ă©tats que je vais utiliser pour faire de beaux logos d’Ă©tat de la Wallbox

  • Scheduled
  • Ready
  • Waiting for car demand
  • Disconnected
  • Charging

Bilan de ces analyses

Voici ce que je garde pour les exploiter 

Les ContrĂ´les Wallbox

Je dĂ©cortique l’entitĂ© Wallbox Portal Pause Resume

Elle a deux valeurs :

  • DĂ©sactivĂ©e soit Pause
  • ActivĂ©e soit Resume (Reprise)

J’ai testĂ© cela, c’est assez pratique. Par exemple, on branche le vĂ©hicule, la charge ne dĂ©marre pas car nous sommes hors de la plage de charge (=heures creuses chez moi), on appuie sur Reprise et la charge dĂ©marre. J’imagine que si on est en charge, si on appuie sur Pause, cela doit couper la charge mais je n’ai pas testĂ©.

Un bouton sur le Dashboard peut ĂŞtre sympa et pratique.

Je dĂ©cortique l’entitĂ© Wallbox Portal Locked Unlocked

Cette entitĂ© n’a pas d’intĂ©rĂŞt pour moi, elle doit servir pour les Wallbox partagĂ©es dans des co-pro par exemple ou chacun vient la dĂ©verrouiller avec une carte RFID pour s’en servir.

Elle est toujours sur Déverrouillé, je la désactive.

Je dĂ©cortique l’entitĂ© Wallbox Portal Max. Charging Current

C’est un curseur qui va de 0 Ă  la valeur max du courant configurĂ©.

Elle n’a d’intĂ©rĂŞt que si on n’utilise pas de EM112 en tĂŞte d’installation et qu’on veut rĂ©duire la consommation de la Wallbox pour laisser un peu de place Ă  d’autres Ă©quipements.

Chez moi, c’est configurĂ© sur 32A et je n’y touche jamais, je dĂ©sactive cette entitĂ©.

Bilan de ces analyses

Voici ce que je garde pour les exploiter

Je crée de belles images pour les états de la Wallbox

A noter que je n’en ai pas trouvĂ©, nulle-part sur le web. Alors je lance mon vieux Photoshop et c’est parti…

Je ne dĂ©pose pas les images mais si vous les rĂ©utilisez, je ne demande rien, juste d’indiquer la source.

Je vais crĂ©er une carte pour afficher l’Ă©tat de la Wallbox

Comme expliqué plus haut, la Wallbox peut prendre 5 états.

  • Scheduled
  • Ready
  • Waiting for car demand
  • Disconnected
  • Charging

Ces états sont fournis par entité : Wallbox Portal Status Description

La carte sera donc

type: image
entity: sensor.wallbox_portal_status_description
style:
  width: 100%
  top: 50%
  left: 50%
state_image:
  Scheduled: /local/maison/Wallbox/Scheduled.png
  Ready: /local/maison/Wallbox/Ready.png
  Waiting for car demand: /local/maison/Wallbox/Waiting-for-car-demand.png
  Disconnected: /local/maison/Wallbox/Disconnected.png
  Charging: /local/maison/Wallbox/Charging.png

A noter que j’ai placĂ© les 5 fichiers png dans le dossier /config/www/maison/Wallbox

 

J’ajoute un gif animĂ© transparent Ă  mon Dashboard HA

Mon objectif

Mon objectif est de réaliser une animation via un gif animé.

Je pourrai changer de gif en fonction de l’Ă©tat d’une entitĂ©.

Je vais dessiner les deux boules (une rouge une bleue)

Un petit coup de Photoshop ou autre et voici le fichier de base

Je vais crĂ©er l’animation dans Canva

Ma version de photoshop Ă©tant ancienne, je n’ai pas la fonctionnalitĂ© montage Ă  la maison, j’utilise Canva (en ligne).

Pour éviter une marque blanche au détourage, je mets le fond de mon écran HA en fond, le résultat est :

Je vais basculer sur un fond transparent

Je n’ai pas trouvĂ© comment faire cela avec Canva, j’utilise un outil en  ligne

Le résultat donne 

Je fais deux autres animations

Pour avoir trois états, je génère deux autres fichiers, un plus rapide et un plus lent, donc trois fichiers au total :

J’ajoute un template qui va correspondre Ă  la puissance consommĂ©e 

Dans mon fichier templates.yaml, j’ajoute

- name: Consommation_vitesse
  unique_id: sensor.consommation_vitesse
  state: >-
          {% if (states('sensor.linky_puissance_apparente')|float) < 400 %}
            lente
          {% elif (states('sensor.linky_puissance_apparente')|float) >4000 %}
            rapide
          {% else %}
            moyenne
          {% endif %} 

Sur le dashboard, j’ajoute une carte qui va afficher un des 3 gif animĂ©s, cela en fonction de la valeur de sensor.consommation_vitesse.

- type: image
  entity: sensor.consommation_vitesse
  tap_action:
    action: none
  style:
    width: 7%
    top: 91.6%
    left: 26.7%
  state_image:
    lente: /local/maison/Conso/lente.gif
    moyenne: /local/maison/Conso/moyenne.gif
    rapide: /local/maison/Conso/rapide.gif

 

J’intègre le Power Boost EM112 de chez Carlo Gavazzi dans Home Assistant via le port RS485 (Modbus)

Information importante

A noter que l’intĂ©gration dĂ©crite ci-dessous ne peut fonctionner que si la clĂ© USB/RS485 est le seul Ă©quipement du bus RS485 connectĂ©e au EM112. En effet (et grâce Ă  l’aide d’Eric G.) J’ai compris qu’il ne pouvait y avoir qu’un seul Ă©quipement maitre sur le bus. Or le maitre est celui qui interroge et l’esclave celui qui rĂ©pond. l’EM112 est donc esclave.

Mon idĂ©e première Ă©tait de sniffer les trames de dialogues entre l’EM112 et ma Wallbox, la Wallbox Ă©tant maitre, je ne peux faire cela. Pour la beautĂ© de l’exercice, j’ai testĂ© avec deux maitres, cela fonctionne on retrouve des valeurs mais de temps en temps, quand les deux maitres posent une question ensemble, on se retrouve avec une erreur.

Si quelqu’un peut m’orienter vers une manière de “snifer” le bus 485 pour intercepter les informations que le EM112 envoie Ă  une Wallbox par exemple, je suis preneur car Ă  ce stade, je ne peux avoir une Wallbox et une ClĂ© RS485/USB en parallèle (deux maitres).

Lire la suite