decode latin1 and added ELECTRICITY_EXPORTED_TOTAL
This commit is contained in:
		
							parent
							
								
									c1202f33e9
								
							
						
					
					
						commit
						4073917d3e
					
				| @ -10,23 +10,26 @@ from dsmr_parser import telegram_specifications | ||||
| from dsmr_parser.clients.telegram_buffer import TelegramBuffer | ||||
| from dsmr_parser.exceptions import ParseError, InvalidChecksumError | ||||
| from dsmr_parser.parsers import TelegramParser | ||||
| from dsmr_parser.clients.settings import SERIAL_SETTINGS_V2_2, \ | ||||
|     SERIAL_SETTINGS_V4, SERIAL_SETTINGS_V5 | ||||
| from dsmr_parser.clients.settings import ( | ||||
|     SERIAL_SETTINGS_V2_2, | ||||
|     SERIAL_SETTINGS_V4, | ||||
|     SERIAL_SETTINGS_V5, | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | ||||
|     """Creates a DSMR asyncio protocol.""" | ||||
| 
 | ||||
|     if dsmr_version == '2.2': | ||||
|     if dsmr_version == "2.2": | ||||
|         specification = telegram_specifications.V2_2 | ||||
|         serial_settings = SERIAL_SETTINGS_V2_2 | ||||
|     elif dsmr_version == '4': | ||||
|     elif dsmr_version == "4": | ||||
|         specification = telegram_specifications.V4 | ||||
|         serial_settings = SERIAL_SETTINGS_V4 | ||||
|     elif dsmr_version == '5': | ||||
|     elif dsmr_version == "5": | ||||
|         specification = telegram_specifications.V5 | ||||
|         serial_settings = SERIAL_SETTINGS_V5 | ||||
|     elif dsmr_version == '5B': | ||||
|     elif dsmr_version == "5B": | ||||
|         specification = telegram_specifications.BELGIUM_FLUVIUS | ||||
|         serial_settings = SERIAL_SETTINGS_V5 | ||||
|     elif dsmr_version == "5L": | ||||
| @ -39,11 +42,17 @@ def create_dsmr_protocol(dsmr_version, telegram_callback, loop=None, **kwargs): | ||||
|         specification = telegram_specifications.Q3D | ||||
|         serial_settings = SERIAL_SETTINGS_V5 | ||||
|     else: | ||||
|         raise NotImplementedError("No telegram parser found for version: %s", | ||||
|                                   dsmr_version) | ||||
|         raise NotImplementedError( | ||||
|             "No telegram parser found for version: %s", dsmr_version | ||||
|         ) | ||||
| 
 | ||||
|     protocol = partial(DSMRProtocol, loop, TelegramParser(specification), | ||||
|                        telegram_callback=telegram_callback, **kwargs) | ||||
|     protocol = partial( | ||||
|         DSMRProtocol, | ||||
|         loop, | ||||
|         TelegramParser(specification), | ||||
|         telegram_callback=telegram_callback, | ||||
|         **kwargs | ||||
|     ) | ||||
| 
 | ||||
|     return protocol, serial_settings | ||||
| 
 | ||||
| @ -51,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): | ||||
|     """Creates a DSMR asyncio protocol coroutine using serial port.""" | ||||
|     protocol, serial_settings = create_dsmr_protocol( | ||||
|         dsmr_version, telegram_callback, loop=None) | ||||
|     serial_settings['url'] = port | ||||
|         dsmr_version, telegram_callback, loop=None | ||||
|     ) | ||||
|     serial_settings["url"] = port | ||||
| 
 | ||||
|     conn = create_serial_connection(loop, protocol, **serial_settings) | ||||
|     return conn | ||||
| 
 | ||||
| 
 | ||||
