示例#1
0
def test_validate_internal():
    """Test Internal messages."""
    versions = [('1.4', INTERNAL_FIXTURES_14), ('1.5', INTERNAL_FIXTURES_15),
                ('2.0', INTERNAL_FIXTURES_20)]
    for protocol_version, fixture in versions:
        gateway = get_gateway(protocol_version)
        const = get_const(protocol_version)
        for name, payload in fixture.items():
            if isinstance(payload, dict):
                _payload = payload.get('payload')
                return_value = payload.get('return')
            else:
                _payload = payload
                return_value = None
            sub_type = const.Internal[name]
            msg = Message('1;255;3;0;{};{}\n'.format(sub_type, _payload))
            valid = msg.validate(protocol_version)
            assert valid == {
                'node_id': 1,
                'child_id': 255,
                'type': 3,
                'ack': 0,
                'sub_type': sub_type,
                'payload': _payload
            }
            ret = gateway.logic('1;255;3;0;{};{}\n'.format(sub_type, _payload))
            if return_value is None:
                assert ret is None, 'Version: {} Message: {}'.format(
                    protocol_version, msg)
            else:
                assert ret, 'Version: {} Message: {}'.format(
                    protocol_version, msg)
示例#2
0
    def parse_message_to_mqtt(self, data):
        """Parse a mysensors command string.

        Return a MQTT topic, payload and qos-level as a tuple.
        """
        msg = Message(data, self)
        payload = str(msg.payload)
        msg.payload = ""
        # prefix/node/child/type/ack/subtype : payload
        return f"/{msg.encode('/')}"[:-2], payload, msg.ack
示例#3
0
    def _parse_message_to_mqtt(self, data):
        """Parse a mysensors command string.

        Return a MQTT topic, payload and qos-level as a tuple.
        """
        msg = Message(data, self)
        payload = str(msg.payload)
        msg.payload = ''
        # prefix/node/child/type/ack/subtype : payload
        return ('{}/{}'.format(self._out_prefix,
                               msg.encode('/'))[:-2], payload, msg.ack)
示例#4
0
def test_validate_bad_pres():
    """Test bad Presentation messages."""
    versions = [('1.4', PRES_BAD_FIXTURES_14), ('1.5', PRES_BAD_FIXTURES_15),
                ('2.0', PRES_BAD_FIXTURES_20)]
    for protocol_version, fixture in versions:
        const = get_const(protocol_version)
        for name, payload in fixture.items():
            sub_type = const.Presentation[name]
            msg = Message('1;0;0;0;{};{}\n'.format(sub_type, payload))
            with pytest.raises(vol.Invalid):
                msg.validate(protocol_version)
示例#5
0
    def test_encode(self):
        """Test encode of message."""
        msg = Message()
        cmd = msg.encode()
        self.assertEqual(cmd, '0;0;0;0;0;\n')

        msg.node_id = 1
        msg.child_id = 255
        msg.type = MessageType.internal
        msg.sub_type = Internal.I_BATTERY_LEVEL
        msg.ack = 0
        msg.payload = 57

        cmd = msg.encode()
        self.assertEqual(cmd, '1;255;3;0;0;57\n')
示例#6
0
 def test_callback_exception(self):
     """Test gateway callback with exception."""
     side_effect = ValueError('test')
     self.gateway = Gateway(event_callback=self._callback)
     with mock.patch.object(self.gateway, 'event_callback',
                            side_effect=side_effect) as mock_callback:
         with self.assertLogs(level='ERROR') as test_handle:
             msg = Message()
             msg.node_id = 1
             self.gateway.alert(msg)
         assert mock_callback.called
         self.assertEqual(
             # only check first line of error log
             test_handle.output[0].split('\n', 1)[0],
             'ERROR:mysensors:test')
示例#7
0
 def test_decode(self):
     """Test decode of message."""
     msg = Message('1;255;3;0;0;57\n')
     self.assertEqual(msg.node_id, 1)
     self.assertEqual(msg.child_id, 255)
     self.assertEqual(msg.type, MessageType.internal)
     self.assertEqual(msg.sub_type, Internal.I_BATTERY_LEVEL)
     self.assertEqual(msg.ack, 0)
     self.assertEqual(msg.payload, '57')
