Purpose
EdgePERSensor defines the minimal OAII-conformant Sensor subclass required for edge-primary Personal Event Recognition (PER) for aging in place.
EdgePERSensor is designed to:
- bind a concrete sensing capability to an EdgePERDevice
- produce PERSignal instances suitable for Subject–Object and PrimaryUser interpretation
- support conservative operation under uncertain conditions
- expose policy-aware capture and summarization behaviors
EdgePERSensor is intentionally minimal and does not prescribe sensor technologies (PIR, mmWave, contact reed switch, camera, microphone, etc.).
Scope and Non-Goals
In Scope
- Sensor identity and binding to an EdgePERDevice
- Sensor type and observed domain
- Capture and summarization method contracts
- Calibration and health reporting hooks
- Minimal notification contract for observation and degradation
Out of Scope
- Vendor driver interfaces
- Full signal schemas for all modalities (handled by PERSignal spec)
- Cloud-based inference
- Medical/diagnostic inference
Role in the Open SGI MVM Pipeline
EdgePERSensor performs the first two stages of the single pipeline:
- Capture: Acquire raw readings and package them as a PERSignal (or a modality-specific subtype).
- Summarize: Produce a reduced representation suitable for local event recognition and privacy-preserving logging.
The sensor itself does not assert user identity or beneficial/detrimental evaluation.
Required Attributes
EdgePERSensor extends the OAII Sensor base attributes with MVM constraints.
Identity and Binding
sensor_id(stable unique identifier)world_ref(the PER Home World)device_ref(EdgePERDevice.device_id)sensor_type(enumerated; at minimum: motion or contact)
Observed Domain
observed_domain(domain descriptor)value_domain(what values can be emitted)
Governance
privacy_class(default LOCAL)access_class(default READ_WRITE)capture_policy_ref(Policy ref; optional override)redaction_policy_ref(Policy ref; optional override)
Runtime and Quality
sensor_state(INIT, READY, ACTIVE, DEGRADED, OFFLINE)health_state(OK, WARN, ERROR)calibration_state(CALIBRATED, NEEDS_CALIBRATION)last_capture_time(EpochMillis)
Notifications
EdgePERSensor emits sensor-level notifications that MAY be consumed by Agents.
All deliveries MUST be policy-mediated by the hosting EdgePERDevice and/or active Policies.
sensor.observation(new capture)sensor.state_changedsensor.health_changedsensor.calibration_changed
Methods
All methods use ParameterSet inputs and ResultSet outputs.
RegisterSensor(params) -> resultBindToDevice(params) -> resultConfigureSensor(params) -> resultCaptureSignal(params) -> result(returnssignal_id)SummarizeSignal(params) -> result(returns a summary payload)GetSensorStatus(params) -> resultCalibrate(params) -> result
ASN.1 Specification
Notes:
- This module is designed to be code-generatable.
- ParameterSet/ResultSet are repeated for MVM self-containment; implementations may import shared modules.
- Signal references are represented as UUIDs; the PERSignal object is defined in the next spec.
OpenSGI-PER-EdgeSensor-MVM DEFINITIONS AUTOMATIC TAGS ::= BEGIN
-- =======================================
-- Basic Scalar Types
-- =======================================
UUID ::= OCTET STRING (SIZE(16))
IA5Text ::= IA5String
EpochMillis ::= INTEGER (0..MAX)
VersionString ::= IA5String (SIZE(1..64))
-- =======================================
-- Common Types (MVM local definitions)
-- =======================================
PrivacyClass ::= ENUMERATED {
public(0),
local(1),
sensitive(2),
restricted(3)
}
AccessClass ::= ENUMERATED {
readOnly(0),
readWrite(1),
writeOnce(2)
}
StatusCode ::= ENUMERATED {
success(0),
partial(1),
fail(2)
}
ResultSet ::= SEQUENCE {
status StatusCode,
resultVersion VersionString,
errorCode IA5Text OPTIONAL,
errorDetail IA5Text OPTIONAL,
result OCTET STRING OPTIONAL
}
ParameterSet ::= SEQUENCE {
paramsVersion VersionString,
params OCTET STRING
}
WorldRef ::= SEQUENCE {
worldId UUID,
worldRole IA5Text OPTIONAL
}
PolicyRef ::= SEQUENCE {
policyId UUID,
policyType IA5Text OPTIONAL
}
-- =======================================
-- Domains
-- =======================================
DomainType ::= ENUMERATED {
discreteSet(0),
numericRange(1),
vector(2),
media(3),
other(255)
}
DiscreteValue ::= IA5Text
DiscreteSet ::= SEQUENCE {
values SEQUENCE (SIZE(1..MAX)) OF DiscreteValue
}
NumericRange ::= SEQUENCE {
minValue INTEGER,
maxValue INTEGER
}
ObservedDomain ::= SEQUENCE {
domainName IA5Text,
domainType DomainType,
domainSpec OCTET STRING OPTIONAL
}
ValueDomain ::= SEQUENCE {
domainType DomainType,
domainSpec OCTET STRING
}
-- =======================================
-- Sensor Types and State
-- =======================================
SensorType ::= ENUMERATED {
motion(0),
contact(1),
deviceHealth(2),
audio(3),
video(4),
other(255)
}
SensorState ::= ENUMERATED {
init(0),
ready(1),
active(2),
degraded(3),
offline(4)
}
HealthState ::= ENUMERATED {
ok(0),
warn(1),
error(2)
}
CalibrationState ::= ENUMERATED {
calibrated(0),
needsCalibration(1)
}
-- =======================================
-- EdgePERSensor Core Object
-- =======================================
EdgePERSensor ::= SEQUENCE {
sensorId UUID,
worldRef WorldRef,
deviceId UUID,
sensorType SensorType,
observedDomain ObservedDomain,
valueDomain ValueDomain,
privacyClass PrivacyClass,
accessClass AccessClass,
capturePolicyRef PolicyRef OPTIONAL,
redactionPolicyRef PolicyRef OPTIONAL,
sensorState SensorState,
healthState HealthState,
calibrationState CalibrationState,
lastCaptureTime EpochMillis OPTIONAL
}
-- =======================================
-- Sensor Notifications
-- =======================================
SensorNotificationType ::= ENUMERATED {
sensorObservation(0),
sensorStateChanged(1),
sensorHealthChanged(2),
sensorCalibrationChanged(3)
}
SensorNotification ::= SEQUENCE {
notificationId UUID,
notificationType SensorNotificationType,
sensorId UUID,
deviceId UUID,
worldId UUID,
timestamp EpochMillis,
governingPolicy PolicyRef OPTIONAL,
-- Opaque payload for extensibility; implementations may define a schema
payload OCTET STRING OPTIONAL
}
-- =======================================
-- Method Contracts (Operation Types)
-- =======================================
-- 1) RegisterSensor
RegisterSensorRequest ::= SEQUENCE {
sensorDescriptor EdgePERSensor,
params ParameterSet OPTIONAL
}
RegisterSensorResponse ::= SEQUENCE {
result ResultSet,
sensorId UUID OPTIONAL
}
-- 2) BindToDevice
BindToDeviceRequest ::= SEQUENCE {
sensorId UUID,
deviceId UUID,
params ParameterSet OPTIONAL
}
BindToDeviceResponse ::= SEQUENCE {
result ResultSet
}
-- 3) ConfigureSensor
ConfigureSensorRequest ::= SEQUENCE {
sensorId UUID,
params ParameterSet
}
ConfigureSensorResponse ::= SEQUENCE {
result ResultSet
}
-- 4) CaptureSignal
CaptureSignalRequest ::= SEQUENCE {
sensorId UUID,
-- capture parameters: windowing, debouncing, modality options
params ParameterSet OPTIONAL
}
CaptureSignalResponse ::= SEQUENCE {
result ResultSet,
-- reference to produced signal object (defined in PERSignal spec)
signalId UUID OPTIONAL,
-- optional quick metadata without revealing full payload
captureTime EpochMillis OPTIONAL
}
-- 5) SummarizeSignal
SummarizeSignalRequest ::= SEQUENCE {
sensorId UUID,
signalId UUID,
-- summarization parameters: redaction mode, aggregation window
params ParameterSet OPTIONAL
}
SummarizeSignalResponse ::= SEQUENCE {
result ResultSet,
-- summary payload (opaque) suitable for local event recognition and logging
summary OCTET STRING OPTIONAL
}
-- 6) GetSensorStatus
GetSensorStatusRequest ::= SEQUENCE {
sensorId UUID,
params ParameterSet OPTIONAL
}
GetSensorStatusResponse ::= SEQUENCE {
result ResultSet,
sensorStatus EdgePERSensor OPTIONAL
}
-- 7) Calibrate
CalibrateRequest ::= SEQUENCE {
sensorId UUID,
-- calibration parameters: baseline capture duration, thresholds
params ParameterSet OPTIONAL
}
CalibrateResponse ::= SEQUENCE {
result ResultSet,
calibrationState CalibrationState OPTIONAL
}
-- =======================================
-- Operation Union (Optional Convenience)
-- =======================================
EdgePERSensorOperation ::= CHOICE {
registerSensor RegisterSensorRequest,
bindToDevice BindToDeviceRequest,
configureSensor ConfigureSensorRequest,
captureSignal CaptureSignalRequest,
summarizeSignal SummarizeSignalRequest,
getSensorStatus GetSensorStatusRequest,
calibrate CalibrateRequest
}
EdgePERSensorOperationResult ::= CHOICE {
registerSensorResult RegisterSensorResponse,
bindToDeviceResult BindToDeviceResponse,
configureSensorResult ConfigureSensorResponse,
captureSignalResult CaptureSignalResponse,
summarizeSignalResult SummarizeSignalResponse,
getSensorStatusResult GetSensorStatusResponse,
calibrateResult CalibrateResponse
}
END
ParameterSet Payload Conventions
For compactness, ParameterSet.params and ResultSet.result are opaque octet strings.
For the MVM, implementations SHOULD adopt a stable serialization (CBOR or JSON). Recommended keys follow.
ConfigureSensorRequest.params
zoneId(text) — logical zone label (e.g.,ENTRY,HALLWAY)sensitivity(integer or float)debounceMs(integer)minEventGapMs(integer)enableSummaries(boolean)
CaptureSignalRequest.params
captureWindowMs(integer)maxPayloadBytes(integer)redactionMode(text)
SummarizeSignalRequest.params
summaryType(text) — e.g.,COUNT,BOOLEAN,FEATURESaggregationWindowMs(integer)redactionMode(text)
CalibrateRequest.params
baselineWindowMs(integer)expectedNoiseLevel(integer/float)autoThreshold(boolean)
Implementation Notes
- The MVM minimum is one sensor of type
motionorcontact. - A
deviceHealthsensor MAY be virtual. - For privacy, sensors SHOULD prefer summarized outputs for logging and event recognition, retaining raw payloads only as permitted by retention policy.
- The sensor never claims user identity; PrimaryUser interpretation is performed later by Events, Knowledge, Policies, and Agents.
Next Specification
Spec 3: PERSignal (Signal Subclass)
- defines the minimal signal object produced by EdgePERSensor
- standardizes temporal extent, value domains, and confidence
- supports modality-specific payload patterns while preserving edge privacy

Leave a comment