solectrus / mqtt-collector

Collect data from MQTT broker and push it to InfluxDB 2 for use with SOLECTRUS
Other
6 stars 2 forks source link

Ausreißer erkennen und ignorieren #237

Closed ledermann closed 2 months ago

ledermann commented 2 months ago

In seltenen Fällen kommen über den MQTT-Broker Werte, die offensichtlich nicht stimmen können.

Es wurde von Fällen berichtet, wo ein Growatt Wechselrichter manchmal den Messwert 2.1475e+08 für Erzeugung und Hausverbrauch gemeldet hat.

Solche viel zu großen Werte sollten ignoriert werden. Eine Möglichkeit wäre, dafür eine zusätzliche Variable zu definieren, etwa so:

MAPPING_X_MAX=10000
frizzle0815 commented 2 months ago

Ich würde eine solche Funktion sehr begrüßen! Bei mir läuft ein Wechselrichter von Solis mit Pylontech Speicher. Ich lese den Wechselrichter über Modbus aus und verteile die Werte über mqtt. Wenn der Speicher morgens leer ist und eigentlich nur 0 Werte für Speicher Ladung/Entladung ausgeben sollte, dann treten stattdessen laufend "nervöse Zuckungen" auf, die unrealistisch hohe Werte beinhalten. Derzeit filtere ich solche Werte über Umwege selbst heraus.

ledermann commented 2 months ago

Ich habe das jetzt mal ergänzt. Es läuft so:

In der .env können optional zwei Variablen MAPPING_X_MIN und MAPPING_X_MAX definiert werden, z.B. so:

MAPPING_0_TOPIC=senec/0/ENERGY/GUI_INVERTER_POWER
MAPPING_0_MEASUREMENT=PV
MAPPING_0_FIELD=inverter_power
MAPPING_0_TYPE=integer
MAPPING_0_MIN=5
MAPPING_0_MAX=15000

Bei Über- oder Unterschreitung wird ein Messwert ignoriert. Alles wird im Log protokolliert.

@frizzle0815 und @f1nch87: Ihr könnte das ausprobieren, indem ihr den MQTT-Collector auf die Entwickler-Version (develop) umstellt:

...
mqtt-collector:
  image: ghcr.io/solectrus/mqtt-collector:develop
environment:
  - MAPPING_1_TOPIC
  - MAPPING_1_MEASUREMENT
  - MAPPING_1_FIELD
  - MAPPING_1_TYPE
  - MAPPING_1_JSON_KEY
  - MAPPING_1_MIN
  - MAPPING_1_MAX
  ....

Nicht vergessen: Die beiden neuen Variablen (je Mapping, wenn benutzt!) müssen auch im compose.yaml erwähnt werden, sonst erhält der Container keinen Zugriff darauf.

Wenn es funktioniert (bitte Feedback!) werde ich ein neues Release erstellen.

f1nch87 commented 2 months ago

Ok thank you for your work. I will try it when im home

Ok wieso auch immer ich englisch geschrieben habe :D

frizzle0815 commented 2 months ago

Hallo Georg, die Installation hat bei mir problemlos funktioniert. Ich habe ein extra test-Topic angelegt mit Min 35 und Max 22000.

Im log sieht das so aus (gefiltert):

Subscribing to 17 topics:
- solectrus/test               => pv:test (35 ≥ float ≤ 22000)

2024-09-10T07:46:31.255418254Z   topic = solectrus/test
2024-09-10T07:46:31.255513859Z   Ignoring test: 34.0 is below minimum of 35.0
2024-09-10T07:46:35.086969174Z   topic = solectrus/test
2024-09-10T07:46:35.087201889Z   => pv:test = 35.0
2024-09-10T07:46:38.578738041Z   topic = solectrus/test
2024-09-10T07:46:38.578833629Z   => pv:test = 36.0
2024-09-10T07:47:41.085111720Z   topic = solectrus/test
2024-09-10T07:47:41.085373384Z   => pv:test = 21999.0
2024-09-10T07:47:45.034248850Z   topic = solectrus/test
2024-09-10T07:47:45.034401698Z   => pv:test = 22000.0
2024-09-10T07:47:50.665869874Z   topic = solectrus/test
2024-09-10T07:47:50.665964311Z   Ignoring test: 22001.0 exceeds maximum of 22000.0
2024-09-10T07:48:29.637887468Z   topic = solectrus/test
2024-09-10T07:48:29.637982855Z   Ignoring test: 34.9 is below minimum of 35.0
2024-09-10T07:48:33.577558200Z   topic = solectrus/test
2024-09-10T07:48:33.577660718Z   Ignoring test: 22000.1 exceeds maximum of 22000.0

