/ FunHouse_LIFX / code.py
code.py
  1  # SPDX-FileCopyrightText: 2021 John Park for Adafruit Industries
  2  # SPDX-License-Identifier: MIT
  3  # FunHouse PIR Motion Sensor for LIFX light bulbs
  4  import time
  5  import ssl
  6  import socketpool
  7  import wifi
  8  import adafruit_requests
  9  from adafruit_funhouse import FunHouse
 10  import adafruit_lifx
 11  
 12  # Get wifi details and more from a secrets.py file
 13  try:
 14      from secrets import secrets
 15  except ImportError:
 16      print("WiFi and API secrets are kept in secrets.py, please add them there!")
 17      raise
 18  
 19  # choose colors here. Note formatting differences.
 20  default_bulb_color = "#002010"
 21  default_led_color = 0x002010
 22  tripped_bulb_color = "#440044"
 23  tripped_led_color = 0x440044
 24  
 25  # Set up ESP32-S2 and adafruit_requests session
 26  wifi.radio.connect(ssid=secrets["ssid"], password=secrets["password"])
 27  pool = socketpool.SocketPool(wifi.radio)
 28  http_session = adafruit_requests.Session(pool, ssl.create_default_context())
 29  
 30  # Add your LIFX Personal Access token to secrets.py
 31  # (to obtain a token, visit: https://cloud.lifx.com/settings)
 32  lifx_token = secrets["lifx_token"]
 33  
 34  # Set this to your LIFX light separator label
 35  # https://api.developer.lifx.com/docs/selectors
 36  lifx_light = "label:Lamp"
 37  
 38  # Initialize the LIFX API Client
 39  lifx = adafruit_lifx.LIFX(http_session, lifx_token)
 40  
 41  # List all lights
 42  lights = lifx.list_lights()
 43  # print(lights)  # uncomment for lots of LIFX light info
 44  
 45  funhouse = FunHouse(default_bg=0x000F20, scale=3)
 46  
 47  pir_state = 0
 48  running_state = False
 49  trip_time = 30  # seconds to stay tripped, adjust this with buttons while running
 50  
 51  funhouse.peripherals.dotstars.fill(default_led_color)
 52  
 53  
 54  def set_label_color(conditional, index, on_color):
 55      if conditional:
 56          funhouse.set_text_color(on_color, index)
 57      else:
 58          funhouse.set_text_color(0x606060, index)
 59  
 60  
 61  # Create the labels
 62  funhouse.display.show(None)
 63  up_label = funhouse.add_text(text="+", text_position=(3, 6), text_color=0x606060)
 64  down_label = funhouse.add_text(text="-", text_position=(3, 40), text_color=0x606060)
 65  running_label = funhouse.add_text(
 66      text="paused", text_position=(2, 68), text_color=0x606060
 67  )
 68  time_label = funhouse.add_text(
 69      text=trip_time, text_scale=2, text_position=(30, 25), text_color=0x606060
 70  )
 71  
 72  funhouse.display.show(funhouse.splash)
 73  
 74  # Turn on the light
 75  print("Turning on light...")
 76  lifx.toggle_light(lifx_light)
 77  
 78  # Set the light's brightness
 79  light_brightness = 0.65
 80  lifx.set_brightness(lifx_light, light_brightness)
 81  lifx.set_color(
 82      lifx_light, power="on", color=default_bulb_color, brightness=light_brightness
 83  )
 84  
 85  
 86  while True:
 87  
 88      if funhouse.peripherals.button_up:
 89          trip_time = trip_time + 1
 90          funhouse.set_text(trip_time, time_label)
 91          funhouse.set_text_color(0xFFFFFF, up_label)
 92          time.sleep(0.2)
 93      else:
 94          funhouse.set_text_color(0x606060, up_label)
 95  
 96      if funhouse.peripherals.button_sel:
 97          trip_time = abs(trip_time - 1)
 98          funhouse.set_text(trip_time, time_label)
 99          funhouse.set_text_color(0xFFFFFF, down_label)
100          time.sleep(0.2)
101      else:
102          funhouse.set_text_color(0x606060, down_label)
103  
104      if funhouse.peripherals.button_down:
105          if running_state is False:  # it's currently paused, so unpause it
106              running_state = True  # flip the state
107              funhouse.set_text("..prepping..", running_label)
108              time.sleep(6)  # pause to get out of range
109              funhouse.set_text("sensing...", running_label)
110  
111          else:  # it's currently running, so pause it
112              running_state = False
113              funhouse.set_text("paused", running_label)
114              time.sleep(0.5)
115  
116      # when sensor is tripped, set the color x amount of time
117      if running_state is True and funhouse.peripherals.pir_sensor and pir_state is 0:
118          funhouse.peripherals.dotstars.fill(tripped_led_color)
119          funhouse.set_text("tripped", running_label)
120          lifx.set_color(
121              lifx_light,
122              power="on",
123              color=tripped_bulb_color,
124              brightness=light_brightness,
125          )
126          prior_trip_time = trip_time  # store the state of the trip time value
127          for _ in range(trip_time):
128              time.sleep(1)
129              trip_time = trip_time - 1
130              funhouse.set_text(trip_time, time_label)
131          pir_state = 1
132          trip_time = prior_trip_time  # restore the trip time value
133  
134      # return to default color
135      elif (
136              running_state is True and not funhouse.peripherals.pir_sensor and pir_state is 1
137      ):
138          funhouse.peripherals.dotstars.fill(default_led_color)
139          funhouse.set_text("sensing...", running_label)
140          lifx.set_color(
141              lifx_light,
142              power="on",
143              color=default_bulb_color,
144              brightness=light_brightness,
145          )
146          funhouse.set_text(trip_time, time_label)
147          pir_state = 0