Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 KNX mit ETS

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

    Ich habe gerade zwei Änderungen gemacht:
    - mdelay und millis wurden aus der Platform entfernt. Unter Linux gibt es linux_platform.cpp delay und millies als normale Funktionen.
    - KnxFacade ist nun eine Template-Klasse. D.h. Man kann durch knx.bau() sich die richtige Bau und mit knx.platform() die richtige Platform holen. Damit kann man z.B. bei Samd21 auf die genutzte SamdPlatform-Instanz zugreifen. ( Bernator damit kannst du z.B. den gewünschten Serial setzen an dem der TPUART hängt.)

    mumpf Das mit dem zwei Instanzen auf dem gleichem Rechner liegt wahrscheinlich an https://github.com/thelsing/knx/blob...tform.cpp#L132
    Wenn man das auf 1 setzt wird es wahrscheinlich gehen. Aber dann bekommt jede Instanz auch die selbst verschickten Muticast-Pakete. (AFAIR)

    Mit dem Restart hab ich mir das in etwa so vorgestellt:

    Die Anwendung macht einfach ein knx.restart(PA). Das geht zu BauSystemB::restart(PA).
    Dort wird geschaut, ob es zur PA schon eine Verbindung gibt. Wenn ja einfach restartRequest senden. Sonst ConnectRequest. und den Restartrequest erst senden, wenn das ConnectConfirm kam.
    Wenn das geht, könnte man den Stack perspektivisch auch nutzten um damit andere Geräte zu programmieren. (quasi als ETS-Ersatz.)

    Den Rest deines Posts muss ich noch prüfen.

    Kommentar


      Hi Thomas,

      Zitat von thesing Beitrag anzeigen
      Das mit dem zwei Instanzen auf dem gleichem Rechner...
      ich brauche das nicht wirklich, Linux ist für mich primär Entwicklungs- und Testumgebung. Beim Restart hatte ich aber erstmal 2 Instanzen gestartet und versucht, mit der einen die andere neu zu starten - und das hat nicht geklappt. Hab dann ewig den Fehler bei mir gesucht, bis ich auf die Idee kam, es mal mit einem anderen (TP) Gerät zu testen... sollte somit eher eine Info für andere sein.

      Zitat von thesing Beitrag anzeigen
      Die Anwendung macht einfach ein knx.restart(PA). Das geht zu BauSystemB::restart(PA).
      Dort wird geschaut, ob es zur PA schon eine Verbindung gibt. Wenn ja einfach restartRequest senden. Sonst ConnectRequest. und den Restartrequest erst senden, wenn das ConnectConfirm kam.
      Dann werde ich das mal so machen. Um aber eine queue zu vermeiden, werde ich ein   bool knx.restart(PA)  machen. Falls das Gerät nämlich bereits mit einem anderen Gerät verbunden ist und gar kein Connect abgesetzt werden kann, wird ein false zurückgeliefert. Und selbst wenn das Gerät mit der Ziel-PA bereits verbunden ist, sollte man wirklich einfach ein restart senden? Nehmen wir mal den hypothetischen Fall, dass dieses Zielgerät gerade programmiert wird? Da würde ein restart zwischendurch wirklich stören . Ich würde beim restart dazu neigen, den nur zuzulassen, wenn man die Sequenz Connect->Restart->Disconnect komplett machen darf.
      Den Rest dann so wie Du es sagst.

      Schön, dass Du wieder da bist, ich bin auch gerade auf dem Rückweg vom Urlaub...

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        Moin zusammen,

        da ich zwischenzeitlich nahezu vollständig auf den ESP32 umgestiegen bin, habe ich mir erlaubt, den Stack um die Platform ESP32 zu erweitern. Falls das von allgemeinem Interesse ist, kann ich gerne auch einen PR machen. Den Fork mit ESP32 Unterstützung findet ihr unter https://github.com/metaneutrons/knx.

        Herzliche Grüße, Fabian

        Kommentar


          Hi Fabian,

          Ist der ESP32 über WLAN oder über TP angebunden? Ich wollte mal den ESP8266 über TP ohne WLAN nutzen, aber da bin ich nicht der richtige, das zu schaffen...

          Gruß, Waldemar

          ​​​
          OpenKNX www.openknx.de

          Kommentar


            Moin Waldemar,

            momentan erstmal nur Wifi. Mein nächstes Ziel ist die Nutzung des LAN8710 (ich habe ein Olimex ESP32-EVB mit Ethernet). Dann könnte das Ding im meinem Rack verschwinden und wäre sauber als flexibler Controller (Zeitserver, Zeitschaltuhr, Brandmelder, Klingelsteuerung, SMS-Gateway) per Ethernet angebunden.

            Zwischen LAN/Wifi und TP wechseln ist aber auch auf meinem Wunschzettel. Das könnte man im Moment am einfachsten mit konditionaler Kompilierung lösen, direkt über die Library wäre es aber eleganter. Das schaue ich mir aber sicher noch mal an.

            Nutzt hier jemand überhaupt den ESP32?

            Herzliche Grüße, Fabian

            Kommentar


              Hi Fabian,

              ich habe noch 3 ESP32 "rumliegen", aber sind noch ungenutzt. Ich würde die gerne über TP anbinden, aber wie gesagt, da bin ich nicht der Richtige...

              Gruß, Waldemar
              OpenKNX www.openknx.de

              Kommentar


                Moin!

                Momentan wird in der knx_facade.h bzw. knx_facade.cpp für die Mikrokontroller eine knx Instanz automatisch erzeugt und zwar mit der jeweils vorgegebenen Transportschicht (Bau57B0 für IP und Bau07B0 für TP) (siehe etwa KnxFacade<Esp32Platform, Baut57B0> knx;). Ich denke es müsste ausreichen, wenn Du das einfach mal von Hand änderst (das entsprechende #include in knx_facade.h nicht vergessen) Dafür findet man bei Bedarf aber auch einen eleganteren Weg. Probier's doch mal aus und dann schauen wir weiter.

                Update: Vermutlich ist es zum Testen einfacher eine eigenes Objekt (zu dem automatisch angelegten knx-Objekt) zu instanziieren:

                Code:
                #include <Arduino.h>
                #include <knx.h>
                #include "knx/bau07B0.h"
                #define PIN_KNXLED 17
                #define PIN_BUTTON 16
                
                // create named references for easy access to group objects
                #define goCurrent knx_tp.getGroupObject(1)
                #define goMax knx_tp.getGroupObject(2)
                #define goMin knx_tp.getGroupObject(3)
                #define goReset knx_tp.getGroupObject(4)
                
                // für ESP8266
                KnxFacade<EspPlatform, Bau07B0> knx_tp;
                
                // für ESP32, wobei aktuell noch Serial genutzt wird und Serial1 wohl günstiger wäre
                // KnxFacade<Esp32Platform, Bau07B0> knx_tp;
                
                float currentValue = 0;
                float maxValue = 0;
                float minValue = RAND_MAX;
                long lastsend = 0;
                
                void setup() {
                    knx_tp.readMemory();
                    knx_tp.ledPin(PIN_KNXLED);
                    knx_tp.buttonPin(PIN_BUTTON);
                    knx_tp.start();
                }
                
                void measureTemp() {
                    long now = millis();
                    if ((now - lastsend) < 2000)
                        return;
                    lastsend = now;
                    int r = rand();
                    currentValue = (r * 1.0) / (RAND_MAX * 1.0);
                    currentValue *= 100 * 100;
                    // write new value to groupobject
                    goCurrent.value(currentValue);
                    if (currentValue > maxValue) {
                        maxValue = currentValue;
                        goMax.value(maxValue);
                    }
                    if (currentValue < minValue) {
                        minValue = currentValue;
                        goMin.value(minValue);
                    }
                }
                
                void loop() {
                    knx_tp.loop();
                    if (!knx_tp.configured()) return;
                    measureTemp();
                }
                Ich muss mal meine Siemens BCU suchen...

                Update: Der Programmierbutton funktioniert auf diesem Weg leider nicht...siehe dazu weiter unten!

                Herzliche Grüße, Fabian
                Zuletzt geändert von metaneutrons; 26.08.2019, 23:08.

                Kommentar


                  Hi,

                  ich komme gerne darauf zurück und freue mich auch über Deine Tipps, aber ich kämpfe gerade noch mich den Umstellungen für den "resetDevice" Befehl (stelle das so um, wie Thomas es letztens skizziert hat). Das wird sicherlich noch diese Woche dauern, deswegen komme ich nicht vor nächster/übernächster Woche dazu, mich wieder mal um die ESP32 zu kümmern. Aber ich fände es gut, wenn man Deinen fork mit der Arbeit von Thomas zusammen bringen könnte.

                  Gruß, Waldemar
                  OpenKNX www.openknx.de

                  Kommentar


                    metaneutrons : Danke habe ich gemergt. Ich sollte wohl mal noch eine ArduinoPlatform als Basisklasse für SAMD21, ESP8266 und ESP32 einführen um Codeduplizierung zu reduzieren.

                    Vielleicht sollte man die globale vordefinierte Instanz "knx" lieber weglassen? Dann kann die sich jeder im Sketch so definieren wie er es benötigt. Was meint ihr?

                    Kommentar


                      Moin! Vielen Dank!

                      Eine Arduino-Basisklasse ist eine gute Idee; ich würde alsbald gerne noch den Teensy als Platform hinzufügen. Dann stelle ich das einstweilen zurück.

                      Die vordefinierte Instanz würde ich tatsächlich ebenfalls weglassen. Dann hat man maximale Flexibilität und kann auf einem Controller theoretisch sogar beide Medien betreiben.

                      Herzliche Grüße, Fabian
                      Zuletzt geändert von metaneutrons; 26.08.2019, 14:17.

                      Kommentar


                        Hi Thomas,

                        Zitat von thesing Beitrag anzeigen
                        ielleicht sollte man die globale vordefinierte Instanz "knx" lieber weglassen?
                        Kein Problem, kann man so machen. Ist ja schon bei Linux so. Bin sehr für "gleichartiges" verhalten zwischen den Plattformen. Ich sehe mich schon demnächst beim Portieren von meinem Logikmodul auf den ESP32. Mal schauen, wie "smooth" das geht. Aber ich werde primär wohl beim SAMD bleiben, der kann über dem Bus versorgt werden...

                        thesing: Ich muss jetzt mal alles bei mir auf den neuesten Stand bringen, dann kommt noch ein Pull-Request mit den Änderungen zu "resetDevice" - so wie Du es haben wolltest.

                        metaneutrons: Vielen Dank für Dein Coding-Beispiel oben, gib mir noch ne Woche, aber ich teste das gerne aus, dann wie gesagt gleich mit dem ESP32, ist ja schon gemerged.

                        Gruß, Waldemar
                        OpenKNX www.openknx.de

                        Kommentar


                          Hallo allerseits,

                          Ich habe nun eine ArudinoPlatform Klasse eingeführt. Damit muss man für einen neue Platform für TP nur noch restart, getEepromBuffer und commitToEeprom implementieren.

                          Ich muss bei Gelegenheit mal ESP32 mit in dem Travis-Build aufnehmen.

                          VG Thomas

                          Kommentar


                            Ich habe gerade angefangen die globale knx-Instanz zu entfernen. Dann muss man leider auch die buttonUp()-Funktion für den Programmierbutton in jeden Sketch packen. Momentan denke ich, dass es besser ist diese Instanz auch bei Linux hinzuzufügen und über einen Modus o.ä. zu steuern ob man IP oder TP will. Was denkt ihr?

                            VG Thomas

                            Kommentar


                              Sieht sehr gut aus! Danke thesing! Der Plattform im Konstruktor direkt die Schnittstelle mitzugeben wollte ich auch vorschlagen; hatte den Text schon fertig! Auf dem ESP32 bietet sich natürlich Serial1 für TP an, damit man über Serial bequem debuggen kann. Das würde ich als Option auch für den Konstruktor der verschiedenen Plattformen vorsehen. Ich probiere mal aus, ob ich das hinbekomme. Der ESP32 hat nach meiner Erinnerung drei UART, die großen Teensys drei und mehr...

                              Ich würde auch mal versuchen, ein Stream-Objekt im Konstruktor entgegen zu nehmen, dann könnte man ihm sogar (z.B. auf dem ESP8266) ein SoftwareSerial übergeben. Was denkst Du?

                              So ist es jedenfalls schon wunderbar flexibel.

                              Ad Button: Den Punkte sehe ich. Das geht wegen des Aufrufs der Methode durch einen Interrupt nicht anders, oder? Dann bin ich bei Dir, das es besser ist das anders zu lösen. Vermutlich sind die Anwendungsfälle für ein Gerät, welches sowohl IP als auch TP beherrscht ohnehin überschaubar.

                              Wenn die ArduinoPlatform aus Deiner Sicht stabil ist, würde ich wohl alsbald noch den Teensy als Platform hinzufügen, da ich den in anderen Projekten gerne verwende und von dem hier noch einige liegen.

                              Vielen Dank nochmal für das tolle Projekt. Etwas Derartiges hat in dieser Qualität wirklich gefehlt!

                              Herzliche Grüße, Fabian
                              Zuletzt geändert von metaneutrons; 27.08.2019, 06:47.

                              Kommentar


                                Hi,

                                ihr seid mir zu schnell... ich hatte den Restart auf Linux fertig (Stand von gestern), SAMD klappt noch nicht (suche noch, warum)... Jetzt ist wieder alles anders - ich freue mich ja drüber, ich komme nur nicht hinterher. Folgender Vorschlag: Ich warte jetzt erstmal, bis sich das etwas "eingerüttelt" hat, dann mache ich meine Anpassungen und den push...

                                Gruß, Waldemar
                                OpenKNX www.openknx.de

                                Kommentar

                                Lädt...
                                X