示例#8
0
def test_validate_internal():
    """Test Internal messages."""
    versions = [('1.4', INTERNAL_FIXTURES_14), ('1.5', INTERNAL_FIXTURES_15),
                ('2.0', INTERNAL_FIXTURES_20)]
    for protocol_version, fixture in versions:
        const = get_const(protocol_version)
        for name, payload in fixture.items():
            sub_type = const.Internal[name]
            msg = Message('1;255;3;0;{};{}\n'.format(sub_type, payload))
            valid = msg.validate(protocol_version)
            assert valid == {
                'node_id': 1,
                'child_id': 255,
                'type': 3,
                'ack': 0,
                'sub_type': sub_type,
                'payload': payload
            }
示例#9
0
def test_validate_set():
    """Test Set messages."""
    versions = [('1.4', SET_FIXTURES_14), ('1.5', SET_FIXTURES_15),
                ('2.0', SET_FIXTURES_20)]
    for protocol_version, fixture in versions:
        const = get_const(protocol_version)
        for name, payload in fixture.items():
            sub_type = const.SetReq[name]
            msg = Message('1;0;1;0;{};{}\n'.format(sub_type, payload))
            valid = msg.validate(protocol_version)
            assert valid == {
                'node_id': 1,
                'child_id': 0,
                'type': 1,
                'ack': 0,
                'sub_type': sub_type,
                'payload': payload
            }
示例#10
0
def test_validate_pres():
    """Test Presentation messages."""
    versions = [('1.4', PRES_FIXTURES_14), ('1.5', PRES_FIXTURES_15),
                ('2.0', PRES_FIXTURES_20)]
    for protocol_version, fixture in versions:
        gateway = get_gateway(protocol_version)
        const = get_const(protocol_version)
        for name, payload in fixture.items():
            sub_type = const.Presentation[name]
            msg = Message('1;0;0;0;{};{}\n'.format(sub_type, payload))
            valid = msg.validate(protocol_version)
            assert valid == {
                'node_id': 1,
                'child_id': 0,
                'type': 0,
                'ack': 0,
                'sub_type': sub_type,
                'payload': payload
            }
            ret = gateway.logic('1;0;0;0;{};{}\n'.format(sub_type, payload))
            assert ret is None
示例#11
0
 def _check_connection(self):
     """Check if connection is alive every reconnect_timeout seconds."""
     if ((self.tcp_disconnect_timer + 2 * self.reconnect_timeout) <
             time.time()):
         self.tcp_disconnect_timer = time.time()
         raise OSError('No response from {}. Disconnecting'.format(
             self.server_address))
     if (self.tcp_check_timer + self.reconnect_timeout) >= time.time():
         return
     msg = Message().modify(child_id=255,
                            type=self.const.MessageType.internal,
                            sub_type=self.const.Internal.I_VERSION)
     self.add_job(msg.encode)
     self.tcp_check_timer = time.time()
示例#12
0
 def _check_connection(self):
     """Check if connection is alive every reconnect_timeout seconds."""
     if ((self.tcp_disconnect_timer + 2 * self.reconnect_timeout) <
             time.time()):
         self.tcp_disconnect_timer = time.time()
         self.disconnect()
         _LOGGER.info('No response. Disconnected.')
         return
     if not (self.tcp_check_timer + self.reconnect_timeout) < time.time():
         return
     msg = Message().copy(child_id=255,
                          type=self.const.MessageType.internal,
                          sub_type=self.const.Internal.I_VERSION)
     self.fill_queue(msg.encode)
     self.tcp_check_timer = time.time()
示例#13
0
def get_message(message_data=None):
    """Return a message."""
    return Message(message_data)
示例#14
0
 def test_decode_bad_message(self):
     """Test decode of bad message."""
     with self.assertRaises(ValueError):
         Message('bad;bad;bad;bad;bad;bad\n')
示例#15
0
 def test_encode_bad_message(self):
     """Test encode of bad message."""
     msg = Message()
     msg.sub_type = 'bad'
     cmd = msg.encode()
     self.assertEqual(cmd, None)