# Describes feeds used to hold Adafruit IO data feed_aqi = io.get_feed("air-quality-sensor.aqi") feed_aqi_category = io.get_feed("air-quality-sensor.category") feed_humidity = io.get_feed("air-quality-sensor.humidity") feed_temperature = io.get_feed("air-quality-sensor.temperature") # Set up location metadata from secrets.py file location_metadata = (secrets["latitude"], secrets["longitude"], secrets["elevation"]) elapsed_minutes = 0 prv_mins = 0 while True: try: print("Fetching time...") cur_time = io.receive_time() print("Time fetched OK!") # Hourly reset if cur_time.tm_min == 0: prv_mins = 0 except (ValueError, RuntimeError) as e: print("Failed to fetch time, retrying\n", e) wifi.reset() wifi.connect() continue if cur_time.tm_min >= prv_mins: print("%d min elapsed.." % elapsed_minutes) prv_mins = cur_time.tm_min elapsed_minutes += 1
# set the panel meters to zero (0) based on their offsets # (this could be different for everyone) analog_hours.duty_cycle = HOUR_OFFSET analog_minutes.duty_cycle = MIN_OFFSET analog_seconds.duty_cycle = SEC_OFFSET # initialize hours, minutes and seconds to 0 # this forces a sync on the intial loop hours = 0 minutes = 0 seconds = 0 while True: # sync the clock on intitial loop and every 4 hours if (hours % 4, minutes, seconds) == (0, 0, 0): print("\nSyncing Clock...\n") RTC_CLOCK.datetime = io.receive_time() hours = (RTC_CLOCK.datetime.tm_hour % 12) minutes = RTC_CLOCK.datetime.tm_min seconds = RTC_CLOCK.datetime.tm_sec print("%02d:%02d:%02d" % (hours, minutes, seconds)) # calculate the location for each panel meter analog_seconds.duty_cycle = int(SEC_OFFSET + seconds * (60500 / 60)) analog_minutes.duty_cycle = int(MIN_OFFSET + minutes * (60500 / 60)) analog_hours.duty_cycle = int(HOUR_OFFSET + hours * (60500 / 12))
days = io.receive_data(days_feed["key"])["value"].split(",") print(days) # get data from alarm time feed alarm_time = io.receive_data(time_feed["key"])["value"].split(":") print(alarm_time) # get data from skip alarm feed skip = io.receive_data(skip_feed["key"])["value"] print(skip) last_1 = time.monotonic() # Get data from digital feed digital_feed_data = io.receive_data(digital_feed["key"]) digital = digital_feed_data["value"] # Get the datetime dt = io.receive_time() print(dt) # Format the datetime to iso8601 iso_8601 = ( f"{dt[0]:04d}-{dt[1]:02d}-{dt[2]:02d}T{dt[3]:02d}:{dt[4]:02d}:{dt[5]:02d}Z" ) _time = (int(dt[3]), int(dt[4]), int(dt[5])) print(iso_8601) # Check if data is ON or OFF if digital == "ON": print("received <= ON\n") RELAY.value = 1 elif digital == "OFF": print("received <= OFF\n")
board.DISPLAY.brightness = val while True: # read the light sensor light_value = light_sensor.value print('Light Value: ', light_value) # read the temperature sensor temperature = adt.temperature try: # WiFi Connection if light_value < 1000: # turn on the backlight set_backlight(1) print('displaying temperature...') gfx.display_temp(temperature) # Get and display date and time form Adafruit IO print('Getting time from Adafruit IO...') datetime = io.receive_time() print('displaying time...') gfx.display_date_time(datetime) else: # turn off the backlight set_backlight(0) try: # send temperature data to IO gfx.display_io_status('Sending data...') print('Sending data to Adafruit IO...') io.send_data(temperature_feed['key'], temperature) print('Data sent!') gfx.display_io_status('Data sent!') except AdafruitIO_RequestError as e: raise AdafruitIO_RequestError('IO Error: ', e) except (ValueError, RuntimeError) as e: # WiFi Connection Failure print("Failed to get data, retrying\n", e) wifi.reset()
print("Ping google.com: %d ms" % esp.ping("google.com")) status_pixel.fill(0x00FF00) # we're connected, so make it green # ############## MAIN LOOP ############### # Define the AQI outside of the loop so it persists. aqi = 0 while True: try: current_time = time.monotonic() if current_time > next_rtc_sync: status_pixel.fill(0x0000FF) # blue while we're syncing the time print("Syncing time:") now = io.receive_time() # grab time print("Got time") print(now) rtc.RTC().datetime = now # set the time time_format(time.localtime()) # format the time print(time_display) # Print it to serial, for debugging. print(date_display) dow = get_day_of_week(now) # Calculate the day of the week. print("Day of week: " + dow) next_rtc_sync = (current_time + TIME_BETWEEN_RTC_SYNCS ) # Decide when to next sync the time. if current_time > next_weather_check: # Check weather and AQI. status_pixel.fill(0x00FFFF) # cyan print("Getting AQI!")
class SensorLogger: def __init__(self, i2c_bus=None): # Get wifi details and more from a secrets.py file try: from secrets import secrets self._secrets = secrets except ImportError: raise RuntimeError( "WiFi secrets are kept in secrets.py, please add them there!") try: from settings import settings self._settings = settings except ImportError: raise RuntimeError("Settings file settings.py missing") if i2c_bus: self._i2c = i2c_bus else: self._i2c = board.I2C() self._error_log_file = settings["error_log_filename"] self.io = None self._initialize_wifi() self._initialize_sensors() self._initialize_io() # self.battery = analogio.AnalogIn(board.BATTERY) self.temperature_feed = None self.humidity_feed = None self.batt_volts_feed = None self.heater_state = False def _log_exceptions(func): # pylint:disable=protected-access def _decorator(self, *args, **kwargs): retval = None try: retval = func(self, *args, **kwargs) return retval except Exception as e: err_str = "ERROR in %s\n%s\n" % (func.__name__, e) if self._settings["log_errors_to_file"]: storage.remount("/", disable_concurrent_write_protection=False) with open(self._error_log_file, "a") as err_log: err_log.write(err_str) storage.remount("/", False) print(err_str) return retval return _decorator def _initialize_wifi(self): # Get wifi details and more from a secrets.py file try: from secrets import secrets self._secrets = secrets except ImportError as e: print( "WiFi secrets are kept in secrets.py, please add them there!") raise e from None # ESP32 Setup try: esp32_cs = DigitalInOut(board.D13) esp32_ready = DigitalInOut(board.D11) esp32_reset = DigitalInOut(board.D12) except AttributeError: esp32_cs = DigitalInOut(board.ESP_CS) esp32_ready = DigitalInOut(board.ESP_BUSY) esp32_reset = DigitalInOut(board.ESP_RESET) self._spi = busio.SPI(board.SCK, board.MOSI, board.MISO) self._esp = adafruit_esp32spi.ESP_SPIcontrol( self._spi, esp32_cs, esp32_ready, esp32_reset, service_function=self.service) status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.1) self.wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager( self._esp, self._secrets, status_light) def service(self): # add touch_screen_service button_machine.service() screen_machine.service() @_log_exceptions def _initialize_io(self): aio_username = self._secrets["aio_username"] aio_key = self._secrets["aio_key"] # Create an instance of the Adafruit IO HTTP client self.io = IO_HTTP(aio_username, aio_key, self.wifi) clock = rtc.RTC() clock.datetime = self.io.receive_time() self._initialize_feeds() @_log_exceptions def _initialize_feeds(self): self.temperature_feed = self.io.get_feed( self._secrets["aio_temp_feed"]) self.humidity_feed = self.io.get_feed(self._secrets["aio_hum_feed"]) self.rssi_feed = self.io.get_feed(self._secrets["aio_rssi_feed"]) if 'aio_heater_feed' in self._secrets: self.heater_feed = self.io.get_feed( self._secrets["aio_heater_feed"]) # self.batt_volts_feed = self.io.get_feed("batt-volts") @_log_exceptions def _initialize_sensors(self): if not self.io: self._initialize_io self.temp_sensor = PHT_SENSOR(self._i2c) self.humidity_sensor = self.temp_sensor @_log_exceptions def log_sensors(self): if not (self.humidity_feed and self.temperature_feed): self._initialize_feeds() temp = self.temp_sensor.temperature hum = self.humidity_sensor.relative_humidity rssi = self.wifi.signal_strength() print("\033[1mTmemperature:\033[0m %0.3f k ÂșC" % temp) print("\033[1mHumidity:\033[0m %0.2f %%" % hum) print("\033[1mRSSI:\033[0m %0.2f" % rssi) if self.heater_feed: if temp < 29.0: self.heater_state = True elif temp > 31.0: self.heater_state = False print("\033[1mHeater on:\033[0m", self.heater_state) self.io.send_data(self.heater_feed["key"], self.heater_state) self.io.send_data(self.temperature_feed["key"], temp) self.io.send_data(self.humidity_feed["key"], hum) self.io.send_data(self.rssi_feed["key"], rssi)