mqtt on/off message on button press



  • for those who searched and need a simple sketch on how to send an ON/OFF MQTT message with a switch here it is:

    Based on a GPY, commented are for WIFI, use accordingly.

    enjoy.

    from network import LTE
    from machine import Pin
    from umqtt import MQTTClient
    import machine
    import time
    
    
    is_pressed = False
    button = Pin("P10", mode=Pin.IN, pull=Pin.PULL_UP)
    
    
    
    
    def settimeout(duration):
         pass
    lte = LTE()
    
     # Modem does not connect successfully without first being reset.
    print("Resetting LTE modem ... ", end='')
    lte.send_at_cmd('AT^RESET')
    print("OK")
    time.sleep(1)
    
    print("Configuring LTE ", end='')
    lte.send_at_cmd('AT+CGDCONT=1,"IP","yourAPN"')
    print(".", end='')
    lte.send_at_cmd('AT!="RRC::addscanfreq band=2, 4, 5 dl-earfcn=9410"')
    print(".", end='')
    lte.send_at_cmd('AT+CFUN=1')
    print(" OK")
    
    if not lte.isattached():
        print("Attaching to LTE network ", end='')
        lte.attach()
        while(True):
            if lte.isattached():
                print(" OK")
                break
            print('.', end='')
            time.sleep(1)
    
        # Once attached, connect() should succeed.
        if not lte.isconnected():
            print("Connecting on LTE network ", end='')
            lte.connect()
            while(True):
                if lte.isconnected():
                    print(" OK")
                    break
                print('.', end='')
                time.sleep(1)
    lte.connect()
    while not lte.isconnected():
        machine.idle()
    
    print("Connected to LTE\n")
    #wlan = WLAN(mode=WLAN.STA)
    #wlan.antenna(WLAN.EXT_ANT)
    #wlan.connect("yourwifi", auth=(WLAN.WPA2, "yourpass"), timeout=5000)
    
    #while not wlan.isconnected():
    
    
    #print("Connected to Wifi\n")
    client = MQTTClient("joe", "yourMQTTbroker", port=1883)
    client.settimeout = settimeout
    client.connect()
    
    while True:
        if button() == 1 and not is_pressed:
            time.sleep(1)
        elif button() == 0 and not is_pressed:
            print("Button pressed")
            print("Sending ON")
            client.publish("/gpy", "ON")
            is_pressed = True
            time.sleep(1)
        elif button() == 1 and is_pressed:
            print("Button released")
            print("Sending OFF")
            client.publish("/gpy", "OFF")
            is_pressed = False
            time.sleep(1)
        else:
            pass
    


  • @jupiter8 thx for your code :)
    This is what I was looking for.
    Is there a way to disconnect Lte to save power and only power up to send the message?
    I did some adjustments to check connectivity but I can’t break
    the loop.. so the Message is send again after a undefined period of time..
    Next thing: the program exit on error 104 if the button debounce (reed contact)
    Awesome would be something like:
    In deepsleep wait for interrupt - if interrupted by button
    Connect to lte > publish actual state of button/reed ( door locked / door unlocked & door closed / door open) + Rtc and battery (ok / low/ warning) > disconnect Lte > deepsleep. > wait for interrupt.

    Is this easy to develop or never can be handled by an newbie??

    Kind regards


Log in to reply
 

Pycom on Twitter