26
26
from ocpp .v16 import call as callv16
27
27
from ocpp .v16 import call_result as call_resultv16
28
28
from ocpp .v16 .enums import (
29
- UnitOfMeasure ,
30
29
AuthorizationStatus ,
31
30
Measurand ,
32
31
Phase ,
53
52
CONF_DEFAULT_AUTH_STATUS ,
54
53
CONF_ID_TAG ,
55
54
CONF_MONITORED_VARIABLES ,
55
+ CONF_NUM_CONNECTORS ,
56
56
CONF_CPIDS ,
57
57
CONFIG ,
58
58
DATA_UPDATED ,
59
59
DEFAULT_ENERGY_UNIT ,
60
+ DEFAULT_NUM_CONNECTORS ,
60
61
DEFAULT_POWER_UNIT ,
61
62
DEFAULT_MEASURAND ,
62
63
DOMAIN ,
@@ -276,15 +277,22 @@ def __init__(
276
277
277
278
# Init standard metrics for connector 0
278
279
self ._metrics [(0 , cdet .identifier .value )].value = id
279
- self ._metrics [(0 , csess .session_time .value )].unit = TIME_MINUTES
280
- self ._metrics [(0 , csess .session_energy .value )].unit = UnitOfMeasure .kwh .value
281
- self ._metrics [(0 , csess .meter_start .value )].unit = UnitOfMeasure .kwh .value
282
280
self ._metrics [(0 , cstat .reconnects .value )].value = 0
283
281
284
282
self ._attr_supported_features = prof .NONE
285
283
alphabet = string .ascii_uppercase + string .digits
286
284
self ._remote_id_tag = "" .join (secrets .choice (alphabet ) for i in range (20 ))
287
- self .num_connectors : int = 1
285
+ self .num_connectors : int = DEFAULT_NUM_CONNECTORS
286
+
287
+ def _init_connector_slots (self , conn_id : int ) -> None :
288
+ """Ensure connector-scoped metrics exist and carry the right units."""
289
+ _ = self ._metrics [(conn_id , cstat .status_connector .value )]
290
+ _ = self ._metrics [(conn_id , cstat .error_code_connector .value )]
291
+ _ = self ._metrics [(conn_id , csess .transaction_id .value )]
292
+
293
+ self ._metrics [(conn_id , csess .session_time .value )].unit = TIME_MINUTES
294
+ self ._metrics [(conn_id , csess .session_energy .value )].unit = HA_ENERGY_UNIT
295
+ self ._metrics [(conn_id , csess .meter_start .value )].unit = HA_ENERGY_UNIT
288
296
289
297
async def get_number_of_connectors (self ) -> int :
290
298
"""Return number of connectors on this charger."""
@@ -320,29 +328,28 @@ async def post_connect(self):
320
328
num_connectors : int = await self .get_number_of_connectors ()
321
329
self .num_connectors = num_connectors
322
330
for conn in range (1 , self .num_connectors + 1 ):
323
- _ = self ._metrics [(conn , cstat .status_connector .value )]
324
- _ = self ._metrics [(conn , cstat .error_code_connector .value )]
325
- _ = self ._metrics [(conn , csess .session_energy .value )]
326
- _ = self ._metrics [(conn , csess .meter_start .value )]
327
- _ = self ._metrics [(conn , csess .transaction_id .value )]
328
- self ._metrics [(0 , cdet .connectors .value )].value = num_connectors
331
+ self ._init_connector_slots (conn )
332
+ self ._metrics [(0 , cdet .connectors .value )].value = self .num_connectors
329
333
await self .get_heartbeat_interval ()
330
334
331
335
accepted_measurands : str = await self .get_supported_measurands ()
332
336
updated_entry = {** self .entry .data }
333
337
for i in range (len (updated_entry [CONF_CPIDS ])):
334
338
if self .id in updated_entry [CONF_CPIDS ][i ]:
335
- updated_entry [CONF_CPIDS ][i ][self .id ][CONF_MONITORED_VARIABLES ] = (
336
- accepted_measurands
337
- )
339
+ s = updated_entry [CONF_CPIDS ][i ][self .id ]
340
+ if s .get (CONF_MONITORED_VARIABLES ) != accepted_measurands or s .get (
341
+ CONF_NUM_CONNECTORS
342
+ ) != int (self .num_connectors ):
343
+ s [CONF_MONITORED_VARIABLES ] = accepted_measurands
344
+ s [CONF_NUM_CONNECTORS ] = int (self .num_connectors )
338
345
break
339
346
# if an entry differs this will unload/reload and stop/restart the central system/websocket
340
347
self .hass .config_entries .async_update_entry (self .entry , data = updated_entry )
341
348
342
349
await self .set_standard_configuration ()
343
350
344
351
self .post_connect_success = True
345
- _LOGGER .debug (f"' { self . id } ' post connection setup completed successfully" )
352
+ _LOGGER .debug ("'%s ' post connection setup completed successfully", self . id )
346
353
347
354
# nice to have, but not needed for integration to function
348
355
# and can cause issues with some chargers
@@ -822,22 +829,6 @@ def supported_features(self) -> int:
822
829
"""Flag of Ocpp features that are supported."""
823
830
return self ._attr_supported_features
824
831
825
- def get_metric (self , measurand : str , connector_id : int = 0 ):
826
- """Return last known value for given measurand."""
827
- val = self ._metrics [(connector_id , measurand )].value
828
- if val is not None :
829
- return val
830
-
831
- if connector_id and connector_id > 0 :
832
- if measurand == cstat .status_connector .value :
833
- agg = self ._metrics [(0 , cstat .status_connector .value )]
834
- return agg .extra_attr .get (connector_id , agg .value )
835
- if measurand == cstat .error_code_connector .value :
836
- agg = self ._metrics [(0 , cstat .error_code_connector .value )]
837
- return agg .extra_attr .get (connector_id , agg .value )
838
-
839
- return None
840
-
841
832
def get_ha_metric (self , measurand : str , connector_id : int | None = None ):
842
833
"""Return last known value in HA for given measurand, or None if not available."""
843
834
base = self .settings .cpid .lower ()
@@ -855,30 +846,6 @@ def get_ha_metric(self, measurand: str, connector_id: int | None = None):
855
846
return st .state
856
847
return None
857
848
858
- def get_extra_attr (self , measurand : str , connector_id : int = 0 ):
859
- """Return extra attributes for given measurand (per connector)."""
860
- attrs = self ._metrics [(connector_id , measurand )].extra_attr
861
- if attrs :
862
- return attrs
863
-
864
- if connector_id and connector_id > 0 :
865
- if measurand in (
866
- cstat .status_connector .value ,
867
- cstat .error_code_connector .value ,
868
- ):
869
- agg = self ._metrics [(0 , measurand )]
870
- if connector_id in agg .extra_attr :
871
- return {connector_id : agg .extra_attr [connector_id ]}
872
- return {}
873
-
874
- def get_unit (self , measurand : str , connector_id : int = 0 ):
875
- """Return unit of given measurand."""
876
- return self ._metrics [(connector_id , measurand )].unit
877
-
878
- def get_ha_unit (self , measurand : str , connector_id : int = 0 ):
879
- """Return HA unit of given measurand."""
880
- return self ._metrics [(connector_id , measurand )].ha_unit
881
-
882
849
async def notify_ha (self , msg : str , title : str = "Ocpp integration" ):
883
850
"""Notify user via HA web frontend."""
884
851
await self .hass .services .async_call (
0 commit comments