FEAT : Gestion du pzem

This commit is contained in:
Raymond Bourges 2025-05-27 12:27:23 +02:00
parent d20c1f5055
commit c7b6ca42b3
3 changed files with 123 additions and 3 deletions

71
config/tv.yaml Normal file
View File

@ -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

View File

@ -1,6 +1,3 @@
listener 1883
protocol mqtt
listener 8883
protocol mqtt
cafile /mosquitto/config/ssl/mosquitto.crt

52
proto/pzem.py Executable file
View File

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