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