Compare commits

..

3 Commits

Author SHA1 Message Date
Raymond Bourges
009f71a7a4 FEAT : Station météo OK 2025-06-04 13:05:24 +02:00
Raymond Bourges
b33565876c REFACTO : suppr vieux code TV 2025-06-04 13:01:34 +02:00
Raymond Bourges
4c9f33fc88 FEAT : Interupteur TV 2025-06-04 12:59:54 +02:00
7 changed files with 99 additions and 112 deletions

3
.gitignore vendored
View File

@ -1,4 +1,5 @@
__pycache__ __pycache__
venv/ venv/
ssl/ ssl/
password.* password.*
archive/

View File

@ -2,7 +2,7 @@ version: '3'
services: services:
esphome: esphome:
container_name: esphome container_name: esphome
image: ghcr.io/esphome/esphome:2025.4.2 image: ghcr.io/esphome/esphome:2025.5.1
volumes: volumes:
- "${PWD}/config:/config" - "${PWD}/config:/config"
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro

View File

@ -1,6 +1,6 @@
esphome: esphome:
name: seeed-studio name: meteo
friendly_name: seeed studio friendly_name: meteo
esp32: esp32:
board: esp32-s3-devkitc-1 board: esp32-s3-devkitc-1
@ -9,37 +9,40 @@ esp32:
# Enable logging # Enable logging
logger: logger:
level: DEBUG level: DEBUG
baud_rate: 0
# Enable Home Assistant API # Enable Home Assistant API
api: api:
encryption: encryption:
key: "1tRYVfsGzt8mFr+ay9hE24pdPd8IACedduh9tLWg4xs=" key: "lcr/4ePmB78mYjnyTElGrJXa1xM7an6hCUWolhvT684="
ota: ota:
- platform: esphome - platform: esphome
password: "d68060a1d18b9d61354434595717070c" password: "4d1a5c36ea8858dbece920c9bedeb8db"
wifi: wifi:
ssid: !secret wifi_ssid ssid: !secret wifi_ssid
password: !secret wifi_password password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Meteo Fallback Hotspot"
password: "2GJSSrOmscwi"
captive_portal:
uart: uart:
id: mod_bus_id id: uart_1
tx_pin: GPIO44 # Il faut les inverser !!!! tx_pin:
rx_pin: GPIO43 number: GPIO44
rx_pin:
number: GPIO43
baud_rate: 4800 baud_rate: 4800
# debug:
# direction: BOTH
# dummy_receiver: false
# after:
# delimiter: "\n"
# sequence:
# - lambda: UARTDebug::log_string(direction, bytes);
modbus: modbus:
id: modbus1 id: modbus1
uart_id: mod_bus_id uart_id: uart_1
modbus_controller: modbus_controller:
- id: modbus_controller1 - id: modbus_controller1
@ -59,7 +62,7 @@ sensor:
- platform: modbus_controller - platform: modbus_controller
id: sensor1 id: sensor1
modbus_controller_id: modbus_controller1 modbus_controller_id: modbus_controller1
name: "Wind speed" name: "Anémomètre"
register_type: read register_type: read
address: 0 address: 0
value_type: U_WORD value_type: U_WORD
@ -74,11 +77,12 @@ sensor:
on_value: on_value:
then: then:
- mqtt.publish: - mqtt.publish:
topic: "rbo2" topic: "data"
payload: !lambda 'return "Vent (x 10 en m/s) --> " + to_string(x);' payload: !lambda 'return "Vent (x 10 en m/s) --> " + to_string(x);'
- platform: modbus_controller - platform: modbus_controller
id: sensor2
modbus_controller_id: modbus_controller2 modbus_controller_id: modbus_controller2
name: "Wind direction gear" name: "Girouette"
register_type: read register_type: read
address: 0 address: 0
value_type: U_WORD value_type: U_WORD
@ -93,16 +97,17 @@ sensor:
on_value: on_value:
then: then:
- mqtt.publish: - mqtt.publish:
topic: "rbo2" topic: "data"
payload: !lambda 'return "Sens --> " + to_string(x);' payload: !lambda 'return "Sens --> " + to_string(x);'
mqtt: mqtt:
broker: "pc-raymond.home" broker: "pc-raymond.home"
id: mqtt1 id: mqtt1
log_topic: null # log_topic: log
port: 8883 port: 8883
username: admin username: admin
password: !secret mqtt password: !secret mqtt
# skip_cert_cn_check: True
certificate_authority: | certificate_authority: |
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIDFzCCAf+gAwIBAgIUVQ1Osb4crzbNV4NvXb9K7EmbemYwDQYJKoZIhvcNAQEL MIIDFzCCAf+gAwIBAgIUVQ1Osb4crzbNV4NvXb9K7EmbemYwDQYJKoZIhvcNAQEL
@ -124,5 +129,5 @@ mqtt:
Ap2FlRX2rpKJFiX5rJbjGuzED4G2wv4QNrLl Ap2FlRX2rpKJFiX5rJbjGuzED4G2wv4QNrLl
-----END CERTIFICATE----- -----END CERTIFICATE-----
birth_message: birth_message:
topic: rbo topic: data
payload: 'Nouvelle connexion MQTT...' payload: '---> Nouvelle connexion MQTT...'

View File

@ -1,70 +0,0 @@
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
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

