in esp8266 Ausreißer eliminieren

OP #7512273
Lesenswert?

Hallo,

ich lese mit einem esp8266 die ve.direct Schnittstelle eines Victron Wechselrichters aus. Es wird unter anderem der Spannungswert des Akku ausgelesen. Der Akkuwert liegt immer zwischen 44 V und 57 V. Komischer weise werden immer wieder Werte "0V" eingelesen bzw. gemeldet. Ich möchte gerne diese Ausreißer direkt im esp8266 weg filtern. die sollen nicht am Home assistant weiter gegeben werden.

folgendes habe ich mir ausgedacht: Der aktuelle spannungswert wird in einen Merker geschrieben. Wenn der nächste ausgelesene Wert < 40 V ist, wird der Wert des Merker eingesetzt. Gleiches gilt für Stromwerte. Hier gibt es auch schlimme Spitzen, die mir meine Grafik verhageln. Das kann ja sein, dass der Wechselrichter ein peek raus haut, wenn z.B. eine große Last zugeschaltet wird. Zumindest muss hier der Wert begrenzt werden, der an Home assistant weiter gegeben wird.

Gibt es wo eine Befehlsliste, was ich im ESP alles programmieren kann ?

Wenn jemand so nett wäre, mir da auf die Sprünge zu helfen wäre ich dankbar. Eventuell paar programmierzeilen, wie ich den Code in ESPHome ergänzen muss. Vielen Dank.

Offiziell ist die ve.direct Schnittstelle von Victron nicht dafür vorgesehen, dass man nmit esp8266 Daten ausliest. Ich vermute, dass darin der Grund liegt, dass es ausreisser gibt. Auch habe ich eine 15m Leitung vom Wechselrichter zum esp8266, da am Wechselrichter kein wlan vorhanden ist.

#7512319
Lesenswert?

Jochen B. schrieb:

ve.direct Schnittstelle

Das scheint nach den Konformitätserklärungen eine RS232 oder RS485 zu sein.

Jochen B. schrieb:

ich lese mit einem esp8266 die ve.direct Schnittstelle eines Victron Wechselrichters aus.

Wie machst du das? Zeig das verwendete Programm oder poste einen Link auf die Sourcen.

Jochen B. schrieb:

Komischer weise werden immer wieder Werte "0V" eingelesen bzw. gemeldet.

Dann zeig Mal einen Verlauf der Werte der das Problem zeigt. Prosa ist um ein Signal zu beschreiben meist schlecht.

Jochen B. schrieb:

Ich möchte gerne diese Ausreißer direkt im esp8266 weg filtern. die sollen nicht am Home assistant weiter gegeben werden.

Wieso das? Deine Home Assist Instanz hat vermutlich tausend Mal mehr Rechenpower und anscheinend kann man von Haus aus filtern: https://www.home-assistant.io/integrations/filter/

Jochen B. schrieb:

Gibt es wo eine Befehlsliste, was ich im ESP alles programmieren kann ?

Die Frage verstehe ich nicht. Du kannst alles programmieren was du willst. Durch die Frage vermute ich allerdings dass du selbst noch nicht großartig selbst programmiert hast. Du musst halt den seitherigen Code anpassen und einen Filter an geeigneter Stelle programmieren.

Jochen B. schrieb:

Eventuell paar programmierzeilen, wie ich den Code in ESPHome ergänzen muss.

Ah okay ESPHome. Hätte man gleich schreiben können.

Jochen B. schrieb:

Ich vermute, dass darin der Grund liegt, dass es ausreisser gibt.

Das glaube ich nicht.

Jochen B. schrieb:

Auch habe ich eine 15m Leitung vom Wechselrichter zum esp8266, da am Wechselrichter kein wlan vorhanden ist.

Ist sowohl bei RS485 als auch bei RS232 kein Problem wenn die Verkabelung OK ist. Mach Mal 2-3 Fotos davon.

OP #7512388
Lesenswert?

Hallo, vielen Dank für Eure Hilfe. Hier ein Bild, was da an Daten ankommt. Man sieht schön, dass da immer wieder Null-Werte dabei sind.

Hier ein auszug des Code vom ESP8266:

