Integrare un regolatore Victron SmartSolar con un ESP32 permette di ottenere un monitoraggio locale, immediato e completamente personalizzabile dei parametri principali del proprio impianto fotovoltaico. Questo documento descrive un sistema compatto che legge via BLE i dati del Victron, li elabora con ESPHome e li visualizza su un display OLED SSD1306.
Perché usare un ESP32 con ESPHome
L’ESP32 è un microcontrollore economico, potente e dotato di Bluetooth Low Energy. ESPHome semplifica la configurazione e consente di:
- Leggere i dati via BLE dal regolatore Victron.
- Inviarli a Home Assistant.
- Visualizzarli su un display locale.
- Creare logiche personalizzate.
- Aggiornare il firmware OTA.
Il display SSD1306
Il display OLED SSD1306 (128×64 pixel) è ideale per visualizzare informazioni essenziali:
- Consumo ridotto.
- Ottima leggibilità.
- Collegamento semplice tramite I2C.
- Supporto nativo in ESPHome.
Nel progetto vengono visualizzati ciclicamente:
- PV Power (W)
- Battery Voltage (V)
- Battery Current (A)
- Stato MPPT
Collegamenti hardware
SSD1306 → ESP32
SDA → GPIO 21
SCL → GPIO 22
VCC → 3.3V o 5V (in base al modulo)
GND → GND
Codice completo ESPHome
esphome:
name: esphome-web-660f74
friendly_name: Victron 35
min_version: 2025.11.0
name_add_mac_suffix: false
esp32:
variant: esp32
framework:
type: esp-idf
logger:
level: INFO
api:
ota:
- platform: esphome
wifi:
networks:
- ssid: xxx
password: xxxx
esp32_ble_tracker:
external_components:
- source: github://Fabian-Schmidt/esphome-victron_ble
victron_ble:
- id: MySmartSolar
mac_address: "de630e81b151"
bindkey: "9d9701c7ec7acd40e063725bc6ce5591"
sensor:
- platform: victron_ble
victron_ble_id: MySmartSolar
name: "PV Power"
id: pv_power
type: PV_POWER
- platform: victron_ble
victron_ble_id: MySmartSolar
name: "Battery Voltage"
id: battery_voltage
type: BATTERY_VOLTAGE
- platform: victron_ble
victron_ble_id: MySmartSolar
name: "Battery Current"
id: battery_current
type: BATTERY_CURRENT
- platform: internal_temperature
name: "Temperatura interna"
id: internal_temp
update_interval: 60s
text_sensor:
- platform: victron_ble
victron_ble_id: MySmartSolar
name: "MPPT state"
id: mppt_state
type: DEVICE_STATE
- platform: wifi_info
ip_address:
name: "ESP32 IP Address"
ssid:
name: "ESP32 WiFi SSID"
- platform: version
name: "Firmware ESPHome"
i2c:
sda: 21
scl: 22
scan: true
font:
- file: "gfonts://Roboto"
id: my_font
size: 17
globals:
- id: lcd_page
type: int
restore_value: no
initial_value: '0'
interval:
- interval: 5s
then:
- lambda: |-
id(lcd_page)++;
if (id(lcd_page) > 3) id(lcd_page) = 0;
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
address: 0x3C
lambda: |-
int page = id(lcd_page);
if (page == 0) {
it.printf(0, 0, id(my_font), "PV Power:");
it.printf(0, 20, id(my_font), "%.1f W", id(pv_power).state);
}
if (page == 1) {
it.printf(0, 0, id(my_font), "Batt Volt:");
it.printf(0, 20, id(my_font), "%.2f V", id(battery_voltage).state);
}
if (page == 2) {
it.printf(0, 0, id(my_font), "Batt Curr:");
it.printf(0, 20, id(my_font), "%.2f A", id(battery_current).state);
}
if (page == 3) {
it.printf(0, 0, id(my_font), "MPPT State:");
it.printf(0, 20, id(my_font), "%s", id(mppt_state).state.c_str());
}

Risultato finale
Il display mostra ciclicamente:
- Potenza PV
- Tensione batteria
- Corrente batteria
- Stato MPPT
Il sistema è autonomo, affidabile e perfetto per monitorare un impianto solare senza aprire Home Assistant.
Spiegazione didattica del funzionamento del codice (ID sensori, globals, interval, display)
1. Perché prima servono gli ID dei sensori
Prima di poter usare un sensore nel display o in una lambda, ESPHome deve sapere come si chiama quel sensore. Questo nome è l’id:.
Senza ID, il display non può leggere il valore del sensore e il codice non compila.
Esempio corretto:
id: battery_voltage
Questo permette al display di usare:
id(battery_voltage).state
Gli ID sono quindi etichette obbligatorie che collegano i sensori al codice del display.
—
2. La variabile globale `lcd_page`
globals:
- id: lcd_page
type: int
restore_value: no
initial_value: '0'
Questa variabile è un contatore che indica quale pagina del display deve essere mostrata.
- `type int → è un numero intero
- `initialvalue: ‘0’ → parte dalla pagina 0
- `restorevalue: no → al riavvio riparte da 0
È il “segnalibro” del display.
—
3. Il timer `interval` che cambia pagina ogni 5 secondi
interval:
- interval: 5s
then:
- lambda: |-
id(lcd_page)++;
if (id(lcd_page) > 3) id(lcd_page) = 0;
Ogni 5 secondi:
- aumenta `cd_page di 1
- se supera 3, torna a 0
È un ciclo continuo:
0 → 1 → 2 → 3 → 0 → …
Questo permette al display di cambiare pagina automaticamente senza pulsanti.
—
4. La sezione `display` che disegna la pagina corretta
int page = id(lcd_page);
l display legge quale pagina deve mostrare.
Ogni blocco if (page == X) rappresenta una pagina:
- 0 → PV Power
- 1 → Battery Voltage
- 2 → Battery Current
- 3 → MPPT State
Esempio:
if (page == 0) {
it.printf(0, 0, id(my_font), "PV Power:");
it.printf(0, 20, id(my_font), "%.1f W", id(pv_power).state);
}
Il display mostra solo la pagina corrispondente al valore di lcd_page.
📌 Riassunto didattico
- Prima si definiscono gli ID dei sensori, altrimenti il display non può leggerli.
- `cd_page è la variabile che tiene memoria della pagina corrente.
- interval cambia pagina ogni 5 secondi.
- `isplay legge `cd_page e mostra la pagina giusta.
È un sistema semplice, elegante e molto flessibile.