NEWS
Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium ;-)
-
Ich hatte mir zum ack Thema mal den github-iobroker-wiki-Artikel notiert: https://github.com/ioBroker/ioBroker/wiki/Adapter-Development-Documentation#commands-and-statuses
Ist das noch aktuell?
-
@loredo
Es entspricht der Philosophie von ioBroker, dass der Datenpunkt ein Sollzustands-Datenpunkt (val = neuer Wert, ack = false) bleibt, solange die Rückmeldung ausbleibt.@paul53 Es ist halt ein Unterschied nicht zu reagieren oder etwas nicht anzunehmen und zurückzuweisen. Nicht zu reagieren, obwohl man das Kommando wahrgenommen hat, ist halt nicht zu unterscheiden davon, dass der Adapter einfach nicht läuft. Ich finde es aber wichtig das zu unterscheiden. IMHO sollte ein laufender Adapter immer etwas tun, aber mir persönlich reicht da ein einfacher Logeintrag nicht. Ich möchte das auch Event basiert verarbeiten können und auch direkt im Admin Adapter sehen können, ohne das Log zu durchforsten.
Die von dir besagte Philosophie stört mich nicht selten und hinterlässt bei mir oft den Eindruck eines nur halb fertigen Adapters.
️
Es ist aber erlaubt, dass du eine andere Meinung hast als ich
-
Ich hatte mir zum ack Thema mal den github-iobroker-wiki-Artikel notiert: https://github.com/ioBroker/ioBroker/wiki/Adapter-Development-Documentation#commands-and-statuses
Ist das noch aktuell?
@klassisch sagte: Ist das noch aktuell?
Ja, und es beschreibt es so, wie ich geschrieben habe.
Beispiel: HomeMatic, Datenpunkt MANUAL_MODE: Darüber schaltet man den Thermostaten in den manuellen Modus und man übergibt den manuellen Sollwert. Dieser Datenpunkt wird nie bestätigt.Anmerkung: ioBroker ist ursprünglich aus einer Erweiterung für HomeMatic hervorgegangen. Das ist für Dich sicher nicht neu, aber wahrscheinlich für @Loredo.
-
@klassisch sagte: Ist das noch aktuell?
Ja, und es beschreibt es so, wie ich geschrieben habe.
Beispiel: HomeMatic, Datenpunkt MANUAL_MODE: Darüber schaltet man den Thermostaten in den manuellen Modus und man übergibt den manuellen Sollwert. Dieser Datenpunkt wird nie bestätigt.Anmerkung: ioBroker ist ursprünglich aus einer Erweiterung für HomeMatic hervorgegangen. Das ist für Dich sicher nicht neu, aber wahrscheinlich für @Loredo.
@paul53 Korrekt. Nein das ist nicht neu für mich, sondern an vielen Stellen sehr offensichtlich (was nicht schlimm ist). Ich kenne ioBroker auch schon seit etlichen Jahren, auch wenn ich ihn noch nicht so lange aktiv nutze.
Das ist für mich aber deshalb nicht dauerhaft in Stein gemeißelt, sondern kann sich weiterentwickeln
Ich habe für meinen Adapter entschieden, dass ich das Verhalten so sinnvoller finde. Vor allem auch deshalb, weil eine Darstellung der tatsächlich korrekten Werte über eine externe GUI möglich sein soll. Da stört es, wenn in der GUI dann plötzlich aber Werte angezeigt werden, die gar nicht dem Ist-Zustand entsprechen. Meine oberste Priorität ist immer, den Ist-Zustand zu jeder möglichen Zeit richtig anzuzeigen, nicht den Soll-Zustand. -
@paul53 Korrekt. Nein das ist nicht neu für mich, sondern an vielen Stellen sehr offensichtlich (was nicht schlimm ist). Ich kenne ioBroker auch schon seit etlichen Jahren, auch wenn ich ihn noch nicht so lange aktiv nutze.
Das ist für mich aber deshalb nicht dauerhaft in Stein gemeißelt, sondern kann sich weiterentwickeln
Ich habe für meinen Adapter entschieden, dass ich das Verhalten so sinnvoller finde. Vor allem auch deshalb, weil eine Darstellung der tatsächlich korrekten Werte über eine externe GUI möglich sein soll. Da stört es, wenn in der GUI dann plötzlich aber Werte angezeigt werden, die gar nicht dem Ist-Zustand entsprechen. Meine oberste Priorität ist immer, den Ist-Zustand zu jeder möglichen Zeit richtig anzuzeigen, nicht den Soll-Zustand.@loredo sagte: Ist-Zustand zu jeder möglichen Zeit richtig anzuzeigen, nicht den Soll-Zustand.
Dann muss aber auch der Wert mit dem Ist-Wert überschrieben werden - nicht nur das Ack-Flag. Der Fehlversuch wird dann natürlich in der History mit aufgezeichnet.
-
@loredo sagte: Ist-Zustand zu jeder möglichen Zeit richtig anzuzeigen, nicht den Soll-Zustand.
Dann muss aber auch der Wert mit dem Ist-Wert überschrieben werden - nicht nur das Ack-Flag. Der Fehlversuch wird dann natürlich in der History mit aufgezeichnet.
@paul53 sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:@loredo sagte: Ist-Zustand zu jeder möglichen Zeit richtig anzuzeigen, nicht den Soll-Zustand.
Dann muss aber auch der Wert mit dem Ist-Wert überschrieben werden - nicht nur das Ack-Flag.
Hatte ich ja oben auch so geschrieben, dass ich
oldStatemitack=trueergänzt von z.B.q=0x40zurückschreibe
oldStatemuss sich halt der laufende Adapter selbst organisieren, weshalb es auch unschön ist, wenn Änderungen an Objekten passieren, während der Adapter nicht läuft. der JS-Controller wäre besser dafür geeignet,oldState(also nur die States mitack=true) für alle Adapter bereitzuhalten, aber sowas gibts wohl bisher nicht.By the way, da fällt mir gerade wieder der Bug ein, der mir bei der Entwicklung begegnet ist:
getForeignStateAsync()liefert nurack: falseDadurch muss man beim zurückschreiben (je nachdem, wie lange der Adapter schon läuft) trotzdem nochmal explizit
ack=truesetzen. Das aber nur am Rande erwähnt, weil es auch was mit der Nutzung derackWerte zu tun hat. Das macht es leider derzeit auch schwierig denack-Wert außerhalb von Events abzuprüfen, weil der Wert eben immerfalseist und nietrue</OffTopic> -
@klassisch History (oder influx oder sonstige) reagieren auf die Stgate-Änderung an sich, egal ob ack true oder nicht.
Sobald sich was ändert, wird geschrieben. Wenn Du jetzt einen Adapter-Datenpunkt mit 1 beschreibst und dieser dann vom Adapter auf 2 rückgemeldet wird (z.B. beim Harmony-Adapter zum Starten von Activities) so wird sowohl die 1, als auch die 2 weggespeichert.Gruss, Jürgen
-
@klassisch History (oder influx oder sonstige) reagieren auf die Stgate-Änderung an sich, egal ob ack true oder nicht.
Sobald sich was ändert, wird geschrieben. Wenn Du jetzt einen Adapter-Datenpunkt mit 1 beschreibst und dieser dann vom Adapter auf 2 rückgemeldet wird (z.B. beim Harmony-Adapter zum Starten von Activities) so wird sowohl die 1, als auch die 2 weggespeichert.Gruss, Jürgen
@wildbill sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:z.B. beim Harmony-Adapter zum Starten von Activities
da ist es ja tatsächlich so dass ein "working" über einen anderen Wert als der initiale oder der Zielwert ist.
Ich finde es richtig wenn das auch geloggt wird, da damit die korrekte Funktion ind Gänze abgebildet wird. -
@wildbill
das stimmt und ich finde es bedauerlich!
Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird.@marty56 sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird.
Das wäre Bilanzfälschung!

