From c7b6ca42b3c571de4ecfebfa2be5d8ae62fa08b0 Mon Sep 17 00:00:00 2001 From: Raymond Bourges Date: Tue, 27 May 2025 12:27:23 +0200 Subject: [PATCH] FEAT : Gestion du pzem --- config/tv.yaml | 71 ++++++++++++++++++++++++++++++++++++++ mqtt/config/mosquitto.conf | 3 -- proto/pzem.py | 52 ++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 config/tv.yaml create mode 100755 proto/pzem.py diff --git a/config/tv.yaml b/config/tv.yaml new file mode 100644 index 0000000..4ad35d7 --- /dev/null +++ b/config/tv.yaml @@ -0,0 +1,71 @@ +esphome: + name: tv + friendly_name: TV + +esp32: + board: esp32-s3-devkitc-1 + framework: + type: esp-idf + +# Enable logging +logger: + +# Enable Home Assistant API +api: + encryption: + key: "wbYIRZHpZb8Q8urkl1PqMfP54rY8TUca3VBJxx5DcmI=" + +ota: + - platform: esphome + password: "dbba6251c020b7547d3703b1fc8b5d9d" + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + +# Example configuration entry +uart: + tx_pin: GPIO44 # Il faut les inverser !!!! + rx_pin: GPIO43 + baud_rate: 9600 + # debug: + # direction: BOTH + # dummy_receiver: false + # after: + # delimiter: "\n" + # sequence: + # - lambda: UARTDebug::log_string(direction, bytes); + +modbus: + +output: + - platform: gpio + pin: GPIO8 + id: gpio_8 + +sensor: + - platform: pzemac + address: 4 + power: + name: "PZEM-004T V3 Power" + on_value_range: + - above: 2 + then: + - lambda: |- + // Convertir la valeur flottante en string + char buffer[30]; // Taille suffisante pour stocker la chaîne + snprintf(buffer, sizeof(buffer), "%.2f", x); + ESP_LOGD("main", "--> Lampe ON (%s W)", buffer); + id(gpio_8).turn_on(); + - below: 2 + then: + - wait_until: + condition: + lambda: 'return millis() >= 60000;' + - lambda: |- + // Convertir la valeur flottante en string + char buffer[30]; // Taille suffisante pour stocker la chaîne + snprintf(buffer, sizeof(buffer), "%.2f", x); + ESP_LOGD("main", "--> Lampe OFF (%s W)", buffer); + id(gpio_8).turn_off(); + update_interval: 5s \ No newline at end of file diff --git a/mqtt/config/mosquitto.conf b/mqtt/config/mosquitto.conf index 38acaaa..26487fa 100644 --- a/mqtt/config/mosquitto.conf +++ b/mqtt/config/mosquitto.conf @@ -1,6 +1,3 @@ -listener 1883 -protocol mqtt - listener 8883 protocol mqtt cafile /mosquitto/config/ssl/mosquitto.crt diff --git a/proto/pzem.py b/proto/pzem.py new file mode 100755 index 0000000..eb35526 --- /dev/null +++ b/proto/pzem.py @@ -0,0 +1,52 @@ +#!python +# Importez les modules nécessaires de PyModbus +from pymodbus.client import ModbusSerialClient +import time +from datetime import datetime + +# Paramètres de communication série Modbus +serial_port = "/dev/ttyUSB0" +# Adresses Modbus des PZEM-OO4T +pzems = [4] + + + +# Main +# Créez une instance du client Modbus +client = ModbusSerialClient(port=serial_port, baudrate=9600, stopbits=1, bytesize=8, parity='N') +# Ouvrez la connexion série +client.connect() + +while True: + for pzem in pzems: + print(f"PZEM : {pzem}") + try: + data = client.read_input_registers(0, 10, slave=pzem) + if data: + voltage = data.getRegister(0) / 10.0 # [V] + current = (data.getRegister(1) + (data.getRegister(2) << 16)) / 1000.0 # [A] + power = (data.getRegister(3) + (data.getRegister(4) << 16)) / 10.0 # [W] + energy = data.getRegister(5) + (data.getRegister(6) << 16) # [Wh] + frequency = data.getRegister(7) / 10.0 # [Hz] + powerFactor = data.getRegister(8) / 100.0 + alarm = data.getRegister(9) # 0 = no alarm# La réponse contient les valeurs lues + print("********************************") + print("ID pince : " + str(pzem)) + print("Valeurs lues : " + str(data.registers)) + print('Voltage [V]: ', voltage) + print('Current [A]: ', current) + print('Power [W]: ', power) # active power (V * I * power factor) + print('Energy [Wh]: ', energy) + print('Frequency [Hz]: ', frequency) + print('Power factor []: ', powerFactor) + print('Alarm : ', alarm) + else: + maintenant = datetime.now() + date_heure = maintenant.strftime("%Y-%m-%d %H:%M:%S") + print(f"{date_heure} --> ERREUR : Aucune réponse.") + except Exception as e: + maintenant = datetime.now() + date_heure = maintenant.strftime("%Y-%m-%d %H:%M:%S") + print(f"{date_heure} --> ERREUR {e}") + time.sleep(1) +