Entity
A device/entity is the core unit in ODevice. It represents a physical or logical thing (pump, sensor, greenhouse) with named properties and stateless actions.
Purpose
Model one IoT thing with its data schema, current state, and operations. Entities map to "devices" in the UI.
Canonical model:
Entity
├─ Properties (state: Number, Boolean, Enum, String, Location)
└─ Actions (stateless operations: reset, calibrate, start, stop)Signature
python
Device(
id: str, # unique identifier, e.g. "pump-01"
name: str, # human-readable name, e.g. "Main Pump"
properties: dict, # { "pressure": Number(...), ... }
type: str | None, # optional type tag, defaults to slugified name
)Actions
python
pump.action("reset", label="Reset Pump", icon="reset", severity="danger", confirm="Sure?")
@pump.on_action("reset")
async def do_reset():
...Actions are buttons (no state, no value), sent via POST /actions.
Minimal example
python
from odevice import App, Device, Number
device = Device(id="d1", name="Sensor", properties={"temp": Number()})
app = App("Demo")
app.add(device)Complete example
python
pump = Device(
id="pump-01",
type="pump",
name="Main Pump",
properties={
"pressure": Number(unit="bar", min=0, max=10, view="gauge"),
"power": Boolean(writable=True),
},
)
pump.action("reset", label="Reset Pump")
app.add(pump)Constraints
idmust be unique within anApppropertieskeys must be valid identifierstypedefaults toname.lower().replace(" ", "-")
Common mistakes
- Reusing the same
idfor two devices → raisesValueError - Forgetting
app.add(device)→ device not exposed in manifest - Registering
on_actionbefore callingdevice.action()→ raisesValueError
Generated schema
json
{
"id": "pump-01",
"type": "pump",
"name": "Main Pump",
"properties": { "...": "..." },
"actions": [ { "id": "reset", "label": "Reset Pump", "severity": "normal" } ]
}