| def create_tcp_dsmr_reader(host, port, dsmr_version, | ||||
|                            telegram_callback, loop=None, | ||||
|                            keep_alive_interval=None): | ||||
| def create_tcp_dsmr_reader( | ||||
|     host, port, dsmr_version, telegram_callback, loop=None, keep_alive_interval=None | ||||
| ): | ||||
|     """Creates a DSMR asyncio protocol coroutine using TCP connection.""" | ||||
|     if not loop: | ||||
|         loop = asyncio.get_event_loop() | ||||
|     protocol, _ = create_dsmr_protocol( | ||||
|         dsmr_version, telegram_callback, loop=loop, | ||||
|         keep_alive_interval=keep_alive_interval) | ||||
|         dsmr_version, | ||||
|         telegram_callback, | ||||
|         loop=loop, | ||||
|         keep_alive_interval=keep_alive_interval, | ||||
|     ) | ||||
|     conn = loop.create_connection(protocol, host, port) | ||||
|     return conn | ||||
| 
 | ||||
| @ -77,8 +90,9 @@ class DSMRProtocol(asyncio.Protocol): | ||||
|     transport = None | ||||
|     telegram_callback = None | ||||
| 
 | ||||
|     def __init__(self, loop, telegram_parser, | ||||
|                  telegram_callback=None, keep_alive_interval=None): | ||||
|     def __init__( | ||||
|         self, loop, telegram_parser, telegram_callback=None, keep_alive_interval=None | ||||
|     ): | ||||
|         """Initialize class.""" | ||||
|         self.loop = loop | ||||
|         self.log = logging.getLogger(__name__) | ||||
| @ -95,16 +109,16 @@ class DSMRProtocol(asyncio.Protocol): | ||||
|     def connection_made(self, transport): | ||||
|         """Just logging for now.""" | ||||
|         self.transport = transport | ||||
|         self.log.debug('connected') | ||||
|         self.log.debug("connected") | ||||
|         self._active = False | ||||
|         if self.loop and self._keep_alive_interval: | ||||
|             self.loop.call_later(self._keep_alive_interval, self.keep_alive) | ||||
| 
 | ||||
|     def data_received(self, data): | ||||
|         """Add incoming data to buffer.""" | ||||
|         data = data.decode('ascii', errors='ignore') | ||||
|         data = data.decode("latin1") | ||||
|         self._active = True | ||||
|         self.log.debug('received data: %s', data) | ||||
|         self.log.debug("received data: %s", data) | ||||
|         self.telegram_buffer.append(data) | ||||
| 
 | ||||
|         for telegram in self.telegram_buffer.get_all(): | ||||
| @ -112,26 +126,26 @@ class DSMRProtocol(asyncio.Protocol): | ||||
| 
 | ||||
|     def keep_alive(self): | ||||
|         if self._active: | ||||
|             self.log.debug('keep-alive checked') | ||||
|             self.log.debug("keep-alive checked") | ||||
|             self._active = False | ||||
|             if self.loop: | ||||
|                 self.loop.call_later(self._keep_alive_interval, self.keep_alive) | ||||
|         else: | ||||
|             self.log.warning('keep-alive check failed') | ||||
|             self.log.warning("keep-alive check failed") | ||||
|             if self.transport: | ||||
|                 self.transport.close() | ||||
| 
 | ||||
|     def connection_lost(self, exc): | ||||
|         """Stop when connection is lost.""" | ||||
|         if exc: | ||||
|             self.log.exception('disconnected due to exception', exc_info=exc) | ||||
|             self.log.exception("disconnected due to exception", exc_info=exc) | ||||
|         else: | ||||
|             self.log.info('disconnected because of close/abort.') | ||||
|             self.log.info("disconnected because of close/abort.") | ||||
|         self._closed.set() | ||||
| 
 | ||||
|     def handle_telegram(self, telegram): | ||||
|         """Send off parsed telegram to handling callback.""" | ||||
|         self.log.debug('got telegram: %s', telegram) | ||||
|         self.log.debug("got telegram: %s", telegram) | ||||
| 
 | ||||
