Upload Orchestration¶
upload ¶
Upload subpackage for SHM signal and sensor upload orchestration.
Re-exports all public symbols so from owi.metadatabase.shm.upload import X
works unchanged.
Classes¶
ParentSignalLookupError ¶
Bases: ShmUploadError
Raised when a derived signal refers to unresolved parent signals.
Source code in .venv/lib/python3.14/site-packages/owi/metadatabase/_utils/exceptions.py
ShmUploadError ¶
UploadResultError ¶
Bases: ShmUploadError
Raised when a backend mutation result does not include the expected id.
Source code in .venv/lib/python3.14/site-packages/owi/metadatabase/_utils/exceptions.py
AssetSignalUploadRequest
dataclass
¶
AssetSignalUploadRequest(
projectsite,
assetlocation,
signals,
derived_signals=None,
permission_group_ids=None,
sensor_serial_numbers_by_signal=None,
temperature_compensation_signal_ids=None,
)
Input data for uploading one asset's SHM signals.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
projectsite
|
str
|
Parent SDK project site title. |
required |
assetlocation
|
str
|
Parent SDK asset location title. |
required |
signals
|
SignalConfigMap
|
Archive-compatible main signal data keyed by signal identifier. |
required |
derived_signals
|
SignalConfigMap | None
|
Archive-compatible derived signal data keyed by derived signal identifier. |
None
|
permission_group_ids
|
Sequence[int] | None
|
Visibility groups applied to created SHM objects. |
None
|
sensor_serial_numbers_by_signal
|
Mapping[str, int] | None
|
Optional map from signal identifier to the backend SHM sensor identifier stored on signal history rows. |
None
|
temperature_compensation_signal_ids
|
Mapping[str, int] | None
|
Optional map from legacy temperature-compensation sensor token to backend SHM signal id. |
None
|
Examples:
>>> request = AssetSignalUploadRequest(
... projectsite="Project A",
... assetlocation="Asset-01",
... signals={},
... )
>>> request.result_key
'Project A/Asset-01'
Attributes¶
Functions¶
from_processing_result
classmethod
¶
from_processing_result(
*,
projectsite,
assetlocation,
processing_result,
permission_group_ids=None,
sensor_serial_numbers_by_signal=None,
temperature_compensation_signal_ids=None,
)
Build an upload request from a processed signal-config result.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
projectsite
|
str
|
Parent SDK project site title. |
required |
assetlocation
|
str
|
Parent SDK asset location title. |
required |
processing_result
|
SignalProcessingResult
|
Processed signal and derived-signal records emitted by a processor. |
required |
permission_group_ids
|
Sequence[int] | None
|
Visibility groups applied to created SHM objects. |
None
|
sensor_serial_numbers_by_signal
|
Mapping[str, int] | None
|
Optional map from signal identifier to backend sensor serial number used for signal history rows. |
None
|
temperature_compensation_signal_ids
|
Mapping[str, int] | None
|
Optional map from legacy temperature-compensation sensor token to backend SHM signal id. |
None
|
Returns:
| Type | Description |
|---|---|
AssetSignalUploadRequest
|
Asset-scoped upload request that preserves the archive-compatible payload shape. |
Examples:
>>> from owi.metadatabase.shm.processing import ProcessedSignalRecord, SignalProcessingResult
>>> signal = ProcessedSignalRecord()
>>> signal.add_status("01/01/1972 00:00", "ok")
>>> request = AssetSignalUploadRequest.from_processing_result(
... projectsite="Project A",
... assetlocation="Asset-01",
... processing_result=SignalProcessingResult(signals={"SIG": signal}, derived_signals={}),
... )
>>> request.signals["SIG"]["status"][0]["status"]
'ok'
Source code in src/owi/metadatabase/shm/upload/models.py
AssetSignalUploadResult
dataclass
¶
AssetSignalUploadResult(
asset_key,
signal_ids_by_name,
derived_signal_ids_by_name,
results_main,
results_secondary,
results_derived_main,
results_derived_secondary,
)
Upload result for one asset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
asset_key
|
str
|
Stable asset-scoped result key in |
required |
signal_ids_by_name
|
Mapping[str, int]
|
Backend ids for created main signals keyed by signal identifier. |
required |
derived_signal_ids_by_name
|
Mapping[str, int]
|
Backend ids for created derived signals keyed by signal identifier. |
required |
results_main
|
Sequence[dict[str, Any]]
|
Raw backend responses for main signal creation calls. |
required |
results_secondary
|
Sequence[dict[str, Any]]
|
Raw backend responses for signal history and calibration calls. |
required |
results_derived_main
|
Sequence[dict[str, Any]]
|
Raw backend responses for derived signal creation calls. |
required |
results_derived_secondary
|
Sequence[dict[str, Any]]
|
Raw backend responses for derived history, parent patch, and calibration calls. |
required |
This
|
|
required | |
migrate
|
|
required |
DerivedSignalCalibrationPayload
dataclass
¶
DerivedSignalCalibrationPayload(
derived_signal_id,
calibration_date,
data,
status_approval="yes",
)
Payload model for derived signal calibration records.
DerivedSignalHistoryPayload
dataclass
¶
DerivedSignalHistoryPayload(
derived_signal_id,
activity_start_timestamp,
is_latest_status,
status,
status_approval="yes",
)
Payload model for derived signal history records.
DerivedSignalPayload
dataclass
¶
DerivedSignalPayload(
site,
model_definition,
asset_location,
sub_assembly,
signal_type,
derived_signal_id,
visibility_groups,
heading=None,
level=None,
orientation=None,
stats=None,
data_additional=None,
visibility="usergroup",
)
Payload model for derived signal records.
SensorCalibrationPayload
dataclass
¶
Payload model for sensor calibration records.
SensorPayload
dataclass
¶
SensorPayload(
sensor_type_id,
serial_number,
cabinet,
visibility="usergroup",
visibility_groups=None,
)
Payload model for sensor records.
SensorTypePayload
dataclass
¶
SensorTypePayload(
name,
type,
type_extended,
hardware_supplier,
file=None,
visibility="usergroup",
visibility_groups=None,
)
Payload model for sensor type records.
SignalCalibrationPayload
dataclass
¶
SignalCalibrationPayload(
signal_id,
calibration_date,
data,
tempcomp_signal_id=None,
status_approval="yes",
)
Payload model for signal calibration records.
SignalHistoryPayload
dataclass
¶
SignalHistoryPayload(
signal_id,
activity_start_timestamp,
is_latest_status,
status,
sensor_serial_number=None,
status_approval="yes",
legacy_signal_id=None,
)
Payload model for signal history records.
SignalPayload
dataclass
¶
SignalPayload(
site,
model_definition,
asset_location,
signal_type,
signal_id,
visibility_groups,
sub_assembly=None,
heading=None,
level=None,
orientation=None,
stats=None,
data_additional=None,
visibility="usergroup",
)
Payload model for signal records.
ShmSignalUploadClient ¶
Bases: Protocol
Protocol describing the SHM transport methods used by the uploader.
SignalConfigUploadSource ¶
Bases: Protocol
Protocol for processors that feed turbine-scoped upload data.
ShmSensorUploadClient ¶
ShmSensorUploader ¶
Upload sensor types, sensors, and sensor calibrations for SHM assets.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
shm_api
|
ShmSensorUploadClient
|
SHM transport client that satisfies :class: |
required |
Source code in src/owi/metadatabase/shm/upload/sensors.py
Functions¶
upload_sensor_types ¶
Upload sensor type records, optionally with image attachments.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sensor_types_data
|
Sequence[Mapping[str, Any]]
|
List of sensor type records (e.g. loaded from |
required |
permission_group_ids
|
Sequence[int] | None
|
Permission groups applied to every sensor type. |
required |
path_to_images
|
str | Path | None
|
Optional directory containing sensor type image files. |
None
|
Returns:
| Type | Description |
|---|---|
list[dict[str, Any]]
|
Raw backend responses for each created sensor type. |
Source code in src/owi/metadatabase/shm/upload/sensors.py
upload_sensors ¶
upload_sensors(
sensor_type_name,
sensor_type_params,
sensors_data,
permission_group_ids,
turbines=None,
)
Upload sensor records for a single sensor category across turbines.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sensor_type_name
|
str
|
Key identifying the sensor category within each turbine's data
(e.g. |
required |
sensor_type_params
|
Mapping[str, str]
|
Query parameters used to resolve the backend sensor type id
(e.g. |
required |
sensors_data
|
SensorsDataByTurbine
|
Per-turbine sensor data keyed by turbine identifier. Each turbine
has categories mapping to |
required |
permission_group_ids
|
Sequence[int] | None
|
Permission groups applied to every sensor. |
required |
turbines
|
Sequence[str] | None
|
Optional filter to upload only specific turbines. When None,
all turbines in |
None
|
Returns:
| Type | Description |
|---|---|
list[dict[str, Any]]
|
Raw backend responses for each created sensor. |
Source code in src/owi/metadatabase/shm/upload/sensors.py
upload_sensor_calibrations ¶
upload_sensor_calibrations(
signal_sensor_map_data,
signal_calibration_map_data,
path_to_datasheets,
turbines=None,
)
Upload sensor calibration records with optional PDF attachments.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
signal_sensor_map_data
|
Mapping[str, Mapping[str, Mapping[str, Any]]]
|
Per-turbine signal-to-sensor mapping (keyed by turbine, then signal
name, with sensor lookup params including |
required |
signal_calibration_map_data
|
Mapping[str, Mapping[str, Mapping[str, str]]]
|
Per-turbine calibration data (keyed by turbine, then signal name,
with |
required |
path_to_datasheets
|
str | Path
|
Directory containing calibration PDF files. |
required |
turbines
|
Sequence[str] | None
|
Optional turbine filter. When None, all turbines are processed. |
None
|
Returns:
| Type | Description |
|---|---|
list[dict[str, Any]]
|
Raw backend responses for each created calibration. |
Source code in src/owi/metadatabase/shm/upload/sensors.py
ShmSignalUploader ¶
Upload archive-compatible SHM signal data for arbitrary wind-farm assets.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
shm_api
|
ShmSignalUploadClient
|
SHM transport client, typically :class: |
required |
lookup_service
|
ParentSDKLookupService
|
Parent SDK lookup service used to resolve site, asset, and subassembly ids. |
required |
Source code in src/owi/metadatabase/shm/upload/signals.py
Functions¶
from_clients
classmethod
¶
Construct the uploader from SHM and parent SDK clients.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
shm_api
|
ShmSignalUploadClient
|
SHM transport client used for backend mutations. |
required |
locations_client
|
ParentLocationsLookupClient
|
Parent SDK client that resolves project and asset locations. |
required |
geometry_client
|
ParentGeometryLookupClient
|
Parent SDK client that resolves subassemblies and model definitions. |
required |
Returns:
| Type | Description |
|---|---|
ShmSignalUploader
|
Uploader wired to the canonical SHM lookup service. |
Source code in src/owi/metadatabase/shm/upload/signals.py
upload_asset ¶
Upload main and secondary SHM records for one asset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
request
|
AssetSignalUploadRequest
|
Asset-scoped upload request containing the archive-compatible main and derived signal mappings. |
required |
Returns:
| Type | Description |
|---|---|
AssetSignalUploadResult
|
Created backend ids plus raw backend responses grouped by upload phase. |
Source code in src/owi/metadatabase/shm/upload/signals.py
upload_assets ¶
Upload SHM signal data for multiple assets.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
requests
|
Sequence[AssetSignalUploadRequest]
|
Asset-scoped upload requests to execute in order. |
required |
Returns:
| Type | Description |
|---|---|
dict[str, AssetSignalUploadResult]
|
Upload results keyed by each request's stable result key. |
Source code in src/owi/metadatabase/shm/upload/signals.py
upload_turbines ¶
upload_turbines(
*,
projectsite,
signals_by_turbine,
derived_signals_by_turbine=None,
assetlocations_by_turbine=None,
permission_group_ids=None,
sensor_serial_numbers_by_turbine=None,
temperature_compensation_signal_ids_by_turbine=None,
)
Upload SHM signal data for multiple turbine-scoped config bundles.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
projectsite
|
str
|
Parent SDK project site title shared by the turbine batch. |
required |
signals_by_turbine
|
SignalConfigMapByTurbine
|
Main signal mappings keyed by turbine identifier. |
required |
derived_signals_by_turbine
|
SignalConfigMapByTurbine | None
|
Optional derived signal mappings keyed by turbine identifier. |
None
|
assetlocations_by_turbine
|
Mapping[str, str] | None
|
Optional turbine-to-asset-location override mapping. |
None
|
permission_group_ids
|
Sequence[int] | None
|
Visibility groups applied to created SHM objects. |
None
|
sensor_serial_numbers_by_turbine
|
Mapping[str, Mapping[str, int]] | None
|
Optional per-turbine mapping of signal identifiers to sensor serial numbers used for signal history rows. |
None
|
temperature_compensation_signal_ids_by_turbine
|
Mapping[str, Mapping[str, int]] | None
|
Optional per-turbine mapping of temperature-compensation tokens to backend SHM signal ids. |
None
|
Returns:
| Type | Description |
|---|---|
dict[str, AssetSignalUploadResult]
|
Upload results keyed by turbine identifier. |
This keeps the response keyed by turbine while parent lookups use the
|
|
corresponding asset-location title.
|
|
Source code in src/owi/metadatabase/shm/upload/signals.py
upload_from_processor ¶
upload_from_processor(
*,
projectsite,
processor,
assetlocations_by_turbine=None,
permission_group_ids=None,
sensor_serial_numbers_by_turbine=None,
temperature_compensation_signal_ids_by_turbine=None,
)
Process turbine configs and upload them through the generic SHM seam.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
projectsite
|
str
|
Parent SDK project site title shared by the processor output. |
required |
processor
|
SignalConfigUploadSource
|
Processor instance that populates |
required |
assetlocations_by_turbine
|
Mapping[str, str] | None
|
Optional turbine-to-asset-location override mapping. |
None
|
permission_group_ids
|
Sequence[int] | None
|
Visibility groups applied to created SHM objects. |
None
|
sensor_serial_numbers_by_turbine
|
Mapping[str, Mapping[str, int]] | None
|
Optional per-turbine mapping of signal identifiers to sensor serial numbers used for signal history rows. |
None
|
temperature_compensation_signal_ids_by_turbine
|
Mapping[str, Mapping[str, int]] | None
|
Optional per-turbine mapping of temperature-compensation tokens to backend SHM signal ids. |
None
|
Returns:
| Type | Description |
|---|---|
dict[str, AssetSignalUploadResult]
|
Upload results keyed by turbine identifier. |
Source code in src/owi/metadatabase/shm/upload/signals.py
upload_from_processor_files ¶
upload_from_processor_files(
*,
projectsite,
processor,
path_signal_sensor_map=None,
path_sensor_tc_map=None,
assetlocations_by_turbine=None,
permission_group_ids=None,
)
Process configs, resolve optional file maps, and upload by turbine.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
projectsite
|
str
|
Parent SDK project site title shared by the batch. |
required |
processor
|
SignalConfigUploadSource
|
Processor that populates turbine-scoped signal mappings. |
required |
path_signal_sensor_map
|
str | Path | None
|
Optional JSON file keyed by turbine and signal id with SHM sensor
lookup parameters. When |
None
|
path_sensor_tc_map
|
str | Path | None
|
Optional JSON file keyed by turbine with temperature-
compensation signal identifiers to resolve through
|
None
|
assetlocations_by_turbine
|
Mapping[str, str] | None
|
Optional turbine-to-asset-location override mapping. |
None
|
permission_group_ids
|
Sequence[int] | None
|
Visibility groups applied to created SHM objects. |
None
|
Returns:
| Type | Description |
|---|---|
dict[str, AssetSignalUploadResult]
|
Upload results keyed by turbine identifier. |
Examples:
>>> from unittest.mock import Mock
>>> uploader = ShmSignalUploader(shm_api=Mock(), lookup_service=Mock())
>>> processor = Mock()
>>> processor.signals_data = {}
>>> processor.signals_derived_data = {}
>>> uploader.upload_from_processor_files(projectsite="Project A", processor=processor)
{}
Source code in src/owi/metadatabase/shm/upload/signals.py
Functions¶
build_derived_signal_calibration_payloads ¶
Build derived-signal calibration payloads from archive-style data.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_derived_signal_main_payload ¶
Build the main derived-signal payload from archive-style data.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_derived_signal_parent_patch ¶
Build the parent-signals patch payload for derived signal status rows.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_derived_signal_status_payload ¶
Build the derived-signal status payload used before parent patching.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_sensor_calibration_payloads ¶
Build sensor calibration payload models for one turbine.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_sensor_payloads ¶
build_sensor_payloads(
sensor_type_id,
serial_numbers,
cabinets,
visibility_groups,
visibility="usergroup",
)
Build sensor payload models from parallel columns.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_sensor_type_payloads ¶
build_sensor_type_payloads(
sensor_types_data,
visibility_groups,
path_to_images=None,
visibility="usergroup",
)
Build sensor type payload models from raw records.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_signal_calibration_payloads ¶
Build signal calibration payloads from archive-style offset and CWL data.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_signal_main_payload ¶
Build the main signal payload from archive-style signal data.
Source code in src/owi/metadatabase/shm/upload/payloads.py
build_signal_status_payloads ¶
Build signal status payloads from archive-style status rows.