Ejemplo n.º 1
0
 def _decode_51_record(self, p_controller_obj):
     """ Insteon Extended Message Received (25 bytes).
     See p 247 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj_from = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                                  l_message[2:5])
     l_obj_to = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                                l_message[5:8])
     l_flags = l_message[8]
     l_data = [l_message[9], l_message[10]]
     l_extended = "{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}".format(
         l_message[11], l_message[12], l_message[13], l_message[14],
         l_message[15], l_message[16], l_message[17], l_message[18],
         l_message[19], l_message[20], l_message[21], l_message[22],
         l_message[23], l_message[24])
     #  l_product_key = self._get_addr_from_message(l_message, 12)
     l_devcat = l_message[15] * 256 + l_message[16]
     LOG.info("51 Resp: Fm={}, To={}, Flags={:#x}, Data={} Extended={} ==".
              format(l_obj_from.Name, l_obj_to.Name, l_flags, l_data,
                     l_extended))
     #  l_obj_from.ProductKey = l_product_key
     l_obj_from.DevCat = l_devcat
     l_ret = True
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 2
0
    def _decode_0x6F_record(self, p_controller_obj):
        """All-Link manage Record Response (12 bytes).
        See p 252(265) of 2009 developers guide.

        Modify the IM's All-Link Database (ALDB) with the All-Link data you send.
        Use caution with this command - the IM does not check the validity of the data you send.

        [0] = x02
        [1] = 0x6F
        [2] = Control Code
        [3] = All-Link Record Flag
        [4] = All Lpink Grou
        [5-7] = ID
        [8] = Link Data 1
        [9] = Link Data 2
        [10] = Link Data 3
        [11] = ACK/NAK
         """
        l_message = p_controller_obj._Message
        l_code = l_message[2]
        l_flags = l_message[3]
        l_flag_control = l_flags & 0x40
        l_group = l_message[4]
        l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[5:8])
        l_data = [l_message[8], l_message[9], l_message[10]]
        l_ack = utilDecode.get_ack_nak(l_message[11])
        l_type = 'Responder'
        if l_flag_control != 0:
            l_type = 'Controller'
        l_message = "Manage All-Link response(6F)"
        l_message += " Group:{:#02X}, Name:{}, Flags:{:#02X}, Data:{}, CtlCode:{:#02x},".format(l_group, l_obj.Name, l_flags, l_data, l_code)
        l_message += " Ack:{}, Type:{}".format(l_ack, l_type)
        LOG.info("{}".format(l_message))
        p_controller_obj.Ret = True
        return
Ejemplo n.º 3
0
 def decode_0x57(p_pyhouse_obj, p_controller_obj):
     """All-Link Record Response (10 bytes).
     See p 251(264) of 2009 developers guide.
     [0] = 0x02
     [1] = 0x57
     [2] = AllLink Record Flags
     [3] = AllLink Group
     [4-6] = from address
     [7] = Link Data 1
     [8] = Link Data 2
     [9] = Link Data 3
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(p_pyhouse_obj, l_message[4:7])
     l_link_obj = LinkData()
     l_link_obj.Flag = l_flags = l_message[2]
     l_link_obj.Group = l_group = l_message[3]
     l_link_obj.InsteonAddess = l_obj.InsteonAddress
     l_link_obj.Data = l_data = [l_message[7], l_message[8], l_message[9]]
     l_flag_control = l_flags & 0x40
     l_type = 'Responder'
     if l_flag_control != 0:
         l_type = 'Controller'
         l_link_obj.IsController = True
     LOG.info("All-Link response-0x57 - Group={:#02X}, Name={}, Flags={:#x}, Data={}, {}".format(l_group, l_obj.Name, l_flags, l_data, l_type))
     return
Ejemplo n.º 4
0
 def test_01_GetObj(self):
     """
     """
     # print(PrettyFormatAny.form(self.m_pyhouse_obj.House.Lighting.Lights[0], 'E1-01-A - Lighting'))
     l_addr = INSTEON_0_MSG
     l_ret = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_addr)
     l_dotted = conversions.int2dotted_hex(l_ret.InsteonAddress, 3)
     # print(PrettyFormatAny.form(l_ret, 'E1-01-B - Lighting'))
     self.assertEqual(l_dotted, TESTING_INSTEON_ADDRESS_0)
