adding EasyMeter Q3D support
This commit is contained in:
		
							parent
							
								
									dc608f9da3
								
							
						
					
					
						commit
						761aaccb3f
					
				| @ -10,15 +10,20 @@ def console(): | |||||||
|     """Output DSMR data to console.""" |     """Output DSMR data to console.""" | ||||||
| 
 | 
 | ||||||
|     parser = argparse.ArgumentParser(description=console.__doc__) |     parser = argparse.ArgumentParser(description=console.__doc__) | ||||||
|     parser.add_argument('--device', default='/dev/ttyUSB0', |     parser.add_argument( | ||||||
|                         help='port to read DSMR data from') |         "--device", default="/dev/ttyUSB0", help="port to read DSMR data from" | ||||||
|     parser.add_argument('--host', default=None, |     ) | ||||||
|                         help='alternatively connect using TCP host.') |     parser.add_argument( | ||||||
|     parser.add_argument('--port', default=None, |         "--host", default=None, help="alternatively connect using TCP host." | ||||||
|                         help='TCP port to use for connection') |     ) | ||||||
|     parser.add_argument('--version', default='2.2', choices=['2.2', '4', '5', '5B', '5L', '5S'], |     parser.add_argument("--port", default=None, help="TCP port to use for connection") | ||||||
|                         help='DSMR version (2.2, 4, 5, 5B, 5L, 5S)') |     parser.add_argument( | ||||||
|     parser.add_argument('--verbose', '-v', action='count') |         "--version", | ||||||
|  |         default="2.2", | ||||||
|  |         choices=["2.2", "4", "5", "5B", "5L", "5S", "Q3D"], | ||||||
|  |         help="DSMR version (2.2, 4, 5, 5B, 5L, 5S, Q3D)", | ||||||
|  |     ) | ||||||
|  |     parser.add_argument("--verbose", "-v", action="count") | ||||||
| 
 | 
 | ||||||
|     args = parser.parse_args() |     args = parser.parse_args() | ||||||
| 
 | 
 | ||||||
| @ -39,13 +44,18 @@ def console(): | |||||||
| 
 | 
 | ||||||
|     # create tcp or serial connection depending on args |     # create tcp or serial connection depending on args | ||||||
|     if args.host and args.port: |     if args.host and args.port: | ||||||
|         create_connection = partial(create_tcp_dsmr_reader, |         create_connection = partial( | ||||||
|                                     args.host, args.port, args.version, |             create_tcp_dsmr_reader, | ||||||
|                                     print_callback, loop=loop) |             args.host, | ||||||
|  |             args.port, | ||||||
|  |             args.version, | ||||||
|  |             print_callback, | ||||||
|  |             loop=loop, | ||||||
|  |         ) | ||||||
|     else: |     else: | ||||||
|         create_connection = partial(create_dsmr_reader, |         create_connection = partial( | ||||||
|                                     args.device, args.version, |             create_dsmr_reader, args.device, args.version, print_callback, loop=loop | ||||||
|                                     print_callback, loop=loop) |         ) | ||||||
| 
 | 
 | ||||||
