ECOFORESP - IOTizar uma caldeira a pellets ECOFOREST

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

Código EspHome

ecoforesp.yaml

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)

#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


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 - WAVGAT ESP32 Development Board WiFi+Bluetooth Ultra Low Power Consumption Dual Core ESP 32 ESP 32S ESP 32 Similar ESP8266|Integrated Circuits| - AliExpress
1 - Placa de circuito perfurada 80x120 - 1PC 8X12cm Double Side Copper Prototype DIY Universal Printed Circuit PCB Board Protoboard for Arduino|double side copper prototype|copper prototypepcb board - AliExpress
5 - Opto-acopladores 4N35 - 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
5 - Resistências 200 OHM - 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
1 - Resistência 10KOHM - 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
1 - Capa para ficha DB9 - 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
1 - Ficha IDC 16 Macho - 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
1 - Flat cable 16 vias - 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
1 - Barra de 20 pinos macho - 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
1 - Suporte IC 16 Pins - 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)…


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade