Ok so in my enthousiasm I got the charger to react but for the wrong reasons: It got valid data but wrong data so it stopped charging and waiting. it asks voltage, ampere and wattage (total and per phase), see modbuspoll attached. Will test it later on my charger
substitutions:
device_name: "esphome-web-8aebbc"
esphome:
name: ${device_name}
friendly_name: "ESPHome Load Balancer"
on_boot:
priority: -10
then:
- lambda: |-
union { float f; uint16_t w[2]; } v, a, p, pt;
v.f = 231.8f; a.f = 2.8f;
p.f = v.f * a.f; // ~650W per fase
pt.f = p.f * 3.0f; // ~1950W totaal
// STAP 1: Alles op -1 (FFFF)
for (int i = 20480; i <= 20519; i++) {
id(mb_server).write_holding_register(i, 0xFFFF);
}
// STAP 2: Schrijf data (Big Endian ABCD)
// Voltages (20482, 20484, 20486)
for (int i = 0; i < 3; i++) {
id(mb_server).write_holding_register(20482 + (i*2), v.w[1]);
id(mb_server).write_holding_register(20483 + (i*2), v.w[0]);
}
// Amperes (20492, 20494, 20496)
for (int i = 0; i < 3; i++) {
id(mb_server).write_holding_register(20492 + (i*2), a.w[1]);
id(mb_server).write_holding_register(20493 + (i*2), a.w[0]);
}
// NIEUWE MAPPING: Vermogen per fase (20498, 20500, 20502)
id(mb_server).write_holding_register(20498, p.w[1]); id(mb_server).write_holding_register(20499, p.w[0]);
id(mb_server).write_holding_register(20500, p.w[1]); id(mb_server).write_holding_register(20501, p.w[0]);
id(mb_server).write_holding_register(20502, p.w[1]); id(mb_server).write_holding_register(20503, p.w[0]);
// Totaal Vermogen (20504)
id(mb_server).write_holding_register(20504, pt.w[1]); id(mb_server).write_holding_register(20505, pt.w[0]);
esp32:
board: esp32dev
framework: {type: arduino}
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.0.148
gateway: 192.168.0.1
subnet: 255.255.255.0
logger:
level: VERY_VERBOSE
baud_rate: 0
uart:
- id: intmodbus
tx_pin: 18
rx_pin: 19
baud_rate: 9600
stop_bits: 1
data_bits: 8
parity: EVEN
rx_buffer_size: 1024
external_components:
- source: github://thomase1234/esphome-fake-xemex-csmb@master
components: [ modbus_server ]
modbus_server:
- id: mb_server
uart_id: intmodbus
address: 1
holding_registers: [{start_address: 20480, number: 60}]
# Script om alle vermogensregisters in één keer te updaten (P1, P2, P3 en Totaal)
script:
- id: update_all_power
then:
- lambda: |-
union { float f; uint16_t w[2]; } p1, p2, p3, pt;
p1.f = id(v_l1).state * id(a_l1).state;
p2.f = id(v_l2).state * id(a_l2).state;
p3.f = id(v_l3).state * id(a_l3).state;
pt.f = p1.f + p2.f + p3.f;
id(mb_server).write_holding_register(20498, p1.w[1]); id(mb_server).write_holding_register(20499, p1.w[0]);
id(mb_server).write_holding_register(20500, p2.w[1]); id(mb_server).write_holding_register(20501, p2.w[0]);
id(mb_server).write_holding_register(20502, p3.w[1]); id(mb_server).write_holding_register(20503, p3.w[0]);
id(mb_server).write_holding_register(20504, pt.w[1]); id(mb_server).write_holding_register(20505, pt.w[0]);
number:
- platform: template
name: "Net Frequentie (Hz)"
id: n_freq
initial_value: 50.0
optimistic: true
min_value: 45
max_value: 55
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } f; f.f = (float)x;
id(mb_server).write_holding_register(20480, f.w[1]); id(mb_server).write_holding_register(20481, f.w[0]);
# FASE 1
- platform: template
name: "L1 Spanning (V)"
id: v_l1
initial_value: 231.8
optimistic: true
min_value: 200
max_value: 250
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } v; v.f = (float)x;
id(mb_server).write_holding_register(20482, v.w[1]); id(mb_server).write_holding_register(20483, v.w[0]);
- script.execute: update_all_power
- platform: template
name: "L1 Stroom (A)"
id: a_l1
initial_value: 2.8
optimistic: true
min_value: 0
max_value: 100
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } a; a.f = (float)x;
id(mb_server).write_holding_register(20492, a.w[1]); id(mb_server).write_holding_register(20493, a.w[0]);
- script.execute: update_all_power
# FASE 2
- platform: template
name: "L2 Spanning (V)"
id: v_l2
initial_value: 231.8
optimistic: true
min_value: 200
max_value: 250
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } v; v.f = (float)x;
id(mb_server).write_holding_register(20484, v.w[1]); id(mb_server).write_holding_register(20485, v.w[0]);
- script.execute: update_all_power
- platform: template
name: "L2 Stroom (A)"
id: a_l2
initial_value: 2.8
optimistic: true
min_value: 0
max_value: 100
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } a; a.f = (float)x;
id(mb_server).write_holding_register(20494, a.w[1]); id(mb_server).write_holding_register(20495, a.w[0]);
- script.execute: update_all_power
# FASE 3
- platform: template
name: "L3 Spanning (V)"
id: v_l3
initial_value: 231.8
optimistic: true
min_value: 200
max_value: 250
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } v; v.f = (float)x;
id(mb_server).write_holding_register(20486, v.w[1]); id(mb_server).write_holding_register(20487, v.w[0]);
- script.execute: update_all_power
- platform: template
name: "L3 Stroom (A)"
id: a_l3
initial_value: 2.8
optimistic: true
min_value: 0
max_value: 100
step: 0.1
on_value:
then:
- lambda: |-
union { float f; uint16_t w[2]; } a; a.f = (float)x;
id(mb_server).write_holding_register(20496, a.w[1]); id(mb_server).write_holding_register(20497, a.w[0]);
- script.execute: update_all_power