iobroker-python
Python-SDK für ioBroker-Adapter. Spricht direkt das Redis-Wire-Protokoll der States- und Objects-Datenbank — ein Python-Prozess wird damit zum gleichrangigen Adapter neben jedem Node-Adapter, ohne Brücke und ohne Umweg.
Status: früher Entwurf. Die Wire-Ebene ist gegen eine laufende Installation verifiziert (js-controller 7.2.3,
jsonl-Datenbanken). Die API kann sich noch ändern.
Installation
pip install iobroker
Ein Adapter in dreißig Zeilen
from iobroker import Adapter, State
class MyAdapter(Adapter):
async def on_ready(self):
await self.set_object_not_exists("temperature", {
"type": "state",
"common": {
"name": "Temperatur", "type": "number",
"role": "value.temperature", "unit": "°C",
"read": True, "write": False,
},
})
await self.subscribe_states("*")
await self.set_state("info.connection", True, ack=True)
async def on_state_change(self, id: str, state: State | None):
# ack=False heißt: jemand will etwas schalten.
if state and not state.ack:
self.log.info(f"Befehl auf {id}: {state.val}")
async def on_message(self, msg):
if msg.command == "ping":
await self.reply(msg, {"pong": True})
MyAdapter("myadapter").run()
Ein lauffähiges Beispiel steht in examples/minimal_adapter.py.
Verbindungsdaten
Der Adapter liest sie in dieser Reihenfolge:
- Umgebungsvariablen
IOB_STATES_HOST/PORT/DB/PASS/TYPEundIOB_OBJECTS_*— so wird derpy-controllersie später durchreichen. IOB_CONFIGmit dem Pfad zuriobroker.json.- Die üblichen Installationspfade.
Instanznummer und Loglevel kommen aus --instance / --loglevel oder aus
IOB_INSTANCE / IOB_LOGLEVEL — dieselben Argumente, die js-controller heute
schon an Node-Adapter übergibt.
Was der eingebaute Server anders macht als Redis
Im Standard-Setup redet man nicht mit echtem Redis, sondern mit dem
Redis-Protokollserver in js-controller (Ports 9000 und 9001). Der weicht an
mehreren Stellen ab. Alle folgenden Punkte sind an einer laufenden Installation
am Draht nachgewiesen, nicht aus der Dokumentation abgeleitet — tools/probe.py
prüft sie für die eigene Installation nach.
| Abweichung | Auswirkung | Behandlung im SDK |
|---|---|---|
Kommandos müssen kleingeschrieben sein. Der Server dispatcht ohne toLowerCase() (db-base/redisHandler.js), registriert seine Handler aber nur klein. ioredis sendet zufällig klein, redis-py sendet groß. |
GET … → -Error GET NOT SUPPORTED, get … → 4. Ohne Behandlung scheitert der erste Befehl. |
connection.py hängt sich vor den Command-Packer von redis-py. Synchron über _command_packer, asynchron über pack_command — redis-py benutzt je nach Modus einen anderen Weg. |
Kein HELLO. redis-py verhandelt RESP3 beim Verbinden. |
Verbindungsaufbau scheitert mit HELLO NOT SUPPORTED. |
protocol=2, dazu lib_name=None gegen CLIENT SETINFO. |
Kein PING auf der States-DB. |
Übliche Verbindungstests schlagen fehl. | Verbindungstest über get meta.states.protocolVersion — die Version muss ohnehin geprüft werden. |
Kein SCAN auf der States-DB. Die Objects-DB kann scan, sscan, sadd, eval. |
Schlüssel müssen mit keys gesucht werden. |
DbConfig.is_builtin unterscheidet; gegen echtes Redis ist keys blockierend und muss vermieden werden. |
Pub/Sub liefert den Kanal ohne io.-Präfix. Echtes Redis liefert ihn mit. |
Wer stur das Präfix abschneidet, verstümmelt IDs. | Das SDK toleriert beides — genau wie der JS-Client. |
Abgelaufene States melden sich anders. Kein __keyevent@0__:expired; stattdessen kommt null auf dem State-Kanal selbst. |
Gegen echtes Redis wäre ein zusätzliches Abo nötig. | null wird als „State weg“ an on_state_change gemeldet. |
Dazu eine Eigenschaft, die kein Fehler, aber wichtig ist: die Rechteprüfung sitzt im JS-Client, nicht im Datenbankserver. Wer direkt auf der Redis-Verbindung sitzt, hat faktisch Adminrechte. Das gilt für Node-Adapter genauso — nur kommt bei Python fremder Code aus PyPI mit in den Prozess.
Capability-Probe
python tools/probe.py
(aus dem Repository, nicht im Wheel enthalten)
Meldet für die eigene Installation, was die beiden Datenbanken können, und macht
anschließend einen vollständigen Round-Trip: Objekt anlegen, State schreiben,
Änderung empfangen. Räumt mit --cleanup wieder auf.
Lebenszyklus
alive, connected, uptime und memRss schreibt der Adapter selbst über die
States-DB — genauso wie ein Node-Adapter. Der Stopp läuft über den
sigKill-State: setzt der Controller ihn auf -1, beendet sich der Adapter
geordnet. Damit funktioniert das Anhalten auch unter Windows, wo es kein
SIGTERM gibt.
Entwicklung
python -m venv .venv && .venv/Scripts/activate # Windows
pip install -e ".[dev]"
python examples/minimal_adapter.py --instance 0
Lizenz
MIT
Release files for iobroker 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| iobroker-0.1.1.tar.gz | 17.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iobroker-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.6 kB
Release files / iobroker-0.1.1.tar.gz
| Download URL | iobroker-0.1.1.tar.gz |
|---|---|
| Size | 17.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
68b78986de8c74389bacc42b7b08ab353f785968804dda4638cf075078a98ec0
|
|
BLAKE2b-256 checksum How to use checksums |
acf4034167ac25d0f9654757485e9e5efc7b52889b58b196cad867d0f4e8192a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / iobroker-0.1.1-py3-none-any.whl
| Download URL | iobroker-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
98ad028f27daeb5b503f31a96a5ced1f3887a8ae21a3f856c65d8e9b62a56164
|
|
BLAKE2b-256 checksum How to use checksums |
ff5b8cb09319719411fc7a1a7fb8069444ff6de22a976ac944c74cc1a71b7724
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency log