NEWS
MQTT ack=false forcieren?
-
Hi zusammen
Ich habe aktuell den MQTT adapter in version 4.1.1 auf meiner QNAP basierenden ioBroker instanz laufen.
Der Adapter verbindet sich als Client/Subscriber via IP zu meinem SolarAssistant MQTT Server um die Wechselrichter und Batteriewerte zu subscribendas Funktioniert soweit auch:
mqtt-packet:writeToStream generate called +7ms
mqtt-packet:writeToStream generate: packet.cmd: publish +0ms
mqtt-packet:writeToStream publish: packet: { cmd: 'publish', topic: 'PVGrid/battery_1/state_of_charge/state', payload: '46', qos: 0, retain: false, messageId: 0, dup: false } +0ms
mqtt-packet:writeToStream writeVarByteInt: writing to stream: <Buffer 2a> +0ms
mqtt-packet:writeToStream writeNumberCached: number: 38 +1ms
mqtt-packet:writeToStream writeNumberCached: <Buffer 00 26> +0ms
mqtt-packet:writeToStream publish: payload: '46' +0ms
2023-10-11 12:20:38.128 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.inverter_2.ac_output_voltage.state: {"val":229,"ack":true,"ts":1697019638104,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019638104}
2023-10-11 12:20:38.129 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.inverter_2.load_power.state: {"val":1396,"ack":true,"ts":1697019638104,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019638104}
2023-10-11 12:20:38.129 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.battery_1.power.state: {"val":1078,"ack":true,"ts":1697019638104,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019638104}
2023-10-11 12:20:38.130 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.battery_1.state_of_charge.state: {"val":46,"ack":true,"ts":1697019638104,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019494681}
2023-10-11 12:20:38.131 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.battery_1.voltage.state: {"val":53.9,"ack":true,"ts":1697019638104,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019638104}
2023-10-11 12:20:38.132 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.total.battery_power.state: {"val":1078,"ack":true,"ts":1697019638112,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019638112}
2023-10-11 12:20:38.132 - debug: mqtt.0 (7442) stateChange mqtt.0.PVGrid.total.load_percentage.state: {"val":26,"ack":true,"ts":1697019638112,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697019604919}Mein Problem ist allerdings das ack:true welches ich abstellen muss, da mein Go-E Adapter damit nicht umgehen kann.
Die MQTT Einstellungen habe ich soweit alle standard gelassen.
Sprich "Nur bei Änderungen publizieren" und "Eigene States beim Verbinden publizieren" ist gewählt.Wie bekomme ich es hin das ack:false ist?
Auf der SolarAssistant Seite gibt es nichts einzustellen, was den wert ändert.Vielen lieben Dank!
-
@highpressure sagte in MQTT ack=false forcieren?:
Mein Problem ist allerdings das ack:true welches ich abstellen muss, da mein Go-E Adapter damit nicht umgehen kann.
verstehe ich nicht ??
-
@highpressure sagte in MQTT ack=false forcieren?:
Wie bekomme ich es hin das ack:false ist?
Auf der SolarAssistant Seite gibt es nichts einzustellen, was den wert ändert.Das wird ja auch nicht von der anderen Seite per MQTT mitgesendet, sondern so wird der State vom MQTT-Adapter geschrieben. Und da der Wert von extern so reinkam, ist er logischerweise auch bestätigt.
Was genau ist denn die Problemstellung?
-
ich muss ack=false - warum auch immer - dem go-e bereitstellen, da der - warum auch immer - nicht damit umgehen kann.
Ich hatte eigentlich nicht vor den erst in history oder sonst wo nochmals unnötig zu schreiben.
Gibt es da keinen anderen Weg? -
@highpressure Wie hast Du denn MQTT und den anderen Adapter miteinander verknüpft?
-
via einstellungen des go-e adapter
-
@highpressure sagte in MQTT ack=false forcieren?:
via einstellungen des go-e adapter
Und wenn Du
only Ack
anhakst? Dann sollte doch genau das gewünschte Verhalten erreicht werden (oder ich verstehe die Option in den Einstellungen falsch).Ist auch hier erklärt: https://github.com/MK-2001/ioBroker.go-e/issues/168#issuecomment-1639802038
Normalerweise sollten von einem System immer nur bestätigte Werte geliefert werden. Unbestätigte werden zu steuern verwendet und dann vom Zielgerät nachträglich bestätigt.
Je nachdem welchen Adapter du verwendest, kommen ggf. auch unbestätigte werte aus dem Adapter zurück, dann muss der Haken bei OnlyAck raus. -
Adapter setzen ihre AUSGANGS-State, d.h. jene States die einen Wert VOM Gerät liefern IMMER mit ack=true. Alles andere wäre falsch.
Schau mal in die go-e Dokumentation, dort gibts ein Beispiel für Fronius
https://github.com/MK-2001/ioBroker.go-e/blob/main/docs/Readme.md#foreign-objects -
hab ich schon alles durch
Die Beschreibung im screenshot sagt auch: "This Adapter is currently consuming only ack = false states."Wenn ich onlyAck wähle habe ich im log einen error:
wähle ich gar nichts von beiden - verhalten wie vorher
ich hab eben ins github repo geschaut und die main.js geöffnet:
EDIT sorry, screenshot ist ein paar zeilen zu hoch, weiter unte ist quasi derselbe text nochmals für die ack=true in Zeile 284
https://github.com/MK-2001/ioBroker.go-e/blob/main/main.jsscheinbar wird nur die house consumption geprüft, wie ich das sehe, oder?
-
@highpressure said in MQTT ack=false forcieren?:
This Adapter is currently consuming only ack = false states.
Dann poste das Problem entweder im go-e Wartungstopic (so es das gibt) und / oder mach ein Issue beim Adapter auf.
Wie oben geschrieben, States die der Adapter xyz mit Werten aus dem Gerät befüllt werden IMMER ack=true haben.
Nur States die DU als Input in den Adapter schreibts müssen ack=false haben. Das kann dann aber nur States des GO-E betreffen, die DU (z.b. via script) beschreibts.
-
@mcm57
Vielen Dank, dann werde ich das im GitHub so tun
DANKE EUCH FÜR DIE HILFE!
PS: habe ChatGPT4 den link zur main.js gegeben und um erklärung gebeten weshalb das so ist:
In the code, checking for ack = false is crucial as it helps ensure that only state changes initiated by external inputs are processed further in the onStateChange method. When ack is false, it indicates that the state change is new or unacknowledged, prompting action to handle this change. If ack were true, it would signify an acknowledged or system-generated state change, which doesn't require further action in this context1.
-
Möglicherweise hat der Adapzter den (in meinen Augen falschen Ansatz) dass hier ein vom User beschreibarer State in der Config eingetragen wird, z.B. 0_userdate.xxxxx. Wenn du diesen eigenen State per Skript beschreibts kann da natürlich ack=false stehen.
Der Ansatz ist aber m.E. falsch, da für das Bearbeiten des States als Input bei einem Adapter gilt:
- Input State === eigener State der Instanz -> ack=false
- Input State === foreign State einer fremden Instanz -> ack=true
Es mag Ausnahmen geben - hier seh ich aber keine.
-
@highpressure sagte in MQTT ack=false forcieren?:
EDIT sorry, screenshot ist ein paar zeilen zu hoch, weiter unte ist quasi derselbe text nochmals für die ack=true in Zeile 284
Gerade nochmal den Code genauer angeschaut. Wenn
state.ack = true
, dann geht es ja hier weiter:Und dann wird geprüft, ob
onlyAck
auch auftrue
steht. Sollte also funktionieren.@highpressure sagte in MQTT ack=false forcieren?:
scheinbar wird nur die house consumption geprüft, wie ich das sehe, oder?
Nein, werden alle geprüft. Siehe 3x
case
da drüber. Code passt aus meiner Sicht.Teil doch am besten nochmal ein Log, wenn Du überall
onlyAck
angehakt hast.@mcm57 sagte in MQTT ack=false forcieren?:
Möglicherweise hat der Adapzter den (in meinen Augen falschen Ansatz)
Der Adapter bietet doch in den Instanzeinstellungen die Option, ob man jeweils
ack: true
oderack: false
verarbeiten möchte. Mehr Optionen braucht man ja nicht. Damit ist alles abgedeckt. Auch dieser MQTT-Fall hier. -
@haus-automatisierung said in MQTT ack=false forcieren?:
Der Adapter bietet doch in den Instanzeinstellungen die Option, ob man jeweils
ack: true
oderack: false
verarbeiten möchte. Mehr Optionen braucht man ja nicht. Damit ist alles abgedeckt. Auch dieser MQTT-Fall hier.Wenn er das tut ist das voll in Ordnung.
Ich hatte nur - ohne den Code zu analysieren - nach dem hier geschriebenen einen anderen Einsruck. -
Die gezeigt Fehlermeldung erscheint, wenn eines der auszulesenden Objekte keinen Wert, bzw. Keinen numerischen Wert beinhaltet.
Bitte stelle sicher, dass alle Objekte eingetragen sind. Und in deren Values auch reale Werte eingetragen sind. Welche Werte bei der Berechnung berücksichtigt werden ist in der Formel bei den Einstellungen ersichtlich.
M.E. Hat die Fehlermeldung nichts mit ack zu tun.
-
go-e.0
12309 2023-10-11 14:03:26.539 silly States user redis pmessage io.mqtt.0.PVGrid.total.pv_power.state/io.mqtt.0.PVGrid.total.pv_power.state:{"val":5288,"ack":true,"ts":1697025806536,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697025806536}go-e.0
12309 2023-10-11 14:03:26.537 silly States user redis pmessage io.mqtt.0.PVGrid.total.load_power.state/io.mqtt.0.PVGrid.total.load_power.state:{"val":5770,"ack":true,"ts":1697025806536,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697025806536}go-e.0
12309 2023-10-11 14:03:26.529 silly States user redis pmessage io.mqtt.0.PVGrid.total.battery_power.state/io.mqtt.0.PVGrid.total.battery_power.state:{"val":-208,"ack":true,"ts":1697025806528,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1697025806528}Das sind auch die Foreign Objects aus dem Setup, die liest er ja scheinbar auch aus und wie im silly log zu lesen sind sie nicht 0.
-
@highpressure Du hast onlyAck ja immernoch nicht angehakt