/thing-description` by the server,
+ and the `ClientFactory` subsribes to the `Thing Description` and constructs the `ObjectProxy`.
-!!! Note
-
- Only one protocol is allowed per client.
+ MQTT currently supports only events and properties that publish change events.
### read and write properties
@@ -108,10 +113,7 @@ One can also use `invoke_action` to invoke an action by name
### oneway scheduling
-`oneway` scheduling do not fetch return value and exceptions that might occur while executing a property or an action.
-The server schedules the operation and returns an empty response to the client, allowing it to process further logic.
-It is possible to set a property, set multiple or all properties or invoke an action in
-oneway. Other operations are not supported.
+`oneway` scheduling do not fetch return value and exceptions that might occur while executing a property or an action. The server schedules the operation and returns an empty response to the client, allowing it to process further logic. It is possible to set a property, set multiple or all properties or invoke an action in oneway. Other operations are not supported.
```py title="oneway=True" linenums="1"
--8<-- "docs/beginners-guide/code/object_proxy/sync.py:79:103"
@@ -119,12 +121,11 @@ oneway. Other operations are not supported.
Simply provide the keyword argument `oneway=True` to the operation method.
-Importantly, one cannot have an action argument or a property on the server named `oneway` as it is a
-reserved keyword argument to such methods on the client. At least they become inaccessible on the `ObjectProxy`.
+`oneway` must be always specified as a keyword argument. Due to this reason, one cannot have an action argument or a property on the server named `oneway` as it is a reserved keyword argument to such methods on the client. At least they become inaccessible on the `ObjectProxy`.
### no-block scheduling
-`noblock` allows scheduling a property or action but collecting the reply later:
+`noblock` allows scheduling a property or action and collecting the reply later:
```py title="noblock=True" linenums="1"
--8<-- "docs/beginners-guide/code/object_proxy/sync.py:107:139"
@@ -156,7 +157,7 @@ Simply prefix `async_` to the method name, like `async_read_property`, `async_wr
There is no support for dot operator based access for asyncio. One may also note that `async` operations
do not change the nature of the execution on the server side.
`asyncio` on `ObjectProxy` is purely a client-side non-blocking network call, so that one can
-simultaneously perform other async operations while the client is waiting for the network operation to complete.
+simultaneously perform other async operations while the client is waiting for said network operation to complete.
!!! Note
@@ -214,15 +215,14 @@ Once again, to customize callback scheduling, see [events section](./events.md#s
##### foreign attributes on client
-Normally, there cannot be user defined attributes on the `ObjectProxy` as the attributes on the client
-must mimic the available properties, actions and events on the server. An accidental setting of an unknown
-property must raise an `AttributeError` when not found on the server, instead of silently going through and setting
-said property on the client object itself:
+Normally, there cannot be user defined attributes on the `ObjectProxy` as the attributes on the client must mimic the available properties, actions and events on the server. An accidental setting of an unknown property must raise an `AttributeError`, when not found on the server, instead of silently setting said property on the client itself:
```py title="foreign attributes raise AttributeError" linenums="1"
--8<-- "docs/beginners-guide/code/object_proxy/customizations.py:3:7"
```
+The requirement for this behaviour is due to python's duck typing. If one intends to set a property named `foo`, and instead types it as `fooo` (misspelt), it is better to raise an error instead of silently setting a new attribute `fooo` on the client.
+
One can overcome this by setting `allow_foreign_attributes` to `True`:
```py title="foreign attributes allowed" linenums="1"
@@ -236,15 +236,13 @@ For invoking any operation (say property read/write & action call), two types of
- `invokation_timeout` - the amount of time the server has to wait for an operation to be scheduled
- `execution_timeout` - the amount of time the server has to complete the operation once scheduled
-When the `invokation_timeout` expires, the operation is guaranteed to be never scheduled. When the `execution_timeout` expires, the operation is scheduled but returns without the expected response. In both cases, a `TimeoutError` is raised on the client side specifying the timeout type. If an operation is scheduled but not completed within the `execution_timeout`, the server may still complete the operation and there can be unknown side effects or client does not know about it.
+When the `invokation_timeout` expires, the operation is guaranteed to be never executed. When the `execution_timeout` expires, the operation is scheduled but returns without the expected response. In both cases, a `TimeoutError` is raised on the client specifying the timeout type. If an operation is scheduled but not completed within the `execution_timeout`, the server may still complete the operation but client does not know about it.
```py title="timeout specification" linenums="1"
--8<-- "docs/beginners-guide/code/object_proxy/customizations.py:29:36"
```
-!!! Note
-
- Currently only a global specification is supported. In future, one may be able to specify timeouts per operation.
+> Currently only a global customization of these values are supported. In future, one may be able to specify timeouts per operation.
#### Remote Access to Logger
diff --git a/docs/index.md b/docs/index.md
index 3314abd..c22fc20 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -5,7 +5,7 @@ description: hololinked introduces SCADA & IoT systems to beginners
# hololinked - Pythonic Object-Oriented Supervisory Control & Data Acquisition / Internet of Things
-`hololinked` is a beginner-friendly pythonic suited for instrumentation control and data acquisition over network (IoT & SCADA).
+`hololinked` is a beginner-friendly, extensible pythonic tool suited for instrumentation control and data acquisition over network (IoT & SCADA).
As a novice, you have a requirement to control and capture data from your hardware, say in your electronics or science lab, and you want to show the data in a dashboard, provide a PyQt GUI or run automated scripts, `hololinked` can help. Even for isolated desktop applications or a small setup without networking, one can still separate the concerns of the tools that interact with the hardware & the hardware itself.
@@ -67,7 +67,7 @@ Each device, or **Thing**, is modeled in software with:
- **Actions**: Methods that command the hardware to perform operations.
- _Oscilloscope_ - connect/disconnect hardware
- - _Camera_ - start/stop measurement or video capture
+ - _Camera_ - snap image or start/stop video capture
- _DC Power Supply_ - execute control routines (e.g., closed-loop control)
- **Events**: Asynchronous messages or data streams to clients (e.g., alarms, measured values)
@@ -82,7 +82,9 @@ This separation is independent of:
- data serialization or binary representation (JSON, MessagePack, Pickle etc.)
- security or access control mechanisms (JWT, Basic Auth, OAuth etc.)
-The `Thing` object represents the physical device and is modeled as a class, encapsulating its properties, actions, and events as its attributes & methods. Additionally, **state machines** can constrain property and action execution:
+The `Thing` object (as in OOP) represents the physical device and is modeled as a class, encapsulating its properties, actions, and events as its attributes & methods.
+
+Additionally, **state machines** can constrain property and action execution:
- _Oscilloscope_ - Cannot start a new measurement while one is ongoing
- _Camera_ - Cannot change exposure time while capturing video
@@ -90,4 +92,5 @@ The `Thing` object represents the physical device and is modeled as a class, enc
---
> **Ready to get started?**
-> See the [Handbook](beginners-guide/articles/servers) section for concepts and code example and the [Examples Repository](https://github.com/hololinked-dev/examples) section for hardware-specific implementations.
+> See the [Handbook](beginners-guide/articles/servers) section for concepts and code example and the [Examples Repository](https://github.com/hololinked-dev/examples) section for hardware-specific implementations. There are some online (live) examples available listed on the [project website](https://hololinked.dev).
+
diff --git a/docs/introduction/contributing.md b/docs/introduction/contributing.md
index 97c08ed..1dde945 100644
--- a/docs/introduction/contributing.md
+++ b/docs/introduction/contributing.md
@@ -37,27 +37,28 @@ One can setup a development environment with [uv](https://docs.astral.sh/uv/) as
1. Install uv if you don't have it already: [uv docs](https://docs.astral.sh/uv/getting-started/installation/)
2. Create and activate a virtual environment:
-
```bash
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
```
3. Install the package in development mode with all dependencies:
-
```bash
-uv pip install -e .
+uv sync
+# or
+uv sync --no-install-project
uv pip install -e ".[dev,test]"
```
## Running Tests
To run unit and integration tests:
-
```bash
pytest -s -v tests
```
+You might need docker daemon for running some tests (currently `test_16_protocols_mqtt`).
+
## Pre-commit Hooks
You can use pre-commit hooks to ensure code quality before committing changes, and be ensured that certain pipeline checks will pass.
@@ -68,7 +69,7 @@ pre-commit install
pre-commit run --all-files
```
-Currently ruff, bandit and gitleaks are configured to run as pre-commit hooks.
+Currently `ruff`, `bandit` and `gitleaks` are configured to run as pre-commit hooks.
Precommit hooks are optional. To skip them, use:
diff --git a/docs/introduction/installation.md b/docs/introduction/installation.md
index 9d2e6c9..c21444a 100644
--- a/docs/introduction/installation.md
+++ b/docs/introduction/installation.md
@@ -24,7 +24,7 @@ pip install -e .
With `uv`:
```sh
-git clone https://github.com/hololinked-dev/hololinked.git
+git clone --no-recurse-submodules https://github.com/hololinked-dev/hololinked.git
cd hololinked
uv venv
source .venv/bin/activate # for Linux/Mac
diff --git a/docs/introduction/resources.md b/docs/introduction/resources.md
index f8894c0..5217cf5 100644
--- a/docs/introduction/resources.md
+++ b/docs/introduction/resources.md
@@ -7,7 +7,7 @@ Check out:
| Repository | URL | Description |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| examples | [GitHub](https://github.com/hololinked-dev/examples.git) | repository containing example code discussed in this documentation |
-| control panel | [Website](https://control-panel.hololinked.dev) [GitHub](https://github.com/hololinked-dev/thing-control-panel.git) | GUI to view your devices' properties, actions, and events |
-| Infrastructure Components | [GitHub](https://github.com/hololinked-dev/daq-system-infrastructure.git) | Databases, MQTT broker (Identity System in the future), based on docker |
+| control panel | [Website](https://control-panel.hololinked.dev) [GitHub](https://github.com/hololinked-dev/thing-control-panel.git) | GUI to view and interact with your devices' properties, actions, and events |
+| Infrastructure Components | [GitHub](https://github.com/hololinked-dev/daq-system-infrastructure.git) | Databases, MQTT broker, Identity System (Keycloak), based on docker |
| Eclipse ThingWeb | [GitHub](https://github.com/eclipse-thingweb/node-wot) | javascript implementation of the W3C Web of Things (WoT) standard, for example, to use as HTTP clients |
| TD Editor | [Website](https://eclipse.github.io/editdor/) [GitHub](https://github.com/eclipse/editdor) | GUI to create and edit Thing Descriptions (TD) |
diff --git a/docs/introduction/use-cases.md b/docs/introduction/use-cases.md
index 5fbff0f..a45ecec 100644
--- a/docs/introduction/use-cases.md
+++ b/docs/introduction/use-cases.md
@@ -9,22 +9,11 @@
| HTTP |
Web Apps |
-
- readproperty,
- writeproperty,
- observeproperty,
- unobserveproperty,
- invokeaction,
- subscribeevent,
- unsubscribeevent,
- readmultipleproperties,
- writemultipleproperties,
- readallproperties,
- writeallproperties
- properties and actions can be operated in a oneway and no-block manner (issue and query later format) as well
+ |
+ Properties, Actions, Events
|
- [tornado]()
+ tornado
|
username-password,
@@ -36,19 +25,17 @@
|
| ZMQ TCP |
Networked Control Systems, subnet protected containerized apps like in Kubernetes |
- [pyzmq]() |
-
- username-password planned,
- device API key planned
+ |
+ Properties, Actions, Events
+ |
+ pyzmq |
+
+ planned, likely may take upto end of 2026, please use HTTP if needed. Its not slow.
|
| ZMQ IPC |
Desktop Applications, Python Dashboards without exposing device API directly on network |
-
- username-password planned,
- device API key planned
- |
| ZMQ INPROC |
@@ -62,18 +49,15 @@
| MQTT |
- Reliable pub-sub & incorporating into existing systems that use MQTT for lightweight messaging
+ Reliable pub-sub & incorporating into existing systems that use MQTT for lightweight messaging
|
-
- observeproperty,
- unobserveproperty,
- subscribeevent,
- unsubscribeevent
+ |
+ Properties that emit change events, plain Events
|
- [aiomqtt]()
+ aiomqtt/Eclipse Paho
|
-
+ |
username-password,
TLS with client certificates (you set this up in the broker anyway)
|
@@ -81,17 +65,7 @@
| MQTT with websockets |
- Reliable pub-sub for web applications, planned for March 2026 release.
- |
-
- observeproperty,
- unobserveproperty,
- subscribeevent,
- unsubscribeevent
- |
-
- username-password,
- TLS with client certificates (you set this up in the broker anyway)
+ planned for April/May 2026 release.
|
@@ -103,7 +77,7 @@
Will be updated
|
- [aiocoap]()
+ aiocoap
|
Will be updated
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 600823f..69e9596 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -126,12 +126,4 @@
/* Optional polish */
.md-nav__link--active { font-weight: 700; } /* make current item pop */
-.md-nav__link code { font-family: inherit; } /* keep code fragments consistent in TOCs */
-
-/* Compact footer navigation (prev/next links) */
-.md-footer__inner {
- padding-top: 0rem;
- padding-bottom: 0rem;
- max-height: 60px;
-}
-
+.md-nav__link code { font-family: inherit; } /* keep code fragments consistent in TOCs */
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 346cf0d..626060d 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -79,7 +79,6 @@ nav:
- Clients:
- ClientFactory: api-reference/clients/base.md
- ObjectProxy: api-reference/clients/object-proxy.md
- # Security
- Abstractions:
- ConsumedThingAction: api-reference/clients/bases/cta.md
- ConsumedThingProperty: api-reference/clients/bases/ctp.md
From 896983852fda65b2c4cc2575ecf157830e01b4e7 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Sun, 22 Mar 2026 08:51:22 +0100
Subject: [PATCH 4/6] update serialization doc
---
.../beginners-guide/articles/serialization.md | 29 ++++++++++++-------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/docs/beginners-guide/articles/serialization.md b/docs/beginners-guide/articles/serialization.md
index c12f46e..e58e9cd 100644
--- a/docs/beginners-guide/articles/serialization.md
+++ b/docs/beginners-guide/articles/serialization.md
@@ -1,20 +1,21 @@
# Serializers
To promote interoperability, safety and ease of integration with web applications, the default content type for all properties, actions and events is the JSON data format - `application/json`.
-Moreover, a `C++` implementation of JSON (`msgspec`) is used, therefore one need not worry about the performance for a large number of use cases, including lists of 1000 to 10000 floats
+The default included implementation relies on `C++` (`msgspec`), therefore one need not worry about the performance for a large number of use cases, including lists of 1000 to 10000 floats
and large nested dictionaries or objects.
### Changing the Default Serializer
-It is possible to change the serialization format on an individual basis by using the `Serializers` singleton.
-Set the desired serialization on the specific property, action or event:
+One would use the `Serializers` singleton to set the desired serialization on the specific property, action or event to overcome the default setting on an individual basis:
-```py linenums="1" title="Change Serializer for Specific Properties, Actions or Events" hl_lines="8 12"
+```py linenums="1" title="Change Serializer for Specific Properties, Actions or Events" hl_lines="4 10 14"
from hololinked.serializers import Serializers
# Using a pickle serializer for a list property
Serializers.register_for_object(OceanOpticsSpectrometer.spectrum, Serializers.pickle)
# pickle is not recommended, use message pack if possible
+# from hololinked.config import global_config
+# global_config.ALLOW_PICKLE = True # default False
# Using message pack for an action or event
Serializers.register_for_object(
@@ -29,9 +30,9 @@ Serializers.register_for_object(
OceanOpticsSpectrometer(id="spectro1").run_with_http_server()
```
-Other properties, actions or events will still use the default (JSON) serialization. By referring the property, action or event at the class level, the data format change will be reflected for all instances. To overload the content type per `Thing` instance, specify the `thing_id` as well:
+i.e., other properties, actions or events will still use the default (JSON) serialization. By referring the property, action or event at the class level, the data format change will be reflected for all instances. To overload the content type per `Thing` instance, specify the `thing_id` as well:
-```py linenums="1" title="Overload per Thing instance" hl_lines="14 15"
+```py linenums="1" title="Overload per Thing instance" hl_lines="13 15"
from hololinked.serializers import Serializers
spectrometer = OceanOpticsSpectrometer(id='spectro1')
@@ -53,9 +54,9 @@ Serializers.register_for_object_per_thing_instance(
spectrometer.run(...)
```
-To overload the default serializer altogether for a `Thing` **instance**:
+To overload the default serializer for the entire `Thing` **instance** altogether:
-```py linenums="1" title="default serializer for thing instance" hl_lines="7 8"
+```py linenums="1" title="default serializer for thing instance" hl_lines="6-8"
from hololinked.serializers import Serializers
spectrometer = OceanOpticsSpectrometer(id='spectro1')
@@ -66,7 +67,8 @@ Serializers.register_for_thing_instance(
serializer=Serializers.msgpack
)
-# specific property will use pickle, other properties, actions and events will use msgpack
+# specific property will use pickle, other properties, actions
+# and events will use msgpack
Serializers.register_for_object_per_thing_instance(
thing_id=spectrometer.id,
objekt=OceanOpticsSpectrometer.spectrum.name, # accepts only string name
@@ -76,7 +78,14 @@ Serializers.register_for_object_per_thing_instance(
spectrometer.run(...)
```
-per-instance overloads have higher priority than the per-Thing-object. The singleton behaviour of `Serializers` ensures that all registrations are available across all protocol servers within the same process.
+The order of priority is as follows (from highest to lowest):
+
+1. Per-Thing-instance overloads for specific properties, actions or events.
+2. Per-Thing-instance overloads for the entire Thing instance.
+3. Per-Thing-class overloads for specific properties, actions or events.
+4. Fallback to the default serializer. It is possible to change the default serializer, see API reference.
+
+The singleton behaviour of `Serializers` ensures that all registrations are available across all protocol servers within the same process.
### Built-in Serializers
From 0e68a72623ce6215ec644675b44f73b162425740 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Fri, 15 May 2026 13:00:40 +0200
Subject: [PATCH 5/6] generic updates
---
docs/api-reference/clients/bases/utils.md | 2 +-
docs/api-reference/clients/security/apikey.md | 8 ++++++++
docs/api-reference/clients/security/basic.md | 7 +++++++
docs/api-reference/clients/security/oidc.md | 6 ++++++
docs/api-reference/td/form.md | 3 +++
docs/api-reference/td/metadata.md | 5 +++++
docs/api-reference/td/security.md | 11 +++++++++++
docs/beginners-guide/articles/object-proxy.md | 2 +-
docs/index.md | 16 ++++++++++++++--
docs/introduction/installation.md | 1 +
docs/introduction/use-cases.md | 10 +++++++---
mkdocs.yml | 9 ++++++++-
pyproject.toml | 2 +-
13 files changed, 73 insertions(+), 9 deletions(-)
create mode 100644 docs/api-reference/clients/security/apikey.md
create mode 100644 docs/api-reference/clients/security/basic.md
create mode 100644 docs/api-reference/clients/security/oidc.md
create mode 100644 docs/api-reference/td/form.md
create mode 100644 docs/api-reference/td/metadata.md
create mode 100644 docs/api-reference/td/security.md
diff --git a/docs/api-reference/clients/bases/utils.md b/docs/api-reference/clients/bases/utils.md
index 0741d09..5de8baa 100644
--- a/docs/api-reference/clients/bases/utils.md
+++ b/docs/api-reference/clients/bases/utils.md
@@ -1,3 +1,3 @@
-::: hololinked.client.abstractions.raise_local_exception
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/api-reference/clients/security/apikey.md b/docs/api-reference/clients/security/apikey.md
new file mode 100644
index 0000000..fed13c9
--- /dev/null
+++ b/docs/api-reference/clients/security/apikey.md
@@ -0,0 +1,8 @@
+
+
+::: hololinked.client.security.APIKeySecurity
+ options:
+ members:
+ - __init__
+ - value
+ - http_header_name
\ No newline at end of file
diff --git a/docs/api-reference/clients/security/basic.md b/docs/api-reference/clients/security/basic.md
new file mode 100644
index 0000000..1a6bcbd
--- /dev/null
+++ b/docs/api-reference/clients/security/basic.md
@@ -0,0 +1,7 @@
+
+
+::: hololinked.client.security.BasicSecurity
+ options:
+ members:
+ - __init__
+ - http_header
diff --git a/docs/api-reference/clients/security/oidc.md b/docs/api-reference/clients/security/oidc.md
new file mode 100644
index 0000000..5775c89
--- /dev/null
+++ b/docs/api-reference/clients/security/oidc.md
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/docs/api-reference/td/form.md b/docs/api-reference/td/form.md
new file mode 100644
index 0000000..bb251f9
--- /dev/null
+++ b/docs/api-reference/td/form.md
@@ -0,0 +1,3 @@
+
+
+::: hololinked.td.forms.Form
\ No newline at end of file
diff --git a/docs/api-reference/td/metadata.md b/docs/api-reference/td/metadata.md
new file mode 100644
index 0000000..8164bc9
--- /dev/null
+++ b/docs/api-reference/td/metadata.md
@@ -0,0 +1,5 @@
+
+
+::: hololinked.td.metadata.Link
+
+::: hololinked.td.metadata.VersionInfo
\ No newline at end of file
diff --git a/docs/api-reference/td/security.md b/docs/api-reference/td/security.md
new file mode 100644
index 0000000..99a36e4
--- /dev/null
+++ b/docs/api-reference/td/security.md
@@ -0,0 +1,11 @@
+
+
+::: hololinked.td.security_definitions.SecurityScheme
+
+::: hololinked.td.security_definitions.NoSecurityScheme
+
+::: hololinked.td.security_definitions.BasicSecurityScheme
+
+::: hololinked.td.security_definitions.APIKeySecurityScheme
+
+::: hololinked.td.security_definitions.OIDCSecurityScheme
\ No newline at end of file
diff --git a/docs/beginners-guide/articles/object-proxy.md b/docs/beginners-guide/articles/object-proxy.md
index 3d4f273..d714d4a 100644
--- a/docs/beginners-guide/articles/object-proxy.md
+++ b/docs/beginners-guide/articles/object-proxy.md
@@ -17,7 +17,7 @@ One would require a [Thing Description](https://www.w3.org/TR/wot-thing-descript
[Spectrometer](https://examples.hololinked.dev/simulations/spectrometer/resources/wot-td) |
[Oscilloscope](https://examples.hololinked.dev/simulations/oscilloscope/resources/wot-td)
-This metadata is used to create the `ObjectProxy`, and in `hololinked`, this JSON document is automatically generated and served by the server protocols. There is lesser requirement for manually creating said `ThingDescription`, unless one wants to highly customize it. The purpose of this JSON metadata is to provide both a human and machine readable description of the `Thing` and its capabilities, so that clients can automatically discover and interact with it without prior knowledge. Sounds like something useful for AI applications right?
+The purpose of this JSON metadata is to provide both a human and machine readable description of the `Thing` and its capabilities, so that clients can automatically discover and interact with it without prior knowledge. In `hololinked`, this JSON document is automatically generated and served by the server protocols. There is lesser requirement for manually creating said `ThingDescription`, unless one wants to highly customize it.
To instantiate an `ObjectProxy`, use the `ClientFactory` for one protocol at a time:
diff --git a/docs/index.md b/docs/index.md
index c22fc20..27d0cb4 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -91,6 +91,18 @@ Additionally, **state machines** can constrain property and action execution:
---
-> **Ready to get started?**
-> See the [Handbook](beginners-guide/articles/servers) section for concepts and code example and the [Examples Repository](https://github.com/hololinked-dev/examples) section for hardware-specific implementations. There are some online (live) examples available listed on the [project website](https://hololinked.dev).
+!!! tip "Ready to get started?"
+ Please see:
+
+ - [Handbook](beginners-guide/articles/servers) section for concepts
+ - Code example and the [Examples Repository](https://github.com/hololinked-dev/examples) section for hardware-specific implementations
+ - Online (live) examples listed on the [project website](https://hololinked.dev)
+
+ Office hours are available on request for any formal or informal discussions, help with implementation or just to say hi:
+
+ - Every Wednesday 4-6PM CET/CEST
+ - Every Friday 9-10AM CET/CEST, 4-5PM CET/CEST
+
+ Please email to info@hololinked.dev. You can also ask questions in the [discord group](https://discord.com/invite/kEz87zqQXh) (currently no participants).
+
diff --git a/docs/introduction/installation.md b/docs/introduction/installation.md
index c21444a..4fbada0 100644
--- a/docs/introduction/installation.md
+++ b/docs/introduction/installation.md
@@ -9,6 +9,7 @@ pip install hololinked
From conda:
```sh
+pip install aiomqtt
conda install -c conda-forge hololinked
```
diff --git a/docs/introduction/use-cases.md b/docs/introduction/use-cases.md
index a45ecec..c5b1a78 100644
--- a/docs/introduction/use-cases.md
+++ b/docs/introduction/use-cases.md
@@ -24,7 +24,7 @@
|
| ZMQ TCP |
- Networked Control Systems, subnet protected containerized apps like in Kubernetes |
+ Networked Control Systems, devices in protected networks, containerized apps like in Kubernetes |
Properties, Actions, Events
|
@@ -35,7 +35,7 @@
| ZMQ IPC |
- Desktop Applications, Python Dashboards without exposing device API directly on network |
+ Desktop Applications, Python Dashboards without exposing device API directly on network (streamlit, dash, panel etc.) |
| ZMQ INPROC |
@@ -69,7 +69,11 @@
- | CoAP |
+
+ CoAP
+ CoAP Websockets
+ CoAP UDP
+ |
Planned, April 2026.
|
diff --git a/mkdocs.yml b/mkdocs.yml
index 626060d..1b4afa4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -85,6 +85,10 @@ nav:
- ConsumedThingEvent: api-reference/clients/bases/cte.md
- SSE: api-reference/clients/bases/sse.md
- Utils: api-reference/clients/bases/utils.md
+ - Security:
+ - Basic: api-reference/clients/security/basic.md
+ - API Key: api-reference/clients/security/apikey.md
+ - OIDC Direct Access Grant: api-reference/clients/security/oidc.md
- Servers:
- HTTP: api-reference/protocols/http/index.md
- ZMQ: api-reference/protocols/zmq/index.md
@@ -103,6 +107,9 @@ nav:
- EventAffordance: api-reference/td/interaction_affordance/event_affordance.md
- DataSchema: api-reference/td/data_schema.md
- Thing Model: api-reference/td/tm.md
+ - Form: api-reference/td/form.md
+ - Metadata: api-reference/td/metadata.md
+ - Security Definitions: api-reference/td/security.md
- Bases:
- Schema: api-reference/td/bases/schema.md
# Examples
@@ -271,7 +278,7 @@ extra:
copyright: >
- © BSD-3-Clause license, hololinked contributors. This website was written by humans. Leave us a star on
+ © BSD-3-Clause license, hololinked contributors. Leave us a star on
GitHub
if you find this project useful!
This website uses anonymized privacy friendly GDPR compliant cookie-less analytics.
diff --git a/pyproject.toml b/pyproject.toml
index d2a0198..3f90891 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -36,4 +36,4 @@ repo = [
]
[tool.uv.sources]
-hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "main" }
\ No newline at end of file
+hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "mypy" }
\ No newline at end of file
From 4a8797b28852918e1ad904f29b9b5bad6c466196 Mon Sep 17 00:00:00 2001
From: Vignesh Venkatasubramanian Vaidyanathan
<62492557+VigneshVSV@users.noreply.github.com>
Date: Tue, 11 Aug 2026 19:31:42 +0200
Subject: [PATCH 6/6] disable pipeline temporarily
---
.github/workflows/ci.yaml | 4 ++--
.gitmodules | 6 ------
deployment/helm/cert-issuer-helm-chart | 1 -
deployment/helm/ingress-helm-chart | 1 -
pyproject.toml | 2 +-
5 files changed, 3 insertions(+), 11 deletions(-)
delete mode 160000 deployment/helm/cert-issuer-helm-chart
delete mode 160000 deployment/helm/ingress-helm-chart
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 97d5b65..49695d0 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -2,8 +2,8 @@ name: deploy-docs
on:
workflow_dispatch:
- repository_dispatch:
- types: [trigger-downstream]
+ # repository_dispatch:
+ # types: [trigger-downstream]
env:
REGISTRY: ghcr.io
diff --git a/.gitmodules b/.gitmodules
index f128ae3..c3ca054 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,9 +1,3 @@
-[submodule "deployment/helm/cert-issuer-helm-chart"]
- path = deployment/helm/cert-issuer-helm-chart
- url = https://gitlab.com/hololinked/kubernetes/helm-charts/cert-issuer-helm-chart.git
[submodule "deployment/helm/container-helm-chart"]
path = deployment/helm/container-helm-chart
url = https://gitlab.com/hololinked/kubernetes/helm-charts/container-helm-chart.git
-[submodule "deployment/helm/ingress-helm-chart"]
- path = deployment/helm/ingress-helm-chart
- url = https://gitlab.com/hololinked/kubernetes/helm-charts/ingress-helm-chart.git
diff --git a/deployment/helm/cert-issuer-helm-chart b/deployment/helm/cert-issuer-helm-chart
deleted file mode 160000
index fbcbd12..0000000
--- a/deployment/helm/cert-issuer-helm-chart
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fbcbd12dcc5de9943de1a245265842cadec224dc
diff --git a/deployment/helm/ingress-helm-chart b/deployment/helm/ingress-helm-chart
deleted file mode 160000
index 343aff1..0000000
--- a/deployment/helm/ingress-helm-chart
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 343aff1c89af401fdc1dad5237153e7070a96793
diff --git a/pyproject.toml b/pyproject.toml
index 3f90891..d2a0198 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -36,4 +36,4 @@ repo = [
]
[tool.uv.sources]
-hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "mypy" }
\ No newline at end of file
+hololinked = { git = "https://github.com/hololinked-dev/hololinked.git", branch = "main" }
\ No newline at end of file