Advertisement
trippyt

NewAquariumLights.py

Jul 12th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.00 KB | None | 0 0
  1. import time
  2. import logging
  3. from logging.handlers import TimedRotatingFileHandler
  4. try:
  5. import RPi.GPIO as GPIO
  6. except:
  7. import dummyGPIO as GPIO
  8. GPIO.setmode(GPIO.BCM)
  9. GPIO.setwarnings(False)
  10. GPIO.setup(13,GPIO.OUT)
  11. GPIO.setup(5,GPIO.OUT)
  12.  
  13. # Toggle Modes
  14. OFF = 0
  15. DAY = 1
  16. NIGHT = 2
  17. VALID_TOGGLE_MODES = [OFF, DAY, NIGHT]
  18.  
  19. TOGGLE_MODE_STR = ['off', 'day', 'night']
  20.  
  21. def create_timed_rotating_log(path):
  22. logger = logging.getLogger("Rotating Log")
  23. logger.setLevel(logging.INFO)
  24.  
  25. handler = TimedRotatingFileHandler(path,
  26. when="m",
  27. interval=1,
  28. backupCount=1)
  29. logger.addHandler(handler)
  30.  
  31. for i in range(1):
  32.  
  33. logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
  34. logger.info("This is a test!")
  35.  
  36. log_file = "/home/pi/Aquarium/meltz/Logs/logfile.log"
  37. create_timed_rotating_log(log_file)
  38.  
  39. class LightControl(object):
  40. def __init__(self): #Default settings
  41. self._auto = True
  42. self._toggle = OFF
  43. self._day_hour = 8
  44. self._night_hour = 20
  45. self._off_hour = 0
  46. self._current_status = 'unknown'
  47. self._schedule = [OFF for i in range(24)]
  48.  
  49. @property
  50. def schedule(self):
  51. return [TOGGLE_MODE_STR[i] for i in self._schedule]
  52.  
  53. @schedule.setter
  54. def schedule(self, new_val):
  55. if len(new_val) != 24:
  56. raise(Exception('Schedule length must be 24!'))
  57.  
  58. if isinstance(new_val[0], str):
  59. if new_val[0] in TOGGLE_MODE_STR:
  60. # schedule array is "off", "night", "day"
  61. self._schedule = [TOGGLE_MODE_STR.index(mode.lower()) for mode in new_val]
  62. else:
  63. # schedule array is "0", "1", "2"
  64. self._schedule = [int(i)%len(TOGGLE_MODE_STR) for i in new_val]
  65. elif isinstance(new_val[0], int):
  66. # schedule array is 0, 1, 2
  67. self._schedule = [i%len(TOGGLE_MODE_STR) for i in new_val]
  68. else:
  69. raise(Exception('Unknown format of Schedule array'))
  70.  
  71. @property
  72. def auto(self):
  73. return self._auto
  74.  
  75. @auto.setter
  76. def auto(self, new_val):
  77. self._auto = bool(int(new_val) and True)
  78.  
  79. @property
  80. def toggle(self):
  81. return self._toggle
  82.  
  83. @toggle.setter
  84. def toggle(self, new_val):
  85. if int(new_val) not in VALID_TOGGLE_MODES:
  86. raise(Exception('AquariumLights: Invalid toggle mode!'))
  87.  
  88. self._toggle = int(new_val)
  89.  
  90. @property
  91. def day_hour(self):
  92. return self._day_hour
  93.  
  94. @day_hour.setter
  95. def day_hour(self, new_val):
  96. if int(new_val) >= 24:
  97. raise(Exception('AquariumLights: Invalid day_hour!'))
  98.  
  99. self._day_hour = int(new_val)
  100. self.schedule_range()
  101.  
  102. @property
  103. def night_hour(self):
  104. return self._night_hour
  105.  
  106. @night_hour.setter
  107. def night_hour(self, new_val):
  108. if int(new_val) >= 24:
  109. raise(Exception('AquariumLights: Invalid night_hour!'))
  110.  
  111. self._night_hour = int(new_val)
  112. self.schedule_range()
  113.  
  114. @property
  115. def off_hour(self):
  116. return self._off_hour
  117.  
  118. @off_hour.setter
  119. def off_hour(self, new_val):
  120. if int(new_val) >= 24:
  121. raise(Exception('AquariumLights: Invalid off_hour!'))
  122.  
  123. self._off_hour = int(new_val)
  124. self.schedule_range()
  125.  
  126. def schedule_range(self):
  127. # set up schedule based on day_hour, night_hour, off_hour
  128. if self._day_hour <= self._night_hour <= self._off_hour:
  129. self._schedule = [OFF for i in range(0, self._day_hour)] +\
  130. [DAY for i in range(self._day_hour, self._night_hour)] +\
  131. [NIGHT for i in range(self._night_hour, self._off_hour)] +\
  132. [OFF for i in range(self._off_hour, 24)]
  133. elif self._day_hour <= self._off_hour <= self._night_hour:
  134. self._schedule = [NIGHT for i in range(0, self._day_hour)] +\
  135. [DAY for i in range(self._day_hour, self._off_hour)] +\
  136. [OFF for i in range(self._off_hour, self._night_hour)] +\
  137. [NIGHT for i in range(self._night_hour, 24)]
  138. elif self._off_hour <= self._day_hour <= self._night_hour:
  139. self._schedule = [NIGHT for i in range(0, self._off_hour)] +\
  140. [OFF for i in range(self._off_hour, self._day_hour)] +\
  141. [DAY for i in range(self._day_hour, self._night_hour)] +\
  142. [NIGHT for i in range(self._night_hour, 24)]
  143.  
  144. def get_config_state(self):
  145. return {'auto': self._auto,
  146. 'toggle': TOGGLE_MODE_STR[self._toggle],
  147. 'day_hour': self._day_hour,
  148. 'night_hour': self._night_hour,
  149. 'off_hour': self._off_hour,
  150. 'schedule': [TOGGLE_MODE_STR[i] for i in self._schedule]
  151. }
  152.  
  153. def daylights_on(self): #Activates Daylights
  154. if self._current_status != 'day':
  155. self._current_status = 'day'
  156. GPIO.output(13,0)
  157. GPIO.output(5,1)
  158. GPIO.output(13,1)
  159. print("DayLights: On")
  160. logging.debug("Day Mode is Active")
  161.  
  162. def nightlights_on(self): #Activates Nightlights
  163. if self._current_status != 'night':
  164. self._current_status = 'night'
  165. GPIO.output(13,0)
  166. GPIO.output(5,1)
  167. GPIO.output(13,0)
  168. print("NightLights: On")
  169. logging.debug("Night Mode is Active")
  170.  
  171. def lights_off(self): # Deactivates any light mode
  172. if self._current_status != 'off':
  173. self._current_status = 'off'
  174. GPIO.output(5,0)
  175. print("Lights: Off")
  176. logging.debug("Off Mode is Active")
  177.  
  178. def check(self):
  179. if self._auto == True:
  180. print('Auto Mode')
  181. logging.debug("Auto Mode is Switched ON")
  182. self.light_logic()
  183. elif self._toggle == OFF:
  184. print('Toggle Mode Off')
  185. logging.debug("Auto Mode is Toggled OFF")
  186. self.lights_off()
  187. elif self._toggle == DAY:
  188. print('Toggle Mode Day')
  189. logging.debug("Day Mode is Toggled ON")
  190. self.daylights_on()
  191. elif self._toggle == NIGHT:
  192. print('Toggle Mode Night')
  193. logging.debug("Night Mode is Toggled ON")
  194. self.nightlights_on()
  195.  
  196. def light_logic(self):
  197. hour = int(time.strftime('%H'))
  198.  
  199. if self._schedule[hour] == DAY:
  200. self.daylights_on()
  201. elif self._schedule[hour] == NIGHT:
  202. self.nightlights_on()
  203. else:
  204. self.lights_off()
  205. print('Hour not found in any range!')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement