issue-51-telegram work in progress
This commit is contained in:
		
							parent
							
								
									f92836da2f
								
							
						
					
					
						commit
						ef66c8422c
					
				| @ -27,15 +27,11 @@ class Telegram(object): | |||||||
|     def add(self, obis_reference, dsmr_object): |     def add(self, obis_reference, dsmr_object): | ||||||
|         self._telegram_data[obis_reference].append(dsmr_object) |         self._telegram_data[obis_reference].append(dsmr_object) | ||||||
| 
 | 
 | ||||||
|     # TODO experiment with api to see what is nice |     def get_by_channel(self, obis_reference, channel): | ||||||
|     def get(self, obis_reference, channel=None): |  | ||||||
|         if channel is None: |  | ||||||
|             return self._telegram_data[obis_reference] |  | ||||||
| 
 |  | ||||||
|         try: |         try: | ||||||
|             return next(filter(lambda x: x.channel == channel, self._telegram_data[obis_reference])) |             return next(filter(lambda x: x.channel == channel, self._telegram_data[obis_reference])) | ||||||
|         except StopIteration: |         except StopIteration: | ||||||
|             return None |             raise LookupError('No value found for OBIS reference "{}" on channel "{}"'.format(obis_reference, channel)) | ||||||
| 
 | 
 | ||||||
|     def __getattr__(self, name): |     def __getattr__(self, name): | ||||||
|         """ will only get called for undefined attributes """ |         """ will only get called for undefined attributes """ | ||||||
| @ -45,7 +41,11 @@ class Telegram(object): | |||||||
|         return value |         return value | ||||||
| 
 | 
 | ||||||
|     def __getitem__(self, obis_reference): |     def __getitem__(self, obis_reference): | ||||||
|         return self._telegram_data[obis_reference][0] |         try: | ||||||
|  |             return self._telegram_data[obis_reference][0] | ||||||
|  |         except IndexError: | ||||||
|  |             # The index error is an internal detail. The KeyError is expected as a user. | ||||||
|  |             raise KeyError | ||||||
| 
 | 
 | ||||||
|     def __len__(self): |     def __len__(self): | ||||||
|         return len(self._telegram_data)  # TODO: its nested now |         return len(self._telegram_data)  # TODO: its nested now | ||||||
|  | |||||||
| @ -129,6 +129,51 @@ TELEGRAM_V5 = ( | |||||||
|     '!6EEE\r\n' |     '!6EEE\r\n' | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | # V5 telegram with 2 MBUS devices | ||||||
|  | TELEGRAM_V5_TWO_MBUS = ( | ||||||
|  |     '/ISK5\\2M550T-1012\r\n' | ||||||
|  |     '\r\n' | ||||||
|  |     '1-3:0.2.8(50)\r\n' | ||||||
|  |     '0-0:1.0.0(200426223325S)\r\n' | ||||||
|  |     '0-0:96.1.1(4530303434303037333832323436303139)\r\n' | ||||||
|  |     '1-0:1.8.1(002130.115*kWh)\r\n' | ||||||
|  |     '1-0:1.8.2(000245.467*kWh)\r\n' | ||||||
|  |     '1-0:2.8.1(000000.000*kWh)\r\n' | ||||||
|  |     '1-0:2.8.2(000000.000*kWh)\r\n' | ||||||
|  |     '0-0:96.14.0(0001)\r\n' | ||||||
|  |     '1-0:1.7.0(00.111*kW)\r\n' | ||||||
|  |     '1-0:2.7.0(00.000*kW)\r\n' | ||||||
|  |     '0-0:96.7.21(00005)\r\n' | ||||||
|  |     '0-0:96.7.9(00003)\r\n' | ||||||
|  |     '1-0:99.97.0(1)(0-0:96.7.19)(190326095015W)(0000002014*s)\r\n' | ||||||
|  |     '1-0:32.32.0(00001)\r\n' | ||||||
|  |     '1-0:52.32.0(00001)\r\n' | ||||||
|  |     '1-0:72.32.0(00192)\r\n' | ||||||
|  |     '1-0:32.36.0(00001)\r\n' | ||||||
|  |     '1-0:52.36.0(00001)\r\n' | ||||||
|  |     '1-0:72.36.0(00001)\r\n' | ||||||
|  |     '0-0:96.13.0()\r\n' | ||||||
|  |     '1-0:32.7.0(229.9*V)\r\n' | ||||||
|  |     '1-0:52.7.0(229.2*V)\r\n' | ||||||
|  |     '1-0:72.7.0(222.9*V)\r\n' | ||||||
|  |     '1-0:31.7.0(000*A)\r\n' | ||||||
|  |     '1-0:51.7.0(000*A)\r\n' | ||||||
|  |     '1-0:71.7.0(001*A)\r\n' | ||||||
|  |     '1-0:21.7.0(00.056*kW)\r\n' | ||||||
|  |     '1-0:41.7.0(00.000*kW)\r\n' | ||||||
|  |     '1-0:61.7.0(00.055*kW)\r\n' | ||||||
|  |     '1-0:22.7.0(00.000*kW)\r\n' | ||||||
|  |     '1-0:42.7.0(00.000*kW)\r\n' | ||||||
|  |     '1-0:62.7.0(00.000*kW)\r\n' | ||||||
|  |     '0-1:24.1.0(003)\r\n' | ||||||
|  |     '0-1:96.1.0()\r\n' | ||||||
|  |     '0-1:24.2.1(700101010000W)(00000000)\r\n' | ||||||
|  |     '0-2:24.1.0(003)\r\n' | ||||||
|  |     '0-2:96.1.0(4730303339303031393336393930363139)\r\n' | ||||||
|  |     '0-2:24.2.1(200426223001S)(00246.138*m3)\r\n' | ||||||
|  |     '!56DD\r\n' | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| TELEGRAM_FLUVIUS_V171 = ( | TELEGRAM_FLUVIUS_V171 = ( | ||||||
|     '/FLU5\253769484_A\r\n' |     '/FLU5\253769484_A\r\n' | ||||||
|     '\r\n' |     '\r\n' | ||||||
|  | |||||||
| @ -4,11 +4,12 @@ import pytz | |||||||
| 
 | 
 | ||||||
| from dsmr_parser import telegram_specifications | from dsmr_parser import telegram_specifications | ||||||
| from dsmr_parser import obis_name_mapping | from dsmr_parser import obis_name_mapping | ||||||
|  | from dsmr_parser import obis_references as obis | ||||||
| from dsmr_parser.objects import CosemObject | from dsmr_parser.objects import CosemObject | ||||||
| from dsmr_parser.objects import MBusObject | from dsmr_parser.objects import MBusObject | ||||||
| from dsmr_parser.objects import ProfileGenericObject | from dsmr_parser.objects import ProfileGenericObject | ||||||
| from dsmr_parser.parsers import TelegramParser | from dsmr_parser.parsers import TelegramParser | ||||||
| from test.example_telegrams import TELEGRAM_V4_2 | from test.example_telegrams import TELEGRAM_V4_2, TELEGRAM_V5_TWO_MBUS | ||||||
| from decimal import Decimal | from decimal import Decimal | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -319,3 +320,47 @@ class TelegramTest(unittest.TestCase): | |||||||
|         item_names_tested_set = set(self.item_names_tested) |         item_names_tested_set = set(self.item_names_tested) | ||||||
| 
 | 
 | ||||||
|         assert item_names_tested_set == V4_name_set |         assert item_names_tested_set == V4_name_set | ||||||
|  | 
 | ||||||
|  |     def test_get(self): | ||||||
|  |         parser = TelegramParser(telegram_specifications.V5) | ||||||
|  |         telegram = parser.parse(TELEGRAM_V5_TWO_MBUS) | ||||||
|  | 
 | ||||||
|  |         mbus_1 = telegram.get(obis.HOURLY_GAS_METER_READING, channel=1) | ||||||
|  |         mbus_2 = telegram.get(obis.HOURLY_GAS_METER_READING, channel=2) | ||||||
|  | 
 | ||||||
|  |         self.assertEqual(type(mbus_1), MBusObject) | ||||||
|  |         self.assertEqual(mbus_1.channel, 1) | ||||||
|  |         self.assertEqual(mbus_1.value, 0) | ||||||
|  | 
 | ||||||
|  |         self.assertEqual(type(mbus_2), MBusObject) | ||||||
|  |         self.assertEqual(mbus_2.channel, 2) | ||||||
|  |         self.assertEqual(mbus_2.value, Decimal('246.138')) | ||||||
|  | 
 | ||||||
|  |     def test_get_without_channel(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) | ||||||
|  | 
 | ||||||
|  |         mbus = telegram.get(obis.HOURLY_GAS_METER_READING) | ||||||
|  | 
 | ||||||
|  |         self.assertEqual(type(mbus), MBusObject) | ||||||
|  |         self.assertEqual(mbus.channel, 1) | ||||||
|  |         self.assertEqual(mbus.value, 0) | ||||||
|  | 
 | ||||||
|  |     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_by_channel(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_by_channel('invalid_obis_reference', channel=1) | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user