Forum: Haus & Smart Home in esp8266 Ausreißer eliminieren


von Jochen B. (kleiner_schelm)


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.

: Verschoben durch Moderator
von N. M. (mani)


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.

von N. M. (mani)


Lesenswert?

N. M. schrieb:
> Ah okay ESPHome.

Scheinbar gibt es einen einfachen Median Filter. Der sollte den Spike 
einfach entfernen:
https://esphome.io/components/sensor/index.html#median

von Jochen B. (kleiner_schelm)


Angehängte Dateien:

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.

: Bearbeitet durch User
von Jochen B. (kleiner_schelm)


Lesenswert?

Ich hab jetzt den Median Filter programmiert. Schein das Problem zu 
beheben. Vielen Dank.

von Chris K. (kathe)


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.

von Jochen B. (kleiner_schelm)


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"

: Bearbeitet durch User
von Rainer W. (rawi)


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.

von Andreas B. (bitverdreher)


Lesenswert?

Beim ESP sollte man waehrend der ADC Messungen das WiFi ausschalten.
Ist ein bekanntes Probelm bei diesen Dingern.

von N. M. (mani)


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).

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Beim ESP sollte man den ADC erst gar nicht benutzen. Mit einem 
Zufallszahlengenerator erreicht man die gleiche Genauigkeit.

von Jochen B. (kleiner_schelm)


Lesenswert?

Danke für die Hilfe. Es geht ja jetzt mit dem Median Filter. Es gibt 
doch bei den anderen Parameterwerten ab und an auch nen falschen Wert. 
Ich habe deshalb ziemlich überall den Filter programmiert.

von Rainer W. (rawi)


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.

von N. M. (mani)


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.

von Andreas B. (bitverdreher)


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).

Stimmt, habe ich ueberlesen. Nehme alles zurueck.
Dann wuerde ich aber trotzdem mal eruieren woher diese Streuungen in der 
Messung kommmen, anstatt an den Symptomen herumzuflicken.

: Bearbeitet durch User
von N. M. (mani)


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

: Bearbeitet durch User
von Rainer W. (rawi)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.