def response_hubinfo(self, message): """Receive start of hub information.""" ptr = 10 self.firmware_name, ptr = utils.unpack_string(message, ptr) ptr += 2 _, ptr = utils.unpack_string(message, ptr) ptr += 2 self.wifi_module, ptr = utils.unpack_string(message, ptr) ptr += 2 self.mac_address, ptr = utils.unpack_string(message, ptr) ptr += 2 self.ip_address, ptr = utils.unpack_string(message, ptr) self.notify_callback(const.UpdateType.info)
def response_roller_updated(self, message): """Receive change of roller information.""" ptr = 2 # sequence? ptr += 4 ptr += 2 # unknown field ptr += 2 # unknown field room_id, ptr = utils.unpack_bytes(message, ptr) ptr += 4 # unknown field roller_type, ptr = utils.unpack_int(message, ptr, 1) ptr += 2 # unknown field roller_name, ptr = utils.unpack_string(message, ptr) ptr += 10 # unknown field roller_id, ptr = utils.unpack_int(message, ptr, 6) ptr += 5 # unknown field ptr += 5 # unknown field roller_percent, ptr = utils.unpack_int(message, ptr, 1) roller_flags, ptr = utils.unpack_int(message, ptr, 1) ptr += 2 # checksum if roller_id not in self.rollers: self.rollers[roller_id] = elements.Roller(self, roller_id) roller = self.rollers[roller_id] roller.name = roller_name # doesn't seem to come through in update # roller.serial = roller_serial roller.room_id = room_id roller.type = roller_type if room_id in self.rooms: roller.room = self.rooms[room_id] else: roller.room = None roller.closed_percent = roller_percent roller.flags = roller_flags roller.notify_callback() self.notify_callback(const.UpdateType.rollers)
def response_timerlist(self, message): """Receive timer list.""" ptr = 0 _, ptr = utils.unpack_bytes(message, ptr, 12) timer_count, ptr = utils.unpack_int(message, ptr, 1) for _ in range(timer_count): _, ptr = utils.unpack_bytes(message, ptr, 2) timer_id, ptr = utils.unpack_bytes(message, ptr) _, ptr = utils.unpack_bytes(message, ptr, 4) icon, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 2) timer_name, ptr = utils.unpack_string(message, ptr) _, ptr = utils.unpack_bytes(message, ptr, 4) # ' !\x02\x01\x00' state, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 4) # ' ;\x02\x01\x00' hour, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 4) # ' <\x02\x01\x00' minute, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 4) # ' "\x02\x04\x00' days, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 4) # '\x00\x00\x00 =' _, ptr = utils.unpack_bytes(message, ptr, 2) # '\x02\x01' timer_type, ptr = utils.unpack_bytes(message, ptr, 4) entity = None if timer_type == b"\x00\x01\x03\x01": # Device Timer _, ptr = utils.unpack_bytes(message, ptr, 8) percent, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 5) roller_id, ptr = utils.unpack_int(message, ptr, 6) if roller_id in self.rollers: entity = self.rollers[roller_id] elif timer_type == b"\x00\x00\x10\x02": # Scene Timer scene_id, ptr = utils.unpack_bytes(message, ptr) if scene_id in self.scenes: entity = self.scenes[scene_id] else: _LOGGER.error(f"{self.host}: Unexpected timer type received: " f"{binascii.hexlify(timer_type)}") return if timer_id not in self.timers: self.timers[timer_id] = elements.Timer(self, timer_id) self.timers[timer_id].icon = icon self.timers[timer_id].name = timer_name self.timers[timer_id].state = state self.timers[timer_id].hour = hour self.timers[timer_id].minute = minute self.timers[timer_id].days = days self.timers[timer_id].entity = entity _, ptr = utils.unpack_bytes(message, ptr, 2) self.notify_callback(const.UpdateType.timers)
def response_rollerlist(self, message): """Receive roller blind list.""" ptr = 2 # sequence? ptr += 10 roller_count, ptr = utils.unpack_int(message, ptr, 1) for _ in range(roller_count): start = ptr ptr += 4 # unknown field roller_id, ptr = utils.unpack_int(message, ptr, 6) ptr += 2 # unknown field room_id, ptr = utils.unpack_bytes(message, ptr) ptr += 4 # unknown field roller_type, ptr = utils.unpack_int(message, ptr, 1) ptr += 2 # unknown field roller_name, ptr = utils.unpack_string(message, ptr) ptr += 8 # unknown field roller_serial, ptr = utils.unpack_string(message, ptr) ptr += 5 # unknown field ptr += 5 # unknown field roller_percent, ptr = utils.unpack_int(message, ptr, 1) roller_flags, ptr = utils.unpack_int(message, ptr, 1) _LOGGER.debug(f"{binascii.hexlify(message[start:ptr])}") if roller_id not in self.rollers: self.rollers[roller_id] = elements.Roller(self, roller_id) roller = self.rollers[roller_id] roller.name = roller_name roller.serial = roller_serial roller.room_id = room_id roller.type = roller_type if room_id in self.rooms: roller.room = self.rooms[room_id] else: roller.room = None roller.closed_percent = roller_percent roller.flags = roller_flags roller.notify_callback() self.notify_callback(const.UpdateType.rollers)
def response_roomlist(self, message): """Receive room list.""" ptr = 12 room_count, ptr = utils.unpack_int(message, ptr, 1) for _ in range(room_count): _, ptr = utils.unpack_bytes(message, ptr, 2) room_id, ptr = utils.unpack_bytes(message, ptr) _, ptr = utils.unpack_bytes(message, ptr, 4) icon, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 2) room_name, ptr = utils.unpack_string(message, ptr) if room_id not in self.rooms: self.rooms[room_id] = elements.Room(self, room_id) self.rooms[room_id].icon = icon self.rooms[room_id].name = room_name self.notify_callback(const.UpdateType.rooms)
def response_scenelist(self, message): """Receive scene list.""" ptr = 0 _, ptr = utils.unpack_bytes(message, ptr, 12) scene_count, ptr = utils.unpack_int(message, ptr, 1) for _ in range(scene_count): _, ptr = utils.unpack_bytes(message, ptr, 2) scene_id, ptr = utils.unpack_bytes(message, ptr) _, ptr = utils.unpack_bytes(message, ptr, 4) icon, ptr = utils.unpack_int(message, ptr, 1) _, ptr = utils.unpack_bytes(message, ptr, 2) scene_name, ptr = utils.unpack_string(message, ptr) _, ptr = utils.unpack_bytes(message, ptr, 5) # Not sure what is being read next but it seems to be variable while message[ptr:ptr + 2] == b"R\x02": _, ptr = utils.unpack_bytes(message, ptr, 2) _, ptr = utils.unpack_bytes(message, ptr) if scene_id not in self.scenes: self.scenes[scene_id] = elements.Scene(self, scene_id) self.scenes[scene_id].icon = icon self.scenes[scene_id].name = scene_name _, ptr = utils.unpack_bytes(message, ptr, 2) self.notify_callback(const.UpdateType.scenes)
def response_authinfo(self, message): """Receive acmeda account information.""" ptr = 15 _, ptr = utils.unpack_string(message, ptr)