Ejemplo n.º 5
0
 def _decode_51_record(self, p_controller_obj):
     """ Insteon Extended Message Received (25 bytes).
     See p 247 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj_from = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
     l_obj_to = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[5:8])
     l_flags = l_message[8]
     l_data = [l_message[9], l_message[10]]
     l_extended = "{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}".format(
                 l_message[11], l_message[12], l_message[13], l_message[14], l_message[15], l_message[16], l_message[17],
                 l_message[18], l_message[19], l_message[20], l_message[21], l_message[22], l_message[23], l_message[24])
     #  l_product_key = self._get_addr_from_message(l_message, 12)
     l_devcat = l_message[15] * 256 + l_message[16]
     LOG.info("51 Resp: Fm={}, To={}, Flags={:#x}, Data={} Extended={} ==".format(l_obj_from.Name, l_obj_to.Name, l_flags, l_data, l_extended))
     #  l_obj_from.ProductKey = l_product_key
     l_obj_from.DevCat = l_devcat
     l_ret = True
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 6
0
 def test_02_PutController(self):
     """
     """
     _l_controller = self.m_pyhouse_obj.House.Lighting.Controllers[0]
     # print(PrettyFormatAny.form(l_controller, 'F1-02-A - Controller'))
     l_addr = INSTEON_1_MSG
     l_ret = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_addr)
     l_ret.Port = PORT_NAME
     Insteon_utils.update_insteon_obj(self.m_pyhouse_obj, l_ret)
     # print(PrettyFormatAny.form(l_controller, 'F1-02-B - l_ret'))
     self.assertEqual(self.m_pyhouse_obj.House.Lighting.Controllers[0].Port, PORT_NAME)
Ejemplo n.º 7
0
 def _decode_0x51(self, p_controller_obj):
     """ Insteon Extended Message Received (25 bytes).
     See p 234(247) of 2009 developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj_from = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
     _l_obj_to = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[5:8])
     _l_flags = l_message[8]
     l_cmd1 = l_message[9]
     l_cmd2 = l_message[10]
     l_extended = "{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}.{:X}".format(
                 l_message[11], l_message[12], l_message[13], l_message[14], l_message[15], l_message[16], l_message[17],
                 l_message[18], l_message[19], l_message[20], l_message[21], l_message[22], l_message[23], l_message[24])
     if l_cmd1 == 0x03 and l_cmd2 == 0:  # Product Data request response
         l_product_key = self._get_addr_from_message(l_message, 12)
         l_devcat = l_message[15] * 256 + l_message[16]
         LOG.info('ProdData Fm:"{}"; ProductID:"{}"; DevCat:"{}"; Data:"{}"'.format(l_obj_from.Name, l_product_key, l_devcat, l_extended))
         l_obj_from.ProductKey = l_product_key
         l_obj_from.DevCat = l_devcat
     p_controller_obj.Ret = True
     Insteon_utils.update_insteon_obj(self.m_pyhouse_obj, l_obj_from)
     return