|         try: | ||||
|             parsed_telegram = self.telegram_parser.parse(telegram) | ||||
|  | ||||
| @ -8,56 +8,57 @@ This module contains a mapping of obis references to names. | ||||
| """ | ||||
| 
 | ||||
| EN = { | ||||
|     obis.P1_MESSAGE_HEADER: 'P1_MESSAGE_HEADER', | ||||
|     obis.P1_MESSAGE_TIMESTAMP: 'P1_MESSAGE_TIMESTAMP', | ||||
|     obis.ELECTRICITY_IMPORTED_TOTAL: 'ELECTRICITY_IMPORTED_TOTAL', | ||||
|     obis.ELECTRICITY_USED_TARIFF_1: 'ELECTRICITY_USED_TARIFF_1', | ||||
|     obis.ELECTRICITY_USED_TARIFF_2: 'ELECTRICITY_USED_TARIFF_2', | ||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_1: 'ELECTRICITY_DELIVERED_TARIFF_1', | ||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_2: 'ELECTRICITY_DELIVERED_TARIFF_2', | ||||
|     obis.ELECTRICITY_ACTIVE_TARIFF: 'ELECTRICITY_ACTIVE_TARIFF', | ||||
|     obis.EQUIPMENT_IDENTIFIER: 'EQUIPMENT_IDENTIFIER', | ||||
|     obis.CURRENT_ELECTRICITY_USAGE: 'CURRENT_ELECTRICITY_USAGE', | ||||
|     obis.CURRENT_ELECTRICITY_DELIVERY: 'CURRENT_ELECTRICITY_DELIVERY', | ||||
|     obis.LONG_POWER_FAILURE_COUNT: 'LONG_POWER_FAILURE_COUNT', | ||||
|     obis.SHORT_POWER_FAILURE_COUNT: 'SHORT_POWER_FAILURE_COUNT', | ||||
|     obis.POWER_EVENT_FAILURE_LOG: 'POWER_EVENT_FAILURE_LOG', | ||||
|     obis.VOLTAGE_SAG_L1_COUNT: 'VOLTAGE_SAG_L1_COUNT', | ||||
|     obis.VOLTAGE_SAG_L2_COUNT: 'VOLTAGE_SAG_L2_COUNT', | ||||
|     obis.VOLTAGE_SAG_L3_COUNT: 'VOLTAGE_SAG_L3_COUNT', | ||||
|     obis.VOLTAGE_SWELL_L1_COUNT: 'VOLTAGE_SWELL_L1_COUNT', | ||||
|     obis.VOLTAGE_SWELL_L2_COUNT: 'VOLTAGE_SWELL_L2_COUNT', | ||||
|     obis.VOLTAGE_SWELL_L3_COUNT: 'VOLTAGE_SWELL_L3_COUNT', | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L1: 'INSTANTANEOUS_VOLTAGE_L1', | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L2: 'INSTANTANEOUS_VOLTAGE_L2', | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L3: 'INSTANTANEOUS_VOLTAGE_L3', | ||||
|     obis.INSTANTANEOUS_CURRENT_L1: 'INSTANTANEOUS_CURRENT_L1', | ||||
|     obis.INSTANTANEOUS_CURRENT_L2: 'INSTANTANEOUS_CURRENT_L2', | ||||
|     obis.INSTANTANEOUS_CURRENT_L3: 'INSTANTANEOUS_CURRENT_L3', | ||||
|     obis.TEXT_MESSAGE_CODE: 'TEXT_MESSAGE_CODE', | ||||
|     obis.TEXT_MESSAGE: 'TEXT_MESSAGE', | ||||
|     obis.DEVICE_TYPE: 'DEVICE_TYPE', | ||||
|     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_L3_POSITIVE: 'INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE', | ||||
|     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_L3_NEGATIVE: 'INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE', | ||||
|     obis.EQUIPMENT_IDENTIFIER_GAS: 'EQUIPMENT_IDENTIFIER_GAS', | ||||
|     obis.HOURLY_GAS_METER_READING: 'HOURLY_GAS_METER_READING', | ||||
|     obis.GAS_METER_READING: 'GAS_METER_READING', | ||||
|     obis.ACTUAL_TRESHOLD_ELECTRICITY: 'ACTUAL_TRESHOLD_ELECTRICITY', | ||||
|     obis.ACTUAL_SWITCH_POSITION: 'ACTUAL_SWITCH_POSITION', | ||||
|     obis.VALVE_POSITION_GAS: 'VALVE_POSITION_GAS', | ||||
|     obis.BELGIUM_HOURLY_GAS_METER_READING: 'BELGIUM_HOURLY_GAS_METER_READING', | ||||
|     obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: 'LUXEMBOURG_EQUIPMENT_IDENTIFIER', | ||||
|     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: 'LUXEMBOURG_ELECTRICITY_USED_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_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', | ||||
|     obis.P1_MESSAGE_HEADER: "P1_MESSAGE_HEADER", | ||||
|     obis.P1_MESSAGE_TIMESTAMP: "P1_MESSAGE_TIMESTAMP", | ||||
|     obis.ELECTRICITY_IMPORTED_TOTAL: "ELECTRICITY_IMPORTED_TOTAL", | ||||
|     obis.ELECTRICITY_USED_TARIFF_1: "ELECTRICITY_USED_TARIFF_1", | ||||
|     obis.ELECTRICITY_USED_TARIFF_2: "ELECTRICITY_USED_TARIFF_2", | ||||
|     obis.ELECTRICITY_EXPORTED_TOTAL: "ELECTRICITY_EXPORTED_TOTAL", | ||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_1: "ELECTRICITY_DELIVERED_TARIFF_1", | ||||
|     obis.ELECTRICITY_DELIVERED_TARIFF_2: "ELECTRICITY_DELIVERED_TARIFF_2", | ||||
|     obis.ELECTRICITY_ACTIVE_TARIFF: "ELECTRICITY_ACTIVE_TARIFF", | ||||
|     obis.EQUIPMENT_IDENTIFIER: "EQUIPMENT_IDENTIFIER", | ||||
|     obis.CURRENT_ELECTRICITY_USAGE: "CURRENT_ELECTRICITY_USAGE", | ||||
|     obis.CURRENT_ELECTRICITY_DELIVERY: "CURRENT_ELECTRICITY_DELIVERY", | ||||
|     obis.LONG_POWER_FAILURE_COUNT: "LONG_POWER_FAILURE_COUNT", | ||||
|     obis.SHORT_POWER_FAILURE_COUNT: "SHORT_POWER_FAILURE_COUNT", | ||||
|     obis.POWER_EVENT_FAILURE_LOG: "POWER_EVENT_FAILURE_LOG", | ||||
|     obis.VOLTAGE_SAG_L1_COUNT: "VOLTAGE_SAG_L1_COUNT", | ||||
|     obis.VOLTAGE_SAG_L2_COUNT: "VOLTAGE_SAG_L2_COUNT", | ||||
|     obis.VOLTAGE_SAG_L3_COUNT: "VOLTAGE_SAG_L3_COUNT", | ||||
|     obis.VOLTAGE_SWELL_L1_COUNT: "VOLTAGE_SWELL_L1_COUNT", | ||||
|     obis.VOLTAGE_SWELL_L2_COUNT: "VOLTAGE_SWELL_L2_COUNT", | ||||
|     obis.VOLTAGE_SWELL_L3_COUNT: "VOLTAGE_SWELL_L3_COUNT", | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L1: "INSTANTANEOUS_VOLTAGE_L1", | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L2: "INSTANTANEOUS_VOLTAGE_L2", | ||||
|     obis.INSTANTANEOUS_VOLTAGE_L3: "INSTANTANEOUS_VOLTAGE_L3", | ||||
|     obis.INSTANTANEOUS_CURRENT_L1: "INSTANTANEOUS_CURRENT_L1", | ||||
|     obis.INSTANTANEOUS_CURRENT_L2: "INSTANTANEOUS_CURRENT_L2", | ||||
|     obis.INSTANTANEOUS_CURRENT_L3: "INSTANTANEOUS_CURRENT_L3", | ||||
|     obis.TEXT_MESSAGE_CODE: "TEXT_MESSAGE_CODE", | ||||
|     obis.TEXT_MESSAGE: "TEXT_MESSAGE", | ||||
|     obis.DEVICE_TYPE: "DEVICE_TYPE", | ||||
|     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_L3_POSITIVE: "INSTANTANEOUS_ACTIVE_POWER_L3_POSITIVE", | ||||
|     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_L3_NEGATIVE: "INSTANTANEOUS_ACTIVE_POWER_L3_NEGATIVE", | ||||
|     obis.EQUIPMENT_IDENTIFIER_GAS: "EQUIPMENT_IDENTIFIER_GAS", | ||||
|     obis.HOURLY_GAS_METER_READING: "HOURLY_GAS_METER_READING", | ||||
|     obis.GAS_METER_READING: "GAS_METER_READING", | ||||
|     obis.ACTUAL_TRESHOLD_ELECTRICITY: "ACTUAL_TRESHOLD_ELECTRICITY", | ||||
|     obis.ACTUAL_SWITCH_POSITION: "ACTUAL_SWITCH_POSITION", | ||||
|     obis.VALVE_POSITION_GAS: "VALVE_POSITION_GAS", | ||||
|     obis.BELGIUM_HOURLY_GAS_METER_READING: "BELGIUM_HOURLY_GAS_METER_READING", | ||||
|     obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: "LUXEMBOURG_EQUIPMENT_IDENTIFIER", | ||||
|     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: "LUXEMBOURG_ELECTRICITY_USED_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_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()]) | ||||
|  | ||||
| @ -6,68 +6,76 @@ refactored to full line signatures to maintain backwards compatibility. | ||||
| Might be refactored in a backwards incompatible way as soon as proper telegram | ||||
| objects are introduced. | ||||
| """ | ||||
| P1_MESSAGE_HEADER = r'\d-\d:0\.2\.8.+?\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_USED_TARIFF_1 = r'\d-\d:1\.8\.1.+?\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_2 = r'\d-\d:2\.8\.2.+?\r\n' | ||||
| ELECTRICITY_ACTIVE_TARIFF = r'\d-\d:96\.14\.0.+?\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_DELIVERY = r'\d-\d:2\.7\.0.+?\r\n' | ||||
| LONG_POWER_FAILURE_COUNT = r'96\.7\.9.+?\r\n' | ||||
| SHORT_POWER_FAILURE_COUNT = r'96\.7\.21.+?\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_L2_COUNT = r'\d-\d:52\.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_L2_COUNT = r'\d-\d:52\.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_L2 = r'\d-\d:52\.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_L2 = r'\d-\d:51\.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 = r'\d-\d:96\.13\.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_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_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_L3_NEGATIVE = r'\d-\d:62\.7\.0.+?\r\n' | ||||
| EQUIPMENT_IDENTIFIER_GAS = r'\d-\d:96\.1\.0.+?\r\n' | ||||
| P1_MESSAGE_HEADER = r"\d-\d:0\.2\.8.+?\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_USED_TARIFF_1 = r"\d-\d:1\.8\.1.+?\r\n" | ||||
| ELECTRICITY_USED_TARIFF_2 = r"\d-\d:1\.8\.2.+?\r\n" | ||||
| ELECTRICITY_EXPORTED_TOTAL = r"\d-\d:2\.8\.0.+?\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_ACTIVE_TARIFF = r"\d-\d:96\.14\.0.+?\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_DELIVERY = r"\d-\d:2\.7\.0.+?\r\n" | ||||
| LONG_POWER_FAILURE_COUNT = r"96\.7\.9.+?\r\n" | ||||
| SHORT_POWER_FAILURE_COUNT = r"96\.7\.21.+?\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_L2_COUNT = r"\d-\d:52\.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_L2_COUNT = r"\d-\d:52\.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_L2 = r"\d-\d:52\.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_L2 = r"\d-\d:51\.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 = r"\d-\d:96\.13\.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_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_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_L3_NEGATIVE = r"\d-\d:62\.7\.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 | ||||
| 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' | ||||
| ACTUAL_TRESHOLD_ELECTRICITY = r'\d-\d:17\.0\.0.+?\r\n' | ||||
| ACTUAL_SWITCH_POSITION = r'\d-\d:96\.3\.10.+?\r\n' | ||||
| VALVE_POSITION_GAS = r'\d-\d:24\.4\.0.+?\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" | ||||
| ACTUAL_TRESHOLD_ELECTRICITY = r"\d-\d:17\.0\.0.+?\r\n" | ||||
| ACTUAL_SWITCH_POSITION = r"\d-\d:96\.3\.10.+?\r\n" | ||||
| VALVE_POSITION_GAS = r"\d-\d:24\.4\.0.+?\r\n" | ||||
| 
 | ||||
