✅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.
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: trueGelb markiert: in diesem Schritt geändert.
📱 Was die App anzeigt
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. Der Wert ist ein Wunsch, noch keine Tatsache.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.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.