Sensor and measurement simulation with configurable noise injection for power system state estimation studies.
The measuring federate simulates sensor measurements in power distribution systems by adding realistic noise characteristics to perfect measurements. It provides:
- Additive noise injection (Gaussian)
- Multiplicative noise injection (percentage-based)
- Seeded random number generation for reproducibility
- Configurable noise parameters per measurement
This component is essential for testing state estimation algorithms and understanding the impact of measurement uncertainty on power system analysis.
- MeasurementRelay: Main federate class (measuring_federate.py)
- MeasurementConfig: Configuration model using Pydantic
- FastAPI Server: REST API wrapper (server.py)
- Test Config Generator: Utility for creating test configurations (generate_test_config.py)
- ✅ Additive Gaussian noise injection
- ✅ Multiplicative (percentage) noise
- ✅ Configurable noise standard deviations
- ✅ Seeded random generation for reproducibility
- ✅ Per-sensor configuration
- ✅ Real-time measurement relay
- ✅ HELICS co-simulation integration
Core dependencies:
helics>=3.4.0- HELICS co-simulation frameworknumpy- Numerical computing and random generationpandas- Data handlingpyarrow- Efficient data serializationpydantic- Configuration validationoedisi~=3.0- OEDISI framework typesfastapi- REST API frameworkuvicorn- ASGI serverrequests/grequests- HTTP client
See pyproject.toml for complete dependency list.
pip install -e Components/measuring_federatecd Components/measuring_federate
pip install -e .pip install -e ".[dev]"# Using the entry point
measuring-federate-server
# Or directly with Python
python server.pyThe server runs on port 5684 (configurable via PORT environment variable).
The MeasurementConfig model accepts:
name: Sensor identifiermeasurement_file: Path to the measurement mapping JSON fileadditive_noise_stddev: Standard deviation for additive noisemultiplicative_noise_stddev: Standard deviation for multiplicative noise (as fraction)run_freq_time_step: Frequency of simulation time steps (default: 1.0)
Example configuration:
from measuring_federate import MeasurementConfig
config = MeasurementConfig(
name="voltage_sensor_1",
measurement_file="sensors.json",
additive_noise_stddev=0.01, # ±0.01 units
multiplicative_noise_stddev=0.005, # ±0.5%
run_freq_time_step=1.0
)For a true measurement value x, the noisy measurement y is computed as:
y = x + ε_additive + x * ε_multiplicative
Where:
ε_additive ~ N(0, σ_add²)- Additive Gaussian noiseε_multiplicative ~ N(0, σ_mult²)- Multiplicative Gaussian noise
from measuring_federate import MeasurementRelay, MeasurementConfig
# Create configuration
config = MeasurementConfig(
name="sensor",
measurement_file="sensors.json",
additive_noise_stddev=0.02,
multiplicative_noise_stddev=0.01
)
# Create and run federate
relay = MeasurementRelay(broker_config)
relay.run()Run tests from the component directory:
pytestRun with coverage:
pytest --cov=measuring_federate --cov-report=htmlThe test suite includes:
- Health check endpoint tests
- Configuration model validation
- Noise reproducibility tests (seeded random generation)
TODO: Add comprehensive tests for:
- Noise injection with various parameters
- Statistical properties of generated noise
- Integration with HELICS subscriptions
- Multiple sensor scenarios
Format code:
black .
isort .Type checking:
mypy .## Docker
Build the Docker image:
```bash
docker build -t oedisi-measuring-federate .
Run the container:
docker run -p 5684:5684 -e PORT=5684 oedisi-measuring-federateBSD 3-Clause License - see LICENSE.md for details.