# ECOFORESP - IOTizar uma caldeira a pellets ECOFOREST

**URL:** <https://forum.cpha.pt/t/ecoforesp-iotizar-uma-caldeira-a-pellets-ecoforest/7169>\
**Category:** Concurso 1/2021\
**Created:** [9 Março , 2021 16:34 UTC](https://forum.cpha.pt/t/ecoforesp-iotizar-uma-caldeira-a-pellets-ecoforest/7169 "2021-03-09T16:34:31Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Peixeiro](https://forum.cpha.pt/user_avatar/forum.cpha.pt/peixeiro/32/2694_2.png) [@Peixeiro](https://forum.cpha.pt/u/Peixeiro)\
**Post date:** [9 Março , 2021 16:34 UTC](https://forum.cpha.pt/t/ecoforesp-iotizar-uma-caldeira-a-pellets-ecoforest/7169/1 "2021-03-09T16:34:33Z")

</div>

## Tema

IOTizar e automatizar o aquecimento central e AQS

## Resumo

Tenho uma caldeira a pellets da Ecoforest ainda com uma CPU sem wifi e a necessidade de a controlar à distância levou-me a tentar integra-la no Home Assistant.

## Descrição

A Ecoforest nunca divulgou informação técnica sobre as suas CPUs que permitisse desenvolver algum controlador externo, no entanto tive a sorte de encontrar uma empresa de domótica espanhola em que o dono ao passar pela mesma necessidade que eu, foi explorar o hardware da CPU e display da caldeira e conseguiu algumas coisas. A CPU dele era uma versão mais antiga que a minha, se fosse igual vendiam-me um shield para o RPI para interligar à CPU da caldeira já “chave na mão”, no entanto partilhou comigo os pins do flat cable do display (igual ao meu) que correspondem aos botões físicos no mesmo e que com um RPI e opto-acopladores conseguia simular o clique nos botões. Com esta base fui tentar desenvolver algo que me permitisse integrar no Home Assistat…

Para “cérebro” optei por um EPS32 e para o firmware o EspHome, por ser fácil de programar e permitir de forma simples criar custom\_components para o caso de ser necessário.  
Usei 4 opto-acopladores para simular o clique nos botões do display: Power, Menu, Next e Prev  
Usei 1 optp-acoplador para colocar a caldeira em modelação (potência mínima), onde se liga normalmente um Crono-Termostato, esta caldeira permite configurar dois modos de crono-termostato: ligar e desligar a caldeira ou passar para o mínimo ao atingir a temperatura pretendida (o modo que eu usei).  
Para saber se a caldeira está ou não ligada, com o material que tinha à mão fiz um sensor óptico não evasivo! Uma simples lâmpada Néon retirada de um interruptor velho, metida dentro de um tubo preto com um LDR ligado ao ESP a verificar se há ou não luz. O néon liguei os contactos 220v da bomba de água, se esta estiver a funcionar o néon é iluminado e o ESP vai indicá-lo ao HomeAssistant!!!

Esta CPU, tem uma porta RS232, onde ter os contactos para o crono-termostato ou sonda de temperatura ambiente e tem também um TX e um RX, que seriam usados para um módulo externo GPRS, nos menus tem inclusive uns que permitem enviar e ver SMSs da assistência técnica. Pouco depois de a marca lançar estas CPUs desenvolveu uma WIFI, que tenta impigir, dizendo que não tem módulos de comunicação para a minha e que tal não é possível.  
Por forma a tentar ver o que a placa transmite via TX da RS232, usei um inverter CD74HC4049E, invertendo o sinal duas vezes, desta forma usando a capacidade de protecção deste componente. Infelizmente não sei a velocidade da porta, paridade, stop-bit, … pelo que de vez em quando vou experimentando e fazendo LOG dos caracteres lidos, na experança de ver alguma informação útil, mas a comunicação série é algo que não domino e nem sei bem por onde ir. Sei que as informações estão lá, mas não sei como chegar até elas…

Outra hipótese que coloquei, seria tentar “interceptar” a informação que vai para o display. A ligação entre este e a CPU é uma ficha IDC de 16 pins, mas destes só tenho identificados 7 pinos: +5V, GND e 5 pinos dos botões (4 + 1 comum). Já tentei desmontar o display, mas a placa está encaixada e tenho algum receio de partir aquilo. Talvez um dia. Em último caso, mete uma ESP32 Cam virada para o display e já está.

Ainda por adicionar está um sensor VL53L0X para ver o nível de pellets no depósito (tal como aqui foi partilhado no fórum) e dois DS18B20 a indicar a temperatura da água na saída e retorno da caldeira.

**Fotos**

 ![EcoESP2_bb](https://forum.cpha.pt/uploads/default/original/2X/d/dd67d3d6ba3ef91ce304aef58f2d77f473834115.jpeg)

 ![EcoforESP 1](https://forum.cpha.pt/uploads/default/original/2X/4/44cefe02f080759029555f6716850340fb8ff44c.jpeg)

 ![EcoforESP 2](https://forum.cpha.pt/uploads/default/original/2X/6/6160b19cede65d775f3272a698a5f2d93795c3eb.jpeg)

 ![EcoforESP 3](https://forum.cpha.pt/uploads/default/original/2X/a/a60a3c158371e90a80c1d2e4abd394d1dfb3e65c.jpeg)

 ![EcoforESP 4](https://forum.cpha.pt/uploads/default/original/2X/7/79654c2c19cddfa6565c96d47ea924eba0ee02f8.jpeg)

**Código EspHome**

ecoforesp.yaml

```auto
esphome:
  name: ecoforesp
  platform: ESP32
  board: mhetesp32devkit
# includes:
# - ecoforesp_custom_uart.h

wifi:
  ssid: "NetLenta"
  password: " *****"

  power_save_mode: NONE
  manual_ip:
    static_ip: 192.168.1.112
    gateway: 192.168.1.254
    subnet: 255.255.255.0
    dns1: 8.8.8.8
    dns2: 8.8.4.4

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ecoforesp Fallback Hotspot"
    password: " *****"

captive_portal:

# Enable logging
logger:
  level: VERBOSE 
  baud_rate: 0 #disable logging over uart
  hardware_uart: UART0

  
web_server:
  port: 80

# Enable Home Assistant API
api:
  password: " *****"

ota:
  password: " *****"

uart:
  id: uart_bus
# tx_pin: GPIO23
  rx_pin: GPIO25
  baud_rate: 9600

time:
  - platform: homeassistant
    id: homeassistant_time
    
sensor:
  - platform: uptime
    name: "EcoforESP Uptime"
    update_interval: 60s
  - platform: wifi_signal
    name: "EcoforESP WiFi Signal"
    update_interval: 60s

  - platform: adc
    id: extrator_sensor
    pin: GPIO33
    update_interval: 10s

binary_sensor:
  - platform: template
    name: "Bomba Caldeira"
    device_class: power
    lambda: |-
      if (id(extrator_sensor).state > 0.1) {
        id(caldeira_switch).publish_state(true);
        return true;
      } else {
        id(caldeira_switch).publish_state(false);
        return false;
      }

#text_sensor:
#- platform: custom
# lambda: |-
# auto my_custom_sensor = new UartReadLineSensor(id(uart_bus));
# App.register_component(my_custom_sensor);
# return {my_custom_sensor};
# text_sensors:
# id: "uart_readline"
# name: "EcoforESP Screen"

switch:
  - platform: gpio
    pin: GPIO18
    id: opto_menu
    restore_mode: ALWAYS_OFF    
  - platform: template
    name: "Menu"
    icon: "mdi:menu"
    turn_on_action:
    - switch.turn_on: opto_menu
    - delay: 500ms
    - switch.turn_off: opto_menu

  - platform: gpio
    pin: GPIO21
    id: opto_power
    restore_mode: ALWAYS_OFF    
  - platform: template
    name: "Power"
    icon: "mdi:power"
    turn_on_action:
    - switch.turn_on: opto_power
    - delay: 500ms
    - switch.turn_off: opto_power

  - platform: gpio
    pin: GPIO19
    id: opto_prev
    restore_mode: ALWAYS_OFF    
  - platform: template
    name: "Prev"
    icon: "mdi:skip-previous"
    turn_on_action:
    - switch.turn_on: opto_prev
    - delay: 500ms
    - switch.turn_off: opto_prev

  - platform: gpio
    pin: GPIO5
    id: opto_next
    restore_mode: ALWAYS_OFF    
  - platform: template
    name: "Next"
    icon: "mdi:skip-next"
    turn_on_action:
    - switch.turn_on: opto_next
    - delay: 500ms
    - switch.turn_off: opto_next

  - platform: gpio
    pin: GPIO17
    id: opto_fullpower
    name: "Potencia Máxima"
    icon: "mdi:fire"
    restore_mode: RESTORE_DEFAULT_ON

  - platform: template
    name: "Caldeira"
    id: caldeira_switch
    icon: "mdi:power"
    turn_on_action:
    - switch.turn_on: opto_power
    - delay: 500ms
    - switch.turn_off: opto_power
    turn_off_action:
    - switch.turn_on: opto_power
    - delay: 500ms
    - switch.turn_off: opto_power

```

ecoforesp\_custom\_uart.h (alguns testes para tentar ver o que a caldeira envia por RS232)

```auto
#include "esphome.h"

class UartReadLineSensor : public Component, public UARTDevice, public TextSensor {
 public:
  UartReadLineSensor(UARTComponent *parent) : UARTDevice(parent) {}
  
	void setup() override {
		// This will be called by App.setup())
		ESP_LOGD("EcoforESP", "EcoforESP UART Reader!");
	}

  int readline(int readch, char *buffer, int len) {
    static int pos = 0;
    int rpos;
		ESP_LOGD("EcoforESP", "Char Readed i: %i", readch); 

    if (readch > 0) {

      switch (readch) {
        case '\n': // Ignore new-lines
          break;
        case '\r': // Return on CR
          rpos = pos;
          pos = 0; // Reset position index ready for next time
          return rpos;
        default:
          if (pos < len-1) {
            buffer[pos++] = readch;
            buffer[pos] = 0;
          }
      }
    }
    // No end of line has been found, so return -1.
    return -1;
  }

  void loop() override {
    const int max_line_length = 80;
    static char buffer[max_line_length];
    if (available() && readline(read(), buffer, max_line_length) > 0) {
      publish_state(buffer);
    }
  }
};

```

**Configuração**

 ![Screenshot_2021-03-05 Visão Geral - Home Assistant(1)](https://forum.cpha.pt/uploads/default/original/2X/a/a7641bcbc7e4ea34d318a2ff924c170268f39e36.png)  
No HomeAssistant tenho esta placa associada a um Sonoff Dual (com firmware Tasmota) o qual controla duas electro-válvulas: uma do circuito de água que vai para o cilindro de AQS e outra para o circuito de aquecimento do rés-do-chão. Como inputs deste Sonoff tenho dois DS18B20 (um no cilindro de AQS para ver a temperatura da água no cilindro e outro no colector que sai da caldeira para ver a temperatura da água do aquecimento central) e tenho lá ligado o Termostato Imersão Regulável do cilicndro de AQS.

Tenho configurados dois generic\_thermostat, um para cada andar da casa, em que o do R/C abre e fecha via Sonoff uma válvula desligando o circuito todo deste andar, com base na temperatura de um sensor Xiaomi BLE LYWSDCGQ e no 1º andar, passa a caldeira para o mínimo através do contacto da EcoforESP, com base na temperatura média de 3 sensores (um Xiaomi Zigbee WSDCGQ01LM, 1 AHT10 e um BMP280, estando estes ligados cada um a Wemos D1 Mini com EspHome)  
O ligar e desligar da caldeira tenho calendarizado com recurso ao Custom Component scheduler-component que podemos encontrar no HACS.  
Em relação às Áquas Quentes Sanitárias, o controlo de temperatura faço-o com o referido termostato de imersão, tendo somente duas automações para fechar ou abrir o circuito consoante a caldeira está ligada.

## Lista de Material

1 - ESP32 Devkit MH-ET Live - [https://www.aliexpress.com/item/4000587285293.html](https://www.aliexpress.com/item/4000587285293.html)  
1 - Placa de circuito perfurada 80x120 - [https://www.aliexpress.com/item/1847776040.html](https://www.aliexpress.com/item/1847776040.html)  
5 - Opto-acopladores 4N35 - [https://mauser.pt/catalog/product\_info.php?cPath=324\_244&products\_id=001-0941](https://mauser.pt/catalog/product_info.php?cPath=324_244&products_id=001-0941)  
5 - Suportes IC 6 pins - [https://mauser.pt/catalog/product\_info.php?cPath=324\_393\_1149&products\_id=012-0001](https://mauser.pt/catalog/product_info.php?cPath=324_393_1149&products_id=012-0001)  
5 - Resistências 200 OHM - [https://mauser.pt/catalog/product\_info.php?cPath=324\_526\_530&products\_id=104-7660](https://mauser.pt/catalog/product_info.php?cPath=324_526_530&products_id=104-7660)  
1 - Foto-resistência LDR - [https://mauser.pt/catalog/product\_info.php?cPath=324\_1127&products\_id=005-0035](https://mauser.pt/catalog/product_info.php?cPath=324_1127&products_id=005-0035)  
1 - Resistência 10KOHM - [https://mauser.pt/catalog/product\_info.php?cPath=324\_526\_530&products\_id=104-6020](https://mauser.pt/catalog/product_info.php?cPath=324_526_530&products_id=104-6020)  
1 - Ficha DB9 macho - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_156&products\_id=011-0055](https://mauser.pt/catalog/product_info.php?cPath=1874_640_156&products_id=011-0055)  
1 - Capa para ficha DB9 - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_156&products\_id=093-0001](https://mauser.pt/catalog/product_info.php?cPath=1874_640_156&products_id=093-0001)  
1 - Ficha IDC 16 para soldar - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_1223&products\_id=011-0630](https://mauser.pt/catalog/product_info.php?cPath=1874_640_1223&products_id=011-0630)  
1 - Ficha IDC 16 Macho - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_1223&products\_id=011-1051](https://mauser.pt/catalog/product_info.php?cPath=1874_640_1223&products_id=011-1051)  
2 - Ficha IDC 16 Femea - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_1223&products\_id=011-0604](https://mauser.pt/catalog/product_info.php?cPath=1874_640_1223&products_id=011-0604)  
1 - Flat cable 16 vias - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_56\_2732\_1250&products\_id=016-0164](https://mauser.pt/catalog/product_info.php?cPath=1874_56_2732_1250&products_id=016-0164)  
2 - Barras de 20 pinos fêmea - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_2570\_792&products\_id=012-0086](https://mauser.pt/catalog/product_info.php?cPath=1874_640_2570_792&products_id=012-0086)  
1 - Barra de 20 pinos macho - [https://mauser.pt/catalog/product\_info.php?cPath=1874\_640\_2570\_792&products\_id=012-0065](https://mauser.pt/catalog/product_info.php?cPath=1874_640_2570_792&products_id=012-0065)  
1 - Inverter CD74HC4049E - [https://mauser.pt/catalog/product\_info.php?cPath=324\_244&products\_id=001-2150](https://mauser.pt/catalog/product_info.php?cPath=324_244&products_id=001-2150)  
1 - Suporte IC 16 Pins - [https://mauser.pt/catalog/product\_info.php?cPath=324\_393\_1149&products\_id=012-0004](https://mauser.pt/catalog/product_info.php?cPath=324_393_1149&products_id=012-0004)

Algum deste material já tinha em stock, tais como resistências, 4 opto-acopladores, flat cable usei um de computador, LDR tinha por cá um que nem sei qual a sua resistência (mas também é só para ver se há ou não luz)…