@ -22,6 +22,17 @@ esp32:
# Enable logging # Enable logging
logger: logger:
output:
- platform: gpio
pin: GPIO21 # essaie GPIO10 d'abord, si ça ne marche pas, tente GPIO21
id: led_builtin
# Fait clignoter la LED toutes les secondes
interval:
- interval: 1s
then:
- output.toggle: led_builtin
uart: uart:
tx_pin: GPIO17 # Il faut les inverser !!!! tx_pin: GPIO17 # Il faut les inverser !!!!
rx_pin: GPIO16 rx_pin: GPIO16

38
proto/l.py Executable file
View File

@ -0,0 +1,38 @@
#!python
import serial
import serial.tools.list_ports
def list_serial_ports():
ports = serial.tools.list_ports.comports()
for port in ports:
print(port.device)
def read_from_serial_port(port_name, baud_rate=9600):
try:
# Ouvrir le port série
ser = serial.Serial(port_name, baud_rate, timeout=1)
print(f"Lecture du port série {port_name}...")
while True:
# Lire une ligne du port série
line = ser.readline()
if line:
hex_line = ' '.join(f'{byte:02x}' for byte in line)
print(f"Reçu (hexa): {hex_line}")
except serial.SerialException as e:
print(f"Erreur: {e}")
finally:
if 'ser' in locals():
ser.close()
print("Port série fermé.")
if __name__ == "__main__":
# Lister les ports série disponibles
print("Ports série disponibles:")
list_serial_ports()
# Remplacer 'COM3' par le nom de votre port série
port_name = input("Entrez le nom du port série à lire (par exemple, COM3 ou /dev/ttyUSB0): ")
read_from_serial_port(port_name)

View File

@ -2,13 +2,17 @@
from pymodbus.client import ModbusSerialClient, ModbusTcpClient from pymodbus.client import ModbusSerialClient, ModbusTcpClient
from pymodbus.pdu.register_read_message import ReadInputRegistersResponse from pymodbus.pdu.register_read_message import ReadInputRegistersResponse
from configModel import Algo, Metrique, Capteur, ModbusType from configModel import Algo, Metrique, Capteur, ModbusType
import struct, time import struct, time, logging
logging.basicConfig(level=logging.DEBUG)
# log = logging.getLogger('pymodbus.protocol.*')
# log.setLevel(logging.DEBUG)
# client = ModbusTcpClient(host="shellyproem50-08f9e0e79718") # grarage (borne et pac) # client = ModbusTcpClient(host="shellyproem50-08f9e0e79718") # grarage (borne et pac)
# client = ModbusTcpClient(host="ShellyPro3EM-FCE8C0D97664") # bureau (prises 1 à 3) # client = ModbusTcpClient(host="ShellyPro3EM-FCE8C0D97664") # bureau (prises 1 à 3)
client = ModbusSerialClient( client = ModbusSerialClient(
port="/dev/ttyACM0", port="/dev/ttyUSB1",
baudrate=4800, baudrate=9600,
# stopbits=capteur.comConfig.stopbits, # stopbits=capteur.comConfig.stopbits,
# bytesize=capteur.comConfig.bytesize, # bytesize=capteur.comConfig.bytesize,
# parity=capteur.comConfig.parity # parity=capteur.comConfig.parity
@ -22,14 +26,11 @@ def uint32(a, b):
ret:int = (a << 16) | b ret:int = (a << 16) | b
return ret return ret
slave = 1 def lireMetrique(metrique:Metrique, registre:int, slave:int = 1, nom:str = "sans nom"):
def lireMetrique(metrique:Metrique, registre):
client.connect() client.connect()
try: try:
data:ReadInputRegistersResponse = client.read_input_registers(registre, 2, slave=slave) data:ReadInputRegistersResponse = client.read_input_registers(registre, 1, slave=slave)
if data: if data:
print(f"--> {data}")
registres = data.registers registres = data.registers
if metrique.algo == Algo.NORMAL: if metrique.algo == Algo.NORMAL:
val = registres[0] val = registres[0]
@ -41,23 +42,24 @@ def lireMetrique(metrique:Metrique, registre):
val = ''.join(chr(register) for register in data.registers) val = ''.join(chr(register) for register in data.registers)
if metrique.algo == Algo.BOOLEAN: if metrique.algo == Algo.BOOLEAN:
val = registres[0] val = registres[0]
print(f"Captation sur {registre} : {val}") print(f"--> Registre {registre} du périmérique {slave} ({nom}) : {val}")
except Exception as e: except Exception as e:
print(f"Erreur lors de la captation sur {registre} : {e}") print(f"Erreur lors de la lecture du registre {registre} du périmérique {slave} ({nom}) : {e}")
finally: finally:
client.close() client.close()
registre = -1 slave = 0
if __name__ == '__main__': if __name__ == '__main__':
slave = 2
while True: while True:
registre = 0 # slave = slave + 1
m:Metrique = Metrique( m:Metrique = Metrique(
idMetrique=1, idMetrique=0,
indexRegistreDepart=registre, indexRegistreDepart=0,
precision=3, precision=3,
algo=Algo.NORMAL algo=Algo.NORMAL
) )
lireMetrique(m, registre) lireMetrique(m, 1, slave=1)
time.sleep(1) time.sleep(1)
# lireMetrique(m, 0, 2, "orientation")
# time.sleep(1)