pycsamt.iot.schemas#
Formal telemetry payload schemas.
Raw IoT payloads are free-form dictionaries, which is convenient but
fragile: the same quantity may arrive as battery_v, battery_voltage,
or voltage. These schemas define a canonical field set per packet
kind, absorb common key aliases, and validate ranges, so downstream
monitoring and provenance code can rely on stable keys.
Each schema is a light dataclass exposing:
from_mapping(payload)— tolerant parser that pulls known aliases into canonical fields and preserves anything else underextra.as_dict(drop_none=...)— flat, serialisable payload with canonical keys merged withextra.
Use validate_payload() / parse_payload() to route a payload
through the schema registered for a given PacketKind.
Module Attributes
Map each packet kind to its canonical payload schema. |
Functions
|
Parse payload into the schema registered for kind. |
|
Return the payload schema registered for kind. |
|
Return a canonicalised payload dictionary for kind. |
Classes
|
Metadata describing one raw acquisition record/window. |
|
Discrete field event (state change, alarm, operator note). |
|
Severity levels for event telemetry. |
|
Device-health telemetry (battery, temperature, link quality). |
|
Energy-budget telemetry for a field node. |
|
Edge quality-control telemetry for one acquisition window. |
|
Transmitter telemetry for a controlled-source (CSAMT/TDEM) survey. |
|
Clock-synchronisation telemetry for a field node. |
|
Base class for canonical telemetry payloads. |
- class pycsamt.iot.schemas.EventSeverity(*values)[source]#
-
Severity levels for event telemetry.
- INFO = 'info'#
- WARNING = 'warning'#
- ERROR = 'error'#
- CRITICAL = 'critical'#
- class pycsamt.iot.schemas.TelemetryPayload(kind=PacketKind.DATA, station=None, extra=<factory>)[source]#
Bases:
PyCSAMTObjectBase class for canonical telemetry payloads.
- Parameters:
kind (PacketKind)
station (str | None)
- kind: PacketKind = 'data'#
Canonical packet kind the schema describes. Overridden per subclass.
- class pycsamt.iot.schemas.HealthPayload(kind=PacketKind.HEALTH, station=None, extra=<factory>, battery_v=None, temperature_c=None, uptime_s=None, free_storage_mb=None, rssi_dbm=None, firmware=None)[source]#
Bases:
TelemetryPayloadDevice-health telemetry (battery, temperature, link quality).
- Parameters:
- kind: PacketKind = 'health'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.QCPayload(kind=PacketKind.QC, station=None, extra=<factory>, accepted=None, decision=None, snr_db=None, finite_coverage=None, spike_fraction=None, rms=None, method=None, channels=<factory>, frequency_band_hz=None, reasons=<factory>)[source]#
Bases:
TelemetryPayloadEdge quality-control telemetry for one acquisition window.
- Parameters:
- kind: PacketKind = 'qc'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.PowerPayload(kind=PacketKind.POWER, station=None, extra=<factory>, battery_v=None, state=None, runtime_days=None, net_wh_per_day=None, solar_w=None, load_w=None)[source]#
Bases:
TelemetryPayloadEnergy-budget telemetry for a field node.
- Parameters:
- kind: PacketKind = 'power'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.SourcePayload(kind=PacketKind.SOURCE, station=None, extra=<factory>, source_id=None, tx_current_a=None, tx_voltage_v=None, tx_frequency_hz=None, tx_power_w=None, dipole_length_m=None, duty_cycle=None, on=None, offset_m=None, azimuth_deg=None)[source]#
Bases:
TelemetryPayloadTransmitter telemetry for a controlled-source (CSAMT/TDEM) survey.
Reported by a transmitter node so the receiver-side QC and provenance know the state of the source that produced each sounding: the injected current and voltage, the frequency currently being transmitted, the grounded-dipole geometry, and the keyed on/off state.
- Parameters:
- kind: PacketKind = 'source'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.SyncPayload(kind=PacketKind.SYNC, station=None, extra=<factory>, offset_ms=None, drift_ppm=None, jitter_ms=None, gps_lock=None, n_reference_points=None, reference=None, tx_locked=None, tx_sync_offset_ms=None, tx_id=None)[source]#
Bases:
TelemetryPayloadClock-synchronisation telemetry for a field node.
- Parameters:
- kind: PacketKind = 'sync'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.EventPayload(kind=PacketKind.EVENT, station=None, extra=<factory>, event=None, severity=EventSeverity.INFO, message=None, code=None)[source]#
Bases:
TelemetryPayloadDiscrete field event (state change, alarm, operator note).
- Parameters:
kind (PacketKind)
station (str | None)
event (str | None)
severity (EventSeverity | str)
message (str | None)
code (str | None)
- kind: PacketKind = 'event'#
Canonical packet kind the schema describes. Overridden per subclass.
- severity: EventSeverity | str = 'info'#
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- class pycsamt.iot.schemas.AcquisitionPayload(kind=PacketKind.DATA, station=None, extra=<factory>, method=None, channels=<factory>, sample_rate_hz=None, frequency_hz=None, frequency_band_hz=None, n_samples=None, gain=None, duration_s=None)[source]#
Bases:
TelemetryPayloadMetadata describing one raw acquisition record/window.
- Parameters:
- kind: PacketKind = 'data'#
Canonical packet kind the schema describes. Overridden per subclass.
- validate()[source]#
Validate object state.
Subclasses can override this hook. The base implementation intentionally accepts all states.
- Return type:
None
- pycsamt.iot.schemas.PAYLOAD_SCHEMAS: dict[PacketKind, type[TelemetryPayload]] = {PacketKind.DATA: <class 'pycsamt.iot.schemas.AcquisitionPayload'>, PacketKind.EVENT: <class 'pycsamt.iot.schemas.EventPayload'>, PacketKind.HEALTH: <class 'pycsamt.iot.schemas.HealthPayload'>, PacketKind.POWER: <class 'pycsamt.iot.schemas.PowerPayload'>, PacketKind.QC: <class 'pycsamt.iot.schemas.QCPayload'>, PacketKind.SOURCE: <class 'pycsamt.iot.schemas.SourcePayload'>, PacketKind.SYNC: <class 'pycsamt.iot.schemas.SyncPayload'>}#
Map each packet kind to its canonical payload schema.
- pycsamt.iot.schemas.schema_for(kind)[source]#
Return the payload schema registered for kind.
- Parameters:
kind (PacketKind | str)
- Return type:
- pycsamt.iot.schemas.parse_payload(kind, payload)[source]#
Parse payload into the schema registered for kind.
- Parameters:
kind (PacketKind | str)
- Return type:
- pycsamt.iot.schemas.validate_payload(kind, payload, *, drop_none=True)[source]#
Return a canonicalised payload dictionary for kind.
Aliased keys are folded into canonical names and values are range checked. Unknown keys are preserved. Raises
ValueErrorwhen a field fails validation.