Guardar las sesiones de carga de Wallbox de un vehículo eléctrico

Miro los datos recuperados de la integración de Wallbox

A continuación un pequeño resumen de los datos que me permitirá guardar los datos de la última sesión de carga en sensor.wallbox _charges.

Ya he descrito todas las entidades de integración de Wallbox en este Retex:

El disparador

Así que voy a usar sensor.wallbox_portal_status_description como disparador para grabar la última sesión de carga.

Por lo tanto, usaré el cambio de estado de Carga a otra cosa para activar la grabación.

Datos

Añado la integración que almacenará los datos de carga

Encontré la integración variables de hass, Absolutamente genial. Gracias a Ankama y Snuffy2 para este trabajo y seguimiento.

Le permite crear un sensor que no está conectado a nada (no a una plantilla). Este sensor mantiene sus valores incluso en el relanzamiento de HA. Exactamente lo que necesitaba sin usar un modo de copia de seguridad de datos externo (json, otra base de datos de …).

El nuevo sensor se llama: Sensor.wallbox _charges

Añado un sensor que detecta el inicio de la carga

De hecho, la integración no me da la hora y la fecha de inicio de la última carga. Para calcular la duración, me parece interesante tener esta información. Así que voy a crearlo.

Confío en la entidad sensor.wallbox _portal _added _range y buscaré la hora de inicio / fecha de carga (por lo tanto, su valor mínimo en las últimas 5 horas)

En mi archivo sensors.yaml, agrego esta entidad:

- plataforma: nombre estadístico: "Wallbox Portal Added Range Min" entidad_id: Sensor.wallbox _portal _added _range state _característica: fecha _value _min max_age: horas: 5  

Esto creará para mí la entidad: sensor.wallbox _portal _added _range _min

Usaré esta entidad para registrar el inicio de la carga y calcular el tiempo de carga.

Añado la automatización que guardará los datos

Es bastante complejo, imagino que es simplifiable, lo explicaré paso a paso

Aquí está el código completo primero

