Refactor into separate file
This commit is contained in:
		
							parent
							
								
									8b64adb80c
								
							
						
					
					
						commit
						c7ed4acb03
					
				| @ -16,6 +16,13 @@ from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \ | |||||||
| 
 | 
 | ||||||
| def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | ||||||
|     """Creates a DSMR asyncio protocol.""" |     """Creates a DSMR asyncio protocol.""" | ||||||
|  |     protocol = _create_dsmr_protocol(dsmr_version, telegram_callback, | ||||||
|  |                                      DSMRProtocol, loop, **kwargs) | ||||||
|  |     return protocol | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _create_dsmr_protocol(dsmr_version, telegram_callback, protocol loop=None, **kwargs): | ||||||
|  |     """Creates a DSMR asyncio protocol.""" | ||||||
| 
 | 
 | ||||||
|     if dsmr_version == '2.2': |     if dsmr_version == '2.2': | ||||||
|         specification = telegram_specifications.V2_2 |         specification = telegram_specifications.V2_2 | ||||||
| @ -39,7 +46,7 @@ def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | |||||||
|         raise NotImplementedError("No telegram parser found for version: %s", |         raise NotImplementedError("No telegram parser found for version: %s", | ||||||
|                                   dsmr_version) |                                   dsmr_version) | ||||||
| 
 | 
 | ||||||
|     protocol = partial(DSMRProtocol, loop, TelegramParser(specification), |     protocol = partial(protocol, loop, TelegramParser(specification), | ||||||
|                        telegram_callback=telegram_callback, **kwargs) |                        telegram_callback=telegram_callback, **kwargs) | ||||||
| 
 | 
 | ||||||
|     return protocol, serial_settings |     return protocol, serial_settings | ||||||
| @ -142,26 +149,3 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
|     async def wait_closed(self): |     async def wait_closed(self): | ||||||
|         """Wait until connection is closed.""" |         """Wait until connection is closed.""" | ||||||
|         await self._closed.wait() |         await self._closed.wait() | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| PACKETTYPE_DSMR = 0x62 |  | ||||||
| SUBTYPE_P1 = 0x01 |  | ||||||
| 
 |  | ||||||
| class RFXtrxDSMRProtocol(DSMRProtocol): |  | ||||||
| 
 |  | ||||||
|     remaining_data = b'' |  | ||||||
| 
 |  | ||||||
|     def data_received(self, data): |  | ||||||
|         """Add incoming data to buffer.""" |  | ||||||
| 
 |  | ||||||
|         data = self.remaining_data + data |  | ||||||
| 
 |  | ||||||
|         while (len(data) > 0 and (packetlength := data[0]+1) <= len(data)): |  | ||||||
|             packettype = data[1] |  | ||||||
|             subtype = data[2] |  | ||||||
|             if (packettype == PACKETTYPE_DSMR and subtype == SUBTYPE_P1): |  | ||||||
|                 dsmr_data = data[4:packetlength] |  | ||||||
|                 super().data_received(dsmr_data) |  | ||||||
|             data = data[packetlength:] |  | ||||||
| 
 |  | ||||||
|         self.remaining_data = data |  | ||||||
|  | |||||||
							
								
								
									
										62
									
								
								dsmr_parser/clients/rfxtrx_protocol.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								dsmr_parser/clients/rfxtrx_protocol.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | """Asyncio protocol implementation for handling telegrams over a RFXtrx connection .""" | ||||||
|  | 
 | ||||||
|  | from functools import partial | ||||||
|  | import asyncio | ||||||
|  | 
 | ||||||
|  | from serial_asyncio import create_serial_connection | ||||||
|  | 
 | ||||||
|  | from .protocol import DSMRProtocol, _create_dsmr_protocol | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def create_rfxtrx_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | ||||||
|  |     """Creates a DSMR asyncio protocol.""" | ||||||
|  |     protocol = _create_dsmr_protocol(dsmr_version, telegram_callback, | ||||||
|  |                                      RFXtrxDSMRProtocol, loop, **kwargs) | ||||||
|  |     return protocol | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def create_rfxtrx_dsmr_reader(port, dsmr_version, telegram_callback, loop=None): | ||||||
|  |     """Creates a DSMR asyncio protocol coroutine using a RFXtrx serial port.""" | ||||||
|  |     protocol, serial_settings = create_rfxtrx_dsmr_protocol( | ||||||
|  |         dsmr_version, telegram_callback, loop=None) | ||||||
|  |     serial_settings['url'] = port | ||||||
|  | 
 | ||||||
|  |     conn = create_serial_connection(loop, protocol, **serial_settings) | ||||||
|  |     return conn | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def create_rfxtrx_tcp_dsmr_reader(host, port, dsmr_version, | ||||||
|  |                                   telegram_callback, loop=None, | ||||||
|  |                                   keep_alive_interval=None): | ||||||
|  |     """Creates a DSMR asyncio protocol coroutine using a RFXtrx TCP connection.""" | ||||||
|  |     if not loop: | ||||||
|  |         loop = asyncio.get_event_loop() | ||||||
|  |     protocol, _ = create_rfxtrx_dsmr_protocol( | ||||||
|  |         dsmr_version, telegram_callback, loop=loop, | ||||||
|  |         keep_alive_interval=keep_alive_interval) | ||||||
|  |     conn = loop.create_connection(protocol, host, port) | ||||||
|  |     return conn | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | PACKETTYPE_DSMR = 0x62 | ||||||
|  | SUBTYPE_P1 = 0x01 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class RFXtrxDSMRProtocol(DSMRProtocol): | ||||||
|  | 
 | ||||||
|  |     remaining_data = b'' | ||||||
|  | 
 | ||||||
|  |     def data_received(self, data): | ||||||
|  |         """Add incoming data to buffer.""" | ||||||
|  | 
 | ||||||
|  |         data = self.remaining_data + data | ||||||
|  | 
 | ||||||
|  |         while (len(data) > 0 and (packetlength := data[0]+1) <= len(data)): | ||||||
|  |             packettype = data[1] | ||||||
|  |             subtype = data[2] | ||||||
|  |             if (packettype == PACKETTYPE_DSMR and subtype == SUBTYPE_P1): | ||||||
|  |                 dsmr_data = data[4:packetlength] | ||||||
|  |                 super().data_received(dsmr_data) | ||||||
|  |             data = data[packetlength:] | ||||||
|  | 
 | ||||||
|  |         self.remaining_data = data | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user