Ankündigung

Einklappen
Keine Ankündigung bisher.

Knx device driver mit integrierter Gruppenmonitor Funktionalität

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Knx device driver mit integrierter Gruppenmonitor Funktionalität

    Hallo Community,

    ich wollte mal auf einen Fork von Franck Marini's Knx Device hinweisen: https://github.com/AndreasMainz/KnxDevice.git
    Ich habe den Treiber so umgebaut, dass auf Index 0 alle nicht addressierten Telegramme rauskommen, so daß man damit ein Gruppenmonitor
    parallel zum sonstigen Geschehen betreiben kann.
    Der Treiber ist nicht besonders schön abgeändert, aber er funktioniert zuverlässig.
    Grundsätzlich finde ich diese strenge Trennung der einzelnen Layers für so einen kleinen Controller oversized und man kann den ursprünglichen Treiber auch nur
    so verwenden, wie es der Autor vorgesehen hat. Leider gehen beim Übergang von z.B. TpUart -> Knxdevice die Information der Gruppenadresse verloren (wird auch nicht mehr gebraucht) und wird in den relevanten Index umgewandelt, der dann auch im Callback (
    Code:
    void knxEvents(byte index)
    )verwendet wird. Die
    Gruppenadresse ist auf dieser Ebene nicht mehr bekannt.
    Die Kapselung der Daten passiert m.M. nach auch nur auf der Programmierebene, im Betrieb sind die Daten nicht besser gegen Überschreiben geschützt (durch z.B. einen fehlerhaften Pointer Zugriff) als im klassischen C. Aber das ist sicher Geschmacksfrage.
    Da mir selbst die Änderung mit Ga_int und Ga_data nicht gefällt, würde ich mich über konkrete Programmiervorschläge, wie man es in C++ besser machen könnte,
    um an die relevanten Daten zu kommen freuen.
    Was ich überhaupt nicht verstanden habe, wo die 1Bit Daten von KNX_DPT_1_001 gespeichert werden, wenn mir da jemand einen Tipp geben könnte..

    Ich freue mich über Eure Korrekturvorschläge..

    Gruß Andreas

    #2
    Hallo Andreas,

    ich kenne die Bibliothek noch nicht so gut.
    Beim drüber schauen hab ich gesehen, dass jedes KnxComObject seinen Wert in einer Union speichert
    Code:
    union {
      // field used in case of short value (1 byte max width, i.e. length <= 2)
      struct{
        byte _value;
        byte _notUSed;
      };
      // field used in case of long value (2 bytes width or more, i.e. length > 2)
      // The data space is allocated dynamically by the constructor
      byte *_longValue;
    };
    Werte, die 1 Byte oder kleiner sind werden in _value gespeichert. Größere Werte hingegen in _longValue (bzw dort wo der Pointer hinzeigt).

    Zitat von odysee_2002 Beitrag anzeigen
    TpUart -> Knxdevice die Information der Gruppenadresse verloren
    Die Klasse KnxDevice hat die Funktion read_dest(index). Diese sollte die Adresse liefern, an die das Telegramm geschickt wurde. Das funktioniert für KOs die du vorher definiert und eine GA zugeweisen hast.

    Um auch die anderen Telegramme zu bekommen (Monitor) könntest du ja auch eine andere knxEvents Funktion (Zeile 372 abändern) anlegen und darin das ganze Telegramm übergeben
    Code:
    knxEvents2(targetedComObjIndex, *(Knx._rxTelegram));
    Funktion im Sketch könnte dann so aussehen:
    Code:
    void knxEvents2(byte index, const KnxTelegram& telegram)
    {
      Serial.print(String(telegram.GetTargetAddress(),HEX));
    }


    Gruß Mike
    OpenKNX www.openknx.de | Kaenx-Creator | Dali-GW

    Kommentar


      #3
      Hallo Mike,

      vielen Dank für deine Anregungen, ich werde diese bei Gelegenheit ausprobieren. Die von dir zitierte Read_Dest Funktion war von mir angelegt und bereits mein Versuch, die Gruppenadresse vom unteren Layer in den höheren Layer zu bekommen. Leider hat es nicht funktioniert, die Werte waren immer Null.
      Die Übergabe mit dem gesamten Telegramm werde ich noch mal ausprobieren. Vielen Dank für diesen Hinweis.
      Noch eine Anmerkung zu der Beschreibung der Union: so wie ich es verstanden habe, ist der Wert von _value der gleiche wie das erste Byte von _longValue.
      Meine aktuelle Version von dem Treiber ist zwar nicht schön programmiert, aber er funktioniert einwandfrei, so dass die c++konforme Programmierung nicht meine oberste Prio hat, da will ich lieber die Gruppenadresse mit dem langen Text aus der ETS ersetzen, diese kann man von dort in eine CSV Datei exportieren und über ein kleines Skript in eine H-Datei konvertieren,so dass man fast die gleiche Anzeige wie im Gruppenmonitor von der ETS bekommt. Soweit meine Pläne, vielen Dank schon mal für deine Hilfe, vielleicht komme ich noch mal auf dich zurück, wenn mich der Compiler wieder mit seltsamen Fehlermeldungen nervt…
      Leider gehen hier im Forum die Bemühungen sehr stark dahin, die KNX Geräte genauso zu programmieren, wie man es bei Kaufgeräten gewohnt ist, die Aufwände sind jedoch beträchtlich und die ganzen zusätzlichen XML (o. ähnliche) Dateien, die man erzeugen musst, sind auch nicht gerade selbsterklärend.


      Viele Grüße aus Mainz
      Andreas

      Kommentar

      Lädt...
      X