Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
856981e
Update resampler time at the start of resampling
shsms Aug 25, 2025
c4d4abb
Rename timer field to resampler_timer for clarity
shsms Aug 25, 2025
bb82ad5
Refactor resampling logic into a dedicated function
shsms Aug 25, 2025
196e222
Add `kind` method to `Error` for retrieving error kind
shsms Aug 25, 2025
e260df0
Refactor resampler cleanup
shsms Aug 25, 2025
fa24e91
Rename `do_next` to `evaluate_formulas`
shsms Aug 25, 2025
7b666b6
Add quantity module with support for various physical quantities
shsms Aug 25, 2025
98613ed
Add tests for the quantity types
shsms Sep 30, 2025
ab13386
Make `Sample` struct generic over value type
shsms Aug 25, 2025
aa2d311
Add QuantityType to Metric trait as an associated type
shsms Aug 25, 2025
112c200
Update Formula trait to support generic Quantity type
shsms Aug 25, 2025
0b61acb
Update LogicalMeterFormula to support generic Quantity type
shsms Aug 25, 2025
7201570
Update `evaluate_formulas` to support generic transformation
shsms Aug 25, 2025
fd57f5e
Add TypedFormulaResponseSender enum and TryFrom implementation
shsms Aug 25, 2025
9ce335f
Add `Formulas` struct to manage logical meter formulas
shsms Aug 25, 2025
cb25391
Change log level to debug for missing metric data in LogicalMeterActor
shsms Aug 25, 2025
082ee30
Refactor resampler initialization into a dedicated method
shsms Aug 25, 2025
af95e6e
Implement `Quantity` types in logical meter streams
shsms Aug 25, 2025
254f0bf
Remove invalid metric checks from formula operations
shsms Aug 25, 2025
a181981
Remove default generic type for `Formula` and `Sample`
shsms Aug 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 35 additions & 24 deletions src/logical_meter/logical_meter_actor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,39 @@ impl LogicalMeterActor {
}
}

async fn start_resamplers(
&mut self,
components: &HashSet<u64>,
metric: Metric,
resamplers: &mut HashMap<(u64, Metric), ComponentDataResampler>,
) -> Result<(), Error> {
for component_id in components {
let resampler_key = &(*component_id, metric);
if resamplers.contains_key(resampler_key) {
continue;
}
let resampler = ComponentDataResampler {
Comment thread
shsms marked this conversation as resolved.
component_id: *component_id,
metric,
resampler: frequenz_resampling::Resampler::new(
self.config.resampling_interval,
ResamplingFunction::Average,
3,
Utc::now()
.with_nanosecond(0)
.ok_or_else(|| Error::chrono_error("Failed to get current time."))?,
false,
),
receiver: self
.client
.receive_electrical_component_telemetry_stream(*component_id)
.await?,
};
resamplers.insert(*resampler_key, resampler);
}
Ok(())
}

/// Handles SubscribeFormula instructions.
///
/// If the formula already exists, it sends the existing receiver to the
Expand Down Expand Up @@ -372,30 +405,8 @@ impl LogicalMeterActor {
.map_err(|e| Error::formula_engine_error(format!("Failed to parse formula: {e}")))?;
let (sender, receiver) = broadcast::channel(8);

for component_id in formula_engine.components() {
let resampler_key = (*component_id, metric);
if resamplers.contains_key(&resampler_key) {
continue;
}
let resampler = ComponentDataResampler {
component_id: *component_id,
metric,
resampler: frequenz_resampling::Resampler::new(
self.config.resampling_interval,
ResamplingFunction::Average,
3,
Utc::now()
.with_nanosecond(0)
.ok_or_else(|| Error::chrono_error("Failed to get current time."))?,
false,
),
receiver: self
.client
.receive_electrical_component_telemetry_stream(*component_id)
.await?,
};
resamplers.insert(resampler_key, resampler);
}
self.start_resamplers(formula_engine.components(), metric, resamplers)
.await?;

formulas.insert(
formula_key,
Expand Down