alias: Guarda una descripción de la sesión de carga: Activador "": - plataforma: _id, entidad estatal: - sensor.wallbox_portal_status_descripción de: Carga a: alias nulo: Cuando finaliza la condición de carga: [] acción: - alias: >- Inicializar el primer conso, que se lanzará solo una vez (deshabilitando las otras acciones) y luego deshabilitar el servicio: variable.update _sensor data: sustitúyase _attributes: valor real: Atributos INIT: carga de sesiones: objetivo nulo: _id (entidad): Sensor.wallbox _charges habilitado: false - servicio: variable.update _sensor data: sustitúyase _attributes: valor real: >- {{ as_timestamp(states('sensor.wallbox _portal _added_range _min'))) | int | timestamp _custom('%d/%m/%Y %H:%M:%S', true)}}} atributos: carga de sesiones: > {% set sessioncharge = {'consumo': 2.14, «coste»: 0,43, «duración»: «00:27», «comienzo»: «19/09/2023 20:36», «final»: «21:03», «km»: 17, «salvado _at»: 1695150359} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.29, «coste»: 4.66, «duración»: «04:19», «principio»: «21/09/2023 21:06», «fin»: «01:25», «km»: 192, «Saved_at»: 1695323159} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 7.68, «coste»: 1.54, «duración»: «01:23», «comienzo»: «22/09/2023 08:45», «fin»: «10:08», «km»: 63, «Saved_at»: 1695409559} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.8, «coste»: 4.76, «duración»: «04:26», «comienzo»: «23/09/2023 16:57», «fin»: «21:23», «km»: 196, 'salvado _at': 1695495959} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.64, «coste»: 4.73, «duración»: «04:05», «inicio»: «26/09/2023 20:59», «fin»: «01:04», «km»: 195, «Saved_at»: 1695755159} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 24.04, «coste»: 4.81, «duración»: «05:17», «comienzo»: «28/09/2023 21:21», «fin»: «02:38», «km»: 198, 'salvado _at': 1695927959} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 17.3, «coste»: 3.46, «duración»: «03:51», «comienzo»: «30/09/2023 21:31», «fin»: «01:22», «km»: 143, «Saved_at»: 1696100759} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 22.18, «coste»: 4.44, «duración»: «04:25», «comienzo»: «03/10/2023 20:43», «fin»: «01:08», «km»: 183, «Saved_at»: 1696359959} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.86, «coste»: 4.77, «duración»: «05:26», «comienzo»: «05/10/2023 21:03», «fin»: «02:29», «km»: 197, 'salvado _at': 1696532759} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.43, «coste»: 4.69, «duración»: «05:07», «comienzo»: «07/10/2023 20:34», «fin»: «01:41», «km»: 193, «Saved_at»: 1696705559} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.32, «coste»: 4.66, «duración»: «04:40», «principio»: «10/10/2023 20:57», «fin»: «04:40», «km»: 192, «Saved_at»: 1696964759} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 25.19, «coste»: 5.04, «duración»: «04:39», «comienzo»: «12/10/2023 19:53», «final»: «00:32», «km»: 208, «Saved_at»: 1697137559} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 8.61, «coste»: 1.72, «duración»: «01:32», «comienzo»: «13/10/2023 21:05», «fin»: «22:37», «km»: 71, «salvado _at»: 1697223959} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 27.76, «coste»: 5.55, «duración»: «04:46», «principio»: «16/10/2023 02:11», «fin»: «06:57», «km»: 231, «Saved_at»: 1697474976} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 24.18, «coste»: 4.84, «duración»: «04:12», «comienzo»: «18/10/2023 02:11», «fin»: «06:23», «km»: 201, «Saved_at»: 1697657509} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 20.17, «coste»: 4.03, «duración»: «03:38», «comienzo»: «19/10/2023 02:11», «fin»: «05:50», «km»: 168, «Saved_at»: 1697688628} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 23.08, «coste»: 4.62, «duración»: «04:13», «comienzo»: «21/10/2023 02:12», «fin»: «06:25», «km»: 192, «Saved_at»: 1697867735} %}{{ carga de sesión }},{% set sessioncharge = {'consumo': 12.19, «coste»: 2.44, «duración»: «03:21», «comienzo»: «22/10/2023 02:13», «fin»: «05:34», «km»: 101, «Saved_at»: 1697946854} %}{{ sessionload }} target: _id (entidad): Sensor.wallbox _charges habilitado: alias falso: >- Inicializar el primer conso, para iniciar solo una vez (deshabilitando las otras acciones) y luego deshabilitar - servicio: variable.update _sensor data: sustitúyase _attributes: valor real: >- {{ as_timestamp(states('sensor.wallbox _portal _added_range _min'))) | int | timestamp _custom('%d/%m/%Y %H:%M:%S', true)}}} atributos: carga de sesiones: >- {% set diff_seconds = now().timestamp() - states.sensor.wallbox _portal _added _range _min.state | como _timestamp %} {% horario establecido = (diff _seconds / 3600) | int %} {% minutos establecidos = ((diff_seconds % 3600) / 60) | int %} {% set sessioncharge = { 'consumo': Estados('sensor.wallbox _portal _added _energy') | float | round(2), 'cost': (states(''sensor.wallbox _portal _energy _price') | float * states(''sensor.wallbox _portal _added _energy') | float | round(2)) | round(2), 'duration': ' quinquies:d' | format(hours, minutes) , 'beginning' (en inglés): como _timestamp(states('sensor.wallbox_portal_added_range_min')) | int | timestamp_custom('%d/%m/%Y %H:%M', verdad), 'fin': now().strftime(')%H:%M') , 'km': ('sensor.wallbox _portal _added _range') | int, 'saved_at': now().timestamp() | int } (en inglés) %} {% Si el estado _attr('sensor.wallbox _charges', 'sessionscharge') no es ninguno %} {{ state_attr('sensor.wallbox _charges', 'sessionscharge') }}, {{ sessioncharge }} {% de lo contrario %} {{ sessionload }}, {{ sessionload }} {% endif %} objetivo: _id (entidad): Sensor.wallbox _charges habilitado: alias verdadero: Guarda la sesión de carga que acaba de finalizar el modo: soltero

 

Explicación parte por parte

  • El disparador: esto es cuando la carga está terminada
  • La acción 1 (desactivada por defecto) debe activarse solo una vez pensando en deshabilitar las otras dos acciones, debe inicializarse como «nulidad» una vez que la entidad que registra los datos.
  • La acción 2 (desactivada por defecto) solo debe activarse una vez cuando se piensa en deshabilitar las otras 2 acciones, esto es para inicializar algunos datos anteriores. De hecho, no quería perder los datos de carga desde la compra del automóvil, así que lo almacené allí. 
  • La acción 3 (que se activará por defecto) es la acción que calcula y registra los datos de carga.

Explicación del código de activación 

Este disparador se basa en la plataforma "estado" de Home Assistant. Controla la situación de una entidad específica, en este caso, «sensor.wallbox _portal _status _description». Específicamente, está configurado para reaccionar cuando se produce un cambio en el estado de esa entidad. Los detalles de configuración son los siguientes:

