|
| 1 | +// License: MIT |
| 2 | +// Copyright © 2025 Frequenz Energy-as-a-Service GmbH |
| 3 | + |
| 4 | +use chrono::TimeDelta; |
| 5 | +use frequenz_microgrid::{ |
| 6 | + Error, LogicalMeterConfig, LogicalMeterHandle, Metric, MicrogridClientHandle, |
| 7 | +}; |
| 8 | + |
| 9 | +#[tokio::main] |
| 10 | +async fn main() -> Result<(), Error> { |
| 11 | + tracing_subscriber::fmt::fmt() |
| 12 | + .with_file(true) |
| 13 | + .with_line_number(true) |
| 14 | + .init(); |
| 15 | + |
| 16 | + let client = MicrogridClientHandle::new("http://[::1]:8800"); |
| 17 | + let mut logical_meter = LogicalMeterHandle::try_new( |
| 18 | + client, |
| 19 | + LogicalMeterConfig { |
| 20 | + resampling_interval: TimeDelta::try_seconds(1).unwrap(), |
| 21 | + }, |
| 22 | + ) |
| 23 | + .await?; |
| 24 | + |
| 25 | + // Create a formula that calculates `grid_power - battery_power`. |
| 26 | + let formula_grid = logical_meter.grid(Metric::AcActivePower)?; |
| 27 | + let formula_battery = logical_meter.battery(None, Metric::AcActivePower)?; |
| 28 | + let formula_consumer = logical_meter.consumer(Metric::AcActivePower)?; |
| 29 | + |
| 30 | + let formula = (logical_meter.grid(Metric::AcActivePower)? |
| 31 | + - logical_meter.battery(None, Metric::AcActivePower)? |
| 32 | + + logical_meter.consumer(Metric::AcActivePower)?)?; |
| 33 | + |
| 34 | + let mut rx = formula.subscribe().await?; |
| 35 | + let mut grid_rx = formula_grid.subscribe().await?; |
| 36 | + let mut battery_rx = formula_battery.subscribe().await?; |
| 37 | + let mut consumer_rx = formula_consumer.subscribe().await?; |
| 38 | + |
| 39 | + loop { |
| 40 | + let sample = rx.recv().await.unwrap(); |
| 41 | + let grid_sample = grid_rx.recv().await.unwrap(); |
| 42 | + let battery_sample = battery_rx.recv().await.unwrap(); |
| 43 | + let consumer_sample = consumer_rx.recv().await.unwrap(); |
| 44 | + tracing::info!( |
| 45 | + "grid({}) - battery({}) + consumer({}) = {}", |
| 46 | + grid_sample.value().unwrap(), |
| 47 | + battery_sample.value().unwrap(), |
| 48 | + consumer_sample.value().unwrap(), |
| 49 | + sample.value().unwrap() |
| 50 | + ); |
| 51 | + } |
| 52 | +} |
0 commit comments