Auslesen & Zusammenführen RegisterVariable

Moin Moin,

ich möchte mich ein wenig in das Enocean Telegramm einarbeiten und bräuchte eure Unterstützung hinsichtlich der Zusammenführung des Telegramms, welches meistens in mehren Schritten reinkommt.

Grundsätzlich klappt das Schreiben in eine Variable (58090) auch. Auch werden das Daten ins Archiv geschrieben. Was mir nicht gelingt, ist einen vollständigen String draus zu machen. Beginn ist ja immer die 55…

Vielleicht könnte ihr mir beim Start etwas unter die Arme greifen…

Danke und Gruß Michael

Du kannst eine Cutter Instance in den Datenfluss bringen und das Trennzeichen dort definieren

Habe es in Skripte, PHP, SQL (Fragen) verschoben.
BTT: in Zeile 8 musst du prüfen ob das Paket komplett ist, wenn nein $data mit RegVar_SetBuffer im Buffer sichern und mit Return das Script verlassen.
Michael

Danke euch…

@ Nall-chan: das war es… Danke!! Nun kann ich es weiterverarbeiten. Ziel ist es, zu meinen vorhanden Enocean Geräten das RSSI hinzuzufügen.

Gruß Michael

Sorry, aber der Code macht kein Sinn.
Du musst das Datenpaket in $data auf Vollständigkeit prüfen.
Michael

eigentlich schade…

okee, aber kannst du mir dann kurz auf die Sprünge helfen wie ich das machen…

Gruß Michael

Da ich das Protokoll nicht kenne, nein.
Vorgehen wäre (egal welches Protokoll)
Neue Daten an die vorhandenen aus dem Buffer anhängen (hast du schon gemacht).
Prüfen ob komplette Pakete enthalten sind, diese extrahieren (und verarbeiten).
Den eventuellen Rest wieder in den Buffer schieben.
Michael

Protokoll ist Enocean…

Grundsätzlich funktioniert es, jedes Telegramm fängt mit „55“ so wie es in der Doku steht.

Danke dir!! Gruß
Michael

Das Startzeichen allein reicht ja nicht. Dann kannst du ja immer erst wenn das nächste Paket kommt das vorherige verarbeiten.
Du musst schon die Längenfelder des Protokolls verarbeiten (am besten auch die Checksummen → hier gelb)
Rot ist in der Doku Data length und blau optional lenght.


Wären somit hier 10 Byte + 7 Byte + 2x 1 Byte für die beiden Checksummen + PaketType (01) + Startzeichen + 2 Bytes für das Data length Feld und 1 Byte für das optional lenght Feld = 24 Byte
Somit wäre ein mögliches Vorgehen:

  1. Suche 0x55
  2. alles davor ignorieren / wegschneiden (kann passieren wenn man mittendrin in ein Paket mit einsteigt und nur das Ende erwischt → z.B. beim starten vom Symcon)
  3. Byte 2+3 mit unpack in ein Integer wandeln und als Data length nutzen.
  4. Byte 4 mit ord() in ein Integer wandeln und als optional lenght nutzen
  5. Beide Längenfelder und die 7 zusätzlichen Bytes addieren zu einer Paketlänge
  6. Prüfen ob $data von 0x55 an so viele Bytes enthält → Paket komplett?
  7. Wenn ja, dann das Teilstück rausschneiden und verarbeiten. Wenn Nein zu 9.
  8. Prüfen ob es noch einen Rest String gibt und es direkt 0x55 weitergeht, wenn ja zu 3. springen (nächstes Paket verarbeiten), sonst weiter mit 9.
  9. Rest in den Buffer schieben.

Michael

PS: habe mit jetzt nur den Header vom Protokoll angesehen, keine Ahnung wie man die CRC ausrechnet oder die Packet Type und eventuellen Subtelegramme korrekt verarbeitet

supi… „studiere“ auch just das Eno-Telegramm.

sp probiere ich es mal… Allerdings muss ich ja auf die „0x55“ triggern, dass dieses ja das das Sync Byte ist.

Gruß Michael.

Wenn du den Cutter NICHT! verwendest, sendet die drunterliegende TCP Schicht oder der Buffer der seriellen Schnittstelle dir regelmäßig Daten rein.

Die 55 ist nicht automatisch der Anfang. So beinhaltet z.B. auch die Zahl 21808 ein Hex 55.

Getriggert wird das Script durch den Datenempfang.
Das sync/Startzeichen haben ich ja oben berücksichtigt, es nützt dir nix um zu wissen wann ein Paket komplett ist.
Sonst verarbeitest du immer das vorherige und nicht das aktuelle Paket.
Michael
PS: ob die 55 in den Nutzdaten maskiert werden muss, habe ich auch nicht geprüft. Einige Protokolle maskieren es dann z.b. mit einem zusätzlichen Zeichen.

ja, das ist mir klar. Ziel ist es aber doch, ein vollständiges Telegramm in einer Str-Variablen zu Speichen. Insofern weiß nicht wie ich den Cutter dazu verwenden soll/kann. Trennzeichen gibt es doch nicht… Arbeite mich halt erst in die Materie ein…

Gruß Michael

Da es kein Ende Zeichen gibt und der Cutter keine dynamisches Längenfeld kann, würde ich das gar nicht erst versuchen.
Michael

1 „Gefällt mir“

Es gibt auch keinen Grund, die Daten in eine String-Variable zu schreiben. Was hast du davon, wenn im Webfront 50000a0701eba5006e… steht? Du willst doch die eigentlichen Nutzdaten sehen?