issue-51-telegram work in progress
This commit is contained in:
		
							parent
							
								
									f5d402ad1b
								
							
						
					
					
						commit
						3ae06f88b7
					
				| @ -34,45 +34,21 @@ class Telegram(object): | ||||
|         self._item_names.append(self._obis_name_mapping[obis_reference]) | ||||
| 
 | ||||
|         # Group Mbus related values into a MbusDevice object. | ||||
|         # TODO sometimes this is a list due to BELGIUM_MAXIMUM_DEMAND_13_MONTHS | ||||
|         # TODO MaxDemandParser (BELGIUM_MAXIMUM_DEMAND_13_MONTHS) returns a list | ||||
|         if isinstance(dsmr_object, DSMRObject) and dsmr_object.is_mbus_reading: | ||||
|             channel_id = dsmr_object.obis_id_code[1] | ||||
|             mbus_device = self._mbus_devices[channel_id] | ||||
|             mbus_device.add(obis_reference, dsmr_object) | ||||
| 
 | ||||
| 
 | ||||
|     def get_mbus_devices(self): | ||||
|         """ | ||||
|         Return MbusDevice objects which are used for water, heat and gas meters. | ||||
|         """ | ||||
|         # TODO sort by channel ID | ||||
|         return list(self._mbus_devices.values()) | ||||
|         return [d[1] for d in sorted(self._mbus_devices.items(), key=lambda x: x[0])] | ||||
| 
 | ||||
|     def get_mbus_device_by_channel(self, channel_id=None): | ||||
|         return self._mbus_devices[channel_id] | ||||
| 
 | ||||
|     # # TODO devices groeperen. alle values van dat channel daar in groeperen en wrappen in device object gebruik makende van device id | ||||
|     # def get(self, obis_reference, channel=None): | ||||
|     #     """ | ||||
|     #     Get values by OBIS reference (regex). If multiple values exist a list is returned, unless filtering by channel. | ||||
|     #     May assume that values are sorted by channel. | ||||
|     #     """ | ||||
|     #     if channel is None: | ||||
|     #         try: | ||||
|     #             values = self._telegram_data[obis_reference] | ||||
|     #         except KeyError: | ||||
|     #             raise LookupError('No value found for OBIS reference "{}"'.format(obis_reference)) | ||||
|     # | ||||
|     #         if len(values) == 1: | ||||
|     #             return values[0] | ||||
|     #         else: | ||||
|     #             return values | ||||
|     # | ||||
|     #     try: | ||||
|     #         return [v for v in self._telegram_data[obis_reference] if v.channel == channel][0] | ||||
|     #     except IndexError: | ||||
|     #         raise LookupError('No value found for OBIS reference "{}" on channel "{}"'.format(obis_reference, channel)) | ||||
| 
 | ||||
|     def __getattr__(self, name): | ||||
|         """ will only get called for undefined attributes """ | ||||
|         obis_reference = self._reverse_obis_name_mapping[name] | ||||
| @ -126,6 +102,7 @@ class DSMRObject(object): | ||||
| 
 | ||||
|         return obis_id == 0 and channel_id != 0 | ||||
| 
 | ||||
| 
 | ||||
| class MBusObject(DSMRObject): | ||||
| 
 | ||||
|     @property | ||||
|  | ||||
| @ -4,8 +4,7 @@ import pytz | ||||
| 
 | ||||
| from dsmr_parser import telegram_specifications | ||||
| from dsmr_parser import obis_name_mapping | ||||
| from dsmr_parser import obis_references as obis | ||||
| from dsmr_parser.objects import CosemObject, MbusDevice | ||||
| from dsmr_parser.objects import CosemObject | ||||
| from dsmr_parser.objects import MBusObject | ||||
| from dsmr_parser.objects import ProfileGenericObject | ||||
| from dsmr_parser.parsers import TelegramParser | ||||
| @ -327,84 +326,31 @@ class TelegramTest(unittest.TestCase): | ||||
| 
 | ||||
|         self.assertEqual(len(telegram), 35) | ||||
| 
 | ||||
