Skip to content

Commit 39ba005

Browse files
Remove producer and consumer from logical meter
The producer and consumer power formulas are now implemented in their own logical component classes. Signed-off-by: Daniel Zullo <[email protected]>
1 parent ba316cf commit 39ba005

File tree

2 files changed

+4
-188
lines changed

2 files changed

+4
-188
lines changed

src/frequenz/sdk/timeseries/logical_meter/_logical_meter.py

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,7 @@
1313
from .._quantities import Power, Quantity
1414
from ..formula_engine import FormulaEngine
1515
from ..formula_engine._formula_engine_pool import FormulaEnginePool
16-
from ..formula_engine._formula_generators import (
17-
CHPPowerFormula,
18-
ConsumerPowerFormula,
19-
ProducerPowerFormula,
20-
PVPowerFormula,
21-
)
16+
from ..formula_engine._formula_generators import CHPPowerFormula, PVPowerFormula
2217

2318

2419
class LogicalMeter:
@@ -50,9 +45,9 @@ class LogicalMeter:
5045
grid = microgrid.grid()
5146
5247
# Get a receiver for a builtin formula
53-
consumer_power_recv = logical_meter.consumer_power.new_receiver()
54-
async for consumer_power_sample in consumer_power_recv:
55-
print(consumer_power_sample)
48+
pv_power_recv = logical_meter.pv_power.new_receiver()
49+
async for pv_power_sample in pv_power_recv:
50+
print(pv_power_sample)
5651
5752
# or compose formulas to create a new formula
5853
net_power_recv = (
@@ -128,56 +123,6 @@ def start_formula(
128123
formula, component_metric_id, nones_are_zeros=nones_are_zeros
129124
)
130125

131-
@property
132-
def consumer_power(self) -> FormulaEngine[Power]:
133-
"""Fetch the consumer power for the microgrid.
134-
135-
Under normal circumstances this is expected to correspond to the gross
136-
consumption of the site excluding active parts and battery.
137-
138-
This formula produces values that are in the Passive Sign Convention (PSC).
139-
140-
If a formula engine to calculate consumer power is not already running, it will
141-
be started.
142-
143-
A receiver from the formula engine can be created using the `new_receiver`
144-
method.
145-
146-
Returns:
147-
A FormulaEngine that will calculate and stream consumer power.
148-
"""
149-
engine = self._formula_pool.from_power_formula_generator(
150-
"consumer_power",
151-
ConsumerPowerFormula,
152-
)
153-
assert isinstance(engine, FormulaEngine)
154-
return engine
155-
156-
@property
157-
def producer_power(self) -> FormulaEngine[Power]:
158-
"""Fetch the producer power for the microgrid.
159-
160-
Under normal circumstances this is expected to correspond to the production
161-
of the sites active parts excluding ev chargers and batteries.
162-
163-
This formula produces values that are in the Passive Sign Convention (PSC).
164-
165-
If a formula engine to calculate producer power is not already running, it will
166-
be started.
167-
168-
A receiver from the formula engine can be created using the `new_receiver`
169-
method.
170-
171-
Returns:
172-
A FormulaEngine that will calculate and stream producer power.
173-
"""
174-
engine = self._formula_pool.from_power_formula_generator(
175-
"producer_power",
176-
ProducerPowerFormula,
177-
)
178-
assert isinstance(engine, FormulaEngine)
179-
return engine
180-
181126
@property
182127
def pv_power(self) -> FormulaEngine[Power]:
183128
"""Fetch the PV power in the microgrid.

tests/timeseries/test_logical_meter.py

Lines changed: 0 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -75,132 +75,3 @@ async def test_pv_power_no_pv_components(self, mocker: MockerFixture) -> None:
7575

7676
await mockgrid.mock_resampler.send_non_existing_component_value()
7777
assert (await pv_power_receiver.receive()).value == Power.zero()
78-
79-
async def test_consumer_power_grid_meter(self, mocker: MockerFixture) -> None:
80-
"""Test the consumer power formula with a grid meter."""
81-
mockgrid = MockMicrogrid(grid_meter=True, mocker=mocker)
82-
mockgrid.add_batteries(2)
83-
mockgrid.add_solar_inverters(2)
84-
85-
async with mockgrid, AsyncExitStack() as stack:
86-
logical_meter = microgrid.logical_meter()
87-
stack.push_async_callback(logical_meter.stop)
88-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
89-
90-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
91-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
92-
6.0
93-
)
94-
95-
async def test_consumer_power_no_grid_meter(self, mocker: MockerFixture) -> None:
96-
"""Test the consumer power formula without a grid meter."""
97-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
98-
mockgrid.add_consumer_meters()
99-
mockgrid.add_batteries(2)
100-
mockgrid.add_solar_inverters(2)
101-
102-
async with mockgrid, AsyncExitStack() as stack:
103-
logical_meter = microgrid.logical_meter()
104-
stack.push_async_callback(logical_meter.stop)
105-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
106-
107-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0, 3.0, 4.0, 5.0])
108-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
109-
20.0
110-
)
111-
112-
async def test_consumer_power_no_grid_meter_no_consumer_meter(
113-
self, mocker: MockerFixture
114-
) -> None:
115-
"""Test the consumer power formula without a grid meter."""
116-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
117-
mockgrid.add_batteries(2)
118-
mockgrid.add_solar_inverters(2)
119-
120-
async with mockgrid, AsyncExitStack() as stack:
121-
logical_meter = microgrid.logical_meter()
122-
stack.push_async_callback(logical_meter.stop)
123-
consumer_power_receiver = logical_meter.consumer_power.new_receiver()
124-
125-
await mockgrid.mock_resampler.send_non_existing_component_value()
126-
assert (await consumer_power_receiver.receive()).value == Power.from_watts(
127-
0.0
128-
)
129-
130-
async def test_producer_power(self, mocker: MockerFixture) -> None:
131-
"""Test the producer power formula."""
132-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
133-
mockgrid.add_solar_inverters(2)
134-
mockgrid.add_chps(2)
135-
136-
async with mockgrid, AsyncExitStack() as stack:
137-
logical_meter = microgrid.logical_meter()
138-
stack.push_async_callback(logical_meter.stop)
139-
producer_power_receiver = logical_meter.producer_power.new_receiver()
140-
141-
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0, 4.0, 5.0])
142-
assert (await producer_power_receiver.receive()).value == Power.from_watts(
143-
14.0
144-
)
145-
146-
async def test_producer_power_no_chp(self, mocker: MockerFixture) -> None:
147-
"""Test the producer power formula without a chp."""
148-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
149-
mockgrid.add_solar_inverters(2)
150-
151-
async with mockgrid, AsyncExitStack() as stack:
152-
logical_meter = microgrid.logical_meter()
153-
stack.push_async_callback(logical_meter.stop)
154-
producer_power_receiver = logical_meter.producer_power.new_receiver()
155-
156-
await mockgrid.mock_resampler.send_meter_power([2.0, 3.0])
157-
assert (await producer_power_receiver.receive()).value == Power.from_watts(
158-
5.0
159-
)
160-
161-
async def test_producer_power_no_pv_no_consumer_meter(
162-
self, mocker: MockerFixture
163-
) -> None:
164-
"""Test the producer power formula without pv and without consumer meter."""
165-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
166-
mockgrid.add_chps(1, True)
167-
168-
async with mockgrid, AsyncExitStack() as stack:
169-
logical_meter = microgrid.logical_meter()
170-
stack.push_async_callback(logical_meter.stop)
171-
producer_power_receiver = logical_meter.producer_power.new_receiver()
172-
173-
await mockgrid.mock_resampler.send_chp_power([2.0])
174-
assert (await producer_power_receiver.receive()).value == Power.from_watts(
175-
2.0
176-
)
177-
178-
async def test_producer_power_no_pv(self, mocker: MockerFixture) -> None:
179-
"""Test the producer power formula without pv."""
180-
mockgrid = MockMicrogrid(grid_meter=False, mocker=mocker)
181-
mockgrid.add_consumer_meters()
182-
mockgrid.add_chps(1)
183-
184-
async with mockgrid, AsyncExitStack() as stack:
185-
logical_meter = microgrid.logical_meter()
186-
stack.push_async_callback(logical_meter.stop)
187-
producer_power_receiver = logical_meter.producer_power.new_receiver()
188-
189-
await mockgrid.mock_resampler.send_meter_power([20.0, 2.0])
190-
assert (await producer_power_receiver.receive()).value == Power.from_watts(
191-
2.0
192-
)
193-
194-
async def test_no_producer_power(self, mocker: MockerFixture) -> None:
195-
"""Test the producer power formula without producers."""
196-
async with MockMicrogrid(
197-
grid_meter=True, mocker=mocker
198-
) as mockgrid, AsyncExitStack() as stack:
199-
logical_meter = microgrid.logical_meter()
200-
stack.push_async_callback(logical_meter.stop)
201-
producer_power_receiver = logical_meter.producer_power.new_receiver()
202-
203-
await mockgrid.mock_resampler.send_non_existing_component_value()
204-
assert (await producer_power_receiver.receive()).value == Power.from_watts(
205-
0.0
206-
)

0 commit comments

Comments
 (0)