def test_read_unknown_response(self): c = Cube('127.0.0.1', 62910) c._socket = StaticResponseSocket([ bytearray('X:', encoding='utf-8'), ]) c.read() self.assertEqual(len(c.received_messages), 0)
def _mocked_cube(self): # conn = Mock() # conn.get_message = Mock(return_value=SetResponse(bytearray("00,0,31", encoding='utf-8'))) c = Cube() c._socket = Mock(socket.socket) c.send_message = Mock() c.get_message = Mock(return_value=SetResponse(bytearray("00,0,31", encoding='utf-8'))) return c
def test_rooms(self): c = Cube() c.get_message = Mock(return_value=MResponse([MResponseBytes])) self.assertEqual(c.rooms, [ Room(room_id=1, name='Wohnzimmer', rf_address='122B65', devices=[ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung'), ]) ])
def test_read(self): c = Cube('127.0.0.1', 62910) c._socket = StaticResponseSocket([ bytearray('H:', encoding='utf-8') + HelloResponseBytes, bytearray('M:', encoding='utf-8') + MResponseBytes ]) c.read() self.assertEqual(len(c.received_messages), 2)
def test_context_manager_connect_and_disconnect(self): c = Cube((None, None)) c.connect = Mock() c.disconnect = Mock() with c: self.assertTrue(c.connect.called) self.assertTrue(c.disconnect.called)
def _mocked_cube(self): # conn = Mock() # conn.get_message = Mock(return_value=SetResponse(bytearray("00,0,31", encoding='utf-8'))) c = Cube() c._socket = Mock(socket.socket) c.send_message = Mock() c.get_message = Mock( return_value=SetResponse(bytearray("00,0,31", encoding='utf-8'))) return c
def test_get_ntp_servers_no_response(self): c = Cube((None, None)) c._socket = Mock(socket.socket) c._socket.recv = Mock(return_value=bytearray("F:ntp.homematic.com,ntp.homematic.com", encoding='utf-8')) c.send_message = Mock() self.assertIsNone(c._ntp_servers) c.ntp_servers c.send_message.assert_called_with(FMessage()) self.assertIsNone(c.ntp_servers)
def test_disconnect(self): fake_socket = Mock(socket.socket) fake_socket.recv = Mock(return_value=bytearray()) fake_socket.close = Mock(return_value=None) c = Cube('127.0.0.1', 62910) c._socket = fake_socket c.disconnect() self.assertTrue(fake_socket.close.called) self.assertIsNone(c._socket)
def test_get_ntp_servers(self): c = Cube((None, None)) c._socket = Mock(socket.socket) c._socket.recv = Mock(return_value=bytearray()) c.send_message = Mock() self.assertIsNone(c._ntp_servers) c.ntp_servers c.send_message.assert_called_with(FMessage()) c.handle_message(FResponse(bytearray("ntp.homematic.com,ntp.homematic.com", encoding='utf-8'))) self.assertEqual(c._ntp_servers, [u'ntp.homematic.com', u'ntp.homematic.com'])
def test_get_ntp_servers_no_response(self): c = Cube((None, None)) c._socket = Mock(socket.socket) c._socket.recv = Mock(return_value=bytearray( "F:ntp.homematic.com,ntp.homematic.com", encoding='utf-8')) c.send_message = Mock() self.assertIsNone(c._ntp_servers) c.ntp_servers c.send_message.assert_called_with(FMessage()) self.assertIsNone(c.ntp_servers)
def test_context_manager_disconnect_on_exception(self): try: c = Cube((None, None)) c.connect = Mock() c.disconnect = Mock() with c as cube: raise Exception("just a test") except Exception as ex: self.assertTrue(c.connect.called) self.assertTrue(c.disconnect.called) self.assertEqual(ex.args, ("just a test", ))
def test_get_message(self): c = Cube('127.0.0.1', 62910) self.assertFalse(c.get_message(F_RESPONSE)) c = Cube('127.0.0.1', 62910) c.parse_message(F_RESPONSE, b"ntp.homematic.com,ntp.homematic.com") msg = FResponse(b"ntp.homematic.com,ntp.homematic.com") self.assertEqual(c.get_message(F_RESPONSE), msg)
def test_constructor(self): c = Cube('1.2.3.4') self.assertEqual(c.addr_port, ('1.2.3.4', 62910)) c = Cube('1.2.3.4', 4567) self.assertEqual(c.addr_port, ('1.2.3.4', 4567)) c = Cube(address='1.2.3.4') self.assertEqual(c.addr_port, ('1.2.3.4', 62910)) c = Cube(address='1.2.3.4', port=9876) self.assertEqual(c.addr_port, ('1.2.3.4', 9876)) c = Cube( DiscoveryNetworkConfigurationResponse( DiscoveryNetworkConfigResponseBytes)) self.assertEqual(c.addr_port, ('10.10.10.153', 62910))
def test_parse_message(self): for message_type, message_bytes, message_class in [ (HELLO_RESPONSE, HelloResponseBytes, HelloResponse), (M_RESPONSE, MResponseBytes, MResponse), (CONFIGURATION_RESPONSE, CubeConfigurationBytes, ConfigurationResponse), (L_RESPONSE, bytearray(b"CxIrZfcSGWQ8AOsA"), LResponse), (F_RESPONSE, bytearray(b"ntp.homematic.com,ntp.homematic.com"), FResponse), (SET_RESPONSE, bytearray(b"00,0,31"), SetResponse), ]: #conn = Connection((None, None), message_handler=lambda x: x) conn = Cube((None, None)) conn.parse_message(message_type, message_bytes) self.assertEqual(len(conn.received_messages), 1) self.assertTrue(message_type in conn.received_messages.keys(), "Message of type %s not found in .received_messages" % message_type) self.assertIsInstance(conn.received_messages[message_type], message_class)
def test_parse_message(self): for message_type, message_bytes, message_class in [ (HELLO_RESPONSE, HelloResponseBytes, HelloResponse), (M_RESPONSE, MResponseBytes, MResponse), (CONFIGURATION_RESPONSE, CubeConfigurationBytes, ConfigurationResponse), (L_RESPONSE, bytearray(b"CxIrZfcSGWQ8AOsA"), LResponse), (F_RESPONSE, bytearray(b"ntp.homematic.com,ntp.homematic.com"), FResponse), (SET_RESPONSE, bytearray(b"00,0,31"), SetResponse), ]: #conn = Connection((None, None), message_handler=lambda x: x) conn = Cube((None, None)) conn.parse_message(message_type, message_bytes) self.assertEqual(len(conn.received_messages), 1) self.assertTrue( message_type in conn.received_messages.keys(), "Message of type %s not found in .received_messages" % message_type) self.assertIsInstance(conn.received_messages[message_type], message_class)
def update_room(settings, room_id, temperature): logger.info('changing temperature of room %s to %s', room_id, temperature) cube_wait1() cube = Cube('evn-cube') cube.connect() rf_address = database.get_room_rf_address(room_id) cube.set_mode_manual(room_id, rf_address, temperature) cube.disconnect() cube_wait2() logger.info('changing temperature of room %s to %s done', room_id, temperature)
def test_get_ntp_servers(self): c = Cube((None, None)) c._socket = Mock(socket.socket) c._socket.recv = Mock(return_value=bytearray()) c.send_message = Mock() self.assertIsNone(c._ntp_servers) c.ntp_servers c.send_message.assert_called_with(FMessage()) c.handle_message( FResponse( bytearray("ntp.homematic.com,ntp.homematic.com", encoding='utf-8'))) self.assertEqual(c._ntp_servers, [u'ntp.homematic.com', u'ntp.homematic.com'])
def update_cube(settings): cube_wait1() # TODO configurable hostname/ip address cube = Cube('evn-cube') cube.connect() cube_rooms = cube.rooms for cube_room in cube_rooms: database.save_or_update_room(cube_room) problems = [] for cube_device in cube.devices: database.save_or_update_device(cube_device) submit_temperature(settings, cube_device) problems.extend(check_for_problems(cube_device, cube_rooms)) cube.disconnect() cube_wait2() return problems
def _get_cube(): cube_address = os.environ.get('cube_address', None) cube_port = os.environ.get('cube_port', 62910) or 62910 return Cube(address=cube_address, port=cube_port)
if not serial: response = Discovery().discover() if response: serial = response.serial else: print("No cubes found.") sys.exit(1) try: net_cfg_response = Discovery().discover( cube_serial=serial, discovery_type=Discovery.DISCOVERY_TYPE_NETWORK_CONFIG) print("Discovered cube: %s" % net_cfg_response) host = net_cfg_response.ip_address except socket.timeout as st: print("Could not find cube '%s': %s" % (serial, st)) sys.exit(1) with Cube(host) as cube: print("") print(cube.info) print("") print("Rooms:") for room in cube.rooms: print(" %s (ID: %s, RF address: %s):" % (room.name, room.room_id, room.rf_address)) for device in room.devices: print(" - %s, serial: %s, RF address: %s" % (device.name, device.serial, device.rf_address))
def test_double_connect(self): c = Cube('127.0.0.1', 62910) c._socket = Mock(socket.socket) self.assertRaises(CubeConnectionException, c.connect)
def test_handle_message(self): c = Cube(None, None) msg = HelloResponse(HelloResponseBytes) c.handle_message(msg) self.assertEqual(c.info, msg) msg = FResponse(b"ntp.homematic.com,ntp.homematic.com") c.handle_message(msg) self.assertEqual(c._ntp_servers, ['ntp.homematic.com', 'ntp.homematic.com']) msg = MResponse(MResponseBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, device_type=2), ]) c = Cube(None, None) c._devices = DeviceList([ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=2, device_type=2), ]) msg = MResponse(MResponseBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, device_type=2), ]) msg = ConfigurationResponse(ThermostatConfigurationBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, configuration=msg, device_type=2), ]) c = Cube(None, None) c._devices = DeviceList([ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1), ]) lresp = LResponse("BhIrZfcSGWQ8AOsA") c.handle_message(lresp) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, settings=lresp.responses[0]), ]) msg = ConfigurationResponse(ThermostatConfigurationBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, configuration=msg, settings=lresp.responses[0]), ]) # Test doesn't work, somehow the extended LResponse is wrong... lrespext = LResponse("CxIrZfcSGWQ8AOsF") c.handle_message(lrespext)
def test_read_after_connect(self): c = Cube('127.0.0.1', 62910) c.read = Mock() c._create_socket = Mock(return_value=Mock(socket.socket)) c.connect() self.assertTrue(c.read.called)
def test_handle_message(self): c = Cube(None, None) msg = HelloResponse(HelloResponseBytes) c.handle_message(msg) self.assertEqual(c.info, msg) msg = FResponse(b"ntp.homematic.com,ntp.homematic.com") c.handle_message(msg) self.assertEqual(c._ntp_servers, ['ntp.homematic.com', 'ntp.homematic.com']) msg = MResponse(MResponseBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, device_type=2), ]) c = Cube(None, None) c._devices = DeviceList([ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=2, device_type=2), ]) msg = MResponse(MResponseBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, device_type=2), ]) msg = ConfigurationResponse(ThermostatConfigurationBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, configuration=msg, device_type=2), ]) c = Cube(None, None) c._devices = DeviceList([ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1), ]) lresp = LResponse("BhIrZfcSGWQ8AOsA") c.handle_message(lresp) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, settings=lresp), ]) msg = ConfigurationResponse(ThermostatConfigurationBytes) c.handle_message(msg) self.assertEqual(c.devices, [ Device(rf_address='122B65', serial='MEQ1472997', name='Heizung', room_id=1, configuration=msg, settings=lresp), ])
def execute(func): with Cube(sys.argv[1]) as cube: return func(cube)
def test_disconnect_not_connected(self): c = Cube('127.0.0.1', 62910) c.disconnect()
def test_not_connected_read(self): c = Cube('127.0.0.1', 62910) self.assertRaises(CubeConnectionException, c.read)