Pour info :
possibilité de programmer ses propres vitesses pour le mini , eco et normal , le maxi reste le maxi dans le yaml .
j’utilise un 485TTL sans broche de commutation , c’est plus simple (pas de cablage gpio 5)
le gpio 17 sur le tx du 485
le gpio 16 sur le rx du 485
( option si module 485TTL avec commutation , gpio 5 vers RE et DE relié ensemble )
le A du 485TTL sur le A du bornier du variateur
le B du 485TTL sur le B du bornier du variateur
donc voici mon fichier :
esphome:
name: pump-rpm-regulator
friendly_name: pump_rpm_regulator
on_boot:
priority: -100
then:
- lambda: |-
if (id(pump_rpm).state > 0) {
id(pump_rpm).make_call().set_value(id(pump_rpm).state).perform();
}
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: "uiZoGOTxpYlWCPeJAUazhiSM1kh3YPokI4="
ota:
- platform: esphome
password: "1b1e1f0872a15337d5"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Variateur Hotspot"
password: " à definir "
web_server:
port: 80
captive_portal:
uart:
tx_pin: GPIO17
rx_pin: GPIO16
baud_rate: 1200
stop_bits: 1
data_bits: 8
parity: NONE
id: modbus_uart
debug:
after:
delimiter: "\n"
output:
- platform: gpio
pin: GPIO05
id: modbus_write_enable
text_sensor:
- platform: template
name: "Modbus Status"
id: modbus_status
number:
- platform: template
name: "Réglage Vitesse RPM"
id: pump_rpm
min_value: 0
max_value: 2900
step: 50
set_action:
then:
- lambda: |-
id(modbus_write_enable).turn_on();
uint16_t rpm = (uint16_t)x;
if (rpm < 1200) {
rpm = 1;
}
uint8_t rpm0 = (rpm >> 8) & 0xFF;
uint8_t rpm1 = rpm & 0xFF;
uint8_t data[6] = {0xAA, 0xD0, 0x0B, 0xB9, rpm0, rpm1};
uint16_t crc = 0xFFFF;
for (int i = 0; i < 6; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
uint8_t crc0 = crc & 0xFF;
uint8_t crc1 = (crc >> 8) & 0xFF;
uint8_t packet[8] = {0xAA, 0xD0, 0x0B, 0xB9, rpm0, rpm1, crc0, crc1};
auto uart = id(modbus_uart);
uart->write_array(packet, 8);
uart->flush();
id(modbus_write_enable).turn_off();
sensor:
- platform: template
name: "Vitesse RPM"
id: pump_rpm_state
unit_of_measurement: "RPM"
accuracy_decimals: 0
update_interval: never
force_update: false
interval:
- interval: 1s
then:
- lambda: |-
id(modbus_write_enable).turn_on();
uint8_t data[6] = {0xAA, 0xC3, 0x07, 0xD1, 0x00, 0x00};
uint16_t crc = 0xFFFF;
for (int i = 0; i < 6; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
uint8_t crc0 = crc & 0xFF;
uint8_t crc1 = (crc >> 8) & 0xFF;
uint8_t packet[8] = {0xAA, 0xC3, 0x07, 0xD1, 0x00, 0x00, crc0, crc1};
auto uart = id(modbus_uart);
while(uart->available() > 0) {
uint8_t t;
uart->read_array(&t, 1);
}
uart->write_array(packet, 8);
uart->flush();
id(modbus_write_enable).turn_off();
uint32_t start_time = millis();
while (uart->available() < 8 && (millis() - start_time) < 200) {
delay(1);
}
if (uart->available() >= 7) {
uint8_t response[7];
uart->read_array(response, 7);
id(modbus_status).publish_state("Online");
float value = (float)((uint16_t)response[5] << 8 | (uint16_t)response[6]);
if (value != id(pump_rpm_state).state) {
id(pump_rpm_state).publish_state(value);
id(pump_rpm).publish_state(value);
}
} else {
id(modbus_status).publish_state("No Response");
}
switch:
- platform: template
name: "Marche Arret"
id: pump_power
optimistic: true
turn_on_action:
- lambda: |-
id(pump_rpm).make_call().set_value(1700).perform();
turn_off_action:
- lambda: |-
id(pump_rpm).make_call().set_value(0).perform();
button:
- platform: template
name: "Mode ECO 1350 RPM"
on_press:
- lambda: |-
id(pump_rpm).make_call().set_value(1350).perform();
- platform: template
name: "Mode Normal 1700 RPM"
on_press:
- lambda: |-
id(pump_rpm).make_call().set_value(1700).perform();
- platform: template
name: "Mode Maxi 2900 RPM"
on_press:
- lambda: |-
id(pump_rpm).make_call().set_value(2900).perform();
- platform: template
name: "Mode Mini 1200 RPM"
on_press:
- lambda: |-
id(pump_rpm).make_call().set_value(1200).perform();
C’est du modbus , accès direct au variateur , pour ceux qui ne sont pas à l’aise avec ce protocole soyer prudent dans les manipulations et programmation