|     # def test_get(self): | ||||
|     #     """ Retrieve MBUS device without supplying channel which fetches all (two) records found. """ | ||||
|     #     parser = TelegramParser(telegram_specifications.V5) | ||||
|     #     telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||
|     # | ||||
|     #     # A single value is returned for the current electricity usage | ||||
|     #     electricity_used_value = telegram.get(obis.CURRENT_ELECTRICITY_USAGE) | ||||
|     #     self.assertEqual(type(electricity_used_value), CosemObject) | ||||
|     #     self.assertEqual(electricity_used_value.channel, 0) | ||||
|     #     self.assertEqual(electricity_used_value.value, Decimal('0.111')) | ||||
|     # | ||||
|     #     # Multiple values are returned for the gas reading | ||||
|     #     gas_values = telegram.get(obis.HOURLY_GAS_METER_READING) | ||||
|     #     self.assertEqual(len(gas_values), 2) | ||||
|     # | ||||
|     #     gas_value_1 = gas_values[0] | ||||
|     #     self.assertEqual(type(gas_value_1), MBusObject) | ||||
|     #     self.assertEqual(gas_value_1.channel, 1) | ||||
|     #     self.assertEqual(gas_value_1.value, 0) | ||||
|     # | ||||
|     #     gas_value_2 = gas_values[1] | ||||
|     #     self.assertEqual(type(gas_value_2), MBusObject) | ||||
|     #     self.assertEqual(gas_value_2.channel, 2) | ||||
|     #     self.assertEqual(gas_value_2.value, Decimal('246.138')) | ||||
|     # | ||||
|     # def test_get_with_channel(self): | ||||
|     #     parser = TelegramParser(telegram_specifications.V5) | ||||
|     #     telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||
|     # | ||||
|     #     gas_value_1 = telegram.get(obis.HOURLY_GAS_METER_READING, channel=1) | ||||
|     #     gas_value_2 = telegram.get(obis.HOURLY_GAS_METER_READING, channel=2) | ||||
|     # | ||||
|     #     self.assertEqual(type(gas_value_1), MBusObject) | ||||
|     #     self.assertEqual(gas_value_1.channel, 1) | ||||
|     #     self.assertEqual(gas_value_1.value, 0) | ||||
|     # | ||||
|     #     self.assertEqual(type(gas_value_2), MBusObject) | ||||
|     #     self.assertEqual(gas_value_2.channel, 2) | ||||
|     #     self.assertEqual(gas_value_2.value, Decimal('246.138')) | ||||
|     # | ||||
|     # def test_get_unknown_value(self): | ||||
|     #     """ Retrieve MBUS device without supplying channel which fetches the first MBUS record found """ | ||||
|     #     parser = TelegramParser(telegram_specifications.V5) | ||||
|     #     telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||
|     # | ||||
|     #     # Test valid OBIS reference with wrong channel | ||||
|     #     with self.assertRaises(LookupError) as exception_context: | ||||
|     #         telegram.get(obis.HOURLY_GAS_METER_READING, channel=123) | ||||
|     # | ||||
|     #     self.assertEqual( | ||||
|     #         str(exception_context.exception), | ||||
|     #         'No value found for OBIS reference "\\d-\\d:24\\.2\\.1.+?\\r\\n" on channel "123"' | ||||
|     #     ) | ||||
|     # | ||||
|     #     # Test invalid OBIS reference | ||||
|     #     with self.assertRaises(LookupError): | ||||
|     #         telegram.get('invalid_obis_reference', channel=1) | ||||
| 
 | ||||
|     # TODO | ||||
|     def test_get_mbus_devices(self): | ||||
|         parser = TelegramParser(telegram_specifications.V5) | ||||
|         telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||
| 
 | ||||
|         mbus_devices = telegram.get_mbus_devices() | ||||
|         print(mbus_devices) | ||||
| 
 | ||||
|         self.assertEqual(len(mbus_devices), 2) | ||||
| 
 | ||||
|         mbus_device_1 = mbus_devices[0] | ||||
|         self.assertEqual(type(mbus_device_1), MbusDevice) | ||||
|         print('mbus_device_1.HOURLY_GAS_METER_READING: ', mbus_device_1.HOURLY_GAS_METER_READING) | ||||
|         self.assertEqual(mbus_device_1.EQUIPMENT_IDENTIFIER_GAS.value, None) | ||||
|         print() | ||||
|         self.assertEqual(mbus_device_1.HOURLY_GAS_METER_READING.value, Decimal('0')) | ||||
| 
 | ||||
|         mbus_device_2 = mbus_devices[1] | ||||
|         self.assertEqual(type(mbus_device_2), MbusDevice) | ||||
|         print('mbus_device_2.HOURLY_GAS_METER_READING: ', mbus_device_2.HOURLY_GAS_METER_READING) | ||||
|         self.assertEqual(mbus_device_2.EQUIPMENT_IDENTIFIER_GAS.value, '4730303339303031393336393930363139') | ||||
|         self.assertEqual(mbus_device_2.HOURLY_GAS_METER_READING.value, Decimal('246.138')) | ||||
| 
 | ||||
|     # TODO | ||||
|     def test_get_mbus_device_by_channel(self): | ||||
|         parser = TelegramParser(telegram_specifications.V5) | ||||
|         telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||
| 
 | ||||
|         print('by channel: ', telegram.get_mbus_device_by_channel(2).HOURLY_GAS_METER_READING) | ||||
|         mbus_device_1 = telegram.get_mbus_device_by_channel(1) | ||||
|         self.assertEqual(mbus_device_1.EQUIPMENT_IDENTIFIER_GAS.value, None) | ||||
|         self.assertEqual(mbus_device_1.HOURLY_GAS_METER_READING.value, Decimal('0')) | ||||
| 
 | ||||
|         mbus_device_2 = telegram.get_mbus_device_by_channel(2) | ||||
|         self.assertEqual(mbus_device_2.EQUIPMENT_IDENTIFIER_GAS.value, '4730303339303031393336393930363139') | ||||
|         self.assertEqual(mbus_device_2.HOURLY_GAS_METER_READING.value, Decimal('246.138')) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user