Add MQTT publishing

This commit is contained in:
arofarn 2020-04-21 20:57:48 +02:00
parent 4f5671f28e
commit e7212ebc1f
3 changed files with 84 additions and 11 deletions

BIN
code/lib/umqtt/robust.mpy Normal file

Binary file not shown.

BIN
code/lib/umqtt/simple.mpy Normal file

Binary file not shown.

View File

@ -23,17 +23,14 @@ __version__ = 0.3
import time
import sys
import machine
import esp
import neopixel
from encoder import Encoder
import ntptime
from umqtt.robust import MQTTClient
import light_modes
import config
# Paramètres
NB_PIX = 67 # Nombre de pixels de la 1e bande de LED
NB_PIX2 = 67 # Nombre de pixels de la 2e bande de LED
MAX_BRIGHT = 100 # Luminosité max (100 max.)
USR_COLOR = [255, 130, 20] # Couleur de base (à luminosité max)
# Déclaration des objets et initialisation des variables
@ -48,8 +45,8 @@ ENC_PIN_C = 13 # broche du clic central de l'encodeur
WIFI_LED_PIN = 0
# With ESP8266 (no timing parameter)
NPXL_STRIP = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), NB_PIX)
NPXL_STRIP2 = neopixel.NeoPixel(machine.Pin(NEOPIX2_PIN), NB_PIX)
NPXL_STRIP = neopixel.NeoPixel(machine.Pin(NEOPIX_PIN), config.NB_PIX)
# NPXL_STRIP2 = neopixel.NeoPixel(machine.Pin(NEOPIX2_PIN), config.NB_PIX2)
# Eteint tout à l'initialisation
NPXL_STRIP.fill([0, 0, 0])
@ -57,7 +54,7 @@ NPXL_STRIP.write()
# Encodeur rotatif
ENCODER = Encoder(ENC_PIN_A, ENC_PIN_B,
min_val=0, max_val=MAX_BRIGHT,
min_val=0, max_val=config.MAX_BRIGHT,
clicks=1)
# Bouton
@ -66,18 +63,64 @@ ENC_BUT = machine.Pin(ENC_PIN_C, machine.Pin.IN)
# LED status WIFI_LED_PIN
WIFI_LED = machine.Pin(WIFI_LED_PIN, machine.Pin.OUT)
# RTC setup
rtc = machine.RTC()
# initialisation des variables d'état
BRIGHTN = 50 # Luminosité (0 - 100)
PWR = True # Est-ce que l'éclairage est allumé ?
BUTTN_STATE = 1
CURRENT_MODE = 0
PWROFF_DELAY = 0
MQTT_DELAY = 2 # Délais en sec. avant d'envoyer les données au MQTT
# Connection au broker MQTT
CLIENT = MQTTClient(client_id=config.CLIENT_ID,
server=config.MQTT_HOST,
user=config.MQTT_USERNAME,
password=config.MQTT_PASSWD,
port=config.MQTT_PORT)
CLIENT.DEBUG = True
CLIENT.connect()
#############
# FUNCTIONS #
#############
def set_rtc():
while True:
try:
return ntptime.settime()
except OSError as e:
if e.errno == 110:
time.sleep(2)
def now(clock):
"""Return a string representing date/time now."""
return "{0:04d}/{1:02d}/{2:02d}_{4:02d}:{5:02d}:{6:02d}".format(*clock.datetime())
def MqttPublish(topic, message, retain=False, qos=0, sleep=0):
"""MQTT publish helper."""
global CLIENT
CLIENT.publish("{location}/{device}/{topic}".format(location=config.LOCATION,
device=CLIENT.client_id,
topic=topic),
message,
retain=retain,
qos=qos)
time.sleep_ms(sleep)
def MqttMultiPublish(payload, sleep=0):
"""Send multiple data"""
for pl in payload:
MqttPublish(pl[0], pl[1], retain=pl[2], qos=pl[3], sleep=sleep)
def power_cycle():
"""ON/OFF function"""
global PWR
@ -102,6 +145,10 @@ def power_cycle():
while ENC_BUT.value() == 0:
time.sleep_ms(10)
# Envoi de la nouvelle info au MQTT
MqttMultiPublish([['power/date', now(rtc), True, 1],
['power/value', "{}".format(PWR), True, 0]])
def update_button_c(button, button_state, pwr, mode):
"""Surveille le bouton C (clic central)"""
@ -130,6 +177,9 @@ def update_button_c(button, button_state, pwr, mode):
if mode >= len(light_modes.MODES_LST):
mode = 0
MqttMultiPublish([['mode/date', now(rtc), True, 1],
['mode/value', "{}".format(mode), True, 1]])
return mode
@ -144,6 +194,26 @@ def update_wifi_led():
# BOUCLE PRINCIPALE #
#####################
set_rtc()
# Envoi de l'état de départ au broker
data = [["last_boot", now(rtc), True, 1],
["location", config.LOCATION, True, 1],
["sys/wifi_ssid", WLAN.config('essid'), True, 0],
["sys/ip", WLAN.ifconfig()[0], True, 1],
["sys/esp8266_device_id", "{:d}".format(esp.flash_id()), True, 1],
['mode/date', now(rtc), True, 1],
["mode/value", "{}".format(CURRENT_MODE), True, 1],
['brightness/date', now(rtc), True, 1],
["brightness/value", "{}".format(BRIGHTN), True, 1],
['power/date', now(rtc), True, 1],
["power/value", "{}".format(PWR), True, 1],
]
MqttMultiPublish(data)
time.sleep(1)
while True:
# Si on a un changement de valeur, on met à jour la luminosité
@ -151,11 +221,14 @@ while True:
if BRIGHTN != ENCODER.value:
print(ENCODER.value)
BRIGHTN = ENCODER.value
MqttMultiPublish([['brightness/date', now(rtc), True, 1],
['brightness/value', "{}".format(BRIGHTN), True, 0]])
# Mise à jour des LED
light_modes.update_neopixel(CURRENT_MODE,
NPXL_STRIP,
USR_COLOR, BRIGHTN)
config.USR_COLOR,
BRIGHTN)
# Si on laisse appuyer 2 secondes: extinction
CURRENT_MODE = update_button_c(ENC_BUT,