# 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))
Пример #3
0
            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")
Пример #4
0
    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()
Пример #5
0
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!")
Пример #6
0
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)