Ejemplo n.º 8
0
 def _decode_60_record(self, p_controller_obj):
     """Get Insteon Modem Info (9 bytes).
     See p 273 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
     l_devcat = l_message[5]
     l_devsubcat = l_message[6]
     l_firmver = l_message[7]
     LOG.info("== 60 - Insteon Modem Info - DevCat={}, DevSubCat={}, Firmware={} - Name={}".format(l_devcat, l_devsubcat, l_firmver, l_obj.Name))
     if l_message[8] == ACK:
         l_ret = True
     else:
         LOG.error("== 60 - No ACK - Got {:#x}".format(l_message[8]))
         l_ret = False
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 9
0
 def decode_57(p_pyhouse_obj, p_controller_obj):
     """All-Link Record Response (10 bytes).
     See p 249)(262 of 2007 developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(p_pyhouse_obj, l_message[4:7])
     l_link_obj = LinkData()
     l_link_obj.Flag = l_flags = l_message[2]
     l_link_obj.Group = l_group = l_message[3]
     l_link_obj.InsteonAddess = l_obj.InsteonAddress
     l_link_obj.Data = l_data = [l_message[7], l_message[8], l_message[9]]
     l_flag_control = l_flags & 0x40
     l_type = 'Responder'
     if l_flag_control != 0:
         l_type = 'Controller'
     LOG.info("All-Link response-57 - Group={:#02X}, Name={}, Flags={:#x}, Data={}, {}".format(l_group, l_obj.Name, l_flags, l_data, l_type))
     l_ret = True
     return l_ret
Ejemplo n.º 10
0
 def _decode_60_record(self, p_controller_obj):
     """Get Insteon Modem Info (9 bytes).
     See p 273 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                             l_message[2:5])
     l_devcat = l_message[5]
     l_devsubcat = l_message[6]
     l_firmver = l_message[7]
     LOG.info(
         "== 60 - Insteon Modem Info - DevCat={}, DevSubCat={}, Firmware={} - Name={}"
         .format(l_devcat, l_devsubcat, l_firmver, l_obj.Name))
     if l_message[8] == ACK:
         l_ret = True
     else:
         LOG.error("== 60 - No ACK - Got {:#x}".format(l_message[8]))
         l_ret = False
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 11
0
 def decode_0x53(p_pyhouse_obj, p_controller_obj):
     """Insteon All-Linking completed (10 bytes).
     See p 247(260) of 2009 developers guide.
     [0] = 0x02
     [1] = 0x53
     [2] = LinkCode - 0=PLM is Responder, 1=PLM is Controller, FF=Deleted
     [3] = LinkGroup
     [4-6] = from address
     [7-8] = DevCat
     [9] = Firmwear Version
     """
     l_message = p_controller_obj._Message
     l_msg = Insteon_utils.decode_link_code(l_message[2])
     l_link_group = l_message[3]
     l_from_id = l_message[4:7]
     l_device_obj = utilDecode.get_obj_from_message(p_pyhouse_obj, l_from_id)
     utilDecode._devcat(l_message[7:9], p_controller_obj)
     _l_version = l_message[9]
     LOG.info('All-Linking completed - Link Code:{}, Group:{}, From:{} '.format(l_msg, l_link_group, l_device_obj.Name))
Ejemplo n.º 12
0
 def _decode_6F_record(self, p_controller_obj):
     """All-Link manage Record Response (12 bytes).
     See p 267 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_code = l_message[2]
     l_flags = l_message[3]
     l_flag_control = l_flags & 0x40
     l_group = l_message[4]
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[5:8])
     l_data = [l_message[8], l_message[9], l_message[10]]
     l_ack = utilDecode.get_ack_nak(l_message[11])
     l_type = 'Responder'
     if l_flag_control != 0:
         l_type = 'Controller'
     l_message = "Manage All-Link response(6F)"
     l_message += " Group:{:#02X}, Name:{}, Flags:{:#02X}, Data:{}, CtlCode:{:#02x},".format(l_group, l_obj.Name, l_flags, l_data, l_code)
     l_message += " Ack:{}, Type:{}".format(l_ack, l_type)
     LOG.info("{}".format(l_message))
     l_ret = True
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 13
0
 def _decode_62_record(self, p_controller_obj):
     """Get response to Send Insteon standard-length message (9 bytes).
     Basically, a response to the 62 command.
     See p 243 of developers guide.
     [0] = 0x02
     [1] = 0x62
     [2-4] = address
     [5] = message flags
     [6] = command 1
     [7] = command 2
     [8] = ACK/NAK
     This is an ack/nak of the command and generally is not very interesting by itself.
     Depending on the command sent, another response MAY follow this message with further data.
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
     _l_msgflags = utilDecode._decode_message_flag(l_message[5])
     l_ack = utilDecode.get_ack_nak(l_message[8])
     l_debug_msg = "Device: {}, {}".format(l_obj.Name, l_ack)
     if l_ack == 'NAK':
         LOG.info("Got ACK(62); {}".format(l_debug_msg))
     return self.check_for_more_decoding(p_controller_obj)
Ejemplo n.º 14
0
    def _decode_0x62_record(self, p_controller_obj):
        """Get response to Send Insteon standard-length message (9 bytes).
        Basically, a response to the 62 command.
        See p 230(243) of 2009 developers guide.
        [0] = 0x02
        [1] = 0x62
        [2-4] = address
        [5] = message flags
        [6] = command 1
        [7] = command 2
        [8] = ACK/NAK

        [8] = User Data 1
        [9] = User Data 2
        [10] = User Data 3
        [11] = User Data 4
        [12] = User Data 5
        [13] = User Data 6
        [14] = User Data 7
        [15] = User Data 8
        [16] = User Data 9
        [17] = User Data 10
        [18] = User Data 11
        [19] = User Data 12
        [20] = User Data 13
        [21] = User Data 14
        [22] = ACK/NAK
        This is an ack/nak of the command and generally is not very interesting by itself.
        Depending on the command sent, another response MAY follow this message with further data.
        """
        l_message = p_controller_obj._Message
        l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
        _l_msgflags = utilDecode._decode_message_flag(l_message[5])
        l_ack = utilDecode.get_ack_nak(l_message[8])
        l_debug_msg = "Device: {}, {}".format(l_obj.Name, l_ack)
        if l_ack == 'NAK':
            LOG.info("Got ACK(62); {}".format(l_debug_msg))
        return
Ejemplo n.º 15
0
 def _decode_62_record(self, p_controller_obj):
     """Get response to Send Insteon standard-length message (9 bytes).
     Basically, a response to the 62 command.
     See p 243 of developers guide.
     [0] = 0x02
     [1] = 0x62
     [2-4] = address
     [5] = message flags
     [6] = command 1
     [7] = command 2
     [8] = ACK/NAK
     This is an ack/nak of the command and generally is not very interesting by itself.
     Depending on the command sent, another response MAY follow this message with further data.
     """
     l_message = p_controller_obj._Message
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                             l_message[2:5])
     _l_msgflags = utilDecode._decode_message_flag(l_message[5])
     l_ack = utilDecode.get_ack_nak(l_message[8])
     l_debug_msg = "Device: {}, {}".format(l_obj.Name, l_ack)
     if l_ack == 'NAK':
         LOG.info("Got ACK(62); {}".format(l_debug_msg))
     return self.check_for_more_decoding(p_controller_obj)
Ejemplo n.º 16
0
 def _decode_6F_record(self, p_controller_obj):
     """All-Link manage Record Response (12 bytes).
     See p 267 of developers guide.
     """
     l_message = p_controller_obj._Message
     l_code = l_message[2]
     l_flags = l_message[3]
     l_flag_control = l_flags & 0x40
     l_group = l_message[4]
     l_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                             l_message[5:8])
     l_data = [l_message[8], l_message[9], l_message[10]]
     l_ack = utilDecode.get_ack_nak(l_message[11])
     l_type = 'Responder'
     if l_flag_control != 0:
         l_type = 'Controller'
     l_message = "Manage All-Link response(6F)"
     l_message += " Group:{:#02X}, Name:{}, Flags:{:#02X}, Data:{}, CtlCode:{:#02x},".format(
         l_group, l_obj.Name, l_flags, l_data, l_code)
     l_message += " Ack:{}, Type:{}".format(l_ack, l_type)
     LOG.info("{}".format(l_message))
     l_ret = True
     return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 17
0
 def test_01_GetObj(self):
     """
     """
     l_msg = MSG_50
     # print(FormatBytes(l_msg), 'D2-01-A - Message')
     _l_ret = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_msg[2:5])
Ejemplo n.º 18
0
 def test_02_GetObj(self):
     """
     """
     l_msg = MSG_50
     l_ret = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_msg)
     print(PrettyFormatAny.form(l_ret, 'Combined Dicts'))
Ejemplo n.º 19
0
    def _decode_50_record(self, p_controller_obj):
        """ Insteon Standard Message Received (11 bytes)
        A Standard-length INSTEON message is received from either a Controller or Responder that you are ALL-Linked to.
        See p 233(246) of developers guide.
        [0] = x02
        [1] = 0x50
        [2-4] = from address
        [5-7] = to address / group
        [8] = message flags
        [9] = command 1
        [10] = command 2
        """
        l_message = p_controller_obj._Message
        l_device_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
        l_flags = utilDecode._decode_message_flag(l_message[8])
        l_cmd1 = l_message[9]
        l_cmd2 = l_message[10]
        l_data = [l_cmd1, l_cmd2]
        #  print(PrettyFormatAny.form(l_device_obj, 'Insteon_decoder 156 - Device'))
        if l_device_obj.DeviceType == 2:
            Insteon_HVAC.ihvac_utility().decode_50_record(self.m_pyhouse_obj, l_device_obj, p_controller_obj)
            return self.check_for_more_decoding(p_controller_obj, True)
        l_debug_msg = 'Std Msg fm: {}; Cmd1:{:#x}, Cmd2:{:#x}; '.format(l_device_obj.Name, l_cmd1, l_cmd2)
        #  Break down bits 7(msb), 6, 5 into message type
        if l_message[8] & 0xE0 == 0x80:  #  Broadcast/NAK Message (100)
            l_debug_msg += utilDecode._devcat(l_message[5:7], l_device_obj)
        elif l_message[8] & 0xE0 == 0xC0:  #  (110) all link broadcast of group id
            l_group = l_message[7]
            l_debug_msg += "All-Link broadcast - Group:{}, Data:{}; ".format(l_group, l_data)
            LOG.info("== 50B All-link Broadcast Group:{}, Data:{} ==".format(l_group, l_data))
        #
        try:
            if l_cmd1 == MESSAGE_TYPES['product_data_request']:  #  0x03
                l_debug_msg += " product data request. - Should never happen - S/B 51 response"
            elif l_cmd1 == MESSAGE_TYPES['engine_version']:  #  0x0D
                l_engine_id = l_cmd2
                l_device_obj.EngineVersion = l_engine_id
                l_debug_msg += "Engine version is: {}; ".format(l_engine_id)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['id_request']:  #  0x10
                l_debug_msg += "Request ID From: {}; ".format(l_device_obj.Name)
                #  LOG.info("Got an ID request. Light:{}".format(l_device_obj.Name,))
            elif l_cmd1 == MESSAGE_TYPES['on']:  #  0x11
                l_device_obj.CurLevel = 100
                l_debug_msg += "Device:{} turned Full ON  ; ".format(l_device_obj.Name)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['off']:  #  0x13
                l_device_obj.CurLevel = 0
                l_debug_msg += "Light:{} turned Full OFF; ".format(l_device_obj.Name)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['status_request']:  #  0x19
                l_level = int(((l_cmd2 + 2) * 100) / 256)
                l_device_obj.CurLevel = l_level
                l_debug_msg += "Status of light:{} is level:{}; ".format(l_device_obj.Name, l_level)
                LOG.info("PLM:{} Got Light Status From:{}, Level is:{} ".format(p_controller_obj.Name, l_device_obj.Name, l_level))

            elif l_cmd1 >= MESSAGE_TYPES['thermostat_temp_up'] and l_cmd1 <= MESSAGE_TYPES['thermostat_report']:  #  0x6e
                _l_ret1 = Insteon_HVAC.ihvac_utility().decode_50_record(l_device_obj, l_cmd1, l_cmd2)
                pass

            elif l_cmd1 >= 0x68 and l_cmd1 <= 0x75:  #  0x6e
                _l_ret1 = Insteon_HVAC.ihvac_utility().decode_50_record(l_device_obj, l_cmd1, l_cmd2)
                pass

            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 01:
                l_debug_msg += ' Device Set Button Pressed '
            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 02:
                l_debug_msg += ' Controller Set Button Pressed '

            else:
                l_debug_msg += "\n\tUnknown type - last command was {} - {}; ".format(l_device_obj._Command1, PrintBytes(l_message))
                LOG.warn('Decoding 50 tyoe {}'.format(l_debug_msg))
        except AttributeError as e_err:
            LOG.error('ERROR decoding 50 record {}'.format(e_err))
        l_ret = True
        LOG.info('50 Resp; {}'.format(l_debug_msg))
        return self.check_for_more_decoding(p_controller_obj, l_ret)
Ejemplo n.º 20
0
    def _decode_0x50(self, p_controller_obj):
        """ Insteon Standard Message Received (11 bytes)
        A Standard-length INSTEON message is received from either a Controller or Responder that you are ALL-Linked to.
        See p 233(246) of 2009 developers guide.
        [0] = x02
        [1] = 0x50
        [2-4] = from address
        [5-7] = to address / group
        [8] = message flags
        [9] = command 1
        [10] = command 2
        """
        l_mqtt = False
        l_message = p_controller_obj._Message
        l_device_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_message[2:5])
        l_device_obj.BrightnessPct = '?'
        if l_device_obj.DeviceType == 2:  # HVAC Type
            DecodeHvac().decode_0x50(self.m_pyhouse_obj, l_device_obj, p_controller_obj)
            return
        if l_device_obj.DeviceType == 3:  # Security Type
            DecodeSecurity().decode_0x50(self.m_pyhouse_obj, l_device_obj, p_controller_obj)
            return
        l_flags = utilDecode._decode_message_flag(l_message[8])
        l_cmd1 = l_message[9]
        l_cmd2 = l_message[10]
        l_data = [l_cmd1, l_cmd2]
        l_debug_msg = 'Fm:"{}"; Flg:{}; C1:{:#x},{:#x}; '.format(l_device_obj.Name, l_flags, l_cmd1, l_cmd2)
        #
        #  Break down bits 7(msb), 6, 5 into message type
        #
        if l_message[8] & 0xE0 == 0x80:  #  100 - SB [Broadcast]
            l_debug_msg += utilDecode._devcat(l_message[5:7], l_device_obj)
        elif l_message[8] & 0xE0 == 0xC0:  #  110 - SA Broadcast = all link broadcast of group id
            l_group = l_message[7]
            l_debug_msg += 'A-L-brdcst-Gp:"{}","{}"; '.format(l_group, l_data)
        try:
            if l_cmd1 == MESSAGE_TYPES['product_data_request']:  #  0x03
                l_debug_msg += " Product-data-request."
            elif l_cmd1 == MESSAGE_TYPES['cleanup_success']:  #  0x06
                l_debug_msg += 'CleanupSuccess with {} failures; '.format(l_cmd2)
            elif l_cmd1 == MESSAGE_TYPES['engine_version']:  #  0x0D
                l_device_obj.EngineVersion = l_cmd2
                l_debug_msg += 'Engine-version:"{}(i-{})"; '.format(l_cmd2, l_cmd2 + 1)
            elif l_cmd1 == MESSAGE_TYPES['id_request']:  #  0x10
                l_device_obj.FirmwareVersion = l_cmd2
                l_debug_msg += 'Request-ID:"{}"; '.format(l_device_obj.FirmwareVersion)
            elif l_cmd1 == MESSAGE_TYPES['on']:  #  0x11
                l_device_obj.BrightnessPct = 100
                l_mqtt = True
                l_debug_msg += 'Turn ON; '.format(l_device_obj.Name)
            elif l_cmd1 == MESSAGE_TYPES['off']:  #  0x13
                l_device_obj.BrightnessPct = 0
                l_mqtt = True
                l_debug_msg += 'Turn OFF; '.format(l_device_obj.Name)
            elif l_cmd1 == MESSAGE_TYPES['status_request']:  #  0x19
                l_device_obj.BrightnessPct = l_level = utilDecode.decode_light_brightness(l_cmd2)
                l_debug_msg += 'Status of light:"{}"-level:"{}"; '.format(l_device_obj.Name, l_level)
            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 0x01:
                l_debug_msg += ' Device-Set-Button-Pressed '
            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 0x02:
                l_debug_msg += ' Controller-Set-Button-Pressed '
            else:
                l_debug_msg += '\n\tUnknown-type -"{}"; '.format(FormatBytes(l_message))
                l_device_obj.BrightnessPct = utilDecode.decode_light_brightness(l_cmd2)
                l_mqtt = True
        except AttributeError as e_err:
            LOG.error('ERROR decoding 0x50 record {}'.format(e_err))

        Insteon_utils.update_insteon_obj(self.m_pyhouse_obj, l_device_obj)
        p_controller_obj.Ret = True
        LOG.info('{}'.format(l_debug_msg))
        if l_mqtt:
            self.m_pyhouse_obj.APIs.Computer.MqttAPI.MqttPublish('lighting/status/debug', l_device_obj)  #  /lig
        return
Ejemplo n.º 21
0
 def test_02_GetObj(self):
     """
     """
     l_msg = MSG_50
     l_ret = utilDecode.get_obj_from_message(self.m_pyhouse_obj, l_msg)
     print(PrettyFormatAny.form(l_ret, 'Combined Dicts'))
Ejemplo n.º 22
0
    def _decode_50_record(self, p_controller_obj):
        """ Insteon Standard Message Received (11 bytes)
        A Standard-length INSTEON message is received from either a Controller or Responder that you are ALL-Linked to.
        See p 233(246) of developers guide.
        [0] = x02
        [1] = 0x50
        [2-4] = from address
        [5-7] = to address / group
        [8] = message flags
        [9] = command 1
        [10] = command 2
        """
        l_message = p_controller_obj._Message
        l_device_obj = utilDecode.get_obj_from_message(self.m_pyhouse_obj,
                                                       l_message[2:5])
        l_flags = utilDecode._decode_message_flag(l_message[8])
        l_cmd1 = l_message[9]
        l_cmd2 = l_message[10]
        l_data = [l_cmd1, l_cmd2]
        #  print(PrettyFormatAny.form(l_device_obj, 'Insteon_decoder 156 - Device'))
        if l_device_obj.DeviceType == 2:
            Insteon_HVAC.ihvac_utility().decode_50_record(
                self.m_pyhouse_obj, l_device_obj, p_controller_obj)
            return self.check_for_more_decoding(p_controller_obj, True)
        l_debug_msg = 'Std Msg fm: {}; Cmd1:{:#x}, Cmd2:{:#x}; '.format(
            l_device_obj.Name, l_cmd1, l_cmd2)
        #  Break down bits 7(msb), 6, 5 into message type
        if l_message[8] & 0xE0 == 0x80:  #  Broadcast/NAK Message (100)
            l_debug_msg += utilDecode._devcat(l_message[5:7], l_device_obj)
        elif l_message[
                8] & 0xE0 == 0xC0:  #  (110) all link broadcast of group id
            l_group = l_message[7]
            l_debug_msg += "All-Link broadcast - Group:{}, Data:{}; ".format(
                l_group, l_data)
            LOG.info("== 50B All-link Broadcast Group:{}, Data:{} ==".format(
                l_group, l_data))
        #
        try:
            if l_cmd1 == MESSAGE_TYPES['product_data_request']:  #  0x03
                l_debug_msg += " product data request. - Should never happen - S/B 51 response"
            elif l_cmd1 == MESSAGE_TYPES['engine_version']:  #  0x0D
                l_engine_id = l_cmd2
                l_device_obj.EngineVersion = l_engine_id
                l_debug_msg += "Engine version is: {}; ".format(l_engine_id)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['id_request']:  #  0x10
                l_debug_msg += "Request ID From: {}; ".format(
                    l_device_obj.Name)
                #  LOG.info("Got an ID request. Light:{}".format(l_device_obj.Name,))
            elif l_cmd1 == MESSAGE_TYPES['on']:  #  0x11
                l_device_obj.CurLevel = 100
                l_debug_msg += "Device:{} turned Full ON  ; ".format(
                    l_device_obj.Name)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['off']:  #  0x13
                l_device_obj.CurLevel = 0
                l_debug_msg += "Light:{} turned Full OFF; ".format(
                    l_device_obj.Name)
                self._publish(self.m_pyhouse_obj, l_device_obj)
            elif l_cmd1 == MESSAGE_TYPES['status_request']:  #  0x19
                l_level = int(((l_cmd2 + 2) * 100) / 256)
                l_device_obj.CurLevel = l_level
                l_debug_msg += "Status of light:{} is level:{}; ".format(
                    l_device_obj.Name, l_level)
                LOG.info(
                    "PLM:{} Got Light Status From:{}, Level is:{} ".format(
                        p_controller_obj.Name, l_device_obj.Name, l_level))

            elif l_cmd1 >= MESSAGE_TYPES[
                    'thermostat_temp_up'] and l_cmd1 <= MESSAGE_TYPES[
                        'thermostat_report']:  #  0x6e
                _l_ret1 = Insteon_HVAC.ihvac_utility().decode_50_record(
                    l_device_obj, l_cmd1, l_cmd2)
                pass

            elif l_cmd1 >= 0x68 and l_cmd1 <= 0x75:  #  0x6e
                _l_ret1 = Insteon_HVAC.ihvac_utility().decode_50_record(
                    l_device_obj, l_cmd1, l_cmd2)
                pass

            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 01:
                l_debug_msg += ' Device Set Button Pressed '
            elif l_message[8] & 0xE0 == 0x80 and l_cmd1 == 02:
                l_debug_msg += ' Controller Set Button Pressed '

            else:
                l_debug_msg += "\n\tUnknown type - last command was {} - {}; ".format(
                    l_device_obj._Command1, PrintBytes(l_message))
                LOG.warn('Decoding 50 tyoe {}'.format(l_debug_msg))
        except AttributeError as e_err:
            LOG.error('ERROR decoding 50 record {}'.format(e_err))
        l_ret = True
        LOG.info('50 Resp; {}'.format(l_debug_msg))
        return self.check_for_more_decoding(p_controller_obj, l_ret)