borne/main.py
2025-12-30 16:14:02 +01:00

184 lines
5.0 KiB
Python

from machine import Pin, I2C
from neopixel import NeoPixel
import network
import time
import urequests
Broche = [0, 1, 2, 21, 22, 23, 16, 17, 19, 20, 18]
def debug(str):
if True:
print(f"--> {str}")
class Bouton:
DEBOUNCE_MS = 500
dernier_appui = 0
def __init__(self, nom, pin, todo = None, pin_led = None, led_on = False):
self.nom = nom
self.pin = Pin(pin, Pin.IN, Pin.PULL_UP)
self.pin.irq(trigger = Pin.IRQ_FALLING, handler = self.bouton_presse)
self.todo = todo
if pin_led is None:
self.avec_led = False
else:
self.avec_led = True
self.pin_led = Pin(pin_led, Pin.OUT)
self.led_on() if led_on else self.led_off()
def led_on(self):
if self.avec_led:
self.pin_led.on()
def led_off(self):
if self.avec_led:
self.pin_led.off()
def bouton_presse(self, pin):
self.maintenant = time.ticks_ms()
if time.ticks_diff(self.maintenant, self.dernier_appui) > self.DEBOUNCE_MS:
self.dernier_appui = self.maintenant
print("Bouton " + self.nom + " pressé !")
if self.todo is not None:
self.todo()
class Relais:
i2c = I2C(scl=Pin(Broche[5]), sda=Pin(Broche[4]), freq=20000)
I2C_ADDR = 0x11
def __init__(self) -> None:
self.solaire()
def off(self):
self.i2c.writeto_mem(self.I2C_ADDR, 0x10, bytes([0b0000]))
def solaire(self):
self.i2c.writeto_mem(self.I2C_ADDR, 0x10, bytes([0b0011]))
def reseau(self):
self.i2c.writeto_mem(self.I2C_ADDR, 0x10, bytes([0b1100]))
class Cloud:
token_ha = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkNGY4MDdmYWYzNDQ0NTc0ODY4MmFmNzA4NDdmMTE0MyIsImlhdCI6MTc2NDQ1Mzk0NSwiZXhwIjoyMDc5ODEzOTQ1fQ.DJgSqeTKPHWbKEFH3HuFih4QKt3CSqLqot34_vhCOQU"
headers = {"Authorization": f"Bearer {token_ha}", "Content-Type": "application/json"}
wifi = network.WLAN(network.STA_IF)
dernier_appel_zoe = 0
derniere_val_zoe = 0
dernier_appel_HC = 0
derniere_val_HC = False
ttl = 60 * 1000
def net_up(self):
if not self.wifi.isconnected():
self.wifi.active(True)
self.wifi.connect("Livebox-BDC6", "KFQSn7PDCMSgPpM2Ws")
while not self.wifi.isconnected():
print(".")
def zoe(self) -> int:
try:
self.maintenant = time.ticks_ms()
if time.ticks_diff(self.maintenant, self.dernier_appel_zoe) > self.ttl:
self.dernier_appel_zoe = self.maintenant
self.net_up()
debug("appel sensor.zoe_batterie")
response = urequests.get("https://ha-demo.arbi.fr/api/states/sensor.zoe_batterie", headers=self.headers)
data = response.json()
response.close()
self.derniere_val_zoe = int(data["state"])
return self.derniere_val_zoe
except Exception as e:
print("Erreur :", e)
return -1
def HC(self) -> bool:
try:
self.maintenant = time.ticks_ms()
if time.ticks_diff(self.maintenant, self.dernier_appel_HC) > self.ttl:
self.dernier_appel_HC = self.maintenant
self.net_up()
debug("appel sensor.compteur_linky_ptec")
response = urequests.get("https://ha-demo.arbi.fr/api/states/sensor.compteur_linky_ptec", headers=self.headers)
data = response.json()
response.close()
val = data["state"]
print(f"--------------> {val}")
self.derniere_val_HC = (val == "HC..")
return self.derniere_val_HC
except Exception as e:
print("Erreur :", e)
return False
# Capter exception pour éviter les sorties intempestives (comme timeout sur ntp)
# Regarder https://docs.micropython.org/en/latest/esp32/quickref.html#timers
# led_jaune = Pin(0, Pin.OUT) # D0
# button_jaune = Pin(1, Pin.IN, Pin.PULL_UP) # D1
relais = Relais()
cloud = Cloud()
def action_jaune():
bouton_jaune.led_on()
bouton_bleu.led_off()
bouton_rouge.led_off()
relais.solaire()
bouton_jaune = Bouton("jaune", Broche[1], action_jaune, Broche[0], True)
def action_bleu():
bouton_jaune.led_off()
bouton_bleu.led_on()
bouton_rouge.led_off()
relais.reseau()
bouton_bleu = Bouton("bleu", Broche[3], action_bleu, Broche[2])
def action_rouge():
bouton_jaune.led_off()
bouton_bleu.led_off()
bouton_rouge.led_on()
relais.reseau()
bouton_rouge = Bouton("bleu", Broche[10], action_rouge, Broche[9])
button_moins = Pin(16, Pin.IN, Pin.PULL_UP) # D6 (et masse)
button_plus = Pin(17, Pin.IN, Pin.PULL_UP) # D7 (et masse)
bouton_moins = Bouton("moins", Broche[7])
bouton_plus = Bouton("plus", Broche[6])
#######################################################""
brightness = 0.01 # 1 %
def set_pixel(i, r, g, b):
np[i] = (
int(r * brightness),
int(g * brightness),
int(b * brightness)
)
pin_leds = Pin(19, Pin.OUT) # D8
np = NeoPixel(pin_leds, 10)
set_pixel(0, 0, 255, 0)
set_pixel(7, 0, 255, 0)
np.write()
# np.brightness(50)
pas_temps = 1
i = 0
while True:
# now = datetime.now()
# print("Date et heure :", now)
i += 1
print(f"-------------- {i}")
print(f"Charge : {cloud.zoe()}")
print(f"HC : {cloud.HC()}")
time.sleep(pas_temps)
# set_pixel(0, 0, 0, 0) # OFF
# np.write()