Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 KNX mit ETS

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

    Hallo,

    das Update/das Installieren der BSEC Lib ist ja jetzt echt einfach.
    Den Demo Sketch hatte ich in null komma nix am laufen (musste nur die I2C Adresse anpassen). Mit deinem Demo läuft es aber nicht.
    Ich denke, ich habe zwei mögliche Probleme identifiziert:
    1) das bsec_config_iaq[454] und iaqSensor.setConfig(bsec_config_iaq) ist zumindest im Demo nicht mehr nötig.
    2) Ich glaube du hast das Wire.begin() versehentlich entfernt. Danach bekomme ich zumindest keinen error -2 mehr

    Aber programmieren klappt nicht -aber das ist ja nix neues.
    Aber ich wollte das wenigstens mit dir teilen, damit du die Erkenntnis schonmal hast.

    Gruß,
    Hendrik

    Kommentar


      Hallo,

      zusätzlich zu meinem vorherigen Beitrag noch eine andere Frage:
      Ich versuche gerade das Sonoff Beispiel auf einen PWM Ausgang umzustellen (natürlich mit anderer Hardware).
      Ist das Beispiel aktuell? Ich finde z.B. GroupObject.objectReadBool() weder im aktuellen code, noch in https://knx.readthedocs.io/en/latest/
      Ist es jetzt go.value().boolValue()?

      Damit ich nicht immer so doof fragen muss: Wie/wo kann ich das erlesen?
      Ich finde zwar dies
      https://knx.readthedocs.io/en/latest...80caf05dcf9ba7
      Aber da ist nicht dokumentiert, wie ich die Funktion nutze.
      Wenn ich mir das ansehe:
      https://github.com/thelsing/knx/comm...63ec454ed73370
      Wurde
      Code:
      goMin.objectWriteFloatDpt9(minValue);
      zu
      Code:
      goMin.value(minValue);
      Das bedeutet, dass value() selbst erkennt, welcher DPT nötig ist?

      Hast du die Sonoff S20 eigentlich zuverlässig bei dir im Einsatz?

      Gruß,
      Hendrik
      Zuletzt geändert von henfri; 09.06.2019, 09:43.

      Kommentar


        Hi Hendrik,

        ich hab mir jetzt auch mal die Neuerungen von Thomas angesehen.

        Zitat von henfri Beitrag anzeigen
        Das bedeutet, dass value() selbst erkennt, welcher DPT nötig ist?
        Ich glaube, es ist anders rum: Es gibt noch die Methode
        Code:
        go.dataPointType(DPT(9,1))
        Mit der setzt Du den DPT für das GroupObject, dann kann ein
        Code:
        go.value(125)
        richtig konvertieren. So verstehe ich zumindest die neuen DPT.

        thesing: Muss man immer einen DPT setzen oder bekommst Du den von der ETS mit? Eigentlich definiert man die DPT ja schon in dem knxprod file. Ob das beim Programmieren übertragen wird, weiß ich natürlich nicht.

        Gruß, Waldemar

        Kommentar


          Hi Thomas,

          noch ein kurzes Feedback zu
          ​​​​​​
          Zitat von thesing Beitrag anzeigen
          Ich habe das leider schon versehentlich rausgeworfen.
          Ich habe mein Coding jetzt angepasst, auf den ersten Blick sieht alles gut aus. Bin zwar noch im Krankenhaus, kann also nicht testen, aber ich hab mir mal ne Linux-VM aufgesetzt und das Ganze erstmal syntaktisch korrekt hinbekommen.

          Bei der Gelegenheit: Ich arbeite inzwischen mit VS Code und hab es für Linux hin bekommen, damit zu bauen und zu debuggen. An den Arduino-Teil hab ich mich noch nicht getraut. Wären die Config-Files für VS Code irgendwie interessant für Dich? Oder erst, wenn ich es auch für den SAMD hinbekommen habe?

          Gruß, Waldemar

          Kommentar


            Hallo,

            danke für deine Antwort.
            Ich glaube, es ist anders rum: Es gibt noch die Methode
            Dann glauben wir aber -denke ich- das Gleiche.

            Sobald -durch ETS oder durch "go.dataPointType(DPT(9,1))" - bekannt ist, welchen DPT go hat, muss nur noch value() genutzt werden.

            Klar, noch schöner wäre es, wenn man nur an einer Stelle (ETS) den DPT setzen müsste, aber ich denke, dass der Arduino Compiler die Größe der Objekte zum Zeitpunkt des Kompilieren wissen muss, oder?


            Gruß,
            Hendrik
            Zuletzt geändert von henfri; 10.06.2019, 10:19.

            Kommentar


              Zitat von henfri Beitrag anzeigen
              aber ich denke, dass der Arduino Compiler die Größe der Objekte zum Zeitpunkt des Kompilieren wissen muss, oder?
              Ich hoffe nicht! Wäre auch ein Rückschritt. Denn bei mir ist der DPT abhängig von Parametern, die man in der ETS setzt. Ich kann somit den DPT zur Laufzeit setzen, aber zur Compile-Time kenne ich den nicht (könnte aber den größten nehmen). Da es aber mit dem alten API mit unterschiedlichen DPT funktioniert hat, denke ich nicht, dass es jetzt anders sein wird.

              Gruß, Waldemar

              Kommentar


                Hi Thomas,

                ich hab wirklich gesucht... sorry, wenn das eine blöde Frage ist:

                Finde ich zu einem gegebenen GroupObject irgendwie dessen Nummer raus? Also die Umkehrung der Funktion   knxFacade::getGroupObject(uint16_t goNr) ?

                Hintergrund: Ich konnte mein komplettes Coding abhängig von einen Channel-Parameter schreiben, so dass ich dynamisch die Anzahl Kanäle wählen kann (zum Testen reichen 3, produktiv sollen es 80 werden). Die einzige Stelle, wo das nicht hinhaut, sind die callbacks für die Eingänge. Ich müsste für 80 Kanäle a 2 Eingänge 160 callback-Funktionen anlegen, die alle ein go als Argument bekommen. Wenn ich aus dem go aber seine Nummer rausfinden könnte, komme ich mit 1 callback-Funktion aus und kann anhand der Nummer dynamisch dispatchen.

                Ich hoffe, es ist klar geworden, was ich suche, sonst erkläre ich das gerne anhand vom Beispielcoding...

                Gruß, Waldemar

                Kommentar


                  henfri Du kannst beim BME also das erste mal programmieren, und danach nicht mehr, oder geht schon das erste mal 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.

                  @mumpf: zur value() Problematik: Die Methode gibt es im wesentlichen in zwei Versionen: bei der einen gibt man den Dpt mit an:
                  go.value(1.4, Dpt(9, 1));
                  bei der anderen gibt man nur den Wert rein:
                  go.value(1.4);
                  dafür muss man den Dpt dann aber vorher mit
                  go.datapointType(Dpt(9,1));
                  setzen. Von ETS kommt nur die Größe des KO und nicht der Datenpunkttyp.

                  Die Nummer von einem KO kriegst du mit go.asap() (für Application Service Access Point was letztlich die KO-Nummer ist).

                  Die VS-Code Dateien brauch ist selber nicht. Vielleicht helfen die aber anderen. Du kannst gern einen Pull-Request dafür stellen. Pack die einfach mit ins visualstudio-Verzeichnis
                  Zuletzt geändert von thesing; 10.06.2019, 21:08.

                  Kommentar


                    Ich habe nun auch die GroupObject-Klasse dokumentiert. Ich hoffe das hilft.

                    Kommentar


                      Und schon wieder ein leichte Änderung der Api. Die Klasse KnxValue verhält sich nun in etwa wie ein Typ in Skriptsprachen. D.h. es wird sich gemerkt, was man zu weist und es wird bei der Benutzung (hoffentlich) richtig konvertiert.

                      go.value(4.9) erzeugt also implizit ein KnxValue-Objekt vom Typ double.

                      double foo = go.value(); erhält den Wert als KnxValue-Objekt und wandelt ihn in ein double um. Wenn man einen bestimten Typ will, muss man casten:
                      double foo = (int)go.value(); Wert als KnxValue-Objekt wirt in ein int gewandelt und von dort in ein double.

                      Bei Strings erhält man immer "" es sei denn das KO ist auch vom Typ String. Das liegt daran, dass ich sonst den Speicher für den String im KnxValue managen müsste. (Speicher reservieren und auch wieder frei geben.) Vielleicht kommt das noch später.

                      Die Änderungen sind wie immer noch nicht getestet.

                      Kommentar


                        Hi Thomas,

                        das ist klasse, das kann ich gut gebrauchen, ich will an mehreren Stellen von einem DPT in einen anderen wandeln. Sehe ich richtig, dass wenn ich

                        Code:
                        go1.dataPointType(DPT(9,1));
                        go2.dataPointType(DPT(5,10);
                        go2.value(go1.value())
                        mache, dann implizit von double nach int konvertiert wird? Das ist cool...

                        Zitat von thesing Beitrag anzeigen
                        Die Änderungen sind wie immer noch nicht getestet.
                        Nach aktuellem Stand meiner Genesung werde ich in 2-3 Wochen testen können...

                        Appropos: Was ist den das 3. Argument beim DPT-Konstruktor? Kenne ich gar nicht... Und kann ich auch ein DPT(9) machen (ohne Subtype), oder muss ich mich immer für einen bestimmten entscheiden?

                        Gruß, Waldemar

                        Kommentar


                          Hi Thomas,

                          ist jetzt kein wirklicher Test, aber ich habe mal versucht, Deine neuste Version mit der Arduino IDE zu compilieren. Bei den vorherigen Versionen ging das immer, ich gehe davon aus, dass das auch gewollt ist.

                          Auf jeden Fall bekomme ich folgende Fehler:
                          Code:
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\dptconvert.cpp: In function 'int busValueToAccess(const uint8_t*, int, const Dpt&, KNXValue&)':
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\dptconvert.cpp:601:19: error: ambiguous overload for 'operator=' (operand types are 'KNXValue' and 'int')
                          value = digits;
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\dptconvert.cpp:601:19: note: candidates are:
                          In file included from C:\Users\User\Documents\Arduino\libraries\knx\src\knx\dptconvert.h:34:0,
                          from C:\Users\User\Documents\Arduino\libraries\knx\src\knx\dptconvert.cpp:1:
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:35:15: note: KNXValue& KNXValue::operator=(bool)
                          KNXValue& operator=(const bool value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:36:15: note: KNXValue& KNXValue::operator=(uint8_t)
                          KNXValue& operator=(const uint8_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:37:15: note: KNXValue& KNXValue::operator=(uint16_t)
                          KNXValue& operator=(const uint16_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:38:15: note: KNXValue& KNXValue::operator=(uint32_t)
                          KNXValue& operator=(const uint32_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:39:15: note: KNXValue& KNXValue::operator=(uint64_t)
                          KNXValue& operator=(const uint64_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:40:15: note: KNXValue& KNXValue::operator=(int8_t)
                          KNXValue& operator=(const int8_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:41:15: note: KNXValue& KNXValue::operator=(int16_t)
                          KNXValue& operator=(const int16_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:42:15: note: KNXValue& KNXValue::operator=(int32_t)
                          KNXValue& operator=(const int32_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:43:15: note: KNXValue& KNXValue::operator=(int64_t)
                          KNXValue& operator=(const int64_t value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:44:15: note: KNXValue& KNXValue::operator=(double)
                          KNXValue& operator=(const double value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:45:15: note: KNXValue& KNXValue::operator=(const char*) <near match>
                          KNXValue& operator=(const char* value);
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:45:15: note: no known conversion for argument 1 from 'int' to 'const char*'
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:6:7: note: KNXValue& KNXValue::operator=(const KNXValue&)
                          class KNXValue
                          ^
                          C:\Users\User\Documents\Arduino\libraries\knx\src\knx\knx_value.h:6:7: note: KNXValue& KNXValue::operator=(KNXValue&&)
                          exit status 1
                          [Error] Exit with code=1
                          Da ich, wie schon erwähnt, bisher noch nicht so viel mit der Arduino-Umgebung gemacht habe, könnte es auch an mir liegen, da wäre ich für einen Tipp dankbar, woran das liegen könnte.

                          Vorgehen zur Reproduktion: Ich habe Deine Files ins Arduino/library-Verzeichnis kopiert und beim knx-demo Sketch auf verify gedrückt. Ich arbeite unter Windows...

                          Gruß, Waldemar

                          Kommentar


                            @mumpf: Ja das ist aktuell kaputt. Das sagt der Travis mir auch schon. Der Compiler unter Linux ist klug genug um zu erkennen, dass int32_t und int das gleiche sind. Der von Arduino SAMD nicht. Ich mach das heute noch ganz.

                            Zur Zuweisung: Das sollte so funktionieren.
                            Zu dem Dpt: Du musst immer einen gültigen Subtyp mit angeben. Es gibt halt keinen Typ 9.* sondern nur die konkreten Subtypen. Der index ist dazu da um bei komplexeren Datenpunkttypen auf die einzelnen Komponenten zuzugreifen.
                            Beispiel:
                            Dpt 18.001 ist Bit-Kodiert: CRUUUUUU . Das Flag C hat index 0, index 1 fehlt, da die zweite Komponente ein reserviertes Bit ist, und index 2 ist die Szenennummer (6 Bit).

                            Wahrscheinlich ist es besser statt der Dpt-Klasse einfach ein Enum mit allen implementieren Datenpunkttypen zu erstellen. Dann ist auch klar welche Datenpunkttypen implementiert wurden.

                            Übrigens. Wenn du eh schon eine VM auf dem Laptop hast, kannst du doch mit ETS-Demo schon weiter arbeiten. Oder übersehe ich was? Ich mach das auch direkt auf dem Laptop mit einer Debian-Virtualbox. (Das WSL von Windows 10 sollte es aber auch schon tun.)

                            Kommentar


                              Würde es eigentlich etwas bringen fertig generierte hex-Dateien in github hochzuladen? Oder ist jemand der weiß wie man hex-Dateien flasht auch in der Lage sich mit der arduino-ide eine zu erstellen?

                              Kommentar


                                Hi Thomas,

                                ich weiß (stand heute) nicht, wie man Hex-Dateien flasht, aber ich weiß, wie ich mit der Arduino-IDE Deine Lib nutze... Ich bin sicherlich nicht repräsentativ, aber mir würden fertige Hex-Dateien nicht so viel helfen.

                                Zitat von thesing Beitrag anzeigen
                                Das WSL von Windows 10 sollte es aber auch schon tun.
                                Ja, genau das ist meine Notlösung für's Krankenhaus. Ich hab mir nur zwischendurch in den Kopf gesetzt, mein Projekt so zu strukturieren, dass ich exakt das selbe coding für Linux und für den SAMD nutzen kann. Außerdem will ich das mit VS Code debugbar haben (nur den Linux-Teil). Deswegen probiere ich auch immer wieder die SAMD-Kompilierung. Aber nur, weil ich da ein Problem melde, heißt das nicht, dass Du da sofort ran musst...

                                Meine Testumgebung reicht aber nicht für echte KNX-Tests, denn mein VPN nach Hause ist nicht so konfiguriert, dass es mit Multicast läuft. Und mein Laptop hat ne Firewall installiert, an die ich nicht ran komme (Dienstlaptop). Deswegen sage ich immer, dass es noch 2-3 Wochen dauert, dann komme ich erst nach Hause...

                                Vielen Dank für Deine Hilfe und Deinen Support.

                                Gruß, Waldemar

                                Kommentar

                                Lädt...
                                X