Joey-1970 / Mopeka

1 stars 0 forks source link

Dokumentation zu Mopeka Sensoren? #1

Open mhaberler opened 2 years ago

mhaberler commented 2 years ago

hallo @Joey-1970

ich schreibe an einem Dekoder für Mopeka in C++ und Dein Repo ist sehr hilfreich!

Frage - woher hast Du die Dokumentation der Mopeka-Protokolle? oder ist das auf anderen Code-Beispielen basiert?

ich habe versucht, mit Mopeka Kontakt aufzunehmen - leider null response

danke im voraus,

Michael

Joey-1970 commented 2 years ago

Hallo Michael,

bei MOPEKA hatte ich auch angefragt - null Reaktion. So etwas empfinde ich jetzt nicht ganz schön, zumindest hätte man ja schreiben können das man das Protokoll nicht veröffentlichen möchte...

Wie auch immer: Was den Pro Gas-Sensor angeht, so sollte die Auswertung so weit korrekt sein, beim Standard Gas-Sensor fehlen die Mess-Qualität und das Wichtigste: Der Gas-Level...

Viele Informationen habe ich aus diesem Projekt. Für den Standard-Sensor verstehe ich die Auswertung leider nicht was die beiden fehlenden Werte angeht. Wenn Du da erfolgreicher sein solltest, wäre es super wenn Du mir den "Trick" verraten würdest...

So weit ich Dir Fragen beantworten kann, werde ich versuchen Dich da zu unterstützen...

Joachim

Hier noch ein weiterer Link zum Pro Gas-Sensor

mhaberler commented 2 years ago

Joachim,

danke für die rasche Antwort!

leider weiss ich zum Standard-Sensor auch nicht mehr als das von Dir verlinkte Repo; in meinem Fall kein Problem, da der Pro Sensor deutlich besser funktioniert und eben auch Beispiele zu finden sind

mein Code klappt soweit mit einem ESP32 und es ist eine 1:1 Transliteration

es scheint so zu sein, dass man die Advertisement/Messrate mit dem grünen Button konfigurieren kann, habe aber dazu keinen Hinweis gefunden - weisst Du da etwas? (https://github.com/spbrogan/sensor.mopeka_pro_check/issues/17#issue-1214834763)

schade, an sich ein Super-Produkt..

Liebe Grüsse Michael

Joey-1970 commented 2 years ago

Hallo Michael,

da hatte ich auch kurz mit beschäftigt, habe es dann aber verworfen. Ich zeige bei mir im Modul einfach nur die Zeit zwischen der letzten und der aktuellen Datensendung.

Hier findest Du vielleicht etwas ab Zeile 208.

Weißt Du was man mit accelo_x und accelo_y anfangen kann?

Joachim

mhaberler commented 2 years ago

danke, das schaff ich!

sehe gerade die Doku in https://github.com/Albertworker1004/Mopeka_React-Native/blob/43b7b0056bbca005b80d0fc94e3f013c23585b83/Tank%20Check/firmware.html

da steht was zu "shelf_life_mode" und wie man das setzt

accelo_x und accelo_y: beim Pro Sensor werden die verwendet, um den Sensor waagrecht zu positionieren - die Lage wird in der App angezeigt

im Manual Seite 10 ist dies beschrieben: https://www.mopeka.com/wp-content/uploads/2021/09/M2000004F.pdf

mhaberler commented 2 years ago

ganz interessante Verweise: https://github.com/spbrogan/sensor.mopeka_pro_check/issues/17

Joey-1970 commented 2 years ago

Hallo Michael,

da im von Dir verlinkten Code zur Lage (accelo_x/accelo_y) wird ja auch auf negative Werte geprüft. let x = this.getAcceloX(true) let y = this.getAcceloY(true) if (x > 8) x = 8 if (x < -8) x = -8 if (y > 8) y = 8 if (y < -8) y = -8 Sind die Werte daher als Zweier-Komplement zu werten? An andere Stelle (zum Beispiel bei der Temperatur) werden negative Werte durch Subtraktion erzeugt. Wie hast Du das bei Dir gelöst?

Joachim

mhaberler commented 2 years ago

ja, die sind bei mir als int8_t definiert:

typedef struct {
  float temperature;
  float level;
  int32_t raw_level;
  int8_t raw_temp;

  uint8_t hw_id;
  uint8_t qualityStars;
  ;
  int8_t acceloX;
  int8_t acceloY;
  float battery;
  bool syncPressed;
  bool slowUpdateRate;
  bool corrupted;

} mopeka_t;

....
int DecodeMopeka(sensorstatus_t *sp, sensorconfig_t *cp, const byte *data,
                 size_t len) {

  if (len != 12) {
    LOGD("Mopeka PRO '{}': manufacturer data len ({} - expect 12)",
         cp->cfg_name, len);
    return 0;
  }
  if (data[2] != 3) {
    LOGD("Mopeka PRO '{}': invalid HW id {}", cp->cfg_name, data[2]);
    return 0;
  }
  mopeka_t *mp = &sp->mopeka;
  mp->battery = (data[3] & 0x7f) / 32.0;
  mp->syncPressed = (data[4] & 0x80) > 0;
  mp->raw_temp = (data[4] & 0x7f);
  mp->temperature = mp->raw_temp - 40.0; // °C
  mp->qualityStars = (data[6] >> 6);

  mp->acceloX = data[10];
  mp->acceloY = data[11];

  mp->raw_level = ((int(data[6]) << 8) + data[5]) & 0x3fff;
  mp->level = mp->raw_level *
              (MOPEKA_TANK_LEVEL_COEFFICIENTS_PROPANE_0 +
               (MOPEKA_TANK_LEVEL_COEFFICIENTS_PROPANE_1 * mp->raw_temp) +
               (MOPEKA_TANK_LEVEL_COEFFICIENTS_PROPANE_2 * mp->raw_temp *
                mp->raw_temp));

  return 1;
}
Joey-1970 commented 2 years ago

Hallo Michael,

Danke! Das hat mich wieder einen Schritt weitergebracht!

An die Propan <-> Butan Anpassung muss ich mich auch noch machen... Wie hast Du bei Deiner Formel die Werte definiert?

Ich habe ja immer noch die Hoffnung das ich den Standard-Gas-Sensor auch noch "geknackt" bekomme...

Joachim

mhaberler commented 2 years ago

die habe ich 1:1 aus dem mopeka_check Code übernommen. Copy & Pasta ;)

mhaberler commented 2 years ago

re Standard-Sensor... habe gelesen der TI Chip ist nicht lieferbar, deswegen auch Umstieg auf nRF ich glaube das ist ein Auslaufmodell

ich vermute der Pro ist wegen der BT-Zertifizierung noch nicht in Europa erhältlich, oder sie wollen zuerst die Standard Lagerbestände abverkaufen

Joey-1970 commented 2 years ago

...den Pro habe ich auch hier gekauft, wüßte jetzt nicht das der aus dem Ausland gekommen wäre...

Magst Du die benutzten Koeffizienten für Deine Formel hier bitte noch einmal posten? Das Ergebnis ist der Füllstand in mm?

Joachim

mhaberler commented 2 years ago

https://github.com/spbrogan/mopeka_pro_check/blob/main/mopeka_pro_check/advertisement.py#L17

damit wird die Laufzeit temperaturkompensiert - ja, sollte in mm sein