Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 KNX mit ETS

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

    Mal eine blöde Frage: Warum VS Code und nicht Visual Studio?

    Kommentar


      Zitat von thesing Beitrag anzeigen
      Warum VS Code und nicht Visual Studio?
      Hi Thomas,

      dafür gibt es keinen wirklich "harten" Grund, aber viele kleinere "weiche":
      • Gewöhnung: Ich mache fast alles, was zu editieren ist, mit VS Code (JSON, XML, C#, jeztzt C/C++, YAML, normale Textdateien, etc...)
      • Lightweight: Der Editor ist schnell da und mir gefällt das Extension-Konzept
      • Remote: Das neu verfügbare Remote-Editing finde ich richtig gelungen! Der Editor läuft unter Windows, das Projekt ist auf der WSL unter Debian und man hat exakt die selbe "Experience" wie beim lokalen editieren
      • Gute und einfache Git Anbindung.
      • Ich habe VisualGDB nicht wirklich verstanden (hatte die Testlizenz) und dann ist meine Testzeit wegen des Unfalls zu 50% verfallen.
      • Ich wollte wissen, ob ich es auch kostenfrei mit debugging unter Linux hin bekomme. Dass es geklappt hat, liegt sicherlich auch an Deinem erstklassigen Projektaufbau mit cmake, sauberer Verzeichnisstruktur usw. Hier wirklich
      • Mit VS Code kann ich dann auch die Arduino IDE ersetzen
      • Bei Visual Studio passiert vieles "unter der Hand", häufig verstehe ich nicht (bzw. erst viel später), was wo wie parametriert/generiert wurde. Bei VS Code muss man zwar mehr manuell machen, aber dadurch blicke ich eher, was passiert. Gibt mir dann das Gefühl, dass ich besser analysieren kann, wenn mal was nicht läuft.
      Ich weiß, dass Visual Studio der mächtigere Editor ist, ich habe selber über 15 Jahre in der .NET-Entwicklung verbracht (auch wenn das schon wieder 8 Jahre her ist). Ich hatte auch bei Deinem Projekt erstmal mit Visual Studio und VisualGDB angefangen. Nachdem ich dann aber einigermaßen verstanden habe, was bei Dir abgeht (ich meine Build-Technisch, was Du funktional da mit C++ machst, ist weit jenseits meiner Fähigkeiter bzw. ich bräuchte sicherlich lange, mich da einzulesen), hatte ich es testweise mit VS Code und GDB versucht und recht schnell hin bekommen. Bei der Einbindung vom Arduino kam meine OP dazwischen, aber da gehe ich demnächst dran. Und dann habe ich (hoffentlich) die einheitliche Testumgebung, die ich mir Wünsche, um das Ganze durchzuziehen, aber eben mit VS Code und nicht VS.

      Das mit den VS Code Files (Push-Request) mache ich erst, wenn alles funktioniert, auch Arduino, also realistisch gesehen erst, wenn ich wieder zu Hause bin.

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        Hallo,

        henfri Du kannst beim BME also das erste mal programmieren, und danach nicht mehr, oder geht schon das erste mal nicht?
        Nein, schon das erste Mal geht nicht.

        Zum Sonoff: hab ich bei mir nicht nochmal getestet. Da aber jemand ein Issue dazu auf Github eröffnet und wieder geschlossen hat, vermute ich, dass es geht.
        Bei mir nicht :-( Flashen und Programmieren geht, aber keine Reaktion auf Schaltbefehle.

        Gruß,
        Hendrik

        Kommentar


          @henfri: ich hab mir mal einen neuen S20 bestellt. Der alte reagiert nicht mehr auf Kontaktversuche. Hab ich wahrscheinlich mal VCC mit GND vertauscht. Den BME werde ich mir mal als nächstes nochmal im Detail anschauen und dabei gleich eine KO für Lüftung mit Schwellwerten einbauen. Dann kann ich das auch mal für mehr als zur Visualisierung nutzen.

          Kommentar


            Hallo,

            oh, das wäre ja Klasse!

            Gruß,
            Hendrik

            Kommentar


              Hi Thomas,

              ich hab mal ne Frage und hoffe, dass sie nicht zu unsinnig ist... ist eher so, dass Du ja einen ganzen KNX-Stack implementiert hast und somit für mich zu den "Wissenden" gehörst...

              Über die ETS kann man ja an jedes Gerät ein "Gerät zurücksetzen" senden. Siehst Du die Möglichkeit, so was auch über Deinen Stack zu senden? Also ein anderes Gerät zurücksetzen? Und falls ja - ist es aufwändig, so ein Kommando abzusetzen?

              Hintergrund: Ich habe sporadisch (selten) Geräte, die anfangen, Unsinn zu machen. Ein PM, der plötzlich keine Präsenz meldet, auf dem Lichtkanal aber normal arbeitet, ein Klimaanlagen-Gateway, dass auf jegliche Temperaturvorgabe mit dem Status "Solltemperatur = 30°C" antwortet etc. All diese Probleme sind mit einem "Gerät zurücksetzen" zu beheben und man kann die Symptome in Regeln packen. Und da ich gerade an einem Logikmodul arbeite, würde es mich sehr interessieren, ob und wie ich ein "Gerät zurücksetzen" als Ergebnis einer Logik realisieren kann. Also eine Art "watchdog". Ich habe bisher noch kein Produkt außer der ETS gefunden, das das kann.

              Gruß, Waldemar
              OpenKNX www.openknx.de

              Kommentar


                Ich habe dir mal schnell eine Methode dafür gebastelt. Siehe https://github.com/thelsing/knx/comm...9913fcaf2452be
                Ob es funktioniert kann ich nicht sagen. Sollte es aber.

                Kommentar


                  Wow, danke! Ich brauche wohl noch ein/zwei Tage, bis ich meine Engine wieder zum laufen gebracht habe, aber dann teste ich das sofort - ist ja der Hammer.
                  Feedback kommt dann,
                  Danke nochmal!

                  Gruß, Waldemar
                  OpenKNX www.openknx.de

                  Kommentar


                    Hallo Thomas,

                    ich verwenden deine Stack schon etwas länger mit eine SAMD21. Ich habe nun die Library durch die aktuelle Version ersetzt und habe ein paar Probleme.

                    Ich verwende die wie beschrieben um Werte zu senden. DPT 1 und DTP3 werden allerdings in einem falschen Format gesendet (werden im Busmonitor der ETS angezeigt).
                    Ich mache dies folgendermaßen als Beispiel:

                    knx.getGroupObject(1).dataPointType(Dpt(1, 1));
                    knx.getGroupObject(2).dataPointType(Dpt(3, 7));
                    knx.getGroupObject(3).dataPointType(Dpt(5, 5));

                    knx.getGroupObject(1).value(true);
                    knx.getGroupObject(1).value(false);

                    uint8_t value_send;

                    value_send = 9;
                    knx.getGroupObject(2).value(value_send);

                    value_send = 8;
                    knx.getGroupObject(2).value(value_send);
                    Ist das so OK?

                    Ich bin jetzt nicht so der Programmierprofi
                    Ich habe mal versucht den Fehler zu finden. Es gibt wohl Probleme bei der DPT Konvertierung.
                    Wenn ich folgendes anpasse funktioniert es wie gewünscht:

                    src\knx\dptconvert.cpp
                    int valueToBusValueStepControl(const KNXValue& value, uint8_t* payload, int payload_length, const Dpt& datatype)
                    {
                    switch (datatype.index)
                    {
                    case 0:
                    //bitToPayload(payload, payload_length, 4, value); //sebastian
                    unsigned8ToPayload(payload, payload_length, 0, (uint64_t)value, 0xFF); //sebastian
                    break;
                    case 1:
                    {
                    if ((int64_t)value < INT64_C(0) || (int64_t)value > INT64_C(7))
                    return false;
                    unsigned8ToPayload(payload, payload_length, 0, (uint64_t)value, 0x07);
                    }
                    break;
                    default:
                    return false;
                    }

                    void bitToPayload(uint8_t* payload, int payload_length, int index, bool value)
                    {
                    //payload[index / 8] = (payload[index / 8] & ~(1 << (7 - (index % 8)))) | (value ? (1 << (7 - (index % 8))) : 0); //sebastian
                    payload[index / 8] = (value ? (1 << (7 - (index % 8))) : 0); //sebastian
                    }
                    void unsigned8ToPayload(uint8_t* payload, int payload_length, int index, uint8_t value, uint8_t mask)
                    {
                    ENSURE_PAYLOAD(index + 1);
                    //payload[index] = (payload[index] & ~mask) | (value & mask); //sebastian
                    payload[index] = (value & mask); //sebastian
                    }
                    Bitte um Hilfe. Danke

                    VG Sebastian
                    Zuletzt geändert von SebastianObi; 26.06.2019, 15:41.

                    Kommentar


                      Ich muss mir das noch im Detail anschauen. Die bitToPayLoad und unsigned8ToPayload Funktionen sollten an sich richtig sein. Die bitToPayload-Funktion soll nur das ein Bit ändern un die anderen Bits im Byte nicht anfassen. Gleiches gilt für unsigned8ToPayload. Dort sollen nur die Bits geändert werden, die durch mask angegeben werden.

                      Bei mehrteiligen Datenpunkttypen wie Stepcontrol muss du die einzelnen Komponenten getrennt setzen (und lesen):
                      knx.getGroupObject(2).valueNoSend(1, DPT(3,7,0));
                      knx.getGroupObject(2).value(7, DPT(3,7,1));

                      Das ist sicher nicht die bestmögliche Lösung.
                      Alternativ kann man mit
                      valueRef = knx.getGroupObject(2).valueRef();
                      *valueRef = 8;
                      knx.getGroupObject(2).objectWritten();

                      Den ganzen Datenpunkttyp-Code umgehen.
                      Wahrscheinlich sollte man die DPT-Klasse durch Enums ablösen. Dann könnte man die Komponenten auch richtig benennen. Oder man erzeugt wie die ganzen mehrteiligen Datenpunkttypen eigene structs und fügt die zum KnxValue hinzu. Ich bin da derzeit unschlüssig.

                      Man könnte auch eine Dpt3_7-Klasse bauen mit Methoden assignToGroupObject und readFromGroupObject die dann jeweils die Komponenten lesen und schreiben.
                      Zuletzt geändert von thesing; 28.06.2019, 09:24.

                      Kommentar


                        Hallo,

                        danke für die Infos.
                        Ich verwende jetzt deine original Library mit
                        valueRef = knx.getGroupObject(2).valueRef();
                        *valueRef = 8;
                        knx.getGroupObject(2).objectWritten();

                        so funktioniert DPT 1,1 und 3,7 ohne Probleme. Alle anderen von mir verwendeten DPTs funktionieren ohne Probleme.

                        Ich habe nochmal ein paar Tests gemacht.
                        Das Problem ist, dass in "bitToPayload" und "unsigned8ToPayload" in der variable "payload[index]" schon Daten/Werte vorhanden sind welche nicht zu der aktuellen Gruppenadresse gehören welche gerade gesetzt/gesendet werden soll. Somit werden da dann falsche Werte entstehen.

                        Test 1:
                        knx.getGroupObject(1).dataPointType(Dpt(1, 1));
                        knx.getGroupObject(1).value(false);
                        -> ETS: $30 | Aus
                        oder
                        -> ETS: $20 | Aus


                        Test 2:
                        knx.getGroupObject(1).dataPointType(Dpt(1, 1));
                        knx.getGroupObject(1).value(true);
                        -> ETS: $31 | Ein
                        oder
                        -> ETS: $21 | Ein


                        Test 3:
                        uint8_t value2 = 9;
                        knx.getGroupObject(2).dataPointType(Dpt(3, 7));
                        knx.getGroupObject(2).value(value2);
                        -> ETS: $1C | Erhöhen, 12%


                        Test 4:
                        uint8_t value2 = 8;
                        knx.getGroupObject(2).dataPointType(Dpt(3, 7));
                        knx.getGroupObject(2).value(value2);
                        -> ETS: $1C | Erhöhen, 12%


                        Test 5 OK:
                        uint8_t value3 = 25;
                        knx.getGroupObject(3).dataPointType(Dpt(5, 5));
                        knx.getGroupObject(3).value(value3);
                        -> ETS: $19 | 25


                        Test 6 OK:
                        uint8_t value3 = 243;
                        knx.getGroupObject(3).dataPointType(Dpt(5, 5));
                        knx.getGroupObject(3).value(value3);
                        -> ETS: $F3 | 243


                        Test 7 OK:
                        float value4 = 22.5;
                        knx.getGroupObject(4).dataPointType(Dpt(9, 1));
                        knx.getGroupObject(4).value(value4);
                        -> ETS: $0c 65 | 22,5


                        Test 8 OK:
                        float value4 = 10.5;
                        knx.getGroupObject(4).dataPointType(Dpt(9, 1));
                        knx.getGroupObject(4).value(value4);
                        -> ETS: $04 1a | 10,5
                        Hat jemand anders auch solche Probleme? Komischerweise hatte es mit DPT 1,1 einmal funktioniert. Dann hatte ich die Applikation mit der ETS neu übertragen und dann war es immer wieder fehlerhaft.

                        An den Funktionen "void bitToPayload" und "void unsigned8ToPayload" habe ich jetzt nichts geändert, da die auch für andere Datenentypen verwendet werden und man sich diese sonnst zerschießt.

                        Ich habe jetzt eine Stufe vorher bei den gezielten Datentypen das so angepasst, dass es für mich OK ist:
                        valueToBusValueBinary:
                        //bitToPayload(payload, payload_length, 7, value);
                        payload[7 / 8] = (value ? (1 << (7 - (7 % 8))) : 0);

                        valueToBusValueStepControl:
                        //bitToPayload(payload, payload_length, 4, value);
                        payload[0] = ((uint64_t)value & 0xFF);
                        Zuletzt geändert von SebastianObi; 28.06.2019, 17:11.

                        Kommentar


                          Das klingt stark nach nicht initialisierten Speicher. Ich habe jetzt hinzugefügt, dass die Daten vom GroupObject mit 0 initialisiert werden. Kannst du bitte testen ob damit der Problem behoben ist?

                          Kommentar


                            henfri: bist du mittlerweile mit dem „Adress is not valid 4294967221“ Problem beim BME Sketch weitergekommen.
                            Wollte eigentlich nichts mehr dran machen, habe aber doch nicht die Finger von lassen können und habe auf die aktuellen Libs aktualisiert.
                            Bin aber dann auch gleich an den Punkt mit dem Adress not valid gekommen. Habe jetzt noch nicht detailliert untersucht woran es liegen kann.

                            Grüße und Danke
                            Johannes

                            Kommentar


                              Ja, habe ich hier auch dokumentiert.

                              Open Source und Closed Source Part passten nicht zusammen.

                              Kommentar


                                Zitat von henfri Beitrag anzeigen
                                Ja, habe ich hier auch dokumentiert.

                                Open Source und Closed Source Part passten nicht zusammen.
                                Ich habe den Thread nochmal überflogen, aber habe nichts zum entsprechenden Behebung bzw. dass das Problem behoben wurde gefunden. Vielleicht habe ich auch „Tomaten auf den Augen“...

                                Handelt es sich nur um ein Problem mit der BSEC-Lib?

                                Kommentar

                                Lädt...
                                X