| # TODO 17.0.0 | ||||
| # TODO 96.3.10 | ||||
| 
 | ||||
| ELECTRICITY_USED_TARIFF_ALL = ( | ||||
|     ELECTRICITY_USED_TARIFF_1, | ||||
|     ELECTRICITY_USED_TARIFF_2 | ||||
| ) | ||||
| ELECTRICITY_USED_TARIFF_ALL = (ELECTRICITY_USED_TARIFF_1, ELECTRICITY_USED_TARIFF_2) | ||||
| ELECTRICITY_DELIVERED_TARIFF_ALL = ( | ||||
|     ELECTRICITY_DELIVERED_TARIFF_1, | ||||
|     ELECTRICITY_DELIVERED_TARIFF_2 | ||||
|     ELECTRICITY_DELIVERED_TARIFF_2, | ||||
| ) | ||||
| 
 | ||||
| # Alternate codes for foreign countries. | ||||
| BELGIUM_HOURLY_GAS_METER_READING = r'\d-\d:24\.2\.3.+?\r\n'  # Different code, same format. | ||||
| LUXEMBOURG_EQUIPMENT_IDENTIFIER = r'\d-\d:42\.0\.0.+?\r\n'  # Logical device name | ||||
| 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-) | ||||
| 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 | ||||
| BELGIUM_HOURLY_GAS_METER_READING = ( | ||||
|     r"\d-\d:24\.2\.3.+?\r\n"  # Different code, same format. | ||||
| ) | ||||
| LUXEMBOURG_EQUIPMENT_IDENTIFIER = r"\d-\d:42\.0\.0.+?\r\n"  # Logical device name | ||||
| 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-) | ||||
| ) | ||||
| 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 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.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 | ||||
| @ -15,8 +24,8 @@ how the telegram lines are parsed. | ||||
| """ | ||||
| 
 | ||||
| V2_2 = { | ||||
|     'checksum_support': False, | ||||
|     'objects': { | ||||
|     "checksum_support": False, | ||||
|     "objects": { | ||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||
|         obis.ELECTRICITY_USED_TARIFF_1: CosemParser(ValueParser(Decimal)), | ||||
|         obis.ELECTRICITY_USED_TARIFF_2: CosemParser(ValueParser(Decimal)), | ||||
| @ -41,14 +50,14 @@ V2_2 = { | ||||
|             ValueParser(str),  # unit, position 5 | ||||
|             ValueParser(Decimal),  # meter reading, position 6 | ||||
|         ), | ||||
|     } | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| V3 = V2_2 | ||||
| 
 | ||||
| V4 = { | ||||
|     'checksum_support': True, | ||||
|     'objects': { | ||||
|     "checksum_support": True, | ||||
|     "objects": { | ||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||
| @ -61,10 +70,9 @@ V4 = { | ||||
|         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||
|         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.POWER_EVENT_FAILURE_LOG: | ||||
|             ProfileGenericParser(BUFFER_TYPES, | ||||
|                                  PG_HEAD_PARSERS, | ||||
|                                  PG_UNIDENTIFIED_BUFFERTYPE_PARSERS), | ||||
|         obis.POWER_EVENT_FAILURE_LOG: ProfileGenericParser( | ||||
|             BUFFER_TYPES, PG_HEAD_PARSERS, PG_UNIDENTIFIED_BUFFERTYPE_PARSERS | ||||
|         ), | ||||
|         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.VOLTAGE_SAG_L2_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.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), | ||||
|         obis.HOURLY_GAS_METER_READING: MBusParser( | ||||
|             ValueParser(timestamp), | ||||
|             ValueParser(Decimal) | ||||
|         ) | ||||
|     } | ||||
|             ValueParser(timestamp), ValueParser(Decimal) | ||||
|         ), | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| V5 = { | ||||
|     'checksum_support': True, | ||||
|     'objects': { | ||||
|     "checksum_support": True, | ||||
|     "objects": { | ||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||
|         obis.EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||
| @ -107,10 +114,9 @@ V5 = { | ||||
|         obis.CURRENT_ELECTRICITY_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||
|         obis.LONG_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.SHORT_POWER_FAILURE_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.POWER_EVENT_FAILURE_LOG: | ||||
|             ProfileGenericParser(BUFFER_TYPES, | ||||
|                                  PG_HEAD_PARSERS, | ||||
|                                  PG_UNIDENTIFIED_BUFFERTYPE_PARSERS), | ||||
|         obis.POWER_EVENT_FAILURE_LOG: ProfileGenericParser( | ||||
|             BUFFER_TYPES, PG_HEAD_PARSERS, PG_UNIDENTIFIED_BUFFERTYPE_PARSERS | ||||
|         ), | ||||
|         obis.VOLTAGE_SAG_L1_COUNT: CosemParser(ValueParser(int)), | ||||
|         obis.VOLTAGE_SAG_L2_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.EQUIPMENT_IDENTIFIER_GAS: CosemParser(ValueParser(str)), | ||||
|         obis.HOURLY_GAS_METER_READING: MBusParser( | ||||
|             ValueParser(timestamp), | ||||
|             ValueParser(Decimal) | ||||
|         ) | ||||
|     } | ||||
|             ValueParser(timestamp), ValueParser(Decimal) | ||||
|         ), | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| ALL = (V2_2, V3, V4, V5) | ||||
| 
 | ||||
| 
 | ||||
| BELGIUM_FLUVIUS = deepcopy(V5) | ||||
| BELGIUM_FLUVIUS['objects'].update({ | ||||
| BELGIUM_FLUVIUS["objects"].update( | ||||
|     { | ||||
|         obis.BELGIUM_HOURLY_GAS_METER_READING: MBusParser( | ||||
|         ValueParser(timestamp), | ||||
|         ValueParser(Decimal) | ||||
|             ValueParser(timestamp), ValueParser(Decimal) | ||||
|         ) | ||||
| }) | ||||
|     } | ||||
| ) | ||||
| 
 | ||||
| LUXEMBOURG_SMARTY = deepcopy(V5) | ||||
| LUXEMBOURG_SMARTY['objects'].update({ | ||||
| LUXEMBOURG_SMARTY["objects"].update( | ||||
|     { | ||||
|         obis.LUXEMBOURG_EQUIPMENT_IDENTIFIER: CosemParser(ValueParser(str)), | ||||
|     obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), | ||||
|     obis.LUXEMBOURG_ELECTRICITY_DELIVERED_TARIFF_GLOBAL: CosemParser(ValueParser(Decimal)), | ||||
| }) | ||||
|         obis.LUXEMBOURG_ELECTRICITY_USED_TARIFF_GLOBAL: CosemParser( | ||||
|             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 | ||||
| SWEDEN = { | ||||
|     'checksum_support': True, | ||||
|     'objects': { | ||||
|     "checksum_support": True, | ||||
|     "objects": { | ||||
|         obis.P1_MESSAGE_HEADER: CosemParser(ValueParser(str)), | ||||
|         obis.P1_MESSAGE_TIMESTAMP: CosemParser(ValueParser(timestamp)), | ||||
|         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_DELIVERY: CosemParser(ValueParser(Decimal)), | ||||
|         obis.INSTANTANEOUS_ACTIVE_POWER_L1_POSITIVE: CosemParser(ValueParser(Decimal)), | ||||
| @ -179,16 +193,15 @@ SWEDEN = { | ||||
|         obis.INSTANTANEOUS_CURRENT_L1: CosemParser(ValueParser(Decimal)), | ||||
|         obis.INSTANTANEOUS_CURRENT_L2: 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.ELECTRICITY_IMPORTED_TOTAL: CosemParser(ValueParser(Decimal)), | ||||
|         obis.ELECTRICITY_EXPORTED_TOTAL: 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)), | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user