IotaWatt + Shelly EM3 + OpenEVSE en Home Assistant

De las diferentes formas en las que podemos comunicar con OpenEVSE, en este caso vamos realizarla mediante la API y un único identificador (claim) para intentar simplificar. Ya realizamos el montaje del cargador previamente y unimos nuestros equipos a la misma red wifi.

Para la medición de los consumos utilizamos IoTaWatt en el cuadro principal y Shelly EM3 en el garaje, aunque realmente nos servirá cualquier otro equipo de medición que tengamos integrado en nuestro sistema domótico.

Para establecer y hacer los cálculos de consumos en este ejemplo es siempre en Amperios, por lo que tendremos una lectura del consumo general en el sensor: «general_amp». Ambos tienen sus respectivas integraciones: IoTaWatt y Shelly

Mediante Node-Red detectaremos uno de los 3 modos posibles para seleccionar: «Automático, manual o apagado»

  • Apagado: enviará al cargador el comando para deshabilitar y los valores de carga y máxima carga a cero.
  • Manual: podremos seleccionar entre 6 y 20A, siendo 6 el mínimo posible 20 en este caso el máximo que soporta la instalación, el diferencial es de 20A y se guarda menos de 1A para posibles consumos periféricos, podemos poner a nuestro gusto. Con un máximo de 32A para esta versión del cargador.
  • Automático: en función del consumo de la casa y del garaje iremos modificando la carga del coche de manera automática, si conectamos el horno, lavadora… etc restaremos los Amperios a los disponibles.

En España actualmente tenemos 3 franjas horarias diferentes P1, P2 y P3 en función de nuestro contrato podemos tener precios diferentes de la energía y potencias diferentes. Si además tuvieramos producción solar, podríamos priorizar el autoconsumo y la carga del vehículo…

Para detectar el tramo utilizaremos la integración PVPC de Home Assistant, para facilitar la visualización podemos crear nuestra propia plantilla de sensores, en el ejemplo el precio es con tarifa plana todo el día, pero tambíen podría adaptarse para recuperar el precio en tiempo real, por lo que nos centraremos en recuperar el tramo y adaptar la potencia máxima disponible en cada caso:

- platform: template
  sensors:
    pvpc_tramo:
      friendly_name: "Tramo eléctrico"
      icon_template: mdi:timetable
      value_template: "{{ state_attr('sensor.pvpc', 'period') }}"

Con las integraciones requeridas previas y Node-RED vamos a crear tres Ayudantes, campos donde guardaremos la carga manual de Amperios, el cálculo de los Amperios disponibles y el tipo de carga (input_number.carga_coche_amp, input_number.carga_coche_amp_auto y input_select_tipo_de_carga_coche)

Podemos crear los ayudantes (helpers) en YAML directamente input_numbers.yaml + input_select.yaml

Todo esto junto en un mismo panel visual mínimo:

type: entities
entities:
  - entity: binary_sensor.cargador_vehicle_connected
    name: Conector
  - entity: input_select.tipo_de_carga_coche
    icon: mdi:car-select
  - entity: input_number.carga_coche_amp
  - entity: sensor.cargador_charging_current
    name: Carga OpenEVSE
    icon: mdi:flash-outline
  - entity: sensor.cargador_current
    name: Carga EM3
  - entity: sensor.carga_coche_amp_auto_reader
  - entity: sensor.cargador_ambient_temperature
    name: Temperatura
title: Cargador

Para que todo esto funcione y podamos enviar al cargador utilizaremos Node-RED, dependiendo del modo seleccionado unimos en un único mensaje las 3 partes necesarias del mensaje: state, charge_current y max_current. El más interesante es el modo automático, donde en función del tramo haremos cálculos diferentes para la potencia máxima contratada, restando el consumo que tengamos de los dos cuadros, cada 5 segundos:

Para el cálculo en P3 (Valle) por ejemplo:

// P3: valle

// acometida = (maxCurrent - acometida) * -1
// amps = (kW × 1,000) ÷ volts
// amps = (3500 / 230) - sensor.general_amp

var states = global.get('homeassistant.homeAssistant.states');
var general_amp = parseFloat(states["sensor.general_amp"].state);
var garaje_enchufes = parseFloat(states["sensor.enchufes_current"].state);
var garaje_puerta = parseFloat(states["sensor.puerta_current"].state);

// Si realizamos la lectura en W o kW convertimos a Amperios
//var general_amp = parseFloat(states["sensor.general"].state) / 230;

// 5750w / 230v ~ 25 amp
// se pone a 20 por el diferencial de 20 Amperios del garaje limitante
var general_max = Number(25) - parseFloat(general_amp)
var garaje_max = Number(20) - parseFloat(garaje_enchufes) - parseFloat(garaje_puerta)

// Los máximos amperios contratatados para P3 (Valle) = 5.75 KW
// restando el consumo general en casa - 0.5 amperio de margen
// redondeando

// Mínimo común multiplo de los dos
// valor mínimo
var tmp;

if (general_max < garaje_max)
  tmp = general_max - 0.5;
else
  tmp = garaje_max - 0.5;

// Comprobar que no es negativo
if (tmp > 0)
    msg.payload = tmp;
else
    msg.payload = 0;

return msg;

El valor resultante lo guardamos en el Ayudante/campo [input_number.carga_coche_amp_auto] y lo enviamos API. Para evitar estar enviando al cargador continuamente los mismos valores añadimos un filtro anterior a la API.

Para simplificar se utiliza un claim con el mismo nombre y el resultado en JSON del mensaje creado:

data : msg :
object
method: "post"
path: "http://openEVSE_IP/claims/1983"
data: "{"state":"active","charge_current":"12.0","max_current":"12.0"}"

Para revisar los mensajes podemos acceder mendiante la dirección de nuestro cargador a:
http://openEVSE_IP/claims
http://openEVSE_IP/status

Puedes decargar el flow completo de Node_RED desde aquí, queda margen de mejora ¿que cambiarías?

Actualizado: como opción para integrar facilmente con Alexa o ok Google, generamos un interruptor virtual que cambie entre «Auto» y «Apagado» de tal modo que podamos «Alexa, enciende el cargador del coche»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.