NEWS
Status ack true/false vs. Rückmeldung
-
Hallo!
Ich komme aus der KNX Welt (und die möchte ich jetzt mit ioBroker verbinden). Dort wird typischerweise über einen Status (dort Gruppenadresse) ein Schaltbefehl ausgesandt und wenn der Aktor das erledigt hat, sendet er ne Rückmeldung über ne andere Gruppenadresse. Sowas ähnliches soll meines Verständnisses nach auch mit dem Setzen von Status mit oder ohne ack in ioBroker erreicht werden. Korrigiert mich wenn ich mich irre
Nun ich möchte zunächst den KNX Server per MQTT mit dem ioBroker verbinden und über den Homekit Adapter in ioBroker die Siri Anbindung von KNX erreichen.
In meinem Kopf soweit klar ist, dass bei einem Schalten über KNX die Rückmeldung per MQTT übertragen wird und dann den Status im ioBroker setzt. Was mir noch nicht ganz klar ist: wenn ich über Homekit schalte, wird ja zunächst ein Status in ioBroker gesetzt. Der würde dann per MQTT übertragen, das KNX System führt es aus und es geht zurück zum ioBroker über die Rückmeldung (per MQTT). Den Status noch mal zu setzen bringt ja aber nichts. Vor allem nicht für den Fall, dass was schiefgelaufen ist. Denn dann kommt ja ggf. keine Rückmeldung...
Wie bringe ich das zusammen?
Danke und Grüße,
Sandro -
Für diesen Zweck gibt es im ioBroker das "acknowledge". Du kannst einen State mit oder ohne "acknowledge" setzen (siehe doku zu setState).
Die Logik dahinter ist das du, wenn du eine Aktion ausführen willst, den State ohne "acknowledge" setzt, und derjenige, der den State auswertet diesen bei Erfolg mit acknowledge bestätigt (gleichen wert) oder auf den dann aktiven Wert setzt - auch mit acknowledge.
In wie weit das immer im Zusammenspiel mit dem Yahka Adapter an allen Stellen funktioniert muss ich ausprobieren - in ein paar Fällen hat es schon erfolgreich geklappt.
Im Zusammenspiel mit den getrennten Messages im KNX müsstest du beim Versenden der Nachricht an KNX einen Timeout starten. Kommt die Rueckmeldung mit dem Erfolg, dann kannst du den Wert mit acknowledge bestätigen und den Timeout löschen. Wenn der Timeout kommt dann kannst du die Fehlerbehandlung durchführen.
In diesem Zusammenhang ist es natürlich wichtig, das du im on() mit dem du auf Änderungen am Wert reagierst nur auf Änderungen reagierst bei denen acknowledge=false ist.
A.
-
Danke für die Antwort
Das mit dem Timer leuchtet ein, aber ist mir auch irgendwie unheimlich. Entweder wäre der in Homekit angezeigte Status für ne gewisse Zeit lang ungewiss oder ich muss ich ihn gleich zurücksetzen und warten was ein unnötiges hin und her wäre
Ich hab mir den Yahka Adapter jetzt noch mal angeschaut. Es gibt für den Zustand auch die Option ioBroker.State.OnlyACK, der den Zustand nur an Homekit übermittelt, wenn ack = true ist.
Schaltet man in Homekit kommt der Status mit ack = false rein, aus KNX kommt der Status mit ack = true aus MQTT. Soweit so gut. Mein Plan ist jetzt also auch in iobroker mit zwei Objekten zu arbeiten. Eins zum Schalten (Homekit --> KNX) und das andere für die Rückmeldung (KNX --> Homekit). Das Objekt für die Rückmeldung soll dann auf das Schaltobjekt gespiegelt werden.
Mein aktuelles Problem:
on('mqtt.0.status.wohnen-licht', 'mqtt.0.schalten.wohnen-licht')
Mappt zwar den Status, aber nicht das ack Flag. Der Status in Homekit ändert sich also nicht.
Wie krieg ich denn das hin?
SetForeignState(...) gibt es scheinbar nicht. Hab also gerade keine Idee, wie ich nen Status außerhalb von javascript.0 so setzen kann wie ich möchte.Grüße
Edit: Oder geht das doch? Habe gerade das folgende Beispiel gefunden (http://iobroker.blogspot.com/2017/07/einfache-script-beispiele.html) Ich hatte glaube ich nur mit createState(...) probiert einen Status im mqtt Adapter anzulegen, was scheiterte und ihn unter javascript einordnete. Aber mit setState(...) kann ich Zustände außerhalb des Javascript Adapters schreiben? Dann könnte ich ja über die JSON Notation ohne weiteres auch das ack = true mitgeben. Kann das erste heute Abend probieren, aber wollte das noch in die Runde werfen
-
Noch zwei Updates dazu falls einer ein ähnliches Problem hat
-
Ein Mapping von einem State auf den anderen funktioniert natürlich wunderbar. Meine sind so benannt, dass ich den Zielstate mit einem replace ermitteln und dann setzten kann, mit ack = true oder false wie es eben passt
-
Es gibt in Yahka als InOut Funktion auch ioBroker.Multistate
Damit kann man unterschiedliche Objekte für Lesen und Schreiben angeben. Genau das was ich brauchte
-