Skip to content

Commit 102000c

Browse files
committed
implement #114
1 parent 651f4d6 commit 102000c

2 files changed

Lines changed: 48 additions & 40 deletions

File tree

custom_components/tibber_local/__init__.py

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import time
77
from asyncio import CancelledError
88
from datetime import timedelta
9+
from numbers import Number
910
from typing import Final, Any
1011

1112
import aiohttp
@@ -556,22 +557,29 @@ class TibberLocalBridge:
556557
PLAIN_TEXT_LINE: re.Pattern = re.compile(r'(.*?)-(.*?):(.*?)\.(.*?)\.(.*?)(?:\*(.*?)|)\((.*?)\)')
557558
TWO_DIGIT_CODE_PATTERN = re.compile(r'^([^.]*\.[^.]*)(\(.*$)')
558559

559-
def _get_value_internal(self, key, divisor: int = 1):
560+
def _get_numeric_value_internal(self, key, divisor: int = 1):
560561
if isinstance(key, list):
561562
val = None
562563
for a_key in key:
563564
if val is None:
564-
val = self._get_value_internal(a_key, divisor)
565+
val = self._get_numeric_value_internal(a_key, divisor)
565566
return val
566567

567568
if key in self._obis_values:
568569
a_obis = self._obis_values.get(key)
569-
if hasattr(a_obis, 'scaler'):
570-
return a_obis.value * 10 ** int(a_obis.scaler) / divisor
571-
else:
572-
return a_obis.value / divisor
570+
if isinstance(a_obis.value, Number):
571+
if hasattr(a_obis, 'scaler'):
572+
try:
573+
return a_obis.value * 10 ** int(a_obis.scaler) / divisor
574+
except (TypeError, ValueError):
575+
_LOGGER(f"_get_numeric_value_internal(): could not convert scaler to int for key {key} - {a_obis}")
576+
return None
577+
else:
578+
return a_obis.value / divisor
579+
580+
return None
573581

574-
def _get_str_internal(self, key):
582+
def _get_string_internal(self, key):
575583
if key in self._obis_values:
576584
return self._obis_values.get(key).value
577585

@@ -1281,19 +1289,19 @@ def attrhub_compression_error_readings_count(self):
12811289

12821290
@property
12831291
def attr010060320101(self) -> str: # XYZ
1284-
return self._get_str_internal('010060320101')
1292+
return self._get_string_internal('010060320101')
12851293

12861294
@property
12871295
def attr0100600100ff(self) -> str: # 0a123b4c567890d12e34
1288-
return self._get_str_internal('0100600100ff')
1296+
return self._get_string_internal('0100600100ff')
12891297

12901298
@property
12911299
def attr0100010800ff(self) -> float:
1292-
return self._get_value_internal('0100010800ff')
1300+
return self._get_numeric_value_internal('0100010800ff')
12931301

12941302
@property
12951303
def attr0100010800ff_in_k(self) -> float:
1296-
return self._get_value_internal('0100010800ff', divisor=1000)
1304+
return self._get_numeric_value_internal('0100010800ff', divisor=1000)
12971305

12981306
@property
12991307
def attr0100010800ff_status(self) -> float:
@@ -1302,120 +1310,120 @@ def attr0100010800ff_status(self) -> float:
13021310

13031311
@property
13041312
def attr0100010801ff(self) -> float:
1305-
return self._get_value_internal('0100010801ff')
1313+
return self._get_numeric_value_internal('0100010801ff')
13061314

13071315
@property
13081316
def attr0100010801ff_in_k(self) -> float:
1309-
return self._get_value_internal('0100010801ff', divisor=1000)
1317+
return self._get_numeric_value_internal('0100010801ff', divisor=1000)
13101318

13111319
@property
13121320
def attr0100010802ff(self) -> float:
1313-
return self._get_value_internal('0100010802ff')
1321+
return self._get_numeric_value_internal('0100010802ff')
13141322

13151323
@property
13161324
def attr0100010802ff_in_k(self) -> float:
1317-
return self._get_value_internal('0100010802ff', divisor=1000)
1325+
return self._get_numeric_value_internal('0100010802ff', divisor=1000)
13181326

13191327
@property
13201328
def attr0100010803ff(self) -> float:
1321-
return self._get_value_internal('0100010803ff')
1329+
return self._get_numeric_value_internal('0100010803ff')
13221330

13231331
@property
13241332
def attr0100010803ff_in_k(self) -> float:
1325-
return self._get_value_internal('0100010803ff', divisor=1000)
1333+
return self._get_numeric_value_internal('0100010803ff', divisor=1000)
13261334

13271335
@property
13281336
def attr0100010804ff(self) -> float:
1329-
return self._get_value_internal('0100010804ff')
1337+
return self._get_numeric_value_internal('0100010804ff')
13301338

13311339
@property
13321340
def attr0100010804ff_in_k(self) -> float:
1333-
return self._get_value_internal('0100010804ff', divisor=1000)
1341+
return self._get_numeric_value_internal('0100010804ff', divisor=1000)
13341342

13351343
@property
13361344
def attr0100020800ff(self) -> float:
1337-
return self._get_value_internal('0100020800ff')
1345+
return self._get_numeric_value_internal('0100020800ff')
13381346

13391347
@property
13401348
def attr0100020800ff_in_k(self) -> float:
1341-
return self._get_value_internal(key='0100020800ff', divisor=1000)
1349+
return self._get_numeric_value_internal(key='0100020800ff', divisor=1000)
13421350

13431351
@property
13441352
def attr0100100700ff(self) -> float:
13451353
# search for SUM (0), POS (0), POS (255), NEG (0), ABS (0)
1346-
return self._get_value_internal(
1354+
return self._get_numeric_value_internal(
13471355
['0100100700ff', '0100010700ff', '01000107ffff', '0100020700ff', '01000f0700ff'])
13481356

13491357
@property
13501358
def attr0100240700ff(self) -> float:
13511359
# search for SUM (0), POS (0), POS (255), NEG (0), ABS (0)
1352-
return self._get_value_internal(
1360+
return self._get_numeric_value_internal(
13531361
['0100240700ff', '0100150700ff', '01001507ffff', '0100160700ff', '0100230700ff'])
13541362

13551363
@property
13561364
def attr0100380700ff(self) -> float:
13571365
# search for SUM (0), POS (0), POS (255), NEG (0), ABS (0)
1358-
return self._get_value_internal(
1366+
return self._get_numeric_value_internal(
13591367
['0100380700ff', '0100290700ff', '01002907ffff', '01002a0700ff', '0100370700ff'])
13601368

13611369
@property
13621370
def attr01004c0700ff(self) -> float:
13631371
# search for SUM (0), POS (0), POS (255), NEG (0), ABS (0)
1364-
return self._get_value_internal(
1372+
return self._get_numeric_value_internal(
13651373
['01004c0700ff', '01003d0700ff', '01003d07ffff', '01003e0700ff', '01004b0700ff'])
13661374

13671375
@property
13681376
def attr0100200700ff(self) -> float:
1369-
return self._get_value_internal('0100200700ff')
1377+
return self._get_numeric_value_internal('0100200700ff')
13701378

13711379
@property
13721380
def attr0100340700ff(self) -> float:
1373-
return self._get_value_internal('0100340700ff')
1381+
return self._get_numeric_value_internal('0100340700ff')
13741382

13751383
@property
13761384
def attr0100480700ff(self) -> float:
1377-
return self._get_value_internal('0100480700ff')
1385+
return self._get_numeric_value_internal('0100480700ff')
13781386

13791387
@property
13801388
def attr01001f0700ff(self) -> float:
1381-
return self._get_value_internal('01001f0700ff')
1389+
return self._get_numeric_value_internal('01001f0700ff')
13821390

13831391
@property
13841392
def attr0100330700ff(self) -> float:
1385-
return self._get_value_internal('0100330700ff')
1393+
return self._get_numeric_value_internal('0100330700ff')
13861394

13871395
@property
13881396
def attr0100470700ff(self) -> float:
1389-
return self._get_value_internal('0100470700ff')
1397+
return self._get_numeric_value_internal('0100470700ff')
13901398

13911399
@property
13921400
def attr0100510701ff(self) -> float:
1393-
return self._get_value_internal('0100510701ff')
1401+
return self._get_numeric_value_internal('0100510701ff')
13941402

13951403
@property
13961404
def attr0100510702ff(self) -> float:
1397-
return self._get_value_internal('0100510702ff')
1405+
return self._get_numeric_value_internal('0100510702ff')
13981406

13991407
@property
14001408
def attr0100510704ff(self) -> float:
1401-
return self._get_value_internal('0100510704ff')
1409+
return self._get_numeric_value_internal('0100510704ff')
14021410

14031411
@property
14041412
def attr010051070fff(self) -> float:
1405-
return self._get_value_internal('010051070fff')
1413+
return self._get_numeric_value_internal('010051070fff')
14061414

14071415
@property
14081416
def attr010051071aff(self) -> float:
1409-
return self._get_value_internal('010051071aff')
1417+
return self._get_numeric_value_internal('010051071aff')
14101418

14111419
@property
14121420
def attr01000e0700ff(self) -> float:
1413-
return self._get_value_internal('01000e0700ff')
1421+
return self._get_numeric_value_internal('01000e0700ff')
14141422

14151423
@property
14161424
def attr010000020000(self) -> str: # 01
1417-
return self._get_str_internal('010000020000')
1425+
return self._get_string_internal('010000020000')
14181426

14191427
@property
14201428
def attr0100605a0201(self) -> str: # 123a4567
1421-
return self._get_str_internal('0100605a0201')
1429+
return self._get_string_internal('0100605a0201')

custom_components/tibber_local/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
"iot_class": "local_push",
1212
"issue_tracker": "https://github.com/marq24/ha-tibber-pulse-local/issues",
1313
"requirements": ["smllib>=1.7"],
14-
"version": "2026.4.0"
14+
"version": "2026.5.0"
1515
}

0 commit comments

Comments
 (0)