55
66
77import asyncio
8+ import math
89from datetime import datetime
910
1011from frequenz .channels import Broadcast , Receiver , Sender
@@ -187,58 +188,65 @@ async def _handle_resampling_requests(self) -> None:
187188 )
188189 )
189190
191+ def make_sample (self , value : float | None ) -> Sample [Quantity ]:
192+ """Create a sample with the given value."""
193+ return Sample (
194+ self ._next_ts ,
195+ None if value is None else Quantity (value ),
196+ )
197+
190198 async def send_meter_power (self , values : list [float | None ]) -> None :
191199 """Send the given values as resampler output for meter power."""
192200 assert len (values ) == len (self ._meter_power_senders )
193201 for chan , value in zip (self ._meter_power_senders , values ):
194- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
202+ sample = self .make_sample (value )
195203 await chan .send (sample )
196204
197205 async def send_chp_power (self , values : list [float | None ]) -> None :
198206 """Send the given values as resampler output for CHP power."""
199207 assert len (values ) == len (self ._chp_power_senders )
200208 for chan , value in zip (self ._chp_power_senders , values ):
201- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
209+ sample = self .make_sample (value )
202210 await chan .send (sample )
203211
204212 async def send_pv_inverter_power (self , values : list [float | None ]) -> None :
205213 """Send the given values as resampler output for PV Inverter power."""
206214 assert len (values ) == len (self ._pv_inverter_power_senders )
207215 for chan , value in zip (self ._pv_inverter_power_senders , values ):
208- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
216+ sample = self .make_sample (value )
209217 await chan .send (sample )
210218
211219 async def send_meter_frequency (self , values : list [float | None ]) -> None :
212220 """Send the given values as resampler output for meter frequency."""
213221 assert len (values ) == len (self ._meter_frequency_senders )
214222 for sender , value in zip (self ._meter_frequency_senders , values ):
215- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
223+ sample = self .make_sample (value )
216224 await sender .send (sample )
217225
218226 async def send_bat_inverter_frequency (self , values : list [float | None ]) -> None :
219227 """Send the given values as resampler output for battery inverter frequency."""
220228 assert len (values ) == len (self ._bat_inverter_frequency_senders )
221229 for chan , value in zip (self ._bat_inverter_frequency_senders , values ):
222- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
230+ sample = self .make_sample (value )
223231 await chan .send (sample )
224232
225233 async def send_evc_power (self , values : list [float | None ]) -> None :
226234 """Send the given values as resampler output for EV Charger power."""
227235 assert len (values ) == len (self ._ev_power_senders )
228236 for chan , value in zip (self ._ev_power_senders , values ):
229- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
237+ sample = self .make_sample (value )
230238 await chan .send (sample )
231239
232240 async def send_bat_inverter_power (self , values : list [float | None ]) -> None :
233241 """Send the given values as resampler output for battery inverter power."""
234242 assert len (values ) == len (self ._bat_inverter_power_senders )
235243 for chan , value in zip (self ._bat_inverter_power_senders , values ):
236- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
244+ sample = self .make_sample (value )
237245 await chan .send (sample )
238246
239247 async def send_non_existing_component_value (self ) -> None :
240248 """Send a value for a non existing component."""
241- sample = Sample [ Quantity ]( self ._next_ts , None )
249+ sample = self .make_sample ( None )
242250 await self ._non_existing_component_sender .send (sample )
243251
244252 async def send_evc_current (self , values : list [list [float | None ]]) -> None :
@@ -247,7 +255,7 @@ async def send_evc_current(self, values: list[list[float | None]]) -> None:
247255 for chan , evc_values in zip (self ._ev_current_senders , values ):
248256 assert len (evc_values ) == 3 # 3 values for phases
249257 for phase , value in enumerate (evc_values ):
250- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
258+ sample = self .make_sample (value )
251259 await chan [phase ].send (sample )
252260
253261 async def send_bat_inverter_current (self , values : list [list [float | None ]]) -> None :
@@ -256,7 +264,7 @@ async def send_bat_inverter_current(self, values: list[list[float | None]]) -> N
256264 for chan , bat_values in zip (self ._bat_inverter_current_senders , values ):
257265 assert len (bat_values ) == 3 # 3 values for phases
258266 for phase , value in enumerate (bat_values ):
259- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
267+ sample = self .make_sample (value )
260268 await chan [phase ].send (sample )
261269
262270 async def send_meter_current (self , values : list [list [float | None ]]) -> None :
@@ -265,7 +273,7 @@ async def send_meter_current(self, values: list[list[float | None]]) -> None:
265273 for chan , meter_values in zip (self ._meter_current_senders , values ):
266274 assert len (meter_values ) == 3 # 3 values for phases
267275 for phase , value in enumerate (meter_values ):
268- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
276+ sample = self .make_sample (value )
269277 await chan [phase ].send (sample )
270278
271279 async def send_meter_voltage (self , values : list [list [float | None ]]) -> None :
@@ -274,5 +282,5 @@ async def send_meter_voltage(self, values: list[list[float | None]]) -> None:
274282 for chan , meter_values in zip (self ._meter_voltage_senders , values ):
275283 assert len (meter_values ) == 3 # 3 values for phases
276284 for phase , value in enumerate (meter_values ):
277- sample = Sample ( self ._next_ts , None if not value else Quantity (value ) )
285+ sample = self .make_sample (value )
278286 await chan [phase ].send (sample )
0 commit comments