34
34
35
35
36
36
class Analyser_Merge_Charging_station_FR (Analyser_Merge_Point ):
37
+ MAX_POWER_KW = 401
37
38
WIKIDATA_MAP = {
38
39
"ionity" : "Q42717773" ,
39
40
"bouygues" : "Q3046208" ,
@@ -45,43 +46,111 @@ class Analyser_Merge_Charging_station_FR(Analyser_Merge_Point):
45
46
"Izivia" : "Q86671322" ,
46
47
}
47
48
48
- def keepMaxValueIfEnum (str ):
49
+ @staticmethod
50
+ def keepMaxValueIfEnum (str_val ):
51
+ # Constante pour limiter les valeurs aberrantes (en kW)
52
+ MAX_POWER_KW = 500
53
+
49
54
# si la valeur contient un ; on sépare et on prend la plus haute valeur
50
- if ";" in str :
51
- boom = str .split (";" )
52
- max = 0
55
+ if ";" in str_val :
56
+ boom = str_val .split (";" )
57
+ max_val = 0
53
58
for p in boom :
54
- p = int (p )
55
- if p > max :
56
- max = p
57
-
58
- if max > 0 :
59
- str = max
60
- return str
61
-
62
- def getPuissanceNominaleInKw (self , puissance_nominale ):
63
- # deviner un nombre en kw dans la puissance nominale,
64
- # les valeurs de plus de 401 sont à diviser par mille,
65
- # il faut aussi évacuer le leftpad de 0
66
- if puissance_nominale is None :
59
+ # Supprimer les unités éventuelles (comme "kw")
60
+ p_clean = p .lower ().replace ("kw" , "" ).strip ()
61
+ try :
62
+ p_val = int (float (p_clean ))
63
+ # Ignorer les valeurs supérieures à la limite maximale connue (MAX_POWER_KW)
64
+ if (
65
+ p_val <= Analyser_Merge_Charging_station_FR .MAX_POWER_KW
66
+ and p_val > max_val
67
+ ):
68
+ max_val = p_val
69
+ except ValueError :
70
+ # Ignorer les valeurs qui ne peuvent pas être converties en nombre
71
+ pass
72
+
73
+ if max_val > 0 :
74
+ str_val = str (max_val )
75
+ else :
76
+ # Gérer les cas où il n'y a pas de délimiteur mais une unité est présente
77
+ if "kw" in str_val .lower ():
78
+ p_clean = str_val .lower ().replace ("kw" , "" ).strip ()
79
+ try :
80
+ p_val = int (float (p_clean ))
81
+ if p_val <= Analyser_Merge_Charging_station_FR .MAX_POWER_KW :
82
+ str_val = str (p_val )
83
+ except ValueError :
84
+ pass
85
+ return str_val
86
+
87
+ def _normalize_number (self , v : float ) -> str :
88
+ """Formate un float en supprimant les .0 inutiles et les zéros de fin."""
89
+ try :
90
+ iv = int (v )
91
+ if abs (v - iv ) < 1e-9 :
92
+ return str (iv )
93
+ return f"{ v :.6f} " .rstrip ("0" ).rstrip ("." )
94
+ except Exception :
95
+ return str (v )
96
+
97
+ def getPuissanceNominaleInKw (self , raw ):
98
+ """
99
+ Calcule la puissance nominale en kW à partir d'une valeur brute.
100
+
101
+ Règles:
102
+ - Si 'raw' est une énumération 'a;b;c', on garde la valeur max en kW <= MAX_POWER_KW.
103
+ - Si 'raw' est une valeur unique:
104
+ * suffixe 'kW' => valeur déjà en kW
105
+ * suffixe 'W' => conversion W -> kW
106
+ * sans unité:
107
+ - si > MAX_POWER_KW => on suppose des watts, on divise par 1000
108
+ - sinon => déjà en kW
109
+
110
+ Retour: 'X kW' ou None si indéterminable.
111
+ """
112
+ if raw is None :
67
113
return None
68
- puissance_nominale = str (puissance_nominale )
69
114
70
- if puissance_nominale is None :
115
+ s = str (raw ).strip ()
116
+ if s == "" :
117
+ return None
118
+
119
+ max_kw = getattr (self , "MAX_POWER_KW" , 500 )
120
+
121
+ # Cas énumération: on délègue à keepMaxValueIfEnum puis on formate.
122
+ if ";" in s :
123
+ max_str = self .keepMaxValueIfEnum (s )
124
+ if not max_str :
125
+ return None
126
+ try :
127
+ v = float (
128
+ str (max_str ).replace ("," , "." ).lower ().replace ("kw" , "" ).strip ()
129
+ )
130
+ except Exception :
131
+ return None
132
+ return f"{ self ._normalize_number (v )} kW"
133
+
134
+ # Cas valeur unique
135
+ s_norm = s .lower ().replace ("," , "." )
136
+ try :
137
+ if s_norm .endswith ("kw" ):
138
+ v = float (s_norm [:- 2 ].strip ())
139
+ return f"{ self ._normalize_number (v )} kW"
140
+
141
+ if s_norm .endswith ("w" ):
142
+ v_w = float (s_norm [:- 1 ].strip ())
143
+ v = v_w / 1000.0
144
+ return f"{ self ._normalize_number (v )} kW"
145
+
146
+ # Sans unité
147
+ v = float (s_norm )
148
+ if v > max_kw :
149
+ # On suppose des watts => conversion en kW
150
+ v = v / 1000.0
151
+ return f"{ self ._normalize_number (v )} kW"
152
+ except Exception :
71
153
return None
72
- # Convertir en chaîne et supprimer les zéros à gauche
73
- puissance_str = str (puissance_nominale ).lstrip ("0" )
74
- if not puissance_str :
75
- return 0
76
-
77
- puissance_str = self .keepMaxValueIfEnum (puissance_str )
78
- # Reconvertir en entier
79
- puissance_nominale = int (puissance_str )
80
- # puisssance max de borne en kW connue
81
- if puissance_nominale > 401 :
82
- return str (puissance_nominale / 1000 ) + " kW"
83
- else :
84
- return str (puissance_nominale ) + " kW"
85
154
86
155
def __init__ (self , config , logger = None ):
87
156
Analyser_Merge_Point .__init__ (self , config , logger )
@@ -109,23 +178,23 @@ def __init__(self, config, logger=None):
109
178
level = 3 ,
110
179
tags = ["merge" , "fix:imagery" , "fix:survey" , "fix:picture" ],
111
180
title = T_ ("Car charging station not integrated" ),
112
- ** doc
181
+ ** doc ,
113
182
)
114
183
self .def_class_possible_merge (
115
184
item = 8411 ,
116
185
id = 3 ,
117
186
level = 3 ,
118
187
tags = ["merge" , "fix:imagery" , "fix:survey" , "fix:picture" ],
119
188
title = T_ ("Car charging station, integration suggestion" ),
120
- ** doc
189
+ ** doc ,
121
190
)
122
191
self .def_class_update_official (
123
192
item = 8412 ,
124
193
id = 4 ,
125
194
level = 3 ,
126
195
tags = ["merge" , "fix:imagery" , "fix:survey" , "fix:picture" ],
127
196
title = T_ ("Car charging station update" ),
128
- ** doc
197
+ ** doc ,
129
198
)
130
199
131
200
self .init (
0 commit comments