+class GoogleLightGroup(GoogleLight):
+ def __init__(self, name: str, members: List[GoogleLight], keywords: str = "") -> None:
+ if len(members) < 1:
+ raise Exception("There must be at least one light in the group.")
+ self.members = members
+ mac = GoogleLightGroup.make_up_mac(members)
+ super().__init__(name, mac, keywords)
+
+ @staticmethod
+ def make_up_mac(members: List[GoogleLight]):
+ mac = members[0].get_mac()
+ b = mac.split(':')
+ b[5] = int(b[5], 16) + 1
+ if b[5] > 255:
+ b[5] = 0
+ b[5] = str(b[5])
+ return ":".join(b)
+
+ def is_on(self) -> bool:
+ r = ask_google(f"are {self.goog_name()} on?")
+ if not r.success:
+ return False
+ return 'is on' in r.audio_transcription
+
+ def get_dimmer_level(self) -> Optional[int]:
+ if not self.has_keyword("dimmer"):
+ return False
+ r = ask_google(f'how bright are {self.goog_name()}?')
+ if not r.success:
+ return None
+
+ # four lights are set to 100% brightness
+ txt = r.audio_transcription
+ m = re.search(r"(\d+)% bright", txt)
+ if m is not None:
+ return int(m.group(1))
+ if "is off" in txt:
+ return 0
+ return None
+
+ def set_dimmer_level(self, level: int) -> bool:
+ if not self.has_keyword("dimmer"):
+ return False
+ if 0 <= level <= 100:
+ was_on = self.is_on()
+ r = ask_google(f"set {self.goog_name()} to {level} percent")
+ if not r.success:
+ return False
+ if not was_on:
+ self.turn_off()
+ return True
+ return False
+
+ def make_color(self, color: str) -> bool:
+ return GoogleLight.parse_google_response(
+ ask_google(f"make {self.goog_name()} {color}")
+ )
+
+
+def group_google_lights(lights: List[Light]) -> List[Light]:
+ bookcase_group = []
+ diningroom_group = []
+ for light in lights:
+ name = light.get_name()
+ if "bookcase_light_" in name:
+ bookcase_group.append(light)
+ elif "diningroom_light_" in name:
+ diningroom_group.append(light)
+
+ did_bookcase = False
+ did_diningroom = False
+ ret = []
+ for light in lights:
+ name = light.get_name()
+ if "bookcase_light_" in name:
+ if len(bookcase_group) == 4 and not did_bookcase:
+ ret.append(
+ GoogleLightGroup(
+ "bookcase_lights",
+ bookcase_group,
+ "perm wifi light smart goog dimmer"
+ )
+ )
+ did_bookcase = True
+ elif "diningroom_light_" in name:
+ if len(diningroom_group) == 2 and not did_diningroom:
+ ret.append(
+ GoogleLightGroup(
+ "dining_room_lights",
+ diningroom_group,
+ "intermittent wifi light smart goog dimmer"
+ )
+ )
+ did_diningroom = True
+ else:
+ ret.append(light)
+ return ret
+
+