129 lines
4.2 KiB
Python
Executable file
129 lines
4.2 KiB
Python
Executable file
# Adafruit IO provides some built-in MQTT topics
|
|
# for obtaining the current server time, if you don't have
|
|
# access to a RTC module.
|
|
import time
|
|
import board
|
|
import busio
|
|
from digitalio import DigitalInOut
|
|
from adafruit_esp32spi import adafruit_esp32spi
|
|
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
|
|
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
|
|
import neopixel
|
|
|
|
import adafruit_minimqtt.adafruit_minimqtt as MQTT
|
|
from adafruit_io.adafruit_io import IO_MQTT
|
|
|
|
### WiFi ###
|
|
|
|
# Get wifi details and more from a secrets.py file
|
|
try:
|
|
from secrets import secrets
|
|
except ImportError:
|
|
print("WiFi secrets are kept in secrets.py, please add them there!")
|
|
raise
|
|
|
|
# If you are using a board with pre-defined ESP32 Pins:
|
|
esp32_cs = DigitalInOut(board.ESP_CS)
|
|
esp32_ready = DigitalInOut(board.ESP_BUSY)
|
|
esp32_reset = DigitalInOut(board.ESP_RESET)
|
|
|
|
# If you have an externally connected ESP32:
|
|
# esp32_cs = DigitalInOut(board.D9)
|
|
# esp32_ready = DigitalInOut(board.D10)
|
|
# esp32_reset = DigitalInOut(board.D5)
|
|
|
|
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
|
|
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
|
|
"""Use below for Most Boards"""
|
|
status_light = neopixel.NeoPixel(
|
|
board.NEOPIXEL, 1, brightness=0.2
|
|
) # Uncomment for Most Boards
|
|
"""Uncomment below for ItsyBitsy M4"""
|
|
# status_light = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1, brightness=0.2)
|
|
# Uncomment below for an externally defined RGB LED
|
|
# import adafruit_rgbled
|
|
# from adafruit_esp32spi import PWMOut
|
|
# RED_LED = PWMOut.PWMOut(esp, 26)
|
|
# GREEN_LED = PWMOut.PWMOut(esp, 27)
|
|
# BLUE_LED = PWMOut.PWMOut(esp, 25)
|
|
# status_light = adafruit_rgbled.RGBLED(RED_LED, BLUE_LED, GREEN_LED)
|
|
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light)
|
|
|
|
# Define callback functions which will be called when certain events happen.
|
|
# pylint: disable=unused-argument
|
|
def connected(client):
|
|
# Connected function will be called when the client is connected to Adafruit IO.
|
|
# This is a good place to subscribe to feed changes. The client parameter
|
|
# passed to this function is the Adafruit IO MQTT client so you can make
|
|
# calls against it easily.
|
|
print("Connected to Adafruit IO!")
|
|
|
|
# Subscribe to time/seconds topic
|
|
# https://io.adafruit.com/api/docs/mqtt.html#time-seconds
|
|
io.subscribe_to_time("seconds")
|
|
|
|
# Subscribe to time/millis topic
|
|
# https://io.adafruit.com/api/docs/mqtt.html#time-millis
|
|
io.subscribe_to_time("millis")
|
|
|
|
# Subscribe to time/ISO-8601 topic
|
|
# https://io.adafruit.com/api/docs/mqtt.html#time-iso-8601
|
|
io.subscribe_to_time("iso")
|
|
|
|
# Subscribe to time/hours topic
|
|
# NOTE: This topic only publishes once every hour.
|
|
# https://io.adafruit.com/api/docs/mqtt.html#adafruit-io-monitor
|
|
io.subscribe_to_time("hours")
|
|
|
|
|
|
# pylint: disable=unused-argument
|
|
def disconnected(client):
|
|
# Disconnected function will be called when the client disconnects.
|
|
print("Disconnected from Adafruit IO!")
|
|
|
|
|
|
# pylint: disable=unused-argument
|
|
def message(client, feed_id, payload):
|
|
# Message function will be called when a subscribed feed has a new value.
|
|
# The feed_id parameter identifies the feed, and the payload parameter has
|
|
# the new value.
|
|
print("Feed {0} received new value: {1}".format(feed_id, payload))
|
|
|
|
|
|
# Connect to WiFi
|
|
print("Connecting to WiFi...")
|
|
wifi.connect()
|
|
print("Connected!")
|
|
|
|
# Initialize MQTT interface with the esp interface
|
|
MQTT.set_socket(socket, esp)
|
|
|
|
# Initialize a new MQTT Client object
|
|
mqtt_client = MQTT.MQTT(
|
|
broker="io.adafruit.com", username=secrets["aio_user"], password=secrets["aio_key"],
|
|
)
|
|
|
|
# Initialize an Adafruit IO MQTT Client
|
|
io = IO_MQTT(mqtt_client)
|
|
|
|
# Connect the callback methods defined above to Adafruit IO
|
|
io.on_connect = connected
|
|
io.on_disconnect = disconnected
|
|
io.on_message = message
|
|
|
|
# Connect to Adafruit IO
|
|
io.connect()
|
|
|
|
|
|
# Start a blocking message loop...
|
|
# NOTE: NO code below this loop will execute
|
|
# NOTE: Network reconnection is handled within this loop
|
|
while True:
|
|
try:
|
|
io.loop()
|
|
except (ValueError, RuntimeError) as e:
|
|
print("Failed to get data, retrying\n", e)
|
|
wifi.reset()
|
|
io.reconnect()
|
|
continue
|
|
time.sleep(1)
|