Ankündigung

Einklappen
Keine Ankündigung bisher.

KNX Falcon NuGet / DatenTypen / C#

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

    KNX Falcon NuGet / DatenTypen / C#

    Hi,
    Mal eine Programmmierfrage - ich verzweifel langsam....

    Vom Bus erhalte ich ein Event => "KnxGroupValueReceived"
    Darin gibt es eine Adresse und daraus kann ich den entsprechenden DPT ableiten.
    Über die "DptFacory" kann ich den generieren.

    Wie kann ich aber den generischen "GroupValue" aus dem Event in einen DPT abfüllen und leserlich machen?

    #2
    Falcon 5 oder Falcon 6?

    Wenn Falcon 6:
    das Objekt, das du von der DptFactory bekommst, hat eine Methode ToTypedValue(GroupValue)
    Zuletzt geändert von Klaus Gütter; 01.02.2022, 16:17.

    Kommentar


      #3
      Ist 6.0.4147 vom nuget store.

      var x = DptFactory.Default;
      var y = DptFactory.Default.GetDatapointType(1);
      var z = DptFactory.Default.GetDatapointSubtype(1,1);

      enthält keine (xyz) .ToXX Methoden ausser .ToString().

      Bug?

      Kommentar


        #4
        Bei den Dpt classes selbst ist diese methode vorhanden.
        Ist glaub wirklich die factory kaputt.

        Kommentar


          #5
          Dann nimm ToValue(GroupValue), das geht immer.

          Oder möchtest du den GroupValue bloß in einen String konvertieren (Anzeige wie im Monitor)?
          Oder willst du die einzelnen Felder gemäß KNX Handbook 3/7/2 haben?
          Beschreib doch etwas genauer, was du vorhast und wie du dir deinen Code idealerweise vorstellst.

          Gruß, Klaus

          Kommentar


            #6
            Hab mal mit dem KNX support etwas gemailt.
            Anscheined gabs die Methode früher mal aber Factory an sich ist jetzt eine Leiche.

            Anscheinend muss man nun den entstsprechenen DPT selbst wissen, anhand der Adresse. Ein Telegramm vom Bus weiss an sich nichts.
            ... mit dem Schlusswort - Betriebsgeheimnis....

            Auf den Factory Objekten lässt sich das nicht convertieren - nur auf den ensprechenden DPTs. Factory liefert immer base classes - ev darum.

            Gibt es denn irgendwas wie ich von einem GroupValue zu einem vernünftigen Wert komme? Die hex Werte nützen ohne Datentyp recht wenig.
            Manuell eine Liste mit Adressen und DPTs erstellen klint nach 1960.... vorallem gings mal.
            hex zu bool gibt was anderes als zu double - eigentlich logisch - aber die Info muss doch irgend wo sein...

            Ziel ist einfach die z:B Temperatur zu erhalten. Ich bekomme ein Event vom Bus und brauche nur z.B "1/2/3" + 22.5°C oder "1/2/4" + true/false.
            Ich hab rs232 tempsensoren (einige) unabhängig vom Bus, aber muss der Bodenheizung ein/aus sagen können und den Zustand mitbekommen.
            Oder die Klingel ist nur ein Binärschalter und triggert ein MP3.

            Kommentar


              #7
              Mit Verlaub, die Info vom KNX Support zur DptFactory ist falsch.

              dpt.ToValue(GroupValue) würde dir für DPT9 ein float (22.5f) als object liefern. Das sollte doch passen oder?

              Dass du die DPTs irgendwie angeben musst, ist unumgänglich, im Telegramm stehen sie ja nicht drin.

              Das alles wird erst mit einem IoT-Gateway anwendungsfreundlicher werden.
              Zuletzt geändert von Klaus Gütter; 02.02.2022, 15:54.

              Kommentar


                #8
                aber woher bekomme ich den dpt?
                ist das ein = new dpt9() ? dazu muss ich ja bereits wissen was ankommt.

                Bei mir sind es ja schon über 100 GroupValues welche ich auslesen könnte. Etwa 15 muss ich.

                ideal wäre ein:
                var dpt = Factory."Get"(GroupValue); //Früher ging das und hat funktioniert.

                damit würde ich meterweise code sparen. Mit den definierten classes brauche ich ein mapping für Adresse und Class z.B. 1/2/3, float, dpt9. Screenshot 2022-02-02 155724.jpg

                Kommentar


                  #9
                  Code:
                  var dpt = DptFactory.Default.Get(1, 1);
                  var decodedValue = dpt.ToGroupValue(value);

                  Kommentar


                    #10
                    Schade dass das Feature entfernt wurde.
                    Früher konnte ich irgend was in die Factory werfen - und zumindest die Basistypen kamen richtig raus.

                    Wenn ich z.B (1,1) wissen muss, brauche ich irgend ein mapping - von irgend wo muss das 1,1 herkommen.
                    Früher ging das ohne die (1,1).

                    Dann schreib ich mir mal eine mapping Tabelle bzw etwas um das Projekt xml einzulesen.

                    Kommentar


                      #11
                      Nochmal: da wurde nichts entfernt. Und der Falcon *kann* die Datenpunkttypen nicht wissen, das sind Metainformation, die nur im ETS-Projekt enthalten sind.

                      Kommentar


                        #12
                        Das hat mal funktioniert - darum so begriffsstutzig. Läuft seit 3 Jahren.
                        Der TryGet..() ist auch recht generisch. Gibt jenfalls kein mapping.
                        Ist glaub einfach Glück, dass das funktioniert hat. Defaultwerte waren zufällig gut genug.


                        Screenshot 2022-02-03 113340.jpg

                        Kommentar


                          #13
                          In diesem Code ist die Magie (sprich: das Mapping GA -> DPT) offenbar in TryGetGroupValueDefinition. Das ist aber keine Falcon-Funktion, sondern anscheinend in deinem Code.
                          Zuletzt geändert von Klaus Gütter; 03.02.2022, 12:35.

                          Kommentar


                            #14
                            Ich häng mich hier mal eben mit ran... ich kämpfe auch gerade mit der `DptFactory`.
                            So ganz verstehe ich da die best practice noch nicht.
                            In der Doku steht man soll die Factory verwenden...

                            Code:
                            DptBase dpt = DptFactory.Default.Get(9, -1);
                            object convertedValue = dpt.ToValue(notification.Value);​
                            Also erstens möchte ich eigtl. nicht jedes Mal neue Converter initialisieren, das könnte die Factory als Singletons vorhalten (oder sogar statisch sein).
                            Zweitens ist das DptBase.ToValue() halt auch irgendwie subpar zum Dpt9.ToTypedValue()... das boxing (und manuelle unboxing) sollte man sich idealerweise sparen.

                            Code:
                            Dpt9 dpt9 = new Dpt9();
                            float temperature = dpt9.ToTypedValue(notification.Value);​
                            Bestimmt übersehe ich etwas... Vorschläge?

                            Kommentar


                              #15
                              Zitat von naym Beitrag anzeigen
                              das könnte die Factory als Singletons vorhalten
                              Tut sie intern auch.

                              Zitat von naym Beitrag anzeigen
                              ist das DptBase.ToValue() halt auch irgendwie subpar zum Dpt9.ToTypedValue()
                              Es ist absolut OK, Dpt9 direkt zu instantiieren und ToTypedValue zu benutzen. Die DptFactory und DptBase sind eher für Clients gedacht, die das ganze generisch lösen möchten, sowie für die komplexen Dpts, die dynamisch aus den Informationen der knx_master.xml zusammengebaut werden.

                              Kommentar

                              Lädt...
                              X