Process Signal Configs¶
This guide shows how to parse raw JSON signal configuration events into typed records using the processing pipeline, optionally driven by a YAML spec.
Prerequisites¶
- JSON configuration files (one per turbine) containing arrays of events
- Optionally, a YAML processor spec for farm-specific parsing rules
Using the Default Processor¶
The built-in default processor handles the standard Norther wind farm format:
from owi.metadatabase.shm import DefaultSignalConfigProcessor
processor = DefaultSignalConfigProcessor(
path_configs="data/Norther/signal_configs/",
)
processor.signals_process_data()
# Processed data is now available
print(list(processor.signals_data.keys())) # turbine names
print(list(processor.signals_derived_data.keys()))
Using a Custom YAML Spec¶
For farms with non-standard signal naming:
from owi.metadatabase.shm import ConfiguredSignalConfigProcessor
processor = ConfiguredSignalConfigProcessor.from_yaml_spec(
path_configs="data/MyFarm/signal_configs/",
processor_spec_path="config/my_farm_processor.yaml",
)
processor.signals_process_data()
Processing a Single Event List¶
For programmatic use without file discovery:
from owi.metadatabase.shm import (
ConfiguredSignalConfigProcessor,
DelimitedSignalKeyParser,
SignalProcessorSpec,
)
spec = SignalProcessorSpec(
farm_name="Demo",
signal_key_parser=DelimitedSignalKeyParser(signal_prefixes=("WF_",)),
derived_signal_strategies={},
)
processor = ConfiguredSignalConfigProcessor(path_configs=".", processor_spec=spec)
result = processor.process_events([
{"time": "01/01/2023 00:00", "WF_SIG/status": "ok"},
{"time": "01/06/2023 00:00", "WF_SIG/status": "replaced"},
])
signals, derived_signals = result.to_legacy_data()
print(signals["WF_SIG"]["status"])
# [{'time': '01/01/2023 00:00', 'status': 'ok'},
# {'time': '01/06/2023 00:00', 'status': 'replaced'}]
YAML Spec Format¶
farm_name: "My Farm"
time_field: "time"
default_initial_time: "01/01/1972 00:00"
signal_key_parser:
kind: delimited
signal_prefixes:
- "NRT"
- "X/"
- "Y/"
- "Z/"
separator: "/"
derived_signal_strategies:
"acceleration/yaw_transformation":
kind: level_based
suffixes: ["_X", "_Y"]
parent_signals_builder: acceleration_parent_signals
calibration_fields_builder: yaw_calibration_fields
config_discovery:
kind: json_stem
suffix: ".json"
postprocessors:
- backfill_status
See the Signal Data Model explanation for details on how events map to the backend entity hierarchy.