Signal Data Model¶
The SHM backend organizes monitoring signal metadata into two parallel hierarchies: main signals and derived signals.
Main Signal Hierarchy¶
erDiagram
Signal ||--o{ SignalHistory : "has many"
Signal ||--o{ SignalCalibration : "has many"
Signal {
int id PK
string signal_name
int subassembly_id FK
string direction
}
SignalHistory {
int id PK
int signal_id FK
datetime time
string status
int sensor_serial_number
}
SignalCalibration {
int id PK
int signal_id FK
datetime time
float offset
float cwl
}
Derived Signal Hierarchy¶
erDiagram
DerivedSignal ||--o{ DerivedSignalHistory : "has many"
DerivedSignal ||--o{ DerivedSignalCalibration : "has many"
DerivedSignal }o--o{ Signal : "parent signals"
DerivedSignal {
int id PK
string signal_name
int subassembly_id FK
string source_name
}
DerivedSignalHistory {
int id PK
int derived_signal_id FK
datetime time
}
DerivedSignalCalibration {
int id PK
int derived_signal_id FK
datetime time
float yaw_offset
}
Processing Pipeline¶
Raw configuration events (JSON arrays) are transformed into typed records by the processing subpackage:
- Parse —
DelimitedSignalKeyParserextracts signal name and property from keys like"NRT_WTG_TP_STRAIN/status". - Accumulate —
ProcessedSignalRecordandProcessedDerivedSignalRecordcollect status, offset, CWL, and calibration rows. - Convert —
SignalProcessingResult.to_legacy_data()produces the archive-compatible dict shape consumed by the upload layer.
Upload Workflow¶
The signal upload orchestrator (ShmSignalUploader) follows this sequence:
- Create main signals — one per signal name, returns backend IDs.
- Create signal histories — status rows per signal.
- Create signal calibrations — offset/CWL rows per signal.
- Create derived signals — one per derived signal name.
- Create derived signal histories — with parent signal patches.
- Create derived signal calibrations — calibration rows per derived signal.
See the Process Signal Configs how-to guide for a step-by-step recipe.