Entweder ich logge jede Veränderung um auch später jeden Eingriff sehen zu können, oder ich lasse es.
"Beweise manipulieren" zu können, indem man aktiv bei bestimmten Aktionen die Spuren verwischt, halte ich für keine gute Idee!Ist jetzt absichtlich überspitzt formuliert!
-
@wildbill
das stimmt und ich finde es bedauerlich!
Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird.@marty56 sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird.
Wie @Homoran schon schrieb: Das wäre „geschummelt“

Aber Du kannst ja beim Abfragen der DB die Datensätze ohneackwegfiltern. -
@marty56 sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird.
Das wäre Bilanzfälschung!

Entweder ich logge jede Veränderung um auch später jeden Eingriff sehen zu können, oder ich lasse es.
"Beweise manipulieren" zu können, indem man aktiv bei bestimmten Aktionen die Spuren verwischt, halte ich für keine gute Idee!Ist jetzt absichtlich überspitzt formuliert!
-
@wildbill
das stimmt und ich finde es bedauerlich!
Ich hätte gerne, dass ich mit setState() steuern könnte, ob ein Wert im History Adapter an die jeweilige DB übertragen wird. -
@marty56 dann erstelle dir einen Schattenstate und sortiere per Skript oder irgendeiner Logik aus und logge den dann. Easy
@apollon77 Ja, dass mit dem "Schattenstate" habe ich natürlich gemacht. Dennoch nicht besonders elegant
-
@apollon77 Ja, dass mit dem "Schattenstate" habe ich natürlich gemacht. Dennoch nicht besonders elegant
-
Hi All,
weil ich im Forum und in GitHub in letzter Zeit vermehrt darüber gestolpert bin, möchte ich heute mal ein paar Zeilen zum Thema Bestätigt/Acknowledged-Flag beim setzen von State-Werten schreiben.
Wer jetzt denkt, das weiß ich doch alles ... lest doch vllt. noch ein Stück weiter