|     try: |     try: | ||||||
|         # connect and keep connected until interrupted by ctrl-c |         # connect and keep connected until interrupted by ctrl-c | ||||||
|  | |||||||
| @ -10,23 +10,26 @@ from dsmr_parser import telegram_specifications | |||||||
| from dsmr_parser.clients.telegram_buffer import TelegramBuffer | from dsmr_parser.clients.telegram_buffer import TelegramBuffer | ||||||
| from dsmr_parser.exceptions import ParseError, InvalidChecksumError | from dsmr_parser.exceptions import ParseError, InvalidChecksumError | ||||||
| from dsmr_parser.parsers import TelegramParser | from dsmr_parser.parsers import TelegramParser | ||||||
| from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \ | from dsmr_parser.clients.settings import ( | ||||||
|     SERIAL_SETTINGS_V4, SERIAL_SETTINGS_V5 |     SERIAL_SETTINGS_V2_2, | ||||||
|  |     SERIAL_SETTINGS_V4, | ||||||
|  |     SERIAL_SETTINGS_V5, | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 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.""" | ||||||
| 
 | 
 | ||||||
|     if dsmr_version == '2.2': |     if dsmr_version == "2.2": | ||||||
|         specification = telegram_specifications.V2_2 |         specification = telegram_specifications.V2_2 | ||||||
|         serial_settings = SERIAL_SETTINGS_V2_2 |         serial_settings = SERIAL_SETTINGS_V2_2 | ||||||
|     elif dsmr_version == '4': |     elif dsmr_version == "4": | ||||||
|         specification = telegram_specifications.V4 |         specification = telegram_specifications.V4 | ||||||
|         serial_settings = SERIAL_SETTINGS_V4 |         serial_settings = SERIAL_SETTINGS_V4 | ||||||
|     elif dsmr_version == '5': |     elif dsmr_version == "5": | ||||||
|         specification = telegram_specifications.V5 |         specification = telegram_specifications.V5 | ||||||
|         serial_settings = SERIAL_SETTINGS_V5 |         serial_settings = SERIAL_SETTINGS_V5 | ||||||
|     elif dsmr_version == '5B': |     elif dsmr_version == "5B": | ||||||
|         specification = telegram_specifications.BELGIUM_FLUVIUS |         specification = telegram_specifications.BELGIUM_FLUVIUS | ||||||
|         serial_settings = SERIAL_SETTINGS_V5 |         serial_settings = SERIAL_SETTINGS_V5 | ||||||
|     elif dsmr_version == "5L": |     elif dsmr_version == "5L": | ||||||
| @ -35,12 +38,21 @@ def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | |||||||
|     elif dsmr_version == "5S": |     elif dsmr_version == "5S": | ||||||
|         specification = telegram_specifications.SWEDEN |         specification = telegram_specifications.SWEDEN | ||||||
|         serial_settings = SERIAL_SETTINGS_V5 |         serial_settings = SERIAL_SETTINGS_V5 | ||||||
|  |     elif dsmr_version == "Q3D": | ||||||
|  |         specification = telegram_specifications.Q3D | ||||||
|  |         serial_settings = SERIAL_SETTINGS_V5 | ||||||
|     else: |     else: | ||||||
|         raise NotImplementedError("No telegram parser found for version: %s", |         raise NotImplementedError( | ||||||
|                                   dsmr_version) |             "No telegram parser found for version: %s", dsmr_version | ||||||
|  |         ) | ||||||
| 
 | 
 | ||||||
|     protocol = partial(DSMRProtocol, loop, TelegramParser(specification), |     protocol = partial( | ||||||
|                        telegram_callback=telegram_callback, **kwargs) |         DSMRProtocol, | ||||||
|  |         loop, | ||||||
|  |         TelegramParser(specification), | ||||||
|  |         telegram_callback=telegram_callback, | ||||||
|  |         **kwargs | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     return protocol, serial_settings |     return protocol, serial_settings | ||||||
| 
 | 
 | ||||||
| @ -48,22 +60,26 @@ def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | |||||||
| def create_dsmr_reader(port, dsmr_version, telegram_callback, loop=None): | def create_dsmr_reader(port, dsmr_version, telegram_callback, loop=None): | ||||||
|     """Creates a DSMR asyncio protocol coroutine using serial port.""" |     """Creates a DSMR asyncio protocol coroutine using serial port.""" | ||||||
|     protocol, serial_settings = create_dsmr_protocol( |     protocol, serial_settings = create_dsmr_protocol( | ||||||
|         dsmr_version, telegram_callback, loop=None) |         dsmr_version, telegram_callback, loop=None | ||||||
|     serial_settings['url'] = port |     ) | ||||||
|  |     serial_settings["url"] = port | ||||||
| 
 | 
 | ||||||
|     conn = create_serial_connection(loop, protocol, **serial_settings) |     conn = create_serial_connection(loop, protocol, **serial_settings) | ||||||
|     return conn |     return conn | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def create_tcp_dsmr_reader(host, port, dsmr_version, | def create_tcp_dsmr_reader( | ||||||
|                            telegram_callback, loop=None, |     host, port, dsmr_version, telegram_callback, loop=None, keep_alive_interval=None | ||||||
|                            keep_alive_interval=None): | ): | ||||||
|     """Creates a DSMR asyncio protocol coroutine using TCP connection.""" |     """Creates a DSMR asyncio protocol coroutine using TCP connection.""" | ||||||
|     if not loop: |     if not loop: | ||||||
|         loop = asyncio.get_event_loop() |         loop = asyncio.get_event_loop() | ||||||
|     protocol, _ = create_dsmr_protocol( |     protocol, _ = create_dsmr_protocol( | ||||||
|         dsmr_version, telegram_callback, loop=loop, |         dsmr_version, | ||||||
|         keep_alive_interval=keep_alive_interval) |         telegram_callback, | ||||||
|  |         loop=loop, | ||||||
|  |         keep_alive_interval=keep_alive_interval, | ||||||
|  |     ) | ||||||
|     conn = loop.create_connection(protocol, host, port) |     conn = loop.create_connection(protocol, host, port) | ||||||
|     return conn |     return conn | ||||||
| 
 | 
 | ||||||
| @ -74,8 +90,9 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
|     transport = None |     transport = None | ||||||
|     telegram_callback = None |     telegram_callback = None | ||||||
| 
 | 
 | ||||||
|     def __init__(self, loop, telegram_parser, |     def __init__( | ||||||
|                  telegram_callback=None, keep_alive_interval=None): |         self, loop, telegram_parser, telegram_callback=None, keep_alive_interval=None | ||||||
|  |     ): | ||||||
|         """Initialize class.""" |         """Initialize class.""" | ||||||
|         self.loop = loop |         self.loop = loop | ||||||
|         self.log = logging.getLogger(__name__) |         self.log = logging.getLogger(__name__) | ||||||
| @ -92,16 +109,16 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
|     def connection_made(self, transport): |     def connection_made(self, transport): | ||||||
|         """Just logging for now.""" |         """Just logging for now.""" | ||||||
|         self.transport = transport |         self.transport = transport | ||||||
|         self.log.debug('connected') |         self.log.debug("connected") | ||||||
|         self._active = False |         self._active = False | ||||||
|         if self.loop and self._keep_alive_interval: |         if self.loop and self._keep_alive_interval: | ||||||
|             self.loop.call_later(self._keep_alive_interval, self.keep_alive) |             self.loop.call_later(self._keep_alive_interval, self.keep_alive) | ||||||
| 
 | 
 | ||||||
|     def data_received(self, data): |     def data_received(self, data): | ||||||
|         """Add incoming data to buffer.""" |         """Add incoming data to buffer.""" | ||||||
|         data = data.decode('ascii') |         data = data.decode("ascii") | ||||||
|         self._active = True |         self._active = True | ||||||
|         self.log.debug('received data: %s', data) |         self.log.debug("received data: %s", data) | ||||||
|         self.telegram_buffer.append(data) |         self.telegram_buffer.append(data) | ||||||
| 
 | 
 | ||||||
|         for telegram in self.telegram_buffer.get_all(): |         for telegram in self.telegram_buffer.get_all(): | ||||||
| @ -109,26 +126,26 @@ class DSMRProtocol(asyncio.Protocol): | |||||||
| 
 | 
 | ||||||
|     def keep_alive(self): |     def keep_alive(self): | ||||||
|         if self._active: |         if self._active: | ||||||
|             self.log.debug('keep-alive checked') |             self.log.debug("keep-alive checked") | ||||||
|             self._active = False |             self._active = False | ||||||
|             if self.loop: |             if self.loop: | ||||||
|                 self.loop.call_later(self._keep_alive_interval, self.keep_alive) |                 self.loop.call_later(self._keep_alive_interval, self.keep_alive) | ||||||
|         else: |         else: | ||||||
|             self.log.warning('keep-alive check failed') |             self.log.warning("keep-alive check failed") | ||||||
|             if self.transport: |             if self.transport: | ||||||
|                 self.transport.close() |                 self.transport.close() | ||||||
| 
 | 
 | ||||||
|     def connection_lost(self, exc): |     def connection_lost(self, exc): | ||||||
|         """Stop when connection is lost.""" |         """Stop when connection is lost.""" | ||||||
|         if exc: |         if exc: | ||||||
|             self.log.exception('disconnected due to exception', exc_info=exc) |             self.log.exception("disconnected due to exception", exc_info=exc) | ||||||
|         else: |         else: | ||||||
|             self.log.info('disconnected because of close/abort.') |             self.log.info("disconnected because of close/abort.") | ||||||
|         self._closed.set() |         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.""" | ||||||
|         self.log.debug('got telegram: %s', telegram) |         self.log.debug("got telegram: %s", telegram) | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             parsed_telegram = self.telegram_parser.parse(telegram) |             parsed_telegram = self.telegram_parser.parse(telegram) | ||||||
|  | |||||||
| @ -8,53 +8,56 @@ This module contains a mapping of obis references to names. | |||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| EN = { | EN = { | ||||||
|     obis.P1_MESSAGE_HEADER: 'P1_MESSAGE_HEADER', |     obis.P1_MESSAGE_HEADER: "P1_MESSAGE_HEADER", | ||||||
|     obis.P1_MESSAGE_TIMESTAMP: 'P1_MESSAGE_TIMESTAMP', |     obis.P1_MESSAGE_TIMESTAMP: "P1_MESSAGE_TIMESTAMP", | ||||||
|     obis.ELECTRICITY_IMPORTED_TOTAL: 'ELECTRICITY_IMPORTED_TOTAL', |     obis.ELECTRICITY_IMPORTED_TOTAL: "ELECTRICITY_IMPORTED_TOTAL", | ||||||
|     obis.ELECTRICITY_USED_TARIFF_1: 'ELECTRICITY_USED_TARIFF_1', |     obis.ELECTRICITY_USED_TARIFF_1: "ELECTRICITY_USED_TARIFF_1", | ||||||
|     obis.ELECTRICITY_USED_TARIFF_2: 'ELECTRICITY_USED_TARIFF_2', |     obis.ELECTRICITY_USED_TARIFF_2: "ELECTRICITY_USED_TARIFF_2", | ||||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_1: 'ELECTRICITY_DELIVERED_TARIFF_1', |     obis.ELECTRICITY_DELIVERED_TARIFF_1: "ELECTRICITY_DELIVERED_TARIFF_1", | ||||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_2: 'ELECTRICITY_DELIVERED_TARIFF_2', |     obis.ELECTRICITY_DELIVERED_TARIFF_2: "ELECTRICITY_DELIVERED_TARIFF_2", | ||||||
|     obis.ELECTRICITY_ACTIVE_TARIFF: 'ELECTRICITY_ACTIVE_TARIFF', |     obis.ELECTRICITY_ACTIVE_TARIFF: "ELECTRICITY_ACTIVE_TARIFF", | ||||||
|     obis.EQUIPMENT_IDENTIFIER: 'EQUIPMENT_IDENTIFIER', |     obis.EQUIPMENT_IDENTIFIER: "EQUIPMENT_IDENTIFIER", | ||||||
|     obis.CURRENT_ELECTRICITY_USAGE: 'CURRENT_ELECTRICITY_USAGE', |     obis.CURRENT_ELECTRICITY_USAGE: "CURRENT_ELECTRICITY_USAGE", | ||||||
|     obis.CURRENT_ELECTRICITY_DELIVERY: 'CURRENT_ELECTRICITY_DELIVERY', |     obis.CURRENT_ELECTRICITY_DELIVERY: "CURRENT_ELECTRICITY_DELIVERY", | ||||||
|     obis.LONG_POWER_FAILURE_COUNT: 'LONG_POWER_FAILURE_COUNT', |     obis.LONG_POWER_FAILURE_COUNT: "LONG_POWER_FAILURE_COUNT", | ||||||
|     obis.SHORT_POWER_FAILURE_COUNT: 'SHORT_POWER_FAILURE_COUNT', |     obis.SHORT_POWER_FAILURE_COUNT: "SHORT_POWER_FAILURE_COUNT", | ||||||
|     obis.POWER_EVENT_FAILURE_LOG: 'POWER_EVENT_FAILURE_LOG', |     obis.POWER_EVENT_FAILURE_LOG: "POWER_EVENT_FAILURE_LOG", | ||||||
|     obis.VOLTAGE_SAG_L1_COUNT: 'VOLTAGE_SAG_L1_COUNT', |     obis.VOLTAGE_SAG_L1_COUNT: "VOLTAGE_SAG_L1_COUNT", | ||||||
|     obis.VOLTAGE_SAG_L2_COUNT: 'VOLTAGE_SAG_L2_COUNT', |     obis.VOLTAGE_SAG_L2_COUNT: "VOLTAGE_SAG_L2_COUNT", | ||||||
|     obis.VOLTAGE_SAG_L3_COUNT: 'VOLTAGE_SAG_L3_COUNT', |     obis.VOLTAGE_SAG_L3_COUNT: "VOLTAGE_SAG_L3_COUNT", | ||||||
|     obis.VOLTAGE_SWELL_L1_COUNT: 'VOLTAGE_SWELL_L1_COUNT', |     obis.VOLTAGE_SWELL_L1_COUNT: "VOLTAGE_SWELL_L1_COUNT", | ||||||
|     obis.VOLTAGE_SWELL_L2_COUNT: 'VOLTAGE_SWELL_L2_COUNT', |     obis.VOLTAGE_SWELL_L2_COUNT: "VOLTAGE_SWELL_L2_COUNT", | ||||||
|     obis.VOLTAGE_SWELL_L3_COUNT: 'VOLTAGE_SWELL_L3_COUNT', |     obis.VOLTAGE_SWELL_L3_COUNT: "VOLTAGE_SWELL_L3_COUNT", | ||||||
|     obis.INSTANTANEOUS_VOLTAGE_L1: 'INSTANTANEOUS_VOLTAGE_L1', |     obis.INSTANTANEOUS_VOLTAGE_L1: "INSTANTANEOUS_VOLTAGE_L1", | ||||||
|     obis.INSTANTANEOUS_VOLTAGE_L2: 'INSTANTANEOUS_VOLTAGE_L2', |     obis.INSTANTANEOUS_VOLTAGE_L2: "INSTANTANEOUS_VOLTAGE_L2", | ||||||
|     obis.INSTANTANEOUS_VOLTAGE_L3: 'INSTANTANEOUS_VOLTAGE_L3', |     obis.INSTANTANEOUS_VOLTAGE_L3: "INSTANTANEOUS_VOLTAGE_L3", | ||||||
|     obis.INSTANTANEOUS_CURRENT_L1: 'INSTANTANEOUS_CURRENT_L1', |     obis.INSTANTANEOUS_CURRENT_L1: "INSTANTANEOUS_CURRENT_L1", | ||||||
|     obis.INSTANTANEOUS_CURRENT_L2: 'INSTANTANEOUS_CURRENT_L2', |     obis.INSTANTANEOUS_CURRENT_L2: "INSTANTANEOUS_CURRENT_L2", | ||||||
|     obis.INSTANTANEOUS_CURRENT_L3: 'INSTANTANEOUS_CURRENT_L3', |     obis.INSTANTANEOUS_CURRENT_L3: "INSTANTANEOUS_CURRENT_L3", | ||||||
|     obis.TEXT_MESSAGE_CODE: 'TEXT_MESSAGE_CODE', |     obis.TEXT_MESSAGE_CODE: "TEXT_MESSAGE_CODE", | ||||||
|     obis.TEXT_MESSAGE: 'TEXT_MESSAGE', |     obis.TEXT_MESSAGE: "TEXT_MESSAGE", | ||||||
|     obis.DEVICE_TYPE: 'DEVICE_TYPE', |     obis.DEVICE_TYPE: "DEVICE_TYPE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: 'INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: "INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE: 'INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE: "INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE: 'INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE: "INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE: 'INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE: "INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE: 'INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE: "INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE", | ||||||
|     obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: 'INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE', |     obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: "INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE", | ||||||
|     obis.EQUIPMENT_IDENTIFIER_GAS: 'EQUIPMENT_IDENTIFIER_GAS', |     obis.EQUIPMENT_IDENTIFIER_GAS: "EQUIPMENT_IDENTIFIER_GAS", | ||||||
|     obis.HOURLY_GAS_METER_READING: 'HOURLY_GAS_METER_READING', |     obis.HOURLY_GAS_METER_READING: "HOURLY_GAS_METER_READING", | ||||||
|     obis.GAS_METER_READING: 'GAS_METER_READING', |     obis.GAS_METER_READING: "GAS_METER_READING", | ||||||
|     obis.ACTUAL_TRESHOLD_ELECTRICITY: 'ACTUAL_TRESHOLD_ELECTRICITY', |     obis.ACTUAL_TRESHOLD_ELECTRICITY: "ACTUAL_TRESHOLD_ELECTRICITY", | ||||||
|     obis.ACTUAL_SWITCH_POSITION: 'ACTUAL_SWITCH_POSITION', |     obis.ACTUAL_SWITCH_POSITION: "ACTUAL_SWITCH_POSITION", | ||||||
|     obis.VALVE_POSITION_GAS: 'VALVE_POSITION_GAS', |     obis.VALVE_POSITION_GAS: "VALVE_POSITION_GAS", | ||||||
|     obis.BELGIUM_HOURLY_GAS_METER_READING: 'BELGIUM_HOURLY_GAS_METER_READING', |     obis.BELGIUM_HOURLY_GAS_METER_READING: "BELGIUM_HOURLY_GAS_METER_READING", | ||||||
|     obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: 'LUXEMBOURG_EQUIPMENT_IDENTIFIER', |     obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: "LUXEMBOURG_EQUIPMENT_IDENTIFIER", | ||||||
|     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: 'LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL', |     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: "LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL", | ||||||
|     obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: 'LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL', |     obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: "LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL", | ||||||
|     obis.SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL: 'SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL', |     obis.SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL: "SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL", | ||||||
|     obis.SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: 'SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL', |     obis.SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: "SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL", | ||||||
|  |     obis.Q3D_EQUIPMENT_IDENTIFIER: "Q3D_EQUIPMENT_IDENTIFIER", | ||||||
|  |     obis.Q3D_EQUIPMENT_STATE: "Q3D_EQUIPMENT_STATE", | ||||||
|  |     obis.Q3D_EQUIPMENT_SERIALNUMBER: "Q3D_EQUIPMENT_SERIALNUMBER", | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| REVERSE_EN = dict([(v, k) for k, v in EN.items()]) | REVERSE_EN = dict([(v, k) for k, v in EN.items()]) | ||||||
|  | |||||||
| @ -6,65 +6,76 @@ refactored to full line signatures to maintain backwards compatibility. | |||||||
| Might be refactored in a backwards incompatible way as soon as proper telegram | Might be refactored in a backwards incompatible way as soon as proper telegram | ||||||
| objects are introduced. | objects are introduced. | ||||||
| """ | """ | ||||||
| P1_MESSAGE_HEADER = r'\d-\d:0\.2\.8.+?\r\n' | P1_MESSAGE_HEADER = r"\d-\d:0\.2\.8.+?\r\n" | ||||||
| P1_MESSAGE_TIMESTAMP = r'\d-\d:1\.0\.0.+?\r\n' | P1_MESSAGE_TIMESTAMP = r"\d-\d:1\.0\.0.+?\r\n" | ||||||
| ELECTRICITY_IMPORTED_TOTAL = r'\d-\d:1\.8\.0.+?\r\n' | ELECTRICITY_IMPORTED_TOTAL = r"\d-\d:1\.8\.0.+?\r\n" | ||||||
| ELECTRICITY_USED_TARIFF_1 = r'\d-\d:1\.8\.1.+?\r\n' | ELECTRICITY_USED_TARIFF_1 = r"\d-\d:1\.8\.1.+?\r\n" | ||||||
| ELECTRICITY_USED_TARIFF_2 = r'\d-\d:1\.8\.2.+?\r\n' | ELECTRICITY_USED_TARIFF_2 = r"\d-\d:1\.8\.2.+?\r\n" | ||||||
| ELECTRICITY_DELIVERED_TARIFF_1 = r'\d-\d:2\.8\.1.+?\r\n' | ELECTRICITY_DELIVERED_TARIFF_1 = r"\d-\d:2\.8\.1.+?\r\n" | ||||||
| ELECTRICITY_DELIVERED_TARIFF_2 = r'\d-\d:2\.8\.2.+?\r\n' | ELECTRICITY_DELIVERED_TARIFF_2 = r"\d-\d:2\.8\.2.+?\r\n" | ||||||
| ELECTRICITY_ACTIVE_TARIFF = r'\d-\d:96\.14\.0.+?\r\n' | ELECTRICITY_ACTIVE_TARIFF = r"\d-\d:96\.14\.0.+?\r\n" | ||||||
| EQUIPMENT_IDENTIFIER = r'\d-\d:96\.1\.1.+?\r\n' | EQUIPMENT_IDENTIFIER = r"\d-\d:96\.1\.1.+?\r\n" | ||||||
| CURRENT_ELECTRICITY_USAGE = r'\d-\d:1\.7\.0.+?\r\n' | CURRENT_ELECTRICITY_USAGE = r"\d-\d:1\.7\.0.+?\r\n" | ||||||
| CURRENT_ELECTRICITY_DELIVERY = r'\d-\d:2\.7\.0.+?\r\n' | CURRENT_ELECTRICITY_DELIVERY = r"\d-\d:2\.7\.0.+?\r\n" | ||||||
| LONG_POWER_FAILURE_COUNT = r'96\.7\.9.+?\r\n' | LONG_POWER_FAILURE_COUNT = r"96\.7\.9.+?\r\n" | ||||||
| SHORT_POWER_FAILURE_COUNT = r'96\.7\.21.+?\r\n' | SHORT_POWER_FAILURE_COUNT = r"96\.7\.21.+?\r\n" | ||||||
| POWER_EVENT_FAILURE_LOG = r'99\.97\.0.+?\r\n' | POWER_EVENT_FAILURE_LOG = r"99\.97\.0.+?\r\n" | ||||||
| VOLTAGE_SAG_L1_COUNT = r'\d-\d:32\.32\.0.+?\r\n' | VOLTAGE_SAG_L1_COUNT = r"\d-\d:32\.32\.0.+?\r\n" | ||||||
| VOLTAGE_SAG_L2_COUNT = r'\d-\d:52\.32\.0.+?\r\n' | VOLTAGE_SAG_L2_COUNT = r"\d-\d:52\.32\.0.+?\r\n" | ||||||
| VOLTAGE_SAG_L3_COUNT = r'\d-\d:72\.32\.0.+?\r\n' | VOLTAGE_SAG_L3_COUNT = r"\d-\d:72\.32\.0.+?\r\n" | ||||||
| VOLTAGE_SWELL_L1_COUNT = r'\d-\d:32\.36\.0.+?\r\n' | VOLTAGE_SWELL_L1_COUNT = r"\d-\d:32\.36\.0.+?\r\n" | ||||||
| VOLTAGE_SWELL_L2_COUNT = r'\d-\d:52\.36\.0.+?\r\n' | VOLTAGE_SWELL_L2_COUNT = r"\d-\d:52\.36\.0.+?\r\n" | ||||||
| VOLTAGE_SWELL_L3_COUNT = r'\d-\d:72\.36\.0.+?\r\n' | VOLTAGE_SWELL_L3_COUNT = r"\d-\d:72\.36\.0.+?\r\n" | ||||||
| INSTANTANEOUS_VOLTAGE_L1 = r'\d-\d:32\.7\.0.+?\r\n' | INSTANTANEOUS_VOLTAGE_L1 = r"\d-\d:32\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_VOLTAGE_L2 = r'\d-\d:52\.7\.0.+?\r\n' | INSTANTANEOUS_VOLTAGE_L2 = r"\d-\d:52\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_VOLTAGE_L3 = r'\d-\d:72\.7\.0.+?\r\n' | INSTANTANEOUS_VOLTAGE_L3 = r"\d-\d:72\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_CURRENT_L1 = r'\d-\d:31\.7\.0.+?\r\n' | INSTANTANEOUS_CURRENT_L1 = r"\d-\d:31\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_CURRENT_L2 = r'\d-\d:51\.7\.0.+?\r\n' | INSTANTANEOUS_CURRENT_L2 = r"\d-\d:51\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_CURRENT_L3 = r'\d-\d:71\.7\.0.+?\r\n' | INSTANTANEOUS_CURRENT_L3 = r"\d-\d:71\.7\.0.+?\r\n" | ||||||
| TEXT_MESSAGE_CODE = r'\d-\d:96\.13\.1.+?\r\n' | TEXT_MESSAGE_CODE = r"\d-\d:96\.13\.1.+?\r\n" | ||||||
| TEXT_MESSAGE = r'\d-\d:96\.13\.0.+?\r\n' | TEXT_MESSAGE = r"\d-\d:96\.13\.0.+?\r\n" | ||||||
| DEVICE_TYPE = r'\d-\d:24\.1\.0.+?\r\n' | DEVICE_TYPE = r"\d-\d:24\.1\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE = r'\d-\d:21\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE = r"\d-\d:21\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE = r'\d-\d:41\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE = r"\d-\d:41\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE = r'\d-\d:61\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE = r"\d-\d:61\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE = r'\d-\d:22\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L1_NEGATIVE = r"\d-\d:22\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE = r'\d-\d:42\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L2_NEGATIVE = r"\d-\d:42\.7\.0.+?\r\n" | ||||||
| INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE = r'\d-\d:62\.7\.0.+?\r\n' | INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE = r"\d-\d:62\.7\.0.+?\r\n" | ||||||
| EQUIPMENT_IDENTIFIER_GAS = r'\d-\d:96\.1\.0.+?\r\n' | EQUIPMENT_IDENTIFIER_GAS = r"\d-\d:96\.1\.0.+?\r\n" | ||||||
| # TODO differences between gas meter readings in v3 and lower and v4 and up | # TODO differences between gas meter readings in v3 and lower and v4 and up | ||||||
| HOURLY_GAS_METER_READING = r'\d-\d:24\.2\.1.+?\r\n' | HOURLY_GAS_METER_READING = r"\d-\d:24\.2\.1.+?\r\n" | ||||||
| GAS_METER_READING = r'\d-\d:24\.3\.0.+?\r\n.+?\r\n' | GAS_METER_READING = r"\d-\d:24\.3\.0.+?\r\n.+?\r\n" | ||||||
| ACTUAL_TRESHOLD_ELECTRICITY = r'\d-\d:17\.0\.0.+?\r\n' | ACTUAL_TRESHOLD_ELECTRICITY = r"\d-\d:17\.0\.0.+?\r\n" | ||||||
| ACTUAL_SWITCH_POSITION = r'\d-\d:96\.3\.10.+?\r\n' | ACTUAL_SWITCH_POSITION = r"\d-\d:96\.3\.10.+?\r\n" | ||||||
| VALVE_POSITION_GAS = r'\d-\d:24\.4\.0.+?\r\n' | VALVE_POSITION_GAS = r"\d-\d:24\.4\.0.+?\r\n" | ||||||
| 
 | 
 | ||||||
| # TODO 17.0.0 | # TODO 17.0.0 | ||||||
| # TODO 96.3.10 | # TODO 96.3.10 | ||||||
| 
 | 
 | ||||||
| ELECTRICITY_USED_TARIFF_ALL = ( | ELECTRICITY_USED_TARIFF_ALL = (ELECTRICITY_USED_TARIFF_1, ELECTRICITY_USED_TARIFF_2) | ||||||
|     ELECTRICITY_USED_TARIFF_1, |  | ||||||
|     ELECTRICITY_USED_TARIFF_2 |  | ||||||
| ) |  | ||||||
| ELECTRICITY_DELIVERED_TARIFF_ALL = ( | ELECTRICITY_DELIVERED_TARIFF_ALL = ( | ||||||
|     ELECTRICITY_DELIVERED_TARIFF_1, |     ELECTRICITY_DELIVERED_TARIFF_1, | ||||||
|     ELECTRICITY_DELIVERED_TARIFF_2 |     ELECTRICITY_DELIVERED_TARIFF_2, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| # Alternate codes for foreign countries. | # Alternate codes for foreign countries. | ||||||
| BELGIUM_HOURLY_GAS_METER_READING = r'\d-\d:24\.2\.3.+?\r\n'  # Different code, same format. | BELGIUM_HOURLY_GAS_METER_READING = ( | ||||||
| LUXEMBOURG_EQUIPMENT_IDENTIFIER = r'\d-\d:42\.0\.0.+?\r\n'  # Logical device name |     r"\d-\d:24\.2\.3.+?\r\n"  # Different code, same format. | ||||||
| LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL = r'\d-\d:1\.8\.0.+?\r\n'  # Total imported energy register (P+) | ) | ||||||
| LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL = r'\d-\d:2\.8\.0.+?\r\n'  # Total exported energy register (P-) | LUXEMBOURG_EQUIPMENT_IDENTIFIER = r"\d-\d:42\.0\.0.+?\r\n"  # Logical device name | ||||||
| SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL = r'\d-\d:1\.8\.0.+?\r\n'  # Total imported energy register (P+) | LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL = ( | ||||||
| SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL = r'\d-\d:2\.8\.0.+?\r\n'  # Total exported energy register (P-) |     r"\d-\d:1\.8\.0.+?\r\n"  # Total imported energy register (P+) | ||||||
|  | ) | ||||||
|  | LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL = ( | ||||||
|  |     r"\d-\d:2\.8\.0.+?\r\n"  # Total exported energy register (P-) | ||||||
|  | ) | ||||||
|  | SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL = ( | ||||||
|  |     r"\d-\d:1\.8\.0.+?\r\n"  # Total imported energy register (P+) | ||||||
|  | ) | ||||||
|  | SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL = ( | ||||||
|  |     r"\d-\d:2\.8\.0.+?\r\n"  # Total exported energy register (P-) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | Q3D_EQUIPMENT_IDENTIFIER = r"\d-\d:0\.0\.0.+?\r\n"  # Logical device name | ||||||
|  | Q3D_EQUIPMENT_STATE = r"\d-\d:96\.5\.5.+?\r\n"  # Device state (hexadecimal) | ||||||
|  | Q3D_EQUIPMENT_SERIALNUMBER = r"\d-\d:96\.1\.255.+?\r\n"  # Device Serialnumber | ||||||
|  | |||||||
| @ -2,9 +2,18 @@ from decimal import Decimal | |||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
| 
 | 
 | ||||||
| from dsmr_parser import obis_references as obis | from dsmr_parser import obis_references as obis | ||||||
| from dsmr_parser.parsers import CosemParser, ValueParser, MBusParser, ProfileGenericParser | from dsmr_parser.parsers import ( | ||||||
|  |     CosemParser, | ||||||
|  |     ValueParser, | ||||||
|  |     MBusParser, | ||||||
|  |     ProfileGenericParser, | ||||||
|  | ) | ||||||
| from dsmr_parser.value_types import timestamp | from dsmr_parser.value_types import timestamp | ||||||
| from dsmr_parser.profile_generic_specifications import BUFFER_TYPES, PG_HEAD_PARSERS, PG_UNIDENTIFIED_BUFFERTYPE_PARSERS | from dsmr_parser.profile_generic_specifications import ( | ||||||
|  |     BUFFER_TYPES, | ||||||
|  |     PG_HEAD_PARSERS, | ||||||
|  |     PG_UNIDENTIFIED_BUFFERTYPE_PARSERS, | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| dsmr_parser.telegram_specifications | dsmr_parser.telegram_specifications | ||||||
| @ -15,8 +24,8 @@ how the telegram lines are parsed. | |||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| V2_2 = { | V2_2 = { | ||||||
|     'checksum_support': False, |     "checksum_support": False, | ||||||
|     'objects': { |     "objects": { | ||||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), |         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||||
|         obis.ELECTRICITY_USED_TARIFF_1: CosemParser(ValueParser(Decimal)), |         obis.ELECTRICITY_USED_TARIFF_1: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.ELECTRICITY_USED_TARIFF_2: CosemParser(ValueParser(Decimal)), |         obis.ELECTRICITY_USED_TARIFF_2: CosemParser(ValueParser(Decimal)), | ||||||
| @ -41,14 +50,14 @@ V2_2 = { | |||||||
|             ValueParser(str),  # unit, position 5 |             ValueParser(str),  # unit, position 5 | ||||||
|             ValueParser(Decimal),  # meter reading, position 6 |             ValueParser(Decimal),  # meter reading, position 6 | ||||||
|         ), |         ), | ||||||
|     } |     }, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| V3 = V2_2 | V3 = V2_2 | ||||||
| 
 | 
 | ||||||
| V4 = { | V4 = { | ||||||
|     'checksum_support': True, |     "checksum_support": True, | ||||||
|     'objects': { |     "objects": { | ||||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), |         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), |         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), |         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||||
| @ -61,10 +70,9 @@ V4 = { | |||||||
|         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), |         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), |         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), |         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.POWER_EVENT_FAILURE_LOG: |         obis.POWER_EVENT_FAILURE_LOG: ProfileGenericParser( | ||||||
|             ProfileGenericParser(BUFFER_TYPES, |             BUFFER_TYPES, PG_HEAD_PARSERS, PG_UNIDENTIFIED_BUFFERTYPE_PARSERS | ||||||
|                                  PG_HEAD_PARSERS, |         ), | ||||||
|                                  PG_UNIDENTIFIED_BUFFERTYPE_PARSERS), |  | ||||||
|         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)), | ||||||
| @ -85,15 +93,14 @@ V4 = { | |||||||
|         obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), |         obis.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), | ||||||
|         obis.HOURLY_GAS_METER_READING: MBusParser( |         obis.HOURLY_GAS_METER_READING: MBusParser( | ||||||
|             ValueParser(timestamp), |             ValueParser(timestamp), ValueParser(Decimal) | ||||||
|             ValueParser(Decimal) |         ), | ||||||
|         ) |     }, | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| V5 = { | V5 = { | ||||||
|     'checksum_support': True, |     "checksum_support": True, | ||||||
|     'objects': { |     "objects": { | ||||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), |         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), |         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), |         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||||
| @ -107,10 +114,9 @@ V5 = { | |||||||
|         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), |         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), |         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), |         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.POWER_EVENT_FAILURE_LOG: |         obis.POWER_EVENT_FAILURE_LOG: ProfileGenericParser( | ||||||
|             ProfileGenericParser(BUFFER_TYPES, |             BUFFER_TYPES, PG_HEAD_PARSERS, PG_UNIDENTIFIED_BUFFERTYPE_PARSERS | ||||||
|                                  PG_HEAD_PARSERS, |         ), | ||||||
|                                  PG_UNIDENTIFIED_BUFFERTYPE_PARSERS), |  | ||||||
|         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L2_COUNT: CosemParser(ValueParser(int)), | ||||||
|         obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)), |         obis.VOLTAGE_SAG_L3_COUNT: CosemParser(ValueParser(int)), | ||||||
| @ -133,38 +139,46 @@ V5 = { | |||||||
|         obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), |         obis.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), | ||||||
|         obis.HOURLY_GAS_METER_READING: MBusParser( |         obis.HOURLY_GAS_METER_READING: MBusParser( | ||||||
|             ValueParser(timestamp), |             ValueParser(timestamp), ValueParser(Decimal) | ||||||
|             ValueParser(Decimal) |         ), | ||||||
|         ) |     }, | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ALL = (V2_2, V3, V4, V5) | ALL = (V2_2, V3, V4, V5) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| BELGIUM_FLUVIUS = deepcopy(V5) | BELGIUM_FLUVIUS = deepcopy(V5) | ||||||
| BELGIUM_FLUVIUS['objects'].update({ | BELGIUM_FLUVIUS["objects"].update( | ||||||
|  |     { | ||||||
|         obis.BELGIUM_HOURLY_GAS_METER_READING: MBusParser( |         obis.BELGIUM_HOURLY_GAS_METER_READING: MBusParser( | ||||||
|         ValueParser(timestamp), |             ValueParser(timestamp), ValueParser(Decimal) | ||||||
|         ValueParser(Decimal) |         ) | ||||||
|  |     } | ||||||
| ) | ) | ||||||
| }) |  | ||||||
| 
 | 
 | ||||||
