JsBergbau / AlphaRepeater

Proof of concept Repeater für den Alpha Reader
1 stars 0 forks source link

Blinkcode / via optischem Protokoll direkt auslesen. #2

Open JsBergbau opened 2 years ago

JsBergbau commented 2 years ago

Weiß jemand wie das Optische Protokoll aufgebaut ist? Würde gerne den Reader komplett weglassen und mittels zwei Fotodioden die Blinkenden LEDs an der Pumpe auslesen

Originally posted by @oli477 in https://github.com/JsBergbau/AlphaRepeater/issues/1#issuecomment-996974226

JsBergbau commented 2 years ago

Das wäre eine saubere Option und habe darüber auch schon nachgedacht. Mit einem Logikanalyzer sollte sich das Protokoll dekodieren lassen. Das war mir aber bisher zu aufwändig bzw. den Zeitaufwand nicht wert.

Wenn jemand mehr darüber weiß, sehr gerne hier die Informationen mitteilen.

kuhlix commented 1 year ago

Ich habe mir die optische Schnittstelle an einer Alpha2 Modell E mal angesehen.

Die "Auto-Adapt" LED blinkt mit 9600 Baud, 8 Datenbits, 1 Stoppbit. (NRZ Code mit Ruhepegel = LED ein, falls ich keinen Polaritätsdreher irgendwo habe...) Daten werden in Frames à 88 Byte übertragen. Frames sind getrennt durch eine Pause von etwa 33,5 Bitzeiten. Das macht ca. 10,5 Frames pro Sekunde.

Datenframe

Offset Länge beobachteter / vermuteter Inhalt
0 25 konstant
25 1 Betriebsart (0x03 = Auto-Adapt etc.)
26 4 null
30 2 Volumenstrom [ca. 10/65536 m^3/h]
32 2 Förderhöhe [ca. 10/32768 m]
34 2 meist nach 1 (seltener: 2 od. 3) Min. abwärts zählend
36 2 unregelmäßig (meist nach 1, 2 od. 3 Min.) aufwärts zählend
38 2 Leistung oder Drehzahl?
40 2 Messgröße? (keine Korrelation mit anderen Größen erkennbar)
42 2 Leistung oder Drehzahl?
44 1 Temperatur (negativ, Offset, nicht dieselbe wie 45)
45 1 Pumpentemperatur in C? (sinkt bei steigendem Volumenstrom?!)
46 1 0x33 oder 0x3A
47 1 niedrig aufgelöste Drehzahl/Leistung??
48 1 niedrig aufgelöste Drehzahl/Leistung??
49 1 = Byte 48
50 2 konstant 0x1F01
52 2 0x100, 0x108 oder 0x110 (bei großer Förderhöhe)
54 4 null
58 2 null, selten 0x0004 (bei großer Förderhöhe)
60 2 0x0004, oder null
62 2 Sequenznummer 0xE000..0xFFF0 in 0x10-Schritten
64 16 Daten (Unterkanal)
80 2 Sequenznummer 0x0000..0x01FC in 0x04-Schritten
82 4 Daten (Unterkanal)
86 2 CRC-16, Polynom 0x1012, Anfangswert 0x1f66

(alle Zahlen big-endian, vorzeichenlos)

Das Histogramm von Feld 30..31 sieht übrigens völlig kontinuierlich aus, also keine Sprünge beim Volumenstrom. Der Wert ändert sich etwa einmal pro Sekunde.

Feld 40..41 ist mir ein kleines Mysterium. Bewegt sich wie eine Messgröße, ist aber offenbar unabhängig von Pumpenleistung und Temperatur.

Die Felder 64..79 und 82..85 bilden zwei Datenströme, die offenbar alle 8192 bzw. 512 Byte wiederum Frames bilden. Deren Inhalt ich mir nicht näher angesehen.

Beispieldaten

