✅ack: Befehl oder Bestätigung?

In ioBroker gibt es keine getrennten „Befehls“- und „Status“-Datenpunkte. Derselbe State trägt beides – unterschieden durch das Flag ack. Gehe Schritt für Schritt durch, was passiert, wenn jemand in der App die Wohnzimmerlampe einschaltet.

Schritt 1 / 8 · Tasten ← →
📱App / Admin⚡States-DB (js-controller)🔆Adapter shelly.0⚫Deckenlampe (Shelly)📜Skript (javascript.0)
Schritt 1

Ausgangslage: Lampe aus, bestätigt

Der Datenpunkt der Deckenlampe steht auf false. ack: true heißt: Dieser Wert ist vom Gerät bestätigt – er beschreibt die Wirklichkeit.

⚡ State in der States-DB

✔ ack: true
shelly.0.shellyplus1#0a1b2c3d4e01#1.Relay0.Switch
val
false
ack
true
ts
17:00:00.000
lc
17:00:00.000
from
system.adapter.shelly.0

Gelb markiert: in diesem Schritt geändert.

📱 Was die App anzeigt

aus

Viele Oberflächen zeigen unbestätigte Werte anders an (Farbe, Sanduhr) – daran erkennt man, ob ein Gerät den Befehl wirklich ausgeführt hat.

📜 Skript mit Filter ack: true

wartet …

📏Die Regeln in Kurzform

⚠️ ack: false = Befehl
Wer ein Gerät steuern will (Skript, Oberfläche, Sprachassistent), schreibt ohne ack bzw. mit ack: false. Der Wert ist ein Wunsch, noch keine Tatsache.
✅ ack: true = Tatsache
Nur der zuständige Adapter schreibt Werte seiner Geräte mit ack: true – nachdem das Gerät den Zustand gemeldet hat. Eigene Datenpunkte (z. B. unter 0_userdata.0) setzen Skripte direkt mit ack: true, weil kein Gerät dahintersteht.
💡 Adapter reagieren nur auf ack: false
Ein Adapter ignoriert Änderungen mit ack: true an seinen States – sonst würde jede Rückmeldung einen neuen Befehl auslösen (Endlosschleife).

🧪Typische Fehler

❌ Gerät mit ack: true „schalten“

setState('shelly.0.shellyplus1#0a1b2c3d4e01#1.Relay0.Switch', true, true);

Der Wert in der Datenbank ist dann true, aber der Adapter hält ihn für eine Rückmeldung und schickt nichts an das Gerät. Die Lampe bleibt aus – die Oberfläche zeigt „an“.

✅ Auf echte Zustände reagieren

on({ id: 'hm-rpc.0.MUSTER0002.1.STATE', change: 'ne', ack: true }, (obj) => {
    // läuft nur bei bestätigten Änderungen des Fensterkontakts
});

Mit dem Filter ack: true reagiert ein Skript nur auf Meldungen vom Gerät, nicht auf Befehle anderer Skripte.

Quellen: ioBroker.docs dev/objectsschema.md (States), ioBroker.javascript docs/en/javascript.md (setState: „ack = false: Script wants to send a command … ack = true: Command was successfully executed“). Shelly-RPC Switch.Set laut Shelly-API (2. Generation). IP und IDs sind Beispiele.