– «entidad _id»: Especifica la entidad cuyo estado es monitoreado. En este caso, se trata de «sensor.wallbox _portal _status _description». Múltiples entidades pueden ser monitoreadas proporcionando una lista de entidades en forma de una lista. Sin embargo, en este ejemplo, solo se supervisa una entidad.

– “desde: tarificación»: Esto significa que el disparador reacciona cuando el estado anterior de «sensor.wallbox _portal _status _description» era «Charging». Esta es una condición para activar la automatización. El disparador solo reacciona si el estado anterior era «Carga».

– «a: nulo“: Esto significa que el disparador reacciona cuando el estado actual de «sensor.wallbox _portal _status _description» ha cambiado de «Charging» a cualquier otro estado, incluido «null». Esta es la nueva condición para activar la automatización. El disparador reacciona cuando el estado cambia de Carga a cualquier otro estado.

– ”alias: Cuando finaliza la carga: Este es un alias para el disparador, un nombre que hace que sea más fácil para usted reconocerlo. En este caso, simplemente indica que la automatización se activará cuando termine la carga.

En resumen, esta automatización se activa cuando el estado de «sensor.wallbox_portal_status_description» cambia de «carga» a cualquier otro estado, lo que significa que está diseñado para reaccionar cuando finaliza la carga del coche eléctrico.

Explicación de la acción 1 

Esta acción está destinada a inicializar el primer consumo (carga) para un sensor llamado "sensor.wallbox _charges" utilizando el servicio "variable.update _sensor" de Home Assistant. Aquí hay una explicación detallada de cada componente de la acción:

– «alias»: Es simplemente un nombre o descripción de la acción para hacerla más comprensible. En este caso, indica que esta acción está destinada a la inicialización del primer consumo y que solo debe realizarse una vez. También sugiere deshabilitar nuevas acciones después de su ejecución.

– «servicio: variable.update_sensor“: Esta fila especifica el servicio que se utilizará para realizar la acción. El servicio variable.update _sensor se utiliza para actualizar o inicializar los atributos de una entidad (en este caso, «sensor.wallbox _charges»).

– "datos": Esta sección contiene los datos que se enviarán con el servicio. En este caso:
– «Sustituir _attributes: true» (Verdadero): Esto indica que los atributos de la entidad existente deben ser reemplazados por los nuevos datos. Si "replace _attributes" se establece en "true", los atributos existentes de "sensor.wallbox _charges" serán reemplazados por los nuevos datos.

– Valor: INIT»: Esto indica el valor que debe asignarse al atributo «sessionload» de «sensor.wallbox _charges». En este caso, se asigna el valor "INIT".

– Atributos: carga de sesiones: nulo“: Esta fila indica que el atributo «sessionload» de «sensor.wallbox _charges» debe inicializarse como «null».

– “objetivo”: Especifica la entidad de destino, es decir, la entidad cuyos atributos se actualizan. En este caso, la entidad objetivo es sensor.wallbox _charges.

– ’permitido: true» (Verdadero): Esto indica que esta acción está habilitada y se puede ejecutar.

En resumen, esta acción se utiliza para inicializar el atributo «sessionload» de la entidad «sensor.wallbox _charges» con el valor «null» utilizando el servicio «variable.update _sensor». Se pretende que se ejecute solo una vez para realizar esta inicialización, después de lo cual se recomienda deshabilitar esta acción. Esto podría ser útil para comenzar con valores iniciales específicos en sus automatizaciones o entidades.

Explicación de la acción 2

Esta acción tiene por objeto inicializar el atributo «sessionload» de una entidad denominada «sensor.wallbox _charges» con una serie de datos de sesión de carga preexistentes. Aquí hay una explicación detallada de cada elemento de la acción:

– «servicio: variable.update_sensor“: Se trata del servicio utilizado para actualizar o inicializar los atributos de una entidad en Home Assistant.

– "datos": Esta sección contiene los datos que se enviarán con el servicio. En este caso:
– «Sustituir _attributes: true» (Verdadero): Esto indica que los atributos existentes de la entidad sensor.wallbox _charges serán reemplazados por los nuevos datos.

– "valor": Esta parte se utiliza para definir el valor del atributo sessionload de la entidad sensor.wallbox _charges. El valor se genera dinámicamente utilizando los modelos Jinja2. Utiliza la marca de tiempo de la primera sesión de carga (es decir, «sensor.wallbox _portal _added _range _min») para obtener una fecha y hora, y luego la formatea en el estilo «día/mes/año hora:minuto:segundo». Esto significa que el valor «carga de sesión» se inicializará con la fecha y hora de la primera sesión de recarga.

– "atributos": Aquí es donde se definen los datos para cada sesión de carga. Cada sesión de carga se define en un formato específico utilizando plantillas Jinja2. Estas sesiones de carga están separadas por comas.

– “objetivo”: Especifica la entidad de destino, es decir, la entidad cuyos atributos se actualizan. En este caso, la entidad objetivo es sensor.wallbox _charges.

– ’permitido: true» (Verdadero): Esto indica que esta acción está habilitada y se puede ejecutar.

La finalidad de esta acción es inicializar el atributo «sessionload» de «sensor.wallbox _charges» con datos simulados de sesiones de carga. Esto puede ser útil para probar o comenzar con datos de carga ficticios. Después de la inicialización, se recomienda desactivar esta acción, como se indica en el alias, ya que no es necesario repetirla.

Explicación de la acción 3 – Acción principal

Esta acción tiene por objeto actualizar el atributo «sessionload» de la entidad «sensor.wallbox _charges» con los datos de la sesión de carga que acaba de finalizar. Aquí hay una explicación detallada de cada elemento de la acción:

– «servicio: variable.update_sensor“: Se trata del servicio utilizado para actualizar o inicializar los atributos de una entidad en Home Assistant.

– "datos": Esta sección contiene los datos que se enviarán con el servicio. En este caso:
– «Sustituir _attributes: true» (Verdadero): Esto indica que los atributos existentes de la entidad sensor.wallbox _charges serán reemplazados por los nuevos datos.

– "valor": Esta parte se utiliza para definir el valor del atributo sessionload de la entidad sensor.wallbox _charges. El valor se genera dinámicamente utilizando los modelos Jinja2. Incluye:
– Conversión de la marca de tiempo «sensor.wallbox_portal_added_range_min» en un formato de fecha y hora específico mediante la función «timestamp_custom».

– "atributos": Aquí es donde se definen los datos de la sesión de carga. Estos datos se calculan a partir de diversas entidades, en particular «sensor.wallbox _portal _added _energy», «sensor.wallbox _portal _energy _price», «sensor.wallbox _portal _added _rangemin», «sensor.wallbox _portal _added _range», y la marca de tiempo actual (obtenida a través de «now()»). Los datos incluirán el consumo, el coste, la duración, el inicio, el final, los kilómetros y la marca de tiempo de la sesión de recarga.

– La duración se calcula restando la marca de tiempo de inicio de la sesión de carga de la marca de tiempo actual (expresada en segundos). Entonces estos segundos se convierten en horas y minutos.

– En la sección «{% si … %}“, el código comprueba si el atributo «sessionload» de la entidad «sensor.wallbox _charges» ya está definido. Si este es el caso, se conservarán los datos existentes. De lo contrario, se agregan nuevos datos de sesión de carga.

– “objetivo”: Especifica la entidad de destino, es decir, la entidad cuyos atributos se actualizan. En este caso, la entidad objetivo es sensor.wallbox _charges.

– ’permitido: true» (Verdadero): Esto indica que esta acción está habilitada y se puede ejecutar.

El objetivo de esta acción es registrar los datos de cada sesión de carga que acaba de terminar en el atributo «sessionload» de la entidad «sensor.wallbox _charges». Esto realiza un seguimiento de cada sesión de carga realizada.

 

Resultado

Así, en cada extremo de la carga, se añade un nuevo registro a la entidad sensor.wallbox _charges.

Su contenido es el siguiente:

 

Se ha añadido un mapa que muestra todas las sesiones de carga

<div>Sesiones de carga</div> 
Última actualización: {{ state_attr('sensor.sessions_de _charge','updated_at')}} <br><br>
{% set items = state_attr('sensor.wallbox _charges', 'sessionscharge') %}
<table width='100%'>
<tbody>
{% para i en rango(0, items | count, 1) %}
<tr>
<td>{{ items[i].start }} a {{ items[i].fin }} ({ items[i].duration }})</td>
<td>{{ items[i].consumo }} kWh</td>
<td>+{{ items[i].km }} km</td>
<td>{{ items[i].cost }} €</td>
</tr>

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

Adición de un mapa que muestra un resumen por año, mes, semana

