feat: configure ui labels via mqtt message

This commit is contained in:
s3lph 2023-09-10 21:29:06 +02:00
parent cec9afb41c
commit 1ab40cff2a
Signed by: s3lph
GPG key ID: 0AA29A52FB33CFB5
2 changed files with 30 additions and 3 deletions

View file

@ -1,6 +1,7 @@
import gc
import json
import math
import network
import os
import socket
@ -22,14 +23,25 @@ class Flow3rOpenhabMqtt(Application):
self.state = 0
self.nic = network.WLAN(network.STA_IF)
client_id = CONFIG['mqtt_client_id'].format(self.nic.config('mac').hex())
self.base_topic = CONFIG['mqtt_topic'].format(self.nic.config('mac').hex())
self.base_topic = CONFIG['mqtt_topic_base'].format(self.nic.config('mac').hex()).encode()
self.mqtt = MQTTClient(client_id, CONFIG['mqtt_broker_ip'])
self.mqtt.set_callback(self.mqtt_cb)
self.touch_time = [None]*10
self.touch_begin = [None]*10
self.touch_last = [None]*10
self.touch_base = [False]*10
self.touch_tip = [False]*10
self.touch_log = [[]]*10
self.ui_config = [""]*10
def mqtt_cb(self, topic, msg):
print(topic, msg)
if topic == self.base_topic + b'ui_config':
try:
print(msg)
self.ui_config = json.loads(msg.decode())
except Exception as e:
print(e)
def draw(self, ctx: Context) -> None:
if self.state == 0:
@ -39,6 +51,15 @@ class Flow3rOpenhabMqtt(Application):
ctx.rgb(0, 0, 0).rectangle(-120, -120, 240, 240).fill()
ctx.rgb(0.3, 0.3, 0.3).arc(0, 0, 90, 0, 2.39, 0).arc(0, 0, 90, 2.79, 6.29, 0).stroke()
ctx.rgb(0.9, 0.3, 0.1).move_to(-96, 53).line_to(-1, -43).line_to(71, 29).stroke()
ctx.text_align = ctx.CENTER
ctx.text_baseline = ctx.MIDDLE
ctx.font_size = 20
for i, text in enumerate(self.ui_config):
phi = (2*math.pi/10)*(i+1)-(math.pi/2)
radius = 50 if i%2 else 80
x = radius*math.cos(phi)
y = radius*math.sin(phi)
ctx.rgb(1, 1, 1).move_to(x, y).text(text)
if CONFIG.get('debug_touch', False):
ctx.line_width =1
for i in range(10):
@ -62,9 +83,13 @@ class Flow3rOpenhabMqtt(Application):
self.do_connect()
if self.nic.status() == network.STAT_GOT_IP and self.state == 0:
gc.collect()
self.mqtt.set_last_will(self.base_topic + 'status', 'Offline', retain=True)
self.mqtt.connect()
self.mqtt.subscribe(self.base_topic + 'ui_config')
self.mqtt.publish(self.base_topic + 'status', 'Online', retain=True)
self.state = 1
if self.state == 1:
self.mqtt.check_msg()
for i in range(10):
if ins.captouch.petals[i].pressed:
# Ignore the first few ms of touch events, as position data appears to be unrealiable at first
@ -104,7 +129,9 @@ class Flow3rOpenhabMqtt(Application):
event = 'swipe_left'
if event is not None:
human_petal = 10-(-i%10)
self.mqtt.publish(self.base_topic, b'{{"petal":"{}","event":"{}","dx":{},"dy":{},"duration":{}}}'.format(human_petal, event, d_x, d_y, duration))
msg = b'{{"petal":"{}","event":"{}","dx":{},"dy":{},"duration":{}}}'\
.format(human_petal, event, d_x, d_y, duration)
self.mqtt.publish(self.base_topic + 'event', msg)
self.touch_time[i] = None
self.touch_begin[i] = None
self.touch_last[i] = None

View file

@ -3,5 +3,5 @@
"wifi_psk": "supersecurepassword",
"mqtt_broker_ip": "127.0.0.1",
"mqtt_client_id": "flow3r-{}",
"mqtt_topic": "flow3r-{}/event"
"mqtt_topic_base": "flow3r-{}/"
}