Anschließend habe ich in influxdb geprüft, dass die gefilterten Werte auch tatsächlich nicht in der Datenbank gespeichert wurden, was der Fall ist. Momentan sieht es also sehr gut aus!

Zur Vollständigkeit sei erwähnt, dass mein erster Test gestern Abend Probleme verursacht hat. Ich kann allerdings nicht sagen, ob der Fehler bei mir oder bei Solectrus lag. Es war jedenfalls so, dass ich den gleichen Test wie heute morgen durchgeführt habe und die Werte scheinbar zutreffend gefiltert wurden. Anschließend wurden laut log die entsprechenden Werte jedoch immer und immer wieder erneut geprüft - wie in einer Dauerschleife. Gleichzeitig konnte ich in meinem mqtt Explorer aber sehen, dass die Werte auch tatsächlich immer wieder erneut gesendet wurden - ohne dass ich dies angestoßen hätte. Meine Vermutung geht dahin, dass es sich um ein QoS Problem handelte. Bei mir werden die Werte standardmäßig mit QoS 1 gesendet. Ich bin kein mqtt Profi, aber so wie ich es verstanden habe, versucht der Server die Werte immer wieder erneut zu senden, wenn er (z.B. von Solectrus) keine Rückmeldung erhält, dass der Wert empfangen wurde. Vielleicht gab es hier ein Problem... Ich habe daraufhin bei mir alles auf QoS 0 umgestellt, aber auch mit 1 scheint es jetzt zu funktionieren. Keine Ahnung, ob Du seit gestern noch einmal etwas geändert hast. Für den Test heute Morgen habe ich jedenfalls noch einmal ein neues Docker Image gezogen.

ledermann commented 2 months ago

@frizzle0815 Sehr gut, danke für den ausführlichen Test!

Ich verwende bei mir schon immer QoS 1 (mit ioBroker) und kann mich an keinerlei Probleme damit erinnern. Ich verstehe QoS 1 genau wie du - jede Message muss mindestens einmal zugestellt worden sein, d.h. der Client muss jede Message bestätigen, sonst schickt der Broker sie erneut.

Außer der gestern bereitgestellten Aktualisierung des Docker-Images gab es nichts, was damit irgendwie in Verbindung stehen könnte. Insofern wüsste ich nichts, was ich verbessern könnte.

Ein Szenario könnte ich mir aber eventuell so vorstellen: Vielleicht hast du bei deinen ersten Versuchen noch das alte Image des SENEC-Collectors verwendet, dass die Test-Nachricht gar nicht abonniert hatte.

Wie dem auch sei: QoS 1 wäre auch meine Empfehlung - und da es nun bei dir funktioniert, verfolge ich das nicht weiter, sofern es keine neuen Hinweise geben sollte.

f1nch87 commented 2 months ago

Ich muss erst nochmal Solectrus ordentlich in Portainer aufsetzen, weil ich zu doof bin die variablen im normalen docker zu verändern.

Mal schauen ob er die influx daten behällt aber wahrscheinlich nicht würde ich sagen.

ledermann commented 2 months ago

@f1nch87 Portainer ist ein prima Tool, aber Neuaufsetzen nur um die Variablen zu ergänzen, sollte nicht nötig sein. Ich hatte oben beschrieben, wie es geht. Wo hakt es denn?

f1nch87 commented 2 months ago

Es hackt nur an meiner Faulheit. Habe portainer erst nachträglich auf dem lxc aufgesetzt. Daher kann ich nicht einfach in der .yaml und .env herumschreiben und neu deployen so wie ich es von anderen containern gewohnt bin. Direkt in docker über die Kommandozeile habe ich noch nichts gemacht bislang.

Denke ich lerne die influx daten zu sichern und zu importieren und dann setzte ich solectrus direkt in portainer auf um mich wieder etwas mehr zurechtzufinden.

f1nch87 commented 2 months ago

Also bei mir scheint es mit den zusätzlichen Variablen zu funktionieren.

Danke dafür

ledermann commented 2 months ago

Sehr schön, danke für die Rückmeldungen.

Ich habe nun v0.3.0 des MQTT-Collectors veröffentlicht, Ihr könnt also wieder auf latest wechseln: https://github.com/solectrus/mqtt-collector/releases/tag/v0.3.0

Die Wiki-Seite mit der Doku ist ebenfalls aktualisiert: https://github.com/solectrus/mqtt-collector/wiki/Konfiguration