Best answer is: email Adafruit support, the team will get your feeds reenabled as soon as possible.
If you're aware that you're data is not worth anything and are happy to lose it all, then proceed to follow this guide to just recreate all the feed names.
Short answer is if there are only a couple then do it by hand, otherwise this script will save you a bit of time. I had nearly a hundred, and was curious on the state of the adafruit-io python library, so this happened :shrug:
This will delete and recreate all feeds that are disabled, except those that are part of WipperSnapper devices (you can now export those and then delete the device and re-import the exported JSON file).
You'll need the adafruit-io python library, which is normally installed with this command:
pip install adafruit-io
However I've modified the adafruit-io library to add the enabled flag, and it's not released yet so for now you'll want the following command instead:
pip install git+https://github.com/adafruit/Adafruit_IO_Python.git#add-enabled-attribute
Then the script (see end of page) needs to be run, and if you use the -a
command line argument then it runs without user confirmation (happens per feed). You'll need to update the script with your adafruit IO credentials, or pass them in as arguments/environment-variables.
e.g.
python undisable-adafruit-io-grouped-feeds.py -a
example output (with debug=true changed in the script):
Fetching groups and their feeds... Skipping enabled feed: -really-silly Skipping enabled feed: 70041DF7750A-AfF-esp32s2-rev-tft-scd4x-co2 *** Found WipperSnapper group: Feather Huzzah ESP8266 Stackable Export WipperSnapper device config and re-import instead of deleting and recreating feeds!!! https://io.adafruit.com/tyeth/devices/feather-esp826623549144 Skipping enabled feed: silly-named-feed Found disabled feed in group 'My Feeds': temp DEBUG: Old feed DEBUG: obj: Feed(name='temp', key='temp', id=2687188, description='', enabled=False, unit_type=None, unit_symbol=None, history=True, visibility='private', license=None, status_notify=False, status_timeout=4320) Deleting feed: temp Enabling feed in cloned object... DEBUG: Enabled feed clone - double check!!! DEBUG: obj: Feed(name='temp', key='temp', id=2687188, description='', enabled=True, unit_type=None, unit_symbol=None, history=True, visibility='private', license=None, status_notify=False, status_timeout=4320) Recreating feed: temp Successfully recreated and reassigned feed: temp to group 'My Feeds' DEBUG: New feed DEBUG: obj: Feed(name='temp', key='temp', id=2687190, description='', enabled=True, unit_type=None, unit_symbol=None, history=True, visibility='private', license=None, status_notify=False, status_timeout=4320) Skipping enabled feed: temperature Found WipperSnapper group: BANANA Adafruit ESP32-S3 Feather with 4MB Flash 2MB PSRAM Export WipperSnapper device config and re-import instead of deleting and recreating feeds!!! https://io.adafruit.com/tyeth/devices/feather-esp32s3-4mbflash-2mbpsram13617589 Skipping enabled feed: toast_burnt Skipping enabled feed: toast_burnt_this_month Skipping enabled feed: voc Skipping enabled feed: voc_events_last10seconds Skipping enabled feed: plant-sht3x-seedlings-external-humidity Skipping enabled feed: plant-sht3x-seedlings-external-temp Skipping enabled feed: plant-si7021-seedlings-internal-hum Skipping enabled feed: plant-si7021-seedlings-internal-temp Feed management completed.
""" undisable-adafruit-io-feeds.py Evaluates all Adafruit IO feeds, identifies disabled feeds, by group if any, and automatically deletes and recreates each disabled feed. It offers an interactive mode for step-by-step confirmation and an automated mode for direct processing. """ # Change these or set environment variables / pass arguments DEFAULT_ADAFRUIT_IO_USERNAME = 'YOUR_ADAFRUIT_IO_USERNAME' DEFAULT_ADAFRUIT_IO_KEY = 'YOUR_ADAFRUIT_IO_KEY' DEBUG = False import sys import os import argparse import time from Adafruit_IO import Client, RequestError, Feed # Command-line Argument Parser Setup parser = argparse.ArgumentParser(description="Manage Adafruit IO feeds.") parser.add_argument("-a", "--automated", help="Enable automated mode", action="store_true") parser.add_argument("-u", "--username", help="Adafruit IO Username", type=str) parser.add_argument("-k", "--key", help="Adafruit IO Key", type=str) args = parser.parse_args() # Environment Variables / Arguments / Defaults ADAFRUIT_IO_USERNAME = args.username or os.environ.get("ADAFRUIT_IO_USERNAME", DEFAULT_ADAFRUIT_IO_USERNAME) ADAFRUIT_IO_KEY = args.key or os.environ.get("ADAFRUIT_IO_KEY", DEFAULT_ADAFRUIT_IO_KEY) def main(): """ Main function to handle the feed management process. """ # Initialize Adafruit IO Client aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) # Determine mode mode = 'automated' if args.automated else 'interactive' if mode == 'interactive': print("Running in interactive mode. Use -a or --automated for automated mode.") try: print("Fetching groups and their feeds...") # Fetch all groups and their feeds groups = aio.groups() for group in groups: if group.description == 'A WipperSnapper Device': print("** Found WipperSnapper group:", group.name) print("Export WipperSnapper device config and re-import instead of deleting and recreating feeds!!!") print(f"https://io.adafruit.com/{ADAFRUIT_IO_USERNAME}/devices/{group.key}") continue for feed in group.feeds: if hasattr(feed, "enabled") and feed.enabled is False: print(f"Found disabled feed in group '{group.name}': {feed.name}") if mode == 'interactive': confirm = input(f"Do you want to delete and recreate the feed '{feed.name}' in group '{group.name}'? (y/N): ").strip().upper() if confirm != 'Y': continue if DEBUG: print("DEBUG: Old feed") print("DEBUG: obj:", feed) print("") # Delete the disabled feed print(f"Deleting feed: {feed.name}") aio.delete_feed(feed.key) # Wait for Adafruit IO to process the deletion time.sleep(0.25) print("Enabling feed in cloned object...") feed = feed._replace(enabled=True) if DEBUG: print("DEBUG: Enabled feed clone - double check!!!") print("DEBUG: obj:", feed) print("") # Recreate the feed with the same settings print(f"Recreating feed: {feed.name}") new_feed = aio.create_feed(feed, group.key if group.key else None) # Reassign to group print(f"Successfully recreated and reassigned feed: {new_feed.name} to group '{group.name}'") if DEBUG: print("DEBUG: New feed") print("DEBUG: obj:", new_feed) print("") else: print(f"Skipping enabled feed: {feed.name}") except RequestError as e: print(f"An error occurred: {e}") sys.exit(1) print("Feed management completed.") if __name__ == "__main__": main()