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)…