@@ -293,19 +293,19 @@ def _get_metrics(self, id: str):
293
293
"""Return metrics."""
294
294
cp_id = self .cpids .get (id , id )
295
295
cp = self .charge_points .get (cp_id )
296
- return (cp_id , cp ._metrics ) if cp is not None else (None , None )
296
+ n_connectors = getattr (cp , "num_connectors" , 1 ) or 1
297
+ return (
298
+ (cp_id , cp ._metrics , cp , n_connectors )
299
+ if cp is not None
300
+ else (None , None , None , None )
301
+ )
297
302
298
303
def get_metric (self , id : str , measurand : str , connector_id : int | None = None ):
299
304
"""Return last known value for given measurand."""
300
- # allow id to be either cpid or cp_id
301
- cp_id = self .cpids .get (id , id )
302
- if cp_id not in self .charge_points :
305
+ cp_id , m , cp , n_connectors = self ._get_metrics (id )
306
+ if cp is None :
303
307
return None
304
308
305
- cp = self .charge_points [cp_id ]
306
- m = cp ._metrics
307
- n_connectors = getattr (cp , "num_connectors" , 1 ) or 1
308
-
309
309
def _try_val (key ):
310
310
with contextlib .suppress (Exception ):
311
311
val = m [key ].value
@@ -314,7 +314,7 @@ def _try_val(key):
314
314
315
315
# 1) Explicit connector_id (including 0): just get it
316
316
if connector_id is not None :
317
- conn = 0 if connector_id == 0 else connector_id
317
+ conn = self . _norm_conn ( connector_id )
318
318
return _try_val ((conn , measurand ))
319
319
320
320
# 2) No connector_id: try CHARGER level (conn=0)
@@ -344,8 +344,8 @@ def _try_val(key):
344
344
345
345
def del_metric (self , id : str , measurand : str , connector_id : int | None = None ):
346
346
"""Set given measurand to None."""
347
- # allow id to be either cpid or cp_id
348
- cp_id , m = self . _get_metrics ( id )
347
+ cp_id , m , cp , n_connectors = self . _get_metrics ( id )
348
+
349
349
if m is None :
350
350
return None
351
351
@@ -360,22 +360,18 @@ def del_metric(self, id: str, measurand: str, connector_id: int | None = None):
360
360
361
361
def get_unit (self , id : str , measurand : str , connector_id : int | None = None ):
362
362
"""Return unit of given measurand."""
363
- # allow id to be either cpid or cp_id
364
- cp_id = self .cpids .get (id , id )
365
- if cp_id not in self .charge_points :
366
- return None
363
+ cp_id , m , cp , n_connectors = self ._get_metrics (id )
367
364
368
- cp = self .charge_points [cp_id ]
369
- m = cp ._metrics
370
- n_connectors = getattr (cp , "num_connectors" , 1 ) or 1
365
+ if cp is None :
366
+ return None
371
367
372
368
def _try_unit (key ):
373
369
with contextlib .suppress (Exception ):
374
370
return m [key ].unit
375
371
return None
376
372
377
373
if connector_id is not None :
378
- conn = 0 if connector_id == 0 else connector_id
374
+ conn = self . _norm_conn ( connector_id )
379
375
return _try_unit ((conn , measurand ))
380
376
381
377
val = _try_unit ((0 , measurand ))
@@ -401,21 +397,18 @@ def _try_unit(key):
401
397
402
398
def get_ha_unit (self , id : str , measurand : str , connector_id : int | None = None ):
403
399
"""Return home assistant unit of given measurand."""
404
- cp_id = self .cpids .get (id , id )
405
- if cp_id not in self .charge_points :
406
- return None
400
+ cp_id , m , cp , n_connectors = self ._get_metrics (id )
407
401
408
- cp = self .charge_points [cp_id ]
409
- m = cp ._metrics
410
- n_connectors = getattr (cp , "num_connectors" , 1 ) or 1
402
+ if cp is None :
403
+ return None
411
404
412
405
def _try_ha_unit (key ):
413
406
with contextlib .suppress (Exception ):
414
407
return m [key ].ha_unit
415
408
return None
416
409
417
410
if connector_id is not None :
418
- conn = 0 if connector_id == 0 else connector_id
411
+ conn = self . _norm_conn ( connector_id )
419
412
return _try_ha_unit ((conn , measurand ))
420
413
421
414
val = _try_ha_unit ((0 , measurand ))
@@ -441,22 +434,18 @@ def _try_ha_unit(key):
441
434
442
435
def get_extra_attr (self , id : str , measurand : str , connector_id : int | None = None ):
443
436
"""Return extra attributes for given measurand."""
444
- # allow id to be either cpid or cp_id
445
- cp_id = self .cpids .get (id , id )
446
- if cp_id not in self .charge_points :
447
- return None
437
+ cp_id , m , cp , n_connectors = self ._get_metrics (id )
448
438
449
- cp = self .charge_points [cp_id ]
450
- m = cp ._metrics
451
- n_connectors = getattr (cp , "num_connectors" , 1 ) or 1
439
+ if cp is None :
440
+ return None
452
441
453
442
def _try_extra (key ):
454
443
with contextlib .suppress (Exception ):
455
444
return m [key ].extra_attr
456
445
return None
457
446
458
447
if connector_id is not None :
459
- conn = 0 if connector_id == 0 else connector_id
448
+ conn = self . _norm_conn ( connector_id )
460
449
return _try_extra ((conn , measurand ))
461
450
462
451
val = _try_extra ((0 , measurand ))
@@ -482,28 +471,27 @@ def _try_extra(key):
482
471
483
472
def get_available (self , id : str , connector_id : int | None = None ):
484
473
"""Return whether the charger (or a specific connector) is available."""
485
- # allow id to be either cpid or cp_id
486
- cp_id = self .cpids .get (id , id )
487
- if cp_id not in self .charge_points :
488
- return False
474
+ cp_id , m , cp , n_connectors = self ._get_metrics (id )
489
475
490
- cp = self .charge_points [cp_id ]
476
+ if cp is None :
477
+ return None
491
478
492
- if connector_id is None or connector_id == 0 :
479
+ if self . _norm_conn ( connector_id ) == 0 :
493
480
return cp .status == STATE_OK
494
481
495
- m = cp ._metrics
496
482
status_val = None
497
483
with contextlib .suppress (Exception ):
498
- status_val = m [(connector_id , cstat .status_connector .value )].value
484
+ status_val = m [
485
+ (self ._norm_conn (connector_id ), cstat .status_connector .value )
486
+ ].value
499
487
500
488
if not status_val :
501
489
try :
502
490
flat = m [cstat .status_connector .value ]
503
491
if hasattr (flat , "extra_attr" ):
504
- status_val = flat .extra_attr .get (connector_id ) or getattr (
505
- flat , "value" , None
506
- )
492
+ status_val = flat .extra_attr .get (
493
+ self . _norm_conn ( connector_id )
494
+ ) or getattr ( flat , "value" , None )
507
495
except Exception :
508
496
pass
509
497
0 commit comments