Open JsBergbau opened 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.
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.
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.
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...
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.
~~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.
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
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?
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.
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.
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:
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
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:
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.
@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:
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.
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.
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)
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