Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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)
Esempio n. 4
0
    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)
Esempio n. 5
0
 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)
Esempio n. 6
0
    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)
Esempio n. 7
0
 def response_authinfo(self, message):
     """Receive acmeda account information."""
     ptr = 15
     _, ptr = utils.unpack_string(message, ptr)