{"id":1722,"date":"2022-11-28T22:54:56","date_gmt":"2022-11-28T22:54:56","guid":{"rendered":"https:\/\/www.mainmind.com\/blog\/?p=1722"},"modified":"2022-11-30T09:08:37","modified_gmt":"2022-11-30T09:08:37","slug":"iotawatt-shelly-em3-openevse-en-home-assistant","status":"publish","type":"post","link":"https:\/\/www.mainmind.com\/blog\/iotawatt-shelly-em3-openevse-en-home-assistant\/","title":{"rendered":"IotaWatt + Shelly EM3 + OpenEVSE en Home Assistant"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">De las diferentes formas en las que podemos comunicar con OpenEVSE, en este caso vamos realizarla <a rel=\"noreferrer noopener\" href=\"https:\/\/openevse.stoplight.io\/docs\/openevse-wifi-v4\/eb2631c282f49-release-an-evse-claim\" data-type=\"URL\" data-id=\"https:\/\/openevse.stoplight.io\/docs\/openevse-wifi-v4\/eb2631c282f49-release-an-evse-claim\" target=\"_blank\">mediante la API<\/a> y un \u00fanico identificador (claim) para intentar simplificar. <a rel=\"noreferrer noopener\" href=\"https:\/\/www.mainmind.com\/blog\/instalacion-7-kw-version-europea-openevse-5-5\/\" data-type=\"URL\" data-id=\"https:\/\/www.mainmind.com\/blog\/instalacion-7-kw-version-europea-openevse-5-5\/\" target=\"_blank\">Ya realizamos el montaje del cargador previamente<\/a> y unimos nuestros equipos a la misma red wifi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para la medici\u00f3n de los consumos <a rel=\"noreferrer noopener\" href=\"https:\/\/www.mainmind.com\/blog\/medicion-de-consumo-electrico-iotawatt\/\" data-type=\"URL\" data-id=\"https:\/\/www.mainmind.com\/blog\/medicion-de-consumo-electrico-iotawatt\/\" target=\"_blank\">utilizamos IoTaWatt<\/a> en el cuadro principal y Shelly EM3 en el garaje, aunque realmente nos servir\u00e1 cualquier otro equipo de medici\u00f3n que tengamos integrado en nuestro sistema dom\u00f3tico. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Para establecer y hacer los c\u00e1lculos de consumos en este ejemplo es siempre en Amperios, por lo que tendremos una lectura del consumo general en el sensor: \u00abgeneral_amp\u00bb. Ambos tienen sus respectivas integraciones: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.home-assistant.io\/integrations\/iotawatt\" data-type=\"URL\" data-id=\"https:\/\/www.home-assistant.io\/integrations\/iotawatt\" target=\"_blank\">IoTaWatt<\/a> y <a rel=\"noreferrer noopener\" href=\"https:\/\/www.home-assistant.io\/integrations\/shelly\" data-type=\"URL\" data-id=\"https:\/\/www.home-assistant.io\/integrations\/shelly\" target=\"_blank\">Shelly<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mediante Node-Red detectaremos uno de los 3 modos posibles para seleccionar: \u00abAutom\u00e1tico, manual o apagado\u00bb<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em><strong>Apagado<\/strong><\/em>: enviar\u00e1 al cargador el comando para deshabilitar y los valores de carga y m\u00e1xima carga a cero.<\/li>\n\n\n\n<li><strong><em>Manual<\/em><\/strong>: podremos seleccionar entre 6 y 20A, siendo 6 el m\u00ednimo posible 20 en este caso el m\u00e1ximo que soporta la instalaci\u00f3n, el diferencial es de 20A y se guarda menos de 1A para posibles consumos perif\u00e9ricos, podemos poner a nuestro gusto. Con un m\u00e1ximo de 32A para esta versi\u00f3n del cargador.<\/li>\n\n\n\n<li><strong><em>Autom\u00e1tico<\/em><\/strong>: en funci\u00f3n del consumo de la casa y del garaje iremos modificando la carga del coche de manera autom\u00e1tica, si conectamos el horno, lavadora&#8230; etc restaremos los Amperios a los disponibles.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En Espa\u00f1a actualmente tenemos 3 franjas horarias diferentes P1, P2 y P3 en funci\u00f3n de nuestro contrato podemos tener precios diferentes de la energ\u00eda y potencias diferentes. Si adem\u00e1s tuvieramos producci\u00f3n solar, podr\u00edamos priorizar el autoconsumo y la carga del veh\u00edculo&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para detectar el tramo utilizaremos la <a rel=\"noreferrer noopener\" href=\"https:\/\/www.home-assistant.io\/integrations\/pvpc_hourly_pricing\" data-type=\"URL\" data-id=\"https:\/\/www.home-assistant.io\/integrations\/pvpc_hourly_pricing\" target=\"_blank\">integraci\u00f3n PVPC<\/a> de Home Assistant, para facilitar la visualizaci\u00f3n <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/sensors.yaml\" data-type=\"URL\" data-id=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/sensors.yaml\" target=\"_blank\">podemos crear nuestra propia plantilla de sensores<\/a>, en el ejemplo el precio es con tarifa plana todo el d\u00eda, pero tamb\u00eden podr\u00eda adaptarse para recuperar el precio en tiempo real, por lo que nos centraremos en recuperar el tramo y adaptar la potencia m\u00e1xima disponible en cada caso:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n- platform: template\n  sensors:\n    pvpc_tramo:\n      friendly_name: &quot;Tramo el\u00e9ctrico&quot;\n      icon_template: mdi:timetable\n      value_template: &quot;{{ state_attr(&#039;sensor.pvpc&#039;, &#039;period&#039;) }}&quot;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Con  las integraciones requeridas previas y Node-RED vamos a crear tres Ayudantes, campos donde guardaremos la carga manual de Amperios, el c\u00e1lculo 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)<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"723\" src=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp.jpg\" alt=\"\" class=\"wp-image-1725\" srcset=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp.jpg 517w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp-215x300.jpg 215w\" sizes=\"auto, (max-width: 517px) 100vw, 517px\" \/><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"514\" height=\"726\" src=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp_auto.jpg\" alt=\"\" class=\"wp-image-1727\" srcset=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp_auto.jpg 514w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_carga_coche_amp_auto-212x300.jpg 212w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"680\" src=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_tipo_carga_coche.jpg\" alt=\"\" class=\"wp-image-1726\" srcset=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_tipo_carga_coche.jpg 517w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/ayudante_tipo_carga_coche-228x300.jpg 228w\" sizes=\"auto, (max-width: 517px) 100vw, 517px\" \/><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos crear los ayudantes (helpers) en YAML directamente <a href=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/input_numbers.yaml\" data-type=\"URL\" data-id=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/input_numbers.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">input_numbers.yaml<\/a> + <a href=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/input_select.yaml\" data-type=\"URL\" data-id=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/input_select.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">input_select.yaml<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo esto junto en un mismo panel visual m\u00ednimo:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"471\" height=\"388\" src=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/panel_cargador.jpg\" alt=\"\" class=\"wp-image-1728\" srcset=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/panel_cargador.jpg 471w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/panel_cargador-300x247.jpg 300w\" sizes=\"auto, (max-width: 471px) 100vw, 471px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\ntype: entities\nentities:\n  - entity: binary_sensor.cargador_vehicle_connected\n    name: Conector\n  - entity: input_select.tipo_de_carga_coche\n    icon: mdi:car-select\n  - entity: input_number.carga_coche_amp\n  - entity: sensor.cargador_charging_current\n    name: Carga OpenEVSE\n    icon: mdi:flash-outline\n  - entity: sensor.cargador_current\n    name: Carga EM3\n  - entity: sensor.carga_coche_amp_auto_reader\n  - entity: sensor.cargador_ambient_temperature\n    name: Temperatura\ntitle: Cargador\n<\/pre><\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Para que todo esto funcione y podamos enviar al cargador utilizaremos Node-RED, dependiendo del modo seleccionado unimos en un \u00fanico mensaje las 3 partes necesarias del mensaje: state, charge_current y max_current. El m\u00e1s interesante es el modo autom\u00e1tico, donde en funci\u00f3n del tramo haremos c\u00e1lculos diferentes para la potencia m\u00e1xima contratada, restando el consumo que tengamos de los dos cuadros, cada 5 segundos:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-1024x306.jpg\" alt=\"\" class=\"wp-image-1731\" srcset=\"https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-1024x306.jpg 1024w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-300x90.jpg 300w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-768x229.jpg 768w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-1536x459.jpg 1536w, https:\/\/www.mainmind.com\/blog\/wp-content\/uploads\/2022\/HomeAssistant\/panel_garaje\/nore-red_flow_EVSE-2048x612.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Para el c\u00e1lculo en P3 (Valle) por ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\n\/\/ P3: valle\n\n\/\/ acometida = (maxCurrent - acometida) * -1\n\/\/ amps = (kW \u00d7 1,000) \u00f7 volts\n\/\/ amps = (3500 \/ 230) - sensor.general_amp\n\nvar states = global.get(&#039;homeassistant.homeAssistant.states&#039;);\nvar general_amp = parseFloat(states&#x5B;&quot;sensor.general_amp&quot;].state);\nvar garaje_enchufes = parseFloat(states&#x5B;&quot;sensor.enchufes_current&quot;].state);\nvar garaje_puerta = parseFloat(states&#x5B;&quot;sensor.puerta_current&quot;].state);\n\n\/\/ Si realizamos la lectura en W o kW convertimos a Amperios\n\/\/var general_amp = parseFloat(states&#x5B;&quot;sensor.general&quot;].state) \/ 230;\n\n\/\/ 5750w \/ 230v ~ 25 amp\n\/\/ se pone a 20 por el diferencial de 20 Amperios del garaje limitante\nvar general_max = Number(25) - parseFloat(general_amp)\nvar garaje_max = Number(20) - parseFloat(garaje_enchufes) - parseFloat(garaje_puerta)\n\n\/\/ Los m\u00e1ximos amperios contratatados para P3 (Valle) = 5.75 KW\n\/\/ restando el consumo general en casa - 0.5 amperio de margen\n\/\/ redondeando\n\n\/\/ M\u00ednimo com\u00fan multiplo de los dos\n\/\/ valor m\u00ednimo\nvar tmp;\n\nif (general_max &lt; garaje_max)\n  tmp = general_max - 0.5;\nelse\n  tmp = garaje_max - 0.5;\n\n\/\/ Comprobar que no es negativo\nif (tmp &gt; 0)\n    msg.payload = tmp;\nelse\n    msg.payload = 0;\n\nreturn msg;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">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\u00f1adimos un filtro anterior a la API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para simplificar se utiliza un claim con el mismo nombre y el resultado en JSON del mensaje creado:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\ndata : msg :\nobject\nmethod: &quot;post&quot;\npath: &quot;http:\/\/openEVSE_IP\/claims\/1983&quot;\ndata: &quot;{&quot;state&quot;:&quot;active&quot;,&quot;charge_current&quot;:&quot;12.0&quot;,&quot;max_current&quot;:&quot;12.0&quot;}&quot;\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Para revisar los mensajes podemos acceder mendiante la direcci\u00f3n de nuestro cargador a:<br>http:\/\/openEVSE_IP\/claims<br>http:\/\/openEVSE_IP\/status<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/node-red_flow_evse.json\" data-type=\"URL\" data-id=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/node-red_flow_evse.json\" target=\"_blank\">decargar el flow completo de Node_RED desde aqu\u00ed<\/a>, queda margen de mejora \u00bfque cambiar\u00edas?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizado: como opci\u00f3n para integrar facilmente con Alexa o ok Google, generamos un<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/switch_tipo_de_carga_coche.yaml\" data-type=\"URL\" data-id=\"https:\/\/github.com\/mainmind83\/HA-varios\/blob\/main\/switch_tipo_de_carga_coche.yaml\" target=\"_blank\"> interruptor virtual que cambie entre \u00abAuto\u00bb y \u00abApagado\u00bb<\/a> de tal modo que podamos \u00abAlexa, enciende el cargador del coche\u00bb<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>De las diferentes formas en las que podemos comunicar con OpenEVSE, en este caso vamos realizarla mediante la API y un \u00fanico identificador (claim) para intentar simplificar. Ya realizamos el montaje del cargador previamente y unimos nuestros equipos a la misma red wifi. Para la medici\u00f3n de los consumos utilizamos IoTaWatt en el cuadro principal [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1733,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[864],"tags":[866,897,909,887,908],"class_list":["post-1722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-domotica","tag-home-assistant","tag-iotawatt","tag-node-red","tag-openevse","tag-shelly-em3"],"_links":{"self":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/1722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/comments?post=1722"}],"version-history":[{"count":0,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/posts\/1722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media\/1733"}],"wp:attachment":[{"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/media?parent=1722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/categories?post=1722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mainmind.com\/blog\/wp-json\/wp\/v2\/tags?post=1722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}