Merge pull request #63 from mjkl-gh/master
Improve documentation asyncio
This commit is contained in:
		
						commit
						7f35cd3c73
					
				
							
								
								
									
										113
									
								
								README.rst
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								README.rst
									
									
									
									
									
								
							| @ -39,10 +39,6 @@ process because the code is blocking (not asynchronous): | ||||
|      for telegram in serial_reader.read(): | ||||
|          print(telegram)  # see 'Telegram object' docs below | ||||
| 
 | ||||
| **AsyncIO client** | ||||
| 
 | ||||
| To be documented. | ||||
| 
 | ||||
| **Socket client** | ||||
| 
 | ||||
| Read a remote serial port (for example using ser2net) and work with the parsed telegrams. | ||||
| @ -62,6 +58,115 @@ It should be run in a separate process because the code is blocking (not asynchr | ||||
|      for telegram in socket_reader.read(): | ||||
|          print(telegram)  # see 'Telegram object' docs below | ||||
| 
 | ||||
| **AsyncIO client** | ||||
| 
 | ||||
| For a test run using a tcp server (lasting 20 seconds) use the following example: | ||||
| 
 | ||||
| .. code-block:: python | ||||
|     import asyncio | ||||
|     import logging | ||||
|     from dsmr_parser import obis_references | ||||
|     from dsmr_parser.clients.protocol import create_dsmr_reader, create_tcp_dsmr_reader | ||||
| 
 | ||||
|     logging.basicConfig(level=logging.INFO, format='%(message)s') | ||||
| 
 | ||||
|     HOST = MY_HOST | ||||
|     PORT = MY_PORT | ||||
|     DSMR_VERSION = MY_DSMR_VERSION | ||||
| 
 | ||||
|     logger = logging.getLogger('tcpclient') | ||||
|     logger.debug("Logger created") | ||||
| 
 | ||||
|     def printTelegram(telegram): | ||||
|         logger.info(telegram) | ||||
| 
 | ||||
| 
 | ||||
|     async def main(): | ||||
|         try: | ||||
|             logger.debug("Getting loop") | ||||
|             loop = asyncio.get_event_loop() | ||||
|             logger.debug("Creating reader") | ||||
|             await 	create_tcp_dsmr_reader( | ||||
|                                 HOST, | ||||
|                                 PORT, | ||||
|                                 DSMR_VERSION, | ||||
|                                 printTelegram, | ||||
|                                 loop | ||||
|                                 ) | ||||
|             logger.debug("Reader created going to sleep now")					 | ||||
|             await asyncio.sleep(20) | ||||
|             logger.info('Finished run')					 | ||||
|         except Exception as e: | ||||
|             logger.error("Unexpected error: "+ e) | ||||
| 
 | ||||
|     asyncio.run(main()) | ||||
| 
 | ||||
| Note the creation of a callback function to call when a telegram is received. In this case `printTelegram`. Normally the used loop is the one running. | ||||
| 
 | ||||
| Currently the asyncio implementation does not support returning telegram objects directly as a `read_as_object()` for async tcp is currently not implemented. | ||||
| Moreover, the telegram passed to `telegram_callback(telegram)` is already parsed. Therefore we can't feed it into the telegram constructor directly as that expects unparsed telegrams | ||||
| 
 | ||||
| However, if we construct a mock TelegramParser that just returns the already parsed object we can work around this. An example is below: | ||||
| 
 | ||||
| .. code-block:: python | ||||
|     import asyncio | ||||
|     import logging | ||||
|     #from dsmr_parser import obis_references | ||||
|     #from dsmr_parser import telegram_specifications | ||||
|     #from dsmr_parser.clients.protocol import create_dsmr_reader, create_tcp_dsmr_reader | ||||
|     #from dsmr_parser.objects import Telegram | ||||
| 
 | ||||
|     logging.basicConfig(level=logging.INFO, format='%(message)s') | ||||
| 
 | ||||
|     HOST = MY_HOST | ||||
|     PORT = MY_PORT | ||||
|     DSMR_VERSION = MY_DSMR_VERSION | ||||
| 
 | ||||
|     logger = logging.getLogger('tcpclient') | ||||
|     logger.debug("Logger created") | ||||
| 
 | ||||
|     class mockTelegramParser(object): | ||||
| 
 | ||||
|         def parse(self, telegram): | ||||
|             return telegram | ||||
| 
 | ||||
|     telegram_parser = mockTelegramParser() | ||||
| 
 | ||||
|     def printTelegram(telegram): | ||||
|         try: | ||||
|             logger.info(Telegram(telegram, telegram_parser, telegram_specifications.V4)) | ||||
|         except InvalidChecksumError as e: | ||||
|             logger.warning(str(e)) | ||||
|         except ParseError as e: | ||||
|             logger.error('Failed to parse telegram: %s', e) | ||||
| 
 | ||||
| 
 | ||||
|     async def main(): | ||||
|         try: | ||||
|             logger.debug("Getting loop") | ||||
|             loop = asyncio.get_event_loop() | ||||
|             logger.debug("Creating reader") | ||||
|             await 	create_tcp_dsmr_reader( | ||||
|                                 HOST, | ||||
|                                 PORT, | ||||
|                                 DSMR_VERSION, | ||||
|                                 printTelegram, | ||||
|                                 loop | ||||
|                                 ) | ||||
|             logger.debug("Reader created going to sleep now")					 | ||||
|             while True: | ||||
|                 await asyncio.sleep(1) | ||||
|         except Exception as e: | ||||
|             logger.error("Unexpected error: "+ e) | ||||
|             raise | ||||
| 
 | ||||
|     if __name__ == '__main__': | ||||
|         try: | ||||
|             asyncio.run(main()) | ||||
|         except (KeyboardInterrupt, SystemExit): | ||||
|             logger.info('Closing down...')					 | ||||
|         except Exception as e: | ||||
|             logger.error("Unexpected error: "+ e) | ||||
| 
 | ||||
| Parsing module usage | ||||
| -------------------- | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user