2654 01E7 0250 0113 0303 0099 4109 9099 1661 3004 0117 0595 3403 0000 0000 2252 13C8 3C66 0461 04EB 5B6C 06BE A32C 336A 6C6C 1F01 0108 0000 0000 0000 0004 FD30 0487 4E3D E2A4 DB8D 5281 E390 DBE1 F1D9 014C FFFF FFFF 0C1A 
2654 01E7 0250 0113 0303 0099 4109 9099 1661 3004 0117 0595 3403 0000 0000 2252 13C8 3C66 0461 04F1 5B67 06C4 A32C 336A 6A6A 1F01 0108 0000 0000 0000 0004 FD40 7DFC B796 6484 26D0 24DE C198 540C E1C8 0150 FFFF FFFF 04E0 
2654 01E7 0250 0113 0303 0099 4109 9099 1661 3004 0117 0595 3403 0000 0000 2252 13C8 3C66 0461 04F1 5B67 06C4 A32C 336A 6A6A 1F01 0108 0000 0000 0000 0004 FD50 BA3D DE6F A2F9 9A6F 83B2 7062 9720 0A48 0154 FFFF FFFF 1864 
2654 01E7 0250 0113 0303 0099 4109 9099 1661 3004 0117 0595 3403 0000 0000 2252 13C8 3C66 0461 04EE 5B65 06C7 A42C 336A 6A6A 1F01 0108 0000 0000 0000 0004 FD60 AD1B 000C 5C78 34F6 DAFF 8C4E 1BDC DBCF 0158 FFFF FFFF 9DA0 
2654 01E7 0250 0113 0303 0099 4109 9099 1661 3004 0117 0595 3403 0000 0000 2252 13C8 3C66 0461 04EE 5B65 06C7 A42C 336A 6A6A 1F01 0108 0000 0000 0000 0004 FD70 BDED 6CEA DAF9 6A37 0890 1618 D819 46AE 015C FFFF FFFF 2282 

Falls jemand tiefer graben möchte -- ich habe gut 24h aufgezeichnet...

Sonstiges

Die "m^3/h" LED sendet bei jedem sichtbaren Blinken eine Folge aus vier bis sechs Pulsen; da könnten also auch Daten drin sein. Habe ich nicht weiter betrachtet, zumal vom Alpha Reader offenbar unbenutzt. (Auf Fotos von dem Gerät sehe ich nur ein mittig gelegenes Fenster für den Empfang von der "Auto Adapt" LED.)

Empfangshardware ist ein Photoempfänger aus Photodiode und zwei Operationsverstärkerstufen. Der Ausgang geht dann in den Line-In Eingang einer USB-Soundkarte. Softwareseitig läuft ein relativ simples C-Programm. Einzelheiten könnte ich bei Interesse sicherlich auf Github stellen, wobei sich da m.E. noch einiges vereinfachen ließe.

Todo

~~Wenn jemand die Prüfsummenberechnung rauskriegen könnte, wäre das sicherlich nützlich.~~ (Update: CRC-Parameter ermittelt mit CRC RevEng) Daten von einem anderen Exemplar wären natürlich auch interessant.

Eventuell ließen sich durch Wechsel der Betriebsart noch mehr Felder erkunden. Das wollte ich aber nicht übertreiben... (zumal im Winter) Es sind ja m.E. auch nur Volumenstrom und Förderhöhe wirklich interessant.

taxilof commented 8 months ago

Hallo @kuhlix, oh das ist ja super. Ich wollte mich schon mit dem Oszi in den Keller setzen. Magst du deinen Code auf github stellen? Wäre cool :-) Ich denke, mit einem ESP32 und passendem Photoempfänger könnte man eine Art DIY Reader bauen... Oder per MQTT die Daten direkt an Home Assistant o.ä. senden lassen.

Danke und viele Grüße taxi

kuhlix commented 7 months ago

Hallo @taxilof,

wichtiger als Software wäre m.E. erstmal eine möglichst simple, leicht nachzubauende Hardware. Diese sollte das Signal digital ausgeben, entweder für den Anschluss an eine RS-232-Schnittstelle oder einen Mikrocontroller-UART. Damit entfiele dann die Notwendigkeit einer Analog-zu-Digitalwandlung, die z.B. ein Raspberry Pi nicht besitzt. Und die Notwendigkeit, das Analogsignal in Software zu verarbeiten.

Hattest du Erfolg beim Empfang des optischen Signals, sei es analog oder digital?

JsBergbau commented 7 months ago

Kann man eventuell einen Tastkopf wie für elektronische Zähler verwenden? An der Fixierung müsste man noch arbeiten. Da lässt sich bestimmt etwas mit dem 3D-Drucker einrichten.

taxilof commented 7 months ago

Nabend. Schön von euch zu lesen :-)

Sehe ich wie kuhlix, das wichtigste wäre eine einfache Hardware. Tastkopf für Zähler geht nicht direkt, die sind auf IR (800nm) ausgelegt. Die LED der Pumpe ist Grün, schätze auf 550nm. Und sehr schwach, ohne Verstärker wird das nichts. Kuhlix, wie sah deine Schaltung aus? Eventuell noch ein rail2rail opamp hinten dran und dann auf einen UART?

Ich hatte mit einem SFH309-5 und Versuche gemacht, aber die LED der Pumpe is echt schwach. Habe dann ein Loch in die Folie geschnitten, damit man die LED direkt sah, das half etwas. Halbwegs gut gings aber nur mit zusätzlichem Transistor.

