đŸ€–Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    MQTT SUbscribe is not working, after a few

    UiFlow 2.0
    1
    2
    168
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fellpower
      last edited by

      Hey

      Im using a CoreS3 with UIFLow2.

      I have a few powerwalls, flashed with tasmota - and using iobroker as a mqtt server.

      so my flow looks like that:

      6e643f7c-f478-48fc-a05c-d198db194cc9-image.png

      This is my screen for that "problematic" content:

      720189fb-4305-4d93-9857-cce3ab0753fb-image.png

      if i restart the coreS3, i can switch on and of the powerwall - and the led indicator works instant. BUT after a while, i can switch on and of the powerwall, but the led wont change anymore - or takes minutes, to do so.

      in the iobroker mqtt i can see, that the tasmota device changed its status to "on" instant, so its switched on - but the led on the screen dont tell that.

      if i restart the unit, it works again, for a few minutes.

      any ideas?

      F 1 Reply Last reply Reply Quote 1
      • F
        fellpower @fellpower
        last edited by fellpower

        So, because nobody cares - and the M5Stack might be abadoned by the company - here the solution - found it by myself....

        The Blockly is doing crap - and cant be fixed in there, u have to learn micropython...i asked a friend - and he had the following solution:

        import os, sys, io
        import M5
        from M5 import *
        import m5ui
        import lvgl as lv
        from umqtt import MQTTClient
        import time
        
        page0 = None
        page1Licht = None
        button0 = None
        button1 = None
        Akkubar2 = None
        led0 = None
        led2 = None
        charge = None
        button2 = None
        button3 = None
        led3 = None
        led4 = None
        button4 = None
        mqtt_client = None
        
        msg = None
        last_ui_update = 0   # <---- UI Timing
        
        
        # ---------- MQTT EVENTS ----------
        
        def mqtt_stat_Steckdose2_POWER_event(data):
            global led4, msg
            msg = (data[1]).decode()
            led4.on() if msg == 'ON' else led4.off()
            print("Steckdose2:", msg)
        
        
        def mqtt_stat_Steckdose1_POWER_event(data):
            global led3, msg
            msg = (data[1]).decode()
            led3.on() if msg == 'ON' else led3.off()
            print("Steckdose1:", msg)
        
        
        # ---------- MQTT CONNECT / RECONNECT ----------
        
        def mqtt_connect():
            global mqtt_client
            print("MQTT connecting...")
        
            try:
                mqtt_client = MQTTClient('CoreS3', '192.168.0.100', port=1883,
                                         user='', password='', keepalive=60)
        
                mqtt_client.connect(clean_session=False)
        
                mqtt_client.subscribe('stat/Steckdose2/POWER', mqtt_stat_Steckdose2_POWER_event, qos=0)
                mqtt_client.subscribe('stat/Steckdose1/POWER', mqtt_stat_Steckdose1_POWER_event, qos=0)
        
                print("MQTT connected & subscribed.")
                time.sleep(0.2)
            except Exception as e:
                print("MQTT connect failed:", e)
                time.sleep(2)
        
        
        # ---------- BUTTON EVENTS ----------
        
        def button4_pressed_event(event_struct):
            page0.screen_load()
        
        def button0_pressed_event(event_struct):
            page1Licht.screen_load()
        
        def button3_released_event(event_struct):
            mqtt_client.publish('cmnd/Steckdose2/POWER', 'TOGGLE', qos=0)
        
        def button2_released_event(event_struct):
            mqtt_client.publish('cmnd/Steckdose1/POWER', 'TOGGLE', qos=0)
        
        
        # ---------- UI EVENT HANDLER ----------
        
        def button4_event_handler(event_struct):
            if event_struct.code == lv.EVENT.PRESSED:
                button4_pressed_event(event_struct)
        
        def button0_event_handler(event_struct):
            if event_struct.code == lv.EVENT.PRESSED:
                button0_pressed_event(event_struct)
        
        def button3_event_handler(event_struct):
            if event_struct.code == lv.EVENT.RELEASED:
                button3_released_event(event_struct)
        
        def button2_event_handler(event_struct):
            if event_struct.code == lv.EVENT.RELEASED:
                button2_released_event(event_struct)
        
        
        # ---------- SETUP ----------
        
        def setup():
            global page0, page1Licht, button0, button1, Akkubar2, led0, led2, charge, button2, button3, led3, led4, button4
        
            M5.begin()
            Widgets.setRotation(1)
            m5ui.init()
        
            page0 = m5ui.M5Page(bg_c=0x000000)
            page1Licht = m5ui.M5Page(bg_c=0x000000)
            button0 = m5ui.M5Button(text="Licht", x=114, y=23, bg_c=0x2196f3, text_c=0xffffff, font=lv.font_montserrat_24, parent=page0)
            button1 = m5ui.M5Button(text="Automation", x=71, y=137, bg_c=0x2196f3, text_c=0xffffff, font=lv.font_montserrat_24, parent=page0)
            Akkubar2 = m5ui.M5Bar(x=4, y=220, w=100, h=13, min_value=0, max_value=100, value=25, bg_c=0x2193f3, color=0x21f326, parent=page1Licht)
            led0 = m5ui.M5LED(x=7, y=187, size=20, color=0x00ff00, on=True, parent=page1Licht)
            led2 = m5ui.M5LED(x=297, y=215, size=20, color=0x00ff00, on=True, parent=page0)
            charge = m5ui.M5Label("CHAR", x=248, y=217, text_c=0xffffff, bg_c=0xffffff, bg_opa=0, font=lv.font_montserrat_14, parent=page0)
            button2 = m5ui.M5Button(text="Steckdose 1 (PC)", x=12, y=9, bg_c=0x2196f3, text_c=0xffffff, font=lv.font_montserrat_24, parent=page1Licht)
            button3 = m5ui.M5Button(text="Steckdose 2", x=14, y=78, bg_c=0x2196f3, text_c=0xffffff, font=lv.font_montserrat_24, parent=page1Licht)
            led3 = m5ui.M5LED(x=263, y=10, size=44, color=0x00ff00, on=True, parent=page1Licht)
            led4 = m5ui.M5LED(x=263, y=78, size=44, color=0x00ff00, on=True, parent=page1Licht)
            button4 = m5ui.M5Button(text="Back", x=227, y=196, bg_c=0x2196f3, text_c=0xffffff, font=lv.font_montserrat_24, parent=page1Licht)
        
            button4.add_event_cb(button4_event_handler, lv.EVENT.ALL, None)
            button0.add_event_cb(button0_event_handler, lv.EVENT.ALL, None)
            button3.add_event_cb(button3_event_handler, lv.EVENT.ALL, None)
            button2.add_event_cb(button2_event_handler, lv.EVENT.ALL, None)
        
            page0.screen_load()
            mqtt_connect()
        
            Power.setChargeCurrent(1000)
            Power.setChargeVoltage(4100)
        
        
        # ---------- LOOP ----------
        
        def loop():
            global last_ui_update
        
            # ---- MQTT schnell abfragen -> verhindert Verzögerungen
            for _ in range(5):
                try:
                    mqtt_client.check_msg()
                except:
                    mqtt_connect()
        
            if not mqtt_client.isconnected():
                mqtt_connect()
        
            # ---- UI nur alle 100ms aktualisieren (entkoppelt)
            now = time.ticks_ms()
            if time.ticks_diff(now, last_ui_update) > 100:
                last_ui_update = now
        
                M5.update()
                Akkubar2.set_value(Power.getBatteryLevel(), True)
                led2.on() if Power.isCharging() else led2.off()
                led0.on() if mqtt_client.isconnected() else led0.off()
        
        
        # ---------- MAIN ----------
        
        if __name__ == '__main__':
            try:
                setup()
                while True:
                    loop()
            except (Exception, KeyboardInterrupt) as e:
                try:
                    m5ui.deinit()
                    from utility import print_error_msg
                    print_error_msg(e)
                except ImportError:
                    print("please update to latest firmware")
        
        

        That is working instant, and over a long time. the led indicator switches instant and real.
        The issue is, that the LVGL render takes so long, that the subscribed message dont come trough. its a bug in the blockly implementation, but it never gets fixed, because it seems, the M5Stack is abadoned....so u have to fix it in the mircopython code - and never get back to blockly - or u loose the code ^^

        1 Reply Last reply Reply Quote 0
        • First post
          Last post