| LUXEMBOURG_SMARTY = deepcopy(V5) | LUXEMBOURG_SMARTY = deepcopy(V5) | ||||||
| LUXEMBOURG_SMARTY['objects'].update({ | LUXEMBOURG_SMARTY["objects"].update( | ||||||
|  |     { | ||||||
|         obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), |         obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||||
|     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), |         obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser( | ||||||
|     obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), |             ValueParser(Decimal) | ||||||
| }) |         ), | ||||||
|  |         obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser( | ||||||
|  |             ValueParser(Decimal) | ||||||
|  |         ), | ||||||
|  |     } | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| # Source: https://www.energiforetagen.se/globalassets/energiforetagen/det-erbjuder-vi/kurser-och-konferenser/elnat/branschrekommendation-lokalt-granssnitt-v2_0-201912.pdf | # Source: https://www.energiforetagen.se/globalassets/energiforetagen/det-erbjuder-vi/kurser-och-konferenser/elnat/branschrekommendation-lokalt-granssnitt-v2_0-201912.pdf | ||||||
| SWEDEN = { | SWEDEN = { | ||||||
|     'checksum_support': True, |     "checksum_support": True, | ||||||
|     'objects': { |     "objects": { | ||||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), |         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), |         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||||
|         obis.SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), |         obis.SWEDEN_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), |         obis.SWEDEN_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser( | ||||||
|  |             ValueParser(Decimal) | ||||||
|  |         ), | ||||||
|         obis.CURRENT_ELECTRICITY_USAGE: CosemParser(ValueParser(Decimal)), |         obis.CURRENT_ELECTRICITY_USAGE: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), |         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: CosemParser(ValueParser(Decimal)), | ||||||
| @ -179,5 +193,24 @@ SWEDEN = { | |||||||
|         obis.INSTANTANEOUS_CURRENT_L1: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_CURRENT_L1: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.INSTANTANEOUS_CURRENT_L2: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_CURRENT_L2: CosemParser(ValueParser(Decimal)), | ||||||
|         obis.INSTANTANEOUS_CURRENT_L3: CosemParser(ValueParser(Decimal)), |         obis.INSTANTANEOUS_CURRENT_L3: CosemParser(ValueParser(Decimal)), | ||||||
|  |     }, | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | Q3D = { | ||||||
|  |     "checksum_support": False, | ||||||
|  |     "objects": { | ||||||
|  |         obis.Q3D_EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||||
|  |         obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser( | ||||||
|  |             ValueParser(Decimal) | ||||||
|  |         ), | ||||||
|  |         obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser( | ||||||
|  |             ValueParser(Decimal) | ||||||
|  |         ), | ||||||
|  |         obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: CosemParser(ValueParser(Decimal)), | ||||||
|  |         obis.INSTANTANEOUS_ACTIVE_POWER_L2_POSITIVE: CosemParser(ValueParser(Decimal)), | ||||||
|  |         obis.INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE: CosemParser(ValueParser(Decimal)), | ||||||
|  |         obis.CURRENT_ELECTRICITY_USAGE: CosemParser(ValueParser(Decimal)), | ||||||
|  |         obis.Q3D_EQUIPMENT_STATE: CosemParser(ValueParser(str)), | ||||||
|  |         obis.Q3D_EQUIPMENT_SERIALNUMBER: CosemParser(ValueParser(str)), | ||||||
|  |     }, | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user