Aber fangen wir doch mal an mit einer kleinen Preisfrage (und bevor jemand fragt: Die Belohnung ist Wissen
)Kleine Preisfrage ...
Was genau bedeutet es "bestätigt/acknowleged" beim Setzen von State Werten auf "true" zu setzen?
Antwort A: Ich als User (bzw mein Skript) setzt "bestätigt" auf "true" um zu sagen das ich bestätige das der Wert so sein soll. (Ich bestätige dem Gerät das der Wert mein Wunsch ist.)
Antwort B: Das Gerät (bzw. der Adapter der das Gerät anbindet) zeigt mit "bestätigt" auf "true", das dies der Wert ist der beim Gert gerade wirklich gesetzt ist (Das Gerät hat diesen Wert als "echt" bestätigt.)
Bevor Ihr weiterlest beantwortet die Frage mal für euch ... ... ...
....
....
....
Wer für sich bei Antwort A gelandet ist, der sollte in jedem Fall weiterlesen, weil für Ihn schreibe ich das ganze
Alle anderen dürfen zur Überprüfung Ihres Wissens natürlich auch gern weiterlesen.Ok, wie ist es denn nun mit ack=true?
Antwort B ist korrekt.
Der "acknowledged" Flag (Deutsch "Bestätigt") kennzeichnet einen Wert ,der vom Gerät (bzw. vom Adapter auf Basis von Rückmeldungen vom Gerät - oder "bester Annahme") bestätigt wurde, als der Wert der gerade gesetzt ist. Es ist also "die Realität".
Im Normalfall setzen ausschließlich Adapter (bzw. eigene Skripte die den Status eines States "kennen") Werte mit ack=true. Es gibt nur sehr wenige Anwendungsfälle wo es Sinn macht das ein User bzw. ein Skript einen Wert mit ack=true setzt!
Jeder Adapter sollte jegliche Wertänderungen mit ack=true einfach ignorieren und nichts tun! Falls er es doch tut ist es ein Sonderfall oder ein Bug im Adapter
Bestätigte Werte werden im Admin "grün" angezeigt um zu visualisieren das der Wert direkt vom Adapter kommt und es der Wert sein sollte der dort gerade real ist.
Und wozu nutze ich dann ack=false?
Mit "Acknowledged=false" (was auch überall die Standardeinstellung ist) steuert man ein Gerät. Darauf sollten Adapter (wenn States schreibbar sind) dann auch reagieren und eine Steueraktion auslösen und den Wert zum Gerät senden.
Admin Zeigt Werte mit "ack=false" in rot an, um zu zeigen das man diesem Wert im ersten Schritt nicht uneingeschränkt vertrauen darf, weil das Gerät noch nichts dazu gesagt hat.
Im Normalfall wird der Adapter direkt (oder über Updates dann vom Gerät) nach einer Steueraktion einen neuen bestätigten Wert nach der erfolgten Steuerung setzen - das kann der Wert sein den man gesendet hat oder ein anderer!
Im Admin sieht man das das der gesetzte Wert kurz rot ist und dann kurz darauf von einem "grünen" Wert überschrieben wird. Das ist der Idealfall.Was heisst es wenn ein Wert "rot" bleibt?
Am Ende kann es grob drei Fälle geben wenn ein Wert "rot" (also unbestätigt) bleibt:
- Der Adapter bzw. das Skript die diesen State normalerweise abarbeiten werden gerade nicht ausgeführt. Dann nimmt niemand die Steueraktion entgegen und es bleibt halt so.
- Aus irgendeinem Grund konnte der Adapter die Steueraktion nicht ausführen (zB. weil das Gerät gerade offline ist) und hat auch keinen anderen neuen Wert vom Gerät. Dann könnte es im Logfile was zu finden geben.
- Es ist ein "write only State". Ein Write Only State (zB oft bei "Buttons) triggern bei Betätigung mit dem Wert "true" etwas, aber ausser dem "Trigger" haben sie keinen Wert. Ob so ein State vom Adapter wieder zurückgesetzt wird auf zB False mit ack=true ist Adapterspezifisch und nicht ganz so einfach zu definieren. Das jetzt hier genauer auszuführen würde diesen Rahmen deutlich sprengen.
Gibts das auch nochmal ausführlicher?
Ja, @haus-automatisierung hat das Thema uch in einem Video verarbeitet: Wer also die Erklärung gerne noch einmal in bewegten Bildern (mit ein paar Beispielen) sehen möchte:
https://www.youtube.com/watch?v=p5FyeifYUnw
Und bei eigenen Skripten?
Wenn Ihr Adapter-States steuern wollt ist das oben genannte genau so wichtig. Die "setState"-Methode hat den "ack"-Flag als dritten Parameter. Wenn er weggelassen wird oder auf false steht ist es eine "Steuern" Aktion, sonst wird der Wert "Aktualisiert" (ohne Steuerung). In Blockly und Rulez ist die Terminologie die gleiche.
Für eigene States (in zB 0_userdata.0.* oder javascript.X.*) obliegt es formal Euch wie Ihr arbeiten wollt. Wer die Unterscheidung, ob ein Wert "erfolgreich verarbeitet und umgesetzt" ist vs. "das wollte ich steuern" nicht braucht, kann den ack-Flag ignorieren ... Eine normale subscription auf einen State Wert liefert beide Wert-Änderungen, kann aber über Zusatzparameter eingeschränkt werden auf nur "ack: false" als Beispiel.
Aus Erfahrung sorgt das dann aber dafür das man in dem Umfeld gern mit "ack=true" arbeitet damit es im Admin "nicht als rot dargestellt wird" ... das kann hat zu einer Falle führen weil man dann immer umdenken muss.Ich persönlich versuche auch in Skripten mit korrekten ack-Flags zu arbeiten, um zu sehen ob ein Wert eine Steuerung ist oder der bestätigte Wert. Muss aber jeder für Sich entscheiden.
Gibts im Admin noch andere Farben?
In seltenen Fällen (bzw aktuell bei eher ausgewählten Adaptern) kann man noch State Werte in gelb sehen. Diese weisen an sich darauf hin das der Wert in irgendeiner Hinsicht als "Stale" (denke am besten als "veraltet" übersetzt) anzusehen ist. Das wird über das sogenannte "q" (aka "quality") Flag am State Wert gesteuert mit dem ein Adapter mitgeben kann das/ob ein Wert nur eine Annahme ist oder das Gerät aktuell offline ist und daher der Wert der "zuletzt bekannte aber potentiell veraltete" ist.
Das nutzen momentan nicht so viele Adapter - kommt vllt mal wieder mehr in Mode
Ich hoffe der kleine Exkurs hat mehr Fragen beantwortet als neue aufgeworfen - falls doch bitte einfach Fragen!
Eine aktuelle Idee ist das auch in der Admin UI etwas besser darzustellen das dort klarer wird das "bestätigt" bedeutet.Ingo
Der Beitrag hat mir sehr geholfen, vielen Dank!
Wie ist das aber mit VIS Buttons?
Offenbar nutzen die immer "Steuere ID.."Kann ich mit einem Button einen Datenpunkt setzen?
Natürlich könnte ich mit einem Script laufend den Datenpunkt abfragen und ihn beim Ändern des Wertes aktualisieren.
Aber das muß doch auch einfach aus dem Widget heraus gehen?Viele Grüße
Uwe -
@ukek sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Offenbar nutzen die immer "Steuere ID.."
Kann ich mit einem Button einen Datenpunkt setzen?so herum ist das kein Problem.
nur mit ACK (aktualisiere) kann man keinen Adapter zum steuern bewegen.
-
Der Beitrag hat mir sehr geholfen, vielen Dank!
Wie ist das aber mit VIS Buttons?
Offenbar nutzen die immer "Steuere ID.."Kann ich mit einem Button einen Datenpunkt setzen?
Natürlich könnte ich mit einem Script laufend den Datenpunkt abfragen und ihn beim Ändern des Wertes aktualisieren.
Aber das muß doch auch einfach aus dem Widget heraus gehen?Viele Grüße
Uwe -
@apollon77 Ich setze einen Datenpunkt (Klima-Auto), dass mein Klimagerät automatisch oder manuell laufen soll.
Automatisch bedeutet: je nach Solarüberschuß geht es an/aus und steuert sich selbständig zwischen 18-23 Grad.
Der Datenpunkt (Klima-Auto) wird also erst abgefragt, wenn Solarüberschuß besteht.Ich könnte den Datenpunkt "rot" lassen und erst bei der Aktion "Solarüberschuß" aktualisieren?
Oder soll/kann ich den gleich als "aktualisiere ID.." vom Button setzen?LG Uwe
-
Der Beitrag hat mir sehr geholfen, vielen Dank!
Wie ist das aber mit VIS Buttons?
Offenbar nutzen die immer "Steuere ID.."Kann ich mit einem Button einen Datenpunkt setzen?
Natürlich könnte ich mit einem Script laufend den Datenpunkt abfragen und ihn beim Ändern des Wertes aktualisieren.
Aber das muß doch auch einfach aus dem Widget heraus gehen?Viele Grüße
Uwe@ukek sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Kann ich mit einem Button einen Datenpunkt setzen?
Klar, der wird ja dann mit ack: false geschrieben. Und im Idealfall schreibst Du dann noch ein eigenes Script im JavaScript-Adapter, was auf unbestätigte Änderungen reagiert, dann das tut was Du möchtest und danach den neuen Wert bestätigt / den Datenpunkt mit ack: true neu schreibt. Genau so, wie es auch Adapter machen.
-
@ukek sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Kann ich mit einem Button einen Datenpunkt setzen?
Klar, der wird ja dann mit ack: false geschrieben. Und im Idealfall schreibst Du dann noch ein eigenes Script im JavaScript-Adapter, was auf unbestätigte Änderungen reagiert, dann das tut was Du möchtest und danach den neuen Wert bestätigt / den Datenpunkt mit ack: true neu schreibt. Genau so, wie es auch Adapter machen.
@haus-automatisierung sagte in Bestätigt/Acknowledged-Flag Bedeutung - ein Mysterium
:Und im Idealfall schreibst Du dann noch ein eigenes Script im JavaScript-Adapter
Ja genau das war meine Frage.
Ich lasse VIS den Datenpunkt "rot" setzen und frage ihn danach mit einem Script ab und "aktualisiere ID..".Alles klar, danke!
Viele Grüße
Uwe