-
Notifications
You must be signed in to change notification settings - Fork 33
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #46 from brentru/add-callback-feed
Add feed callback mechanism
- Loading branch information
Showing
2 changed files
with
159 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
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! Listening for DemoFeed changes...") | ||
|
||
|
||
def subscribe(client, userdata, topic, granted_qos): | ||
# This method is called when the client subscribes to a new feed. | ||
print("Subscribed to {0} with QOS level {1}".format(topic, granted_qos)) | ||
|
||
|
||
def unsubscribe(client, userdata, topic, pid): | ||
# This method is called when the client unsubscribes from a feed. | ||
print("Unsubscribed from {0} with PID {1}".format(topic, pid)) | ||
|
||
|
||
# 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 on_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)) | ||
|
||
|
||
def on_battery_msg(client, topic, message): | ||
# Method called whenever user/feeds/battery has a new value | ||
print("Battery level: {}v".format(message)) | ||
|
||
|
||
# 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_username"], | ||
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_subscribe = subscribe | ||
io.on_unsubscribe = unsubscribe | ||
io.on_message = on_message | ||
|
||
# Connect to Adafruit IO | ||
print("Connecting to Adafruit IO...") | ||
io.connect() | ||
|
||
# Set up a message handler for the battery feed | ||
io.add_feed_callback("battery", on_battery_msg) | ||
|
||
# Subscribe to all messages on the battery feed | ||
io.subscribe("battery") | ||
|
||
# Start a blocking loop to check for new messages | ||
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(0.5) |