opensemantic.base
Python models and controllers for the world.opensemantic.base page package.
Builds on oold-python (BaseController, LinkedBaseModel, cast(), _types registry) and opensemantic (OswBaseModel, compute_scoped_uuid).
Overview
- Auto-generated Pydantic models (v1 and v2): Database, WebService, DataTool, DataChannel, Person, Organization, etc.
- DataToolController - generic controller for any DataTool
- TimeSeriesDatabaseController - SQLite and PostgREST backends for time series storage
Architecture
opensemantic.base/
_model.py # auto-generated v2 Pydantic models (DO NOT EDIT)
_controller_mixin.py # DataToolMixin, TimeSeriesDatabaseController mixins
_controller.py # v2 controllers
__init__.py # re-exports model + controller classes
v1/ # same structure for Pydantic v1
DataToolController
Extends DataTool with channel management, subdevice traversal, and data archiving.
from opensemantic.base import DataToolController
tool = DataToolController(
name="sensor",
label=[...],
data_channels=[ch1, ch2],
storage_locations=[db],
auto_archive=True, # auto-creates archive DB from storage_locations[0]
)
tool.get_all_channels() # recursive across subdevices
tool.get_channel_owner(ch) # find which device owns a channel
tool.to_json() # only model fields (controller fields stripped)
Auto-archive from storage_locations
When auto_archive=True and no explicit archive_database is set, the controller auto-creates a LocalTimeSeriesDatabaseController from the first storage_locations entry (resolved via oold backend).
Typed read/write
Channels with a characteristic IRI enable typed serialization:
# Write: converts to base unit, strips defaults for compact storage
await tool.store_typed_data(DataToolMixin.StoreTypedDataParams(
tool_osw_id=tool.get_osw_id(),
rows=[DataToolMixin.TypedDataRow(ts=now, channel=ch, value=Temperature(value=300.0))],
))
# Read: resolves characteristic class via oold's _types registry
results = await tool.read_typed_data(DataToolMixin.ReadTypedDataParams(
tool_osw_id=tool.get_osw_id(), channel=ch,
))
# results[0] is a Temperature instance with defaults restored
Subobject ID auto-computation
Inline subobject osw_id fields are auto-prefixed with the parent's osw_id:
Parent: OSW<parent_uuid>
Channel: OSW<parent_uuid>#OSW<channel_uuid>
Fields with range in json_schema_extra are references to separate entities and are not prefixed.
Unloaded characteristic warning
On init, DataToolController checks if channel characteristic IRIs are present in oold's _types registry. Missing entries produce a warning with guidance to import the corresponding package.
TimeSeriesDatabaseController
Abstract base for time series storage, with SQLite and PostgREST implementations.
from opensemantic.base import LocalTimeSeriesDatabaseController
db = LocalTimeSeriesDatabaseController(name="archive", label=[...], db_path="./data.sqlite")
await db.create_tool(params)
await db.write_tool_channel_raw(params)
await db.read_tool_channel_raw(params)
DataToolView (Dashboard UI)
Interactive dashboard for visualizing archived time series data from DataToolControllers.
Features:
- Wunderbaum TreeGrid for channel selection with characteristic metadata
- Stacked Bokeh plots grouped by characteristic (temperature, pressure, etc.)
- Unit conversion via dropdown (e.g. K to C, Pa to hPa)
- Composite channel splitting (e.g. AirQuality into temperature + pressure sub-plots)
- Text channel log console with timestamped entries
- Configurable via JsonEditor (grouping, auto-fetch, row limit, cache)
Interactive demo: channel selection, plotting, unit switching
Channel selection with stacked plots grouped by characteristic
Unit conversion via dropdown (K to C)
Text channel log console with timestamped entries
from opensemantic.base.view import DataToolView
from opensemantic.base.view._config import DashboardConfig, PlotConfig
view = DataToolView(
controllers=[ctrl],
config=DashboardConfig(lang="en", plot=PlotConfig(auto_fetch=True)),
title="My Dashboard",
)
view.servable() # for panel serve
See examples/datatool_dashboard.py for a full working example.
To regenerate the screenshots after UI changes, see docs/generate_screenshots.py.
Installation
pip install opensemantic.base # models only
pip install opensemantic.base[controller] # + aiosqlite, postgrest
pip install opensemantic.base[view] # + panel, bokeh, panelini, pint
Testing
pytest tests/test_controller.py
PostgREST integration tests require a running pgstack instance. To enable them:
- Start pgstack:
docker compose -f docker-compose.yml -f docker-compose.example-tsdb.override.yml up -d - Copy
tests/.env.exampletotests/.envand fill inTEST_PGRST_URLandTEST_PGRST_JWT_SECRET - Run tests - PostgREST tests are skipped unless both env vars are set
Metadata
Release files for opensemantic.base 0.42.8.post1000002004000
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| opensemantic_base-0.42.8.post1000002004000.tar.gz | 5.0 MB | Without provenance | Details for opensemantic_base-0.42.8.post1000002004000.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| opensemantic_base-0.42.8.post1000002004000-py3-none-any.whl | Python 3 | none | any | Details for opensemantic_base-0.42.8.post1000002004000-py3-none-any.whl |
Total release size: 5.2 MB
Release files / opensemantic_base-0.42.8.post1000002004000.tar.gz
| Download URL | opensemantic_base-0.42.8.post1000002004000.tar.gz |
|---|---|
| Size | 5.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c0b5575e94ce96e78a4f09440a23bec27cce2ffc194f97a1ba95cff11072f497
|
|
BLAKE2b-256 checksum How to use checksums |
92951f13c6192d0beec84678ae771198c6b36d3d680df8a0b51b83cb51fb47eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / opensemantic_base-0.42.8.post1000002004000-py3-none-any.whl
| Download URL | opensemantic_base-0.42.8.post1000002004000-py3-none-any.whl |
|---|---|
| Size | 134.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a1403e7166c7773157a869d0bc736980fee11b0ea950ccfbc91822fd34ebf367
|
|
BLAKE2b-256 checksum How to use checksums |
74cd710a09ecca607a9bee87764b372510f54876361b84899351a914ad515afa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for opensemantic.base 0.42.8.post1000002004000
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.