Tipo: contenido de la reducción: &gt;-
  <div><h1>Sesiones de carga</div>  {%- establecer por defecto _language = 'en' %} Última actualización: {{ 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(valor=0) %} {% set cout_semaine = namespace(valor=0) %} {% set unmois = now() - timedelta(days=30) %} {% set power_months = namespace(valor=0) %} {% set cout_mois = namespace(valor=0) %} {% set uneannee = now() - timedelta(days=365) %} {% set power_annee = namespace(valor=0) %} {% set cout_annee = namespace(valor=0) %} {% para i en rango(0, items | count, 1) %} {% if items[i].saved_at | int &gt;= as_timestamp(uneannee) %} {% set power_annee.value = power_annee.value + items[i].consumo %} {% set cout_annee.value = cout_annee.value + items[i].cost %} {% if items[i].saved_at | int &gt;= as_timestamp(unmonth) %} {% set power_mois.value = power_mois.value + items[i].consumo %} {% set cout_mois.value = cout_mois.value + items[i].cost %} {% if items[i].saved_at | int &gt;= as_timestamp(sevendays) %} {% set power_semaine.value = power_semaine.value + items[i].consumo %} {% set cout_semaine.value = cout_semaine.value + items[i].cost %} {% endif %} {% endif %} {% endif %} {% endfor %}

  </ha-alert> <ha-alert alert-type="info" title="El mes pasado: {{ potencia _mois.value | int }} kWh - {{ coste _mois.value | float | round(2) }} €"></ha-alert> <ha-alert alert-type="info" title="El año pasado: {{ power_annee.value | int }} kWh - {{ cout _annee.value | float | round(2) }} €"></ha-alert>


  <br> 


  {% set items = state_attr('sensor.wallbox _charges', 'sessionscharge') %} {% set septjours = now() - timedelta(days=7) %}

  <table width='100%'> <tbody>  {% para i en rango(0, items | count, 1) %} {% if items[i].saved_at | int &gt;= as_timestamp(sevendays) %} {% _obj = strptime(items[i].start, '%d/%m/%Y %H:%M') %}

  <tr> <td><h5>{{items[i].start }} a {{ items[i].fin }} ({ items[i].duration }})</td> <td>{{ items[i].consumo }} kWh</td> <td>+{{ items[i].km }} km</td> <td>{{ items[i].cost }} €</td> </tr> {% endif %} {% endfor %} </tbody> </table>
    <ha-alert alert-type="success" title="La semana pasada: {{ power_semaine.value | int}} kWh - {{ cost_semaine.value | float | round(2) }}€">    
estilo: .: | ha-card { margen: 0px 0px 0px 0px; Sombra de caja: ninguna; } ha-markdown: $: | h5 { tamaño de fuente: 15px!importante; peso de fuente: normal!importante; relleno: 0px 0px 0px 8px!importante; frontera izquierda: 3px sólido #429f46; }

 

Bonificación: Guardar datos en un archivo CSV

Para uso futuro (y para no perder datos en caso de un fallo), decidí guardar cada sesión de carga sin un archivo CSV. En cada sesión, se agrega una línea.

Así es como me di cuenta de esto.

Añado un sensor «archivo» que corresponde al archivo CSV

Uso un archivo notificar.yaml que se encuentra en la carpeta configuration.yaml que se declara en este archivo por el comando Notificar: !include notify.yaml

Declaro este nuevo sensor con este código:

- nombre: _de_cargar las sesiones de la plataforma _CSV: nombre de archivo: /config/www/csv/sessions_de _charge.csv marca de tiempo: falso

Por lo tanto, cuando me gustaría escribir en el archivo, será suficiente para mí para ejecutar el servicio Notificar.sesiones_de _charge_CSV

Añado una acción

Agrego una acción en la automatización presentada anteriormente que escribirá una línea para cada registro de una sesión de carga

Servicio: _de _charge _CSV data: datos: {} mensaje: >- {% set diff_seconds = now().timestamp() - states.sensor.wallbox _portal _added _range _min.state | como _timestamp %} {% horario establecido = (diff _seconds / 3600) | int %} {% minutos establecidos = ((diff_seconds % 3600) / 60) | int %} {% _string = "" + states('sensor.wallbox _portal _added _energy') | round(2) | replace('., ',') | string +"; " + (states(''sensor.wallbox _portal _energy _price') | float * states(''sensor.wallbox _portal _added _energy') | float | round(2)) | round(2) | replace('.', ',') | string + "; " + ' quinquies:d' | format(hours, minutes) | string + "; « + as_timestamp(states('sensor.wallbox_portal _added_range_min')) | int | timestamp_custom('%d/%m/%Y', true) | string + "; « + as_timestamp(states('sensor.wallbox_portal _added_range_min')) | int | timestamp_custom('%H:%M', true) | string + "; " + now().strftime('%H:%M') | string + "; « + states('sensor.wallbox _portal _added _range') | int | string +»; « + now().timestamp() | int | string» (en inglés). %} {{ sessioncharge _string }} activado: alias verdadero: Añada una línea al archivo de sesiones _de_charge.CSV