Eine gute Schaltung habe ich aus der Photodiode/Phototransistor Application Circuit App Note von Sharp. grundfos_SFH309 Seite 5 Figure 11A war am besten (R_1 dabei ~1MΩ und R_2 um die 2kΩ). T1 war BC548A.

Ergab auf dem Oszi dann folgendes am Ausgang: grundfos_oszi Leider war ein nerviges 20kHz Signal überlagert. Das brachte den Hardware-Uart (9600) des angeschlossenen ESP32 sehr durcheinander, mehr als 10 Bytes konnten nie am Stück ohne Fehler gelesen werden. War auch nur fliegender Aufbau, sehr unschön. Aber Fazit: Phototransistor ist nicht empfindlich genug (wenn man die Folie der Pumpe ganz lassen will).

Mein Plan wäre jetzt eine gute Photodiode mit einem Transimpedanzwandler auf zu bauen + entsprechende Nachverarbeitung (vielleicht reicht schon ein Schmitt-Trigger wie beim Volkszähler für ein gutes UART Signal.

Soweit mal 👍

/edit: es gibt spezielle Ambient-Light Sensoren die gut bei ~500nm sind (z.b. TEPT5600), aber zumindest die Phototransistoren sind zu lahm dann (rise time 50 bis 300µs bei .. äh grob 100µs pro bit sind zu wenig?). Der TEMD6200FX01 könnte vielleicht gut passen.

Grüße taxilof

kuhlix commented 6 months ago

Hallo zusammen,

meine Empfangshardware "Version 1" sah folgendermaßen aus:

Da ich noch nicht wusste, was für ein Signal zu erwarten war, habe ich mir einen universellen Photoempfänger (ca. 3,4 Hz - 45 kHz) gebastelt:

schaltplan

Die Bauteile habe ich aus meinem Fundus ausgesucht, also nichts speziell für diesen Zweck optimiertes.

Das Ausgangssignal (Nutzsignal in der Größenordnung 20mVpp) ging in den Line-In-Eingang einer USB-Soundkarte, um anschließend in Software gefiltert und dekodiert zu werden.

Mit dem Wissen, dass es sich um ein UART-Signal handelt, wollte ich daraufhin einen angepassten Empfänger basteln, der direkt an einen RS-232-Port angeschlossen wird. Dieser Empfänger "Version 2" ist bislang noch nicht weit genug gediehen.

Störungen

@taxilof: Schön zu sehen, dass du ähnliche Beobachtungen wie ich gemacht hast, dass nämlich das Signal ziemlich schwach und von Störungen überlagert ist. Ich habe an der Pumpe nichts modifiziert.

Störungen durch den 100Hz-Flicker der Raumbeleuchtung wurden durch eine ausreichende Abschirmung des Sensors gegen Streulicht behoben.

Außerdem war das Signal von einer starken Störung bei etwa 17,9kHz überlagert, deren Amplitude mit 100Hz schwankte – also offensichtlich von einem Schaltnetzteil:

SCR07 Ausgangssignal, ohne Abschirmblech

Zuerst habe ich das in Software rausgefiltert (Notch-Filter in Audacity). Einfacher und effektiver war jedoch eine magnetische Abschirmung aus einem Stück 0,75mm Stahlblech (Baumarkt). (Edit: Hat glaube ich doch nichts mit dem Material zu tun.)

@taxilof: Das Signal auf deinem Oszillogramm sieht ja bereits ziemlich gut aus – vielleicht würde schon das besagte Stückchen Blech für erfolgreichen Empfang sorgen.

Fotos vom Aufbau

Aufbau auf Lochrasterplatine, im Gehäuse. Photodiode mit schwarzem Moosgummi und Isolierband gegen Streulicht geschirmt – Das Abschirmblech wurde einseitig auf der hier nicht sichtbaren Unterseite am Gehäuse angebracht.

Edit

Mit meinem Stahlblech bzw. mit der unausgesprochenen Annahme, dass es sich um magnetische (induktive) Störungen handelt, war ich wohl etwas auf dem Holzweg. Mittlerweile gehe ich davon aus, dass das kapazitiv einkoppelt. Man halte nur mal eine Hand vor die Pumpe und die andere vor den offenen 1MΩ-Eingang eines Oszilloskops... da ist "unser" Störsignal schon gut zu empfangen. Habe noch keine zufriedenstellende Bastellösung für die Abschirmung des Fensters gefunden. Hier kann man sehen, wie das am kommerziellen Produkt aussieht: https://youtu.be/ok_igbPufgg?t=80 (wabenförmiges Metallgitter vor der Photodiode)