Skip to main content

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:

  1. Umgebungsvariablen IOB_STATES_HOST/PORT/DB/PASS/TYPE und IOB_OBJECTS_* — so wird der py-controller sie später durchreichen.
  2. IOB_CONFIG mit dem Pfad zur iobroker.json.
  3. 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)

Source distribution for iobroker 0.1.1
File Size Uploaded
iobroker-0.1.1.tar.gz 17.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for iobroker 0.1.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page