Add TCP arguments to console. Implement reconnect logic in protocol.
This commit is contained in:
		
							parent
							
								
									cdc9e395aa
								
							
						
					
					
						commit
						763237ef1d
					
				| @ -1,8 +1,9 @@ | |||||||
| import argparse | import argparse | ||||||
| import asyncio | import asyncio | ||||||
| import logging | import logging | ||||||
|  | from functools import partial | ||||||
| 
 | 
 | ||||||
| from .protocol import create_dsmr_reader | from .protocol import create_dsmr_reader, create_tcp_dsmr_reader | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def console(): | def console(): | ||||||
| @ -11,6 +12,10 @@ def console(): | |||||||
|     parser = argparse.ArgumentParser(description=console.__doc__) |     parser = argparse.ArgumentParser(description=console.__doc__) | ||||||
|     parser.add_argument('--device', default='/dev/ttyUSB0', |     parser.add_argument('--device', default='/dev/ttyUSB0', | ||||||
|                         help='port to read DSMR data from') |                         help='port to read DSMR data from') | ||||||
|  |     parser.add_argument('--host', default=None, | ||||||
|  |                         help='alternatively connect using TCP host.') | ||||||
|  |     parser.add_argument('--port', default=None, | ||||||
|  |                         help='TCP port to use for connection') | ||||||
|     parser.add_argument('--version', default='2.2', choices=['2.2', '4'], |     parser.add_argument('--version', default='2.2', choices=['2.2', '4'], | ||||||
|                         help='DSMR version (2.2, 4)') |                         help='DSMR version (2.2, 4)') | ||||||
|     parser.add_argument('--verbose', '-v', action='count') |     parser.add_argument('--verbose', '-v', action='count') | ||||||
| @ -32,7 +37,29 @@ def console(): | |||||||
|                 print(obj.value, obj.unit) |                 print(obj.value, obj.unit) | ||||||
|         print() |         print() | ||||||
| 
 | 
 | ||||||
|     conn = create_dsmr_reader(args.device, args.version, print_callback, loop=loop) |     # create tcp or serial connection depending on args | ||||||
|  |     if args.host and args.port: | ||||||
|  |         create_connection = partial(create_tcp_dsmr_reader, | ||||||
|  |                                     args.host, args.port, args.version, | ||||||
|  |                                     print_callback, loop=loop) | ||||||
|  |     else: | ||||||
|  |         create_connection = partial(create_dsmr_reader, | ||||||
|  |                                     args.device, args.version, | ||||||
|  |                                     print_callback, loop=loop) | ||||||
| 
 | 
 | ||||||
|     loop.create_task(conn) |     try: | ||||||
|     loop.run_forever() |         # connect and keep connected until interrupted by ctrl-c | ||||||
|  |         while True: | ||||||
|  |             # create serial or tcp connection | ||||||
|  |             conn = create_connection() | ||||||
|  |             transport, protocol = loop.run_until_complete(conn) | ||||||
|  |             # wait until connection it closed | ||||||
|  |             loop.run_until_complete(protocol.wait_closed()) | ||||||
|  |             # wait 5 seconds before attempting reconnect | ||||||
|  |             loop.run_until_complete(asyncio.sleep(5)) | ||||||
|  |     except KeyboardInterrupt: | ||||||
|  |         # cleanup connection after user initiated shutdown | ||||||
|  |         transport.close() | ||||||
|  |         loop.run_until_complete(asyncio.sleep(0)) | ||||||
|  |     finally: | ||||||
|  |         loop.close() | ||||||
|  | |||||||
| @ -8,15 +8,9 @@ from serial_asyncio import create_serial_connection | |||||||
| 
 | 
 | ||||||
| from . import telegram_specifications | from . import telegram_specifications | ||||||
| from .exceptions import ParseError | from .exceptions import ParseError | ||||||
| from .parsers import ( | from .parsers import TelegramParserV2_2, TelegramParserV4 | ||||||
|     TelegramParserV2_2, | from .serial import (SERIAL_SETTINGS_V2_2, SERIAL_SETTINGS_V4, | ||||||
|     TelegramParserV4 |                      is_end_of_telegram, is_start_of_telegram) | ||||||
| ) |  | ||||||
| from .serial import ( |  | ||||||
|     SERIAL_SETTINGS_V2_2, SERIAL_SETTINGS_V4, |  | ||||||
|     is_end_of_telegram, |  | ||||||
|     is_start_of_telegram |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def creater_dsmr_protocol(dsmr_version, telegram_callback, loop=None): | def creater_dsmr_protocol(dsmr_version, telegram_callback, loop=None): | ||||||
| @ -47,7 +41,8 @@ def create_dsmr_reader(port, dsmr_version, telegram_callback, loop=None): | |||||||
|     return conn |     return conn | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def create_tcp_dsmr_reader(host, port, dsmr_version, telegram_callback, loop=None): | def create_tcp_dsmr_reader(host, port, dsmr_version, | ||||||
|  |                            telegram_callback, loop=None): | ||||||
|     """Creates a DSMR asyncio protocol coroutine using TCP connection.""" |     """Creates a DSMR asyncio protocol coroutine using TCP connection.""" | ||||||
|     protocol, _ = creater_dsmr_protocol( |     protocol, _ = creater_dsmr_protocol( | ||||||
|         dsmr_version, telegram_callback, loop=None) |         dsmr_version, telegram_callback, loop=None) | ||||||
| @ -72,6 +67,8 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
|         self.telegram = [] |         self.telegram = [] | ||||||
|         # buffer to keep incomplete incoming data |         # buffer to keep incomplete incoming data | ||||||
|         self.buffer = '' |         self.buffer = '' | ||||||
|  |         # keep a lock until the connection is closed | ||||||
|  |         self._closed = asyncio.Event() | ||||||
| 
 | 
 | ||||||
|     def connection_made(self, transport): |     def connection_made(self, transport): | ||||||
|         """Just logging for now.""" |         """Just logging for now.""" | ||||||
| @ -107,7 +104,11 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
| 
 | 
 | ||||||
|     def connection_lost(self, exc): |     def connection_lost(self, exc): | ||||||
|         """Stop when connection is lost.""" |         """Stop when connection is lost.""" | ||||||
|         self.log.error('disconnected') |         if exc: | ||||||
|  |             self.log.exception('disconnected due to exception') | ||||||
|  |         else: | ||||||
|  |             self.log.info('disconnected because of close/abort.') | ||||||
|  |         self._closed.set() | ||||||
| 
 | 
 | ||||||
|     def handle_telegram(self, telegram): |     def handle_telegram(self, telegram): | ||||||
|         """Send off parsed telegram to handling callback.""" |         """Send off parsed telegram to handling callback.""" | ||||||
| @ -115,3 +116,8 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
| 
 | 
 | ||||||
|         if self.telegram_callback: |         if self.telegram_callback: | ||||||
|             self.telegram_callback(telegram) |             self.telegram_callback(telegram) | ||||||
|  | 
 | ||||||
|  |     @asyncio.coroutine | ||||||
|  |     def wait_closed(self): | ||||||
|  |         """Wait until connection is closed.""" | ||||||
|  |         yield from self._closed.wait() | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user