1
external_components:
2
  - source: github://KinDR007/VictronMPPT-ESPHOME@main
3

4
uart:
5
  id: uart3
6
  tx_pin: D8  # Not used! The communication is read-only
7
  rx_pin: D7
8
  baud_rate: 19200
9
  rx_buffer_size: 256
10

11
victron:
12
  id: victron0
13
  uart_id: uart3
14

15
sensor:
16
  - platform: homeassistant
17
    name: "abfrage_intervall"  
18
    device_class: duration
19
    entity_id: input_number.wert_vz_ferraris
20
    unit_of_measurement: "s"
21

22
  - platform: victron
23
    victron_id: victron0
24
   
25
    panel_voltage:
26
      name: "Panel voltage"
27
      filters:
28
      - throttle: 30s
29

30
    battery_voltage:
31
      name: "Battery voltage"
32
      filters:
33
        - min:
34
            window_size: 50
35
            send_every: 4
36
            send_first_at: 3
37

38
        - clamp:
39
            min_value: 44
40
            max_value: 60
41
      #  - throttle:  1s
42

43

44
    battery_current:
45
      name: "Battery current"
46
      filters:
47
        - clamp:
48
            min_value: -50
49
            max_value: 50
50
        - throttle:  5s
51

52
    yield_today:
53
      name: "Leistung Tag"
54
      filters:
55
      - throttle: 30s
56

57
    max_power_yesterday:
58
      name: "max_power_yesterday" 
59
      filters:
60
      - throttle: 30s
61
      
62
    max_power_today:
63
      name: "max_power_today" 
64
      filters:
65
      - throttle: 30s
66
      
67
    yield_total:
68
      name: "yield_total" 
69
      filters:
70
      - throttle: 30s

wobei battery_voltage und battery_current schon code experiment ist. Bei der Grafik war da der gleiche Code wie bei den anderen Parmatern. Bild DC2 ist mit dem experment-Code. Nicht zielführend, leider. Was muss ich programmieren, um die Null-ausreiser weg zu bekommen ? Ich möchte das gerne auf der esp-Seite machen, in Home Assistant wird das alles zu viel. Da gibt es schon einiges an Code.

Ich habe vor 20 Jahren beruflich SPS Programmiert. Dann net mehr, dafür aber viel in Visual basic. Hier bin ich neu am start, muss mich da erst rein fuchsen. Am liebsten wäre mir ne "if then" Abfrage, wenn der Wert < 40 ist wird der Wert des Merker genommen, also ein Wert, der kurz davor korrekt ausgelesen wurde. soweit ich das gelesen habe, rechnen die Filter nen Mittelwert aus den empfangenen Werten. Das kann ich so nicht machen, das verfälscht zu arg.

Angehängte Dateien:
#7512438
Lesenswert?

Jochen B. schrieb:

esp8266 die ve.direct Schnittstelle eines Victron Wechselrichters aus. Es wird unter anderem der Spannungswert des Akku ausgelesen. Der Akkuwert liegt immer zwischen 44 V und 57 V. Komischer weise werden immer wieder Werte "0V" eingelesen bzw. gemeldet.

Log mal am ESP mit was der von dem Victron empfängt in HA weisst du was er sendet. Vergleichen ....

Sind die Fehler im Empfang vom ESP von dem Victron oder bei der Übertragung zu HA?

Frägst du den Victron zu schnell ab, oder liegts am ESP ?? Warum gehen alle den "konfortablen Weg" bevor eine genaue Analyse des Problems angegangen wird.

OP #7512605
Lesenswert?

Hallo,

mit dem Median Filter geht es, die Null-Werte werden ausgegrenzt.

hier ein log vom espHome:

1
[11:17:27][W][component:204]: Component esphome.coroutine took a long time for an operation (0.07 s).
2
[11:17:27][W][component:205]: Components should block for at most 20-30ms.
3
[11:17:28][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
4
[11:17:28][D][text_sensor:064]: '${name} error': Sending state 'No error'
5
[11:17:28][D][sensor:093]: 'yield_total': Sending state 97900.00000 Wh with 0 decimals of accuracy
6
[11:17:28][D][sensor:093]: 'day_number': Sending state 19.00000  with 0 decimals of accuracy
7
[11:17:28][W][component:204]: Component esphome.coroutine took a long time for an operation (0.08 s).
8
[11:17:28][W][component:205]: Components should block for at most 20-30ms.
9
[11:17:29][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
10
[11:17:29][D][text_sensor:064]: '${name} error': Sending state 'No error'
11
[11:17:29][D][sensor:093]: 'Battery voltage': Sending state 52.86000 V with 3 decimals of accuracy
12
[11:17:29][W][component:204]: Component esphome.coroutine took a long time for an operation (0.10 s).
13
[11:17:29][W][component:205]: Components should block for at most 20-30ms.
14
[11:17:30][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
15
[11:17:30][D][text_sensor:064]: '${name} error': Sending state 'No error'
16
[11:17:30][D][sensor:093]: 'yield_yesterday': Sending state 5300.00000 Wh with 0 decimals of accuracy
17
[11:17:30][D][victron:1026]: Unhandled property: H2\xa6H\x9a\xca\xca^HjEM%19
18
I 16400
19
[11:17:30][W][component:204]: Component esphome.coroutine took a long time for an operation (0.08 s).
20
[11:17:30][W][component:205]: Components should block for at most 20-30ms.
21
[11:17:31][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
22
[11:17:31][D][text_sensor:064]: '${name} error': Sending state 'No error'
23
[11:17:31][D][sensor:093]: 'max_power_yesterday': Sending state 2399.00000 W with 0 decimals of accuracy
24
[11:17:31][D][sensor:093]: 'Battery current': Sending state 16.40000 A with 3 decimals of accuracy
25
[11:17:31][W][component:204]: Component esphome.coroutine took a long time for an operation (0.08 s).
26
[11:17:31][W][component:205]: Components should block for at most 20-30ms.
27
[11:17:32][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
28
[11:17:32][D][text_sensor:064]: '${name} error': Sending state 'No error'
29
[11:17:32][W][component:204]: Component esphome.coroutine took a long time for an operation (0.07 s).
30
[11:17:32][W][component:205]: Components should block for at most 20-30ms.
31
[11:17:33][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
32
[11:17:33][D][text_sensor:064]: '${name} error': Sending state 'No error'
33
[11:17:33][D][sensor:093]: 'Battery voltage': Sending state 52.86000 V with 3 decimals of accuracy
34
[11:17:33][W][component:204]: Component esphome.coroutine took a long time for an operation (0.07 s).
35
[11:17:33][W][component:205]: Components should block for at most 20-30ms.
36
[11:17:34][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
37
[11:17:34][D][text_sensor:064]: '${name} error': Sending state 'No error'
38
[11:17:34][W][component:204]: Component esphome.coroutine took a long time for an operation (0.10 s).
39
[11:17:34][W][component:205]: Components should block for at most 20-30ms.
40
[11:17:35][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
41
[11:17:35][D][text_sensor:064]: '${name} error': Sending state 'No error'
42
[11:17:35][W][component:204]: Component esphome.coroutine took a long time for an operation (0.13 s).
43
[11:17:36][W][component:205]: Components should block for at most 20-30ms.
44
[11:17:36][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
45
[11:17:36][D][text_sensor:064]: '${name} error': Sending state 'No error'
46
[11:17:36][D][sensor:093]: 'Battery current': Sending state 16.40000 A with 3 decimals of accuracy
47
[11:17:36][W][component:204]: Component esphome.coroutine took a long time for an operation (0.11 s).
48
[11:17:36][W][component:205]: Components should block for at most 20-30ms.
49
[11:17:37][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
50
[11:17:38][D][text_sensor:064]: '${name} error': Sending state 'No error'
51
[11:17:38][W][component:204]: Component esphome.coroutine took a long time for an operation (0.09 s).
52
[11:17:38][W][component:205]: Components should block for at most 20-30ms.
53
[11:17:39][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
54
[11:17:39][D][text_sensor:064]: '${name} error': Sending state 'No error'
55
[11:17:39][D][sensor:093]: 'Battery voltage': Sending state 52.86000 V with 3 decimals of accuracy
56
[11:17:39][W][component:204]: Component esphome.coroutine took a long time for an operation (0.11 s).
57
[11:17:39][W][component:205]: Components should block for at most 20-30ms.
58
[11:17:39][W][victron:093]: Last transmission too long ago
59
[11:17:40][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
60
[11:17:40][D][text_sensor:064]: '${name} error': Sending state 'No error'
61
[11:17:40][W][component:204]: Component esphome.coroutine took a long time for an operation (0.08 s).
62
[11:17:40][W][component:205]: Components should block for at most 20-30ms.
63
[11:17:41][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
64
[11:17:41][D][text_sensor:064]: '${name} error': Sending state 'No error'
65
[11:17:41][W][component:204]: Component esphome.coroutine took a long time for an operation (0.12 s).
66
[11:17:41][W][component:205]: Components should block for at most 20-30ms.
67
[11:17:42][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
68
[11:17:42][D][text_sensor:064]: '${name} error': Sending state 'No error'
69
[11:17:42][D][sensor:093]: 'Battery current': Sending state 16.30000 A with 3 decimals of accuracy
70
[11:17:42][D][sensor:093]: 'panel_power': Sending state 998.00000 W with 0 decimals of accuracy
71
[11:17:42][W][component:204]: Component esphome.coroutine took a long time for an operation (0.08 s).
72
[11:17:42][W][component:205]: Components should block for at most 20-30ms.
73
[11:17:43][D][text_sensor:064]: '${name} charging mode': Sending state 'Bulk'
74
[11:17:43][D][text_sensor:064]: '${name} error': Sending state 'No error'
75
[11:17:43][D][victron:1026]: Unhandled property: )\xa6J1043
76
H22 530

ich glaube, dass das an der Hardware des Victron liegt. Ich habe da Bleiakku dran. Dieser Wechselrichter ist vergleichsweise "neu" entwickelt. Gut, die Komponenten mit der der Akku geladen wird, stammt von ausgereifen älteren Geräten. Aber am ende wird doch auch immer an der Software was gedreht. Ich glaube mich erinnern zu können, dass ich im log vom espHome auch schon Null-Werte gesehen habe, dass also der Victron diese Werte schickt. wobei ich nicht wusste, ob das nicht von dem langen Kabel kommt, das ja auch direkt mit 230V AC Kabel im Kabelkanal liegt. Da könnte auch was durch EMV kommen. Das kleine Kabel ist aber geschirmt und ich habe eine Seite des Schirms auf Erde gelegt. Es geht jetzt ja, alles gut. Bevor ich hier angefragt habe, habe ich schon einiges gemacht, um den Fehler selbst beheben zu können. Unter anderem auch die Zeit der Abfragen im esp8266 geändert. Da nur der Wert DC Spannung rum zickt, zeigt das auch, dass es net an der Verbindung bzw. EMV liegen kann, denn dann müstten ja alle Werte "spinnen"

#7512708
Lesenswert?

Jochen B. schrieb:

soweit ich das gelesen habe, rechnen die Filter nen Mittelwert aus den empfangenen Werten.

Das ist der falsche Weg, wenn es um Ausreißer geht. Eine Mittelwertrechnung verschmiert die Peaks lediglich über mehrere Werte.

Jochen B. schrieb:

Da könnte auch was durch EMV kommen.

EMV ist bestimmt nicht Schuld an irgendwelchen Störungen. Elektromagnetische Verträglichkeit sorgt ganz im Gegenteil dafür, dass trotz irgendwelcher äußeren Einflüsse die Daten heil übertragen werden.

#7512717
Lesenswert?

Rainer W. schrieb:

Das ist der falsche Weg, wenn es um Ausreißer geht. Eine Mittelwertrechnung verschmiert die Peaks lediglich über mehrere Werte.

Deshalb der Vorschlag mit dem Median. Da hat er das Problem nicht. Bei nur wenigen Werten ist der Aufwand was Speicher und Rechenzeit angeht auch vertretbar.

Rainer W. schrieb:

EMV ist bestimmt nicht Schuld an irgendwelchen Störungen. Elektromagnetische Verträglichkeit sorgt ganz im Gegenteil dafür, dass trotz irgendwelcher äußeren Einflüsse die Daten heil übertragen werden.

Ich vermute auch eher dass ESPHome ab und zu evtl korrupte Daten sieht (vllt CRC Fehler o.ä.) und dann die Werte abnullt.

Andreas B. schrieb:

Beim ESP sollte man waehrend der ADC Messungen das WiFi ausschalten.

Er nutzt doch eine digitale Schnittstelle (siehe oben).

#7513845
Lesenswert?

N. M. schrieb:

Andreas B. schrieb:

Beim ESP sollte man waehrend der ADC Messungen das WiFi ausschalten.

Er nutzt doch eine digitale Schnittstelle (siehe oben).

Was genutzt wird, spielt dabei doch gar keine Rolle. Sobald der WLAN-Block des ESP sendet, stört er, egal ob er Nutzerdaten sendet oder nur sagt "hier bin ich". Durch Abschalten des WLANs lässt sich zuverlässig verhindern, dass der Block mit seiner Sendetätigkeit im wahrsten Sinne des Wortes dazwischen funkt.

#7514496
Lesenswert?

Rainer W. schrieb:

Was genutzt wird, spielt dabei doch gar keine Rolle.

Wenn der TO keinen ADC verwendet gebt ihr im den Rat das WLAN abzuschalten weil das die Qualität der ADC Messung verbessert. Sorry, das ist Bullshit! Was hat das mit dem Problem des TO zu tun? Er nutzt den ESP als Gateway zwischen seinem Wechselrichter (ve.direct/Rs232/485) und seinem Heimnetz (hier über WLAN).

Rainer W. schrieb:

Sobald der WLAN-Block des ESP sendet, stört er, egal ob er Nutzerdaten sendet oder nur sagt "hier bin ich".

Du willst mir also weiß machen dass die paar mW der WLAN Endstufe eine RS232/485 Schnittstelle stören? Denn genau darum geht es hier. In der Industrie hab ich hundert Meter Kabel parallel zu einer Motorleitung über die mehrere kW gehen und die RS485 verliert kein einziges Paket! Und das 24/7!

Rainer W. schrieb:

Durch Abschalten des WLANs lässt sich zuverlässig verhindern, dass der Block mit seiner Sendetätigkeit im wahrsten Sinne des Wortes dazwischen funkt.

Wenn du meinst. Für mich ist das praxisfern. Eine vernünftige digitale Übertragung störst du mir denn bisschen WLAN nicht. Zumindest nicht wenn du ein vernünftiges PCB hast.

#7514851
Lesenswert?

Andreas B. schrieb:

Dann wuerde ich aber trotzdem mal eruieren woher diese Streuungen in der Messung kommmen, anstatt an den Symptomen herumzuflicken.

Ja, da gebe ich dir Recht. Hätte ich persönlich auch so gemacht. Bilder vom Aufbau hat er trotz Nachfragen nicht geschickt. Wahrscheinlich so wie immer nichts geschirmt noch verdrillt.

Da er schreibt dass mehrere Werte ausfallen gehe ich eher von einem Übertragungsproblem auf der digitalen Schnittstelle aus. Wahrscheinlich gehen Frames verloren und ESPHome erfindet dann keine passenden Ersatzwerte. Könnte man bestimmt im Code nachlesen wenn Opensource, habe ich aber keine Lust dazu.

Ansonsten wäre es ja merkwürdig dass die Werte alle null sind. Dann müsste man auch Mal andere Werte sehen oder Ausreißer nach oben...

Edit: Typo

#7514937
Lesenswert?

Andreas B. schrieb:

Dann wuerde ich aber trotzdem mal eruieren woher diese Streuungen in der Messung kommmen, anstatt an den Symptomen herumzuflicken.

Wenn da wirklich an Stelle sinnvoller Messwerte irgendwelche "0V"-Werte auftauchen, hat das nichts mit Streuung von Messwerten zu tun. Da wird es höchste Zeit, direkt auf der seriellen Schnittstelle zu gucken, was der Victron Wechselrichters wirklich von sich gibt. Falls man dann zu der Erkenntnis kommt, dass die Daten mit den unsinnigen "0V" so vom Victron WR kommen, wird man nicht umhin kommen, sie heraus zu filtern, sonst ist die Software auf dem ESP schuld.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren