Add CircuitPython Code
In the embedded code element below, click on the Download: Project Zip link, and save the .zip archive file to your computer.
Then, uncompress the .zip file, it will unpack to a folder named Adafruit_IO_Power_Relay.
Copy the contents of Adafruit_IO_Power_Relay directory to your PyPortal's CIRCUITPY drive.
# SPDX-FileCopyrightText: 2020 Brent Rubell for Adafruit Industries # # SPDX-License-Identifier: MIT import os import time import board import busio from digitalio import DigitalInOut import neopixel import adafruit_connection_manager from adafruit_esp32spi import adafruit_esp32spi from adafruit_esp32spi import adafruit_esp32spi_wifimanager import adafruit_minimqtt.adafruit_minimqtt as MQTT ### WiFi ### secrets = { "ssid" : os.getenv("CIRCUITPY_WIFI_SSID"), "password" : os.getenv("CIRCUITPY_WIFI_PASSWORD"), } # 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) # Set up a pin for controlling the relay power_pin = DigitalInOut(board.D3) power_pin.switch_to_output() ### Feeds ### # Set up a feed named Relay for subscribing to the relay feed on Adafruit IO feed_relay = os.getenv("AIO_USERNAME") + "/feeds/relay" ### Code ### # Define callback methods which are called when events occur # pylint: disable=unused-argument, redefined-outer-name def connected(client, userdata, flags, rc): # This function will be called when the client is connected # successfully to the broker. print("Connected to Adafruit IO!") def disconnected(client, userdata, rc): # This method is called when the client is disconnected print("Disconnected from Adafruit IO!") def subscribe(client, userdata, topic, granted_qos): # This method is called when the client subscribes to a new feed. print("Subscribed to {0}".format(topic)) 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)) def on_message(client, topic, message): # Method callled when a client's subscribed feed has a new value. print("New message on topic {0}: {1}".format(topic, message)) def on_relay_msg(client, topic, value): # Called when relay feed obtains a new value print("Turning Relay %s"%value) if value == "ON": power_pin.value = True elif value == "OFF": power_pin.value = False else: print("Unexpected value received on relay feed.") # Connect to WiFi print("Connecting to WiFi...") wifi.connect() print("Connected!") pool = adafruit_connection_manager.get_radio_socketpool(esp) ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) # Set up a MiniMQTT Client client = MQTT.MQTT( broker="io.adafruit.com", username=os.getenv("AIO_USERNAME"), password=os.getenv("AIO_KEY"), socket_pool=pool, ssl_context=ssl_context, ) # Setup the callback methods above client.on_connect = connected client.on_disconnect = disconnected client.on_subscribe = subscribe client.on_unsubscribe = unsubscribe client.on_message = on_message # Add a callback to the relay feed client.add_topic_callback(feed_relay, on_relay_msg) # Connect the client to Adafruit IO print("Connecting to Adafruit IO...") client.connect() # Subscribe to all updates on relay feed client.subscribe(feed_relay) while True: try: # Poll for new messages on feed_relay client.loop() except (ValueError, RuntimeError, ConnectionError, OSError) as e: print("Failed to get data, retrying\n", e) wifi.reset() client.reconnect() continue time.sleep(0.05)
Once all the files are copied from your computer to the PyPortal, you should have the following files on your CIRCUITPY drive:
settings.toml File Setup
Add your WiFi credentials and your AdafruitIO credentials to settings.toml. You can find your AIO username key from io.adafruit.com. Simply click the Adafruit IO Key on the right hand side of the Adafruit IO header to obtain this information.
CIRCUITPY_WIFI_SSID = "your_wifi_ssid" CIRCUITPY_WIFI_PASSWORD = "your_wifi_password" AIO_USERNAME = "your_aio_username" AIO_KEY = "your_aio_key" TIMEZONE = "America/New_York" # http://worldtimeapi.org/timezones
Test Code
Before wiring everything up, it's important to test the code so it works as-expected.
Open the CircuitPython REPL. The following should output in the REPL:
code.py output: Connecting to WiFi... Connected! Connecting to Adafruit IO... Connected to Adafruit IO! Subscribed to brubell/feeds/relay
Navigate to the Adafruit IO Dashboard you created earlier and toggle the Power switch.
The REPL should output "Turning Relay ON"
Toggling the power switch to the off position should output "Turning Relay OFF" in the REPL.
Text editor powered by tinymce.