Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

    Mag Gyver
    Ich hätte eine Frage bzgl. Lib und Read Request von KNX-Seite. Von 4 gleichzeitigen Requests über Serialevent wird immer nur 1 beantwortet.
    Was läuft schief ? Was kann ich tun ?
    Ein einzelner Request funktioniert einwandfrei.

    2017-07-30 19_47_36-192.168.2.16_data_log_MONLOG_2017-07-30.htm_20170730133735.png
    >>Smelly One<<
    >> BURLI <<
    Grüße Armin

    Kommentar


      Hallo WagoKlemme,

      ich entnehme dem Screenshot einfach anhand dem zeitlichen Verlauf, dass der ARDUINO noch in der Wartephase zwischen den Telegrammabarbeitung (delay) steckt und deswegen nicht auf deine sehr kurz hintereinander kommende Read Request antworten kann, weil der ARDUINO es einfach verschläft bzw. der Puffer der seriellen Schnittstelle überläuft.

      Abhilfe könnte hier vielleicht sein, dass man hier am Sendetimeout in der Library dreht oder vielleicht doch besser erstmal eine Wartezeit zwischen den Abfragen des anderen Gerätes einbaut, wenn möglich.

      Ich z.B. sende nur eine Anfrage (Write auf Anfrageadresse) zum ARDUINO und veranlasse den ARDUINO dann mir die aktuellen Daten zu senden, währe natürlich auch ein Weg um dein anderes Gerät mit den Daten zu füttern.




      Mit freundlichen Grüßen

      Mag Gyver
      Zuletzt geändert von Mag Gyver; 30.07.2017, 20:50.

      Kommentar


        Hallo Mag Gyver,

        danke für deine Einschätzung, hierzu hätte ich noch ein paar Fragen:
        - wieviele Telegramme passen in den seriellen Speicher (ATMega328 64Bytes), bzw. wie groß ist ein Request* ? Und könnte man den nicht vergrössern, wie hier ?
        - könnte man wenigstens die GA abfangen und später eine Antwort senden
        - wie wäre es mit einer Queue in Array, und die Antworten dann sequenziell zu senden, nach Größe des Arrays ?

        Ich kann Edomi oder generell einen Initscan einer Visu nicht dazu bringen, die Read Requests schön nacheinander abzuschicken. Schliesslich sind da in der Größenordnung 1500 GA's zu lesen, das würde zu lang dauern. Den Standard KNX Geräten macht es ja nichts aus. Das ist halt die Konzeption und ansonsten kein Problem in KNX, und wird unvermeidbar sein.

        Edit: *Länge Request : Ein Datarequest ist 23 Byte und ein extended Datarequest hat 263 Bytes. Quelle
        Zuletzt geändert von WagoKlemme; 31.07.2017, 08:34.
        >>Smelly One<<
        >> BURLI <<
        Grüße Armin

        Kommentar


          Hallo WagoKlemme,

          den seriellen Speicher kann man vergrößern. Dazu sind lediglich ein paar Zeilen in der

          Code:
          HardwareSerial.h
          innerhalb der IDE zu ändern. Mit allen Vorteilen und Nachteilen.

          Aber vielleicht bedarf es nur einer kleineren Änderungen. Wertest und bearbeitest du die empfangenen Daten direkt in

          Code:
          void serialEvent()
          aus? Würde dann vorschlagen, hier nur das Wesentliche zu tun. Die Leseanfrage pro Gruppenadresse in einer Variable speichern und dann den Rest in

          Code:
          void loop()
          zu erledigen -> z.B.: Antworten auf deine Leseanfrage. Dann könnte man noch den Schreibtimeout der KNX-Library von Standard

          Code:
          #define SERIAL_WRITE_DELAY_MS 100
          auf den für dich notwendigen Wert

          Code:
          #define SERIAL_WRITE_DELAY_MS (hier dein Wert)
          setzen.


          Nur noch ein Hinweis am Rande. Je mehr Ram, je mehr Gruppenadressen sind möglich. Vielleicht belegst du schon einiges durch andere Libraries davon und es kommt dann zu diesem Phänomen.

          Der Gedanke mit dem Queue in Array ist zwar ein guter Ansatz, jedoch sollte es auch ohne klappen. Die Leseanfrage an sich ist nicht groß, ich vermute nach wie vor ein Timing-Problem.




          Mit freundlichen Grüßen

          Mag Gyver

          Kommentar


            Ich habe mal den Serial_Buffer_Size auf 256 und siehe da, Zufall ?
            2017-07-31 19_19_24-192.168.2.16_data_log_MONLOG_2017-07-31.htm_20170731191616.png
            >>Smelly One<<
            >> BURLI <<
            Grüße Armin

            Kommentar


              Das nenn ich mal "Timing", jetzt hätten wir fast gleichzeitig gepostet und der erste Gedanke ist auch noch gleich. Gedankenübertragung ?

              Buffer habe ich schon, den Rest schaue ich mir an. Danke !
              >>Smelly One<<
              >> BURLI <<
              Grüße Armin

              Kommentar


                Zitat von Mag Gyver Beitrag anzeigen
                Code:
                void serialEvent()
                aus? Würde dann vorschlagen, hier nur das Wesentliche zu tun. Die Leseanfrage pro Gruppenadresse in einer Variable speichern und dann den Rest in

                Code:
                void loop()
                zu erledigen -> z.B.: Antworten auf deine Leseanfrage. Dann könnte man noch den Schreibtimeout der KNX-Library von Standard

                Mit freundlichen Grüßen

                Mag Gyver
                Meinst Du eine Bool zu setzen bei GA-Abfrage ?
                Und dann die Bool in der Loop abfragen ?
                >>Smelly One<<
                >> BURLI <<
                Grüße Armin

                Kommentar


                  Hallo WagoKlemme,

                  ja ich meine pro Gruppenadresse ein Triggervariable vom Typ "BOOL" im void serialEvent () setzen. Wenn diese Triggervariable der jeweiligen Gruppenadresse wahr ist (Bedingung im void loop() prüfen), dann die Antwort auf die Gruppenadresse versenden und natürlich die Triggervariable wieder zurücksetzen. Damit die nächste Leseanfrage auch erkannt werden kann.

                  Des kann man nicht lernen, dass muss man können -> Stichwort "Timing" !


                  Mit freundlichen Grüßen

                  Mag Gyver

                  Kommentar


                    Hallo Mag Gyver,

                    Danke.
                    Also, Umbau mit Bool in Loop und Serial_Write_Delay_MS auf 50.

                    2017-07-31 20_14_32-192.168.2.16_data_log_MONLOG_2017-07-31.htm_20170731191616.png

                    Leider nicht befriedigend, 2 Werte blieben aus.
                    Eine Queue hätte den Vorteil, dass die Performance des Arduino nicht so entscheidend ist. Er liefert halt dann einzelne Werte wie er kann. Hier hätte er für die 4 Werte 14s Zeit gehabt. Das müsste doch ausreichen einzelne Werte zu liefern.
                    Wie siehst Du das ?
                    >>Smelly One<<
                    >> BURLI <<
                    Grüße Armin

                    Kommentar


                      Hallo WagoKlemme,

                      ist schon sehr seltsam. Eigentlich hätte er dies auf jeden Fall locker beantworten können und müssen. Hast du noch zusätzliche

                      Code:
                      delay()
                      irgendwo eingebaut oder verbirgt sich in einer von dir eingebundenen Library noch das Ein oder Andere

                      Code:
                      delay()
                      ?

                      Da ich deinen grundsätzlichen Sketch nicht kenne und die darin zusätzlich eingebundene Libraries ebenfalls nicht, könnte eine Queue schon bei deinem Projekt von entscheidenden Vorteil sein.

                      Schaden kann es auch nicht, einen Versuch ist es auf jeden Fall wert. Ich werde mir bei Gelegenheit, dieses Thema mal vorknöpfen, aber derzeit nicht, da steht noch Viel Anderes auf meiner Liste mit höherer Priorität.



                      Mit freundlichen Grüßen

                      Mag Gyver
                      Zuletzt geändert von Mag Gyver; 31.07.2017, 21:51.

                      Kommentar


                        Hallo Mag Gyver,

                        nein, im Sketch ist kein einziges Delay.
                        Wenn Du dir das Thema vorknöpfst, kann ich das so verstehen, dass Du eine Queue in der Lib planst ?
                        Denn im Sketch laufe ich ja wieder in das selbe (Timing-)Loch, wenn die Answers eh schon in der Loop stehen. Mehr geht eigentlich nicht.
                        Danke für dein Interesse.
                        >>Smelly One<<
                        >> BURLI <<
                        Grüße Armin

                        Kommentar


                          Hallo WagoKlemme,

                          erstmal muss ich verstehen warum es zu diesem Phänomen kommt und ob ich dies bei mir reproduzieren kann. Den von dir verwendeten Sketch, ist das der den du hier schon vor kurzen gepostet hast?

                          Damit ich mir dies zusammen mit der Library anschauen kann, man arbeitet mit mehr Input einfach leichter.



                          Mit freundlichen Grüßen

                          Mag Gyver

                          Kommentar


                            Hallo Mag Gyver,

                            nein, das ist nicht der Sketch.
                            Da ich heute Nacht in Urlaub fahre, kann ich dir den Sketch erst Ende nächster Woche schicken.
                            Danke für deine Hilfe !

                            >>Smelly One<<
                            >> BURLI <<
                            Grüße Armin

                            Kommentar


                              Hallo WagoKlemmen,

                              na dann viel Spaß und gute Erholung.



                              Mit freundlichen Grüßen

                              Mag Gyver

                              Kommentar


                                Hallo liebe erfahrene KNX Arduino User,
                                ich bin völlig neu im Thema Arduino in Zusammenarbeit mit KNX. Mein Ziel ist es, über alle möglichen Geräte in unserem Haus über eine lokale Website auf dem Arduino mit einem Ethernet Shield alle Lichter an / aus zu schalten. Ich habe mich jetzt seit ein paar Tagen mit dem Thema beschäftigt und basierend auf dem unteren Projekt ein bisschen Code zusammengeklatscht. Die Website läuft, sieht gut aus, nur jetzt kommt mein Problem:
                                Manchmal schaltet der Arduino die Lichter auf Befehl, manchmal nicht, und manchmal schaltet er den ersten Befehl, danach aber leider nichts mehr.
                                Hat jemand eine Ahnung weshalb das ganze so instabil ist? Sollte ich delays einbauen vor/nach dem Absenden eines GroupWrites?
                                Kleine Info am Rande: ich nutze keinen originalen Arduino. ( ist das ein Problem mit KNX oder allgemein? )
                                Hier der
                                Code:
                                #include <SPI.h>
                                #include <Ethernet.h>
                                #include <KnxTpUart.h>
                                
                                
                                KnxTpUart knx(&Serial1, PA_INTEGER(15,15,20));
                                
                                byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
                                byte ip[] = { 192, 168, 178, 233 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
                                byte gateway[] = { 192, 168, 178, 1 };                   // internet access via router
                                byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
                                EthernetServer server(80);                             //server port     
                                String readString;
                                
                                void setup() {
                                  Serial.begin(9600);
                                  Serial.println("TP-UART Test");  
                                
                                  Serial1.begin(19200);
                                  UCSR1C = UCSR1C | B00100000; // Even Parity
                                
                                  Serial.print("UCSR1A: ");
                                  Serial.println(UCSR1A, BIN);
                                
                                  Serial.print("UCSR1B: ");
                                  Serial.println(UCSR1B, BIN);
                                
                                  Serial.print("UCSR1C: ");
                                  Serial.println(UCSR1C, BIN);
                                
                                  // start the Ethernet connection and the server:
                                  Ethernet.begin(mac, ip, gateway, subnet);
                                  server.begin();
                                  Serial.print("server is at ");
                                  Serial.println(Ethernet.localIP());
                                  knx.uartReset();
                                }
                                
                                
                                void loop() {
                                  // Create a client connection
                                  EthernetClient client = server.available();
                                  if (client) {
                                    while (client.connected()) {   
                                      if (client.available()) {
                                        char c = client.read();
                                
                                        //read char by char HTTP request
                                        if (readString.length() < 100) {
                                          //store characters to string
                                          readString += c;
                                          //Serial.print(c);
                                         }
                                
                                         //if HTTP request has ended
                                         if (c == '\n') {          
                                           Serial.println(readString); //print to serial monitor for debuging
                                
                                           client.println("HTTP/1.1 200 OK"); //send new page
                                           client.println("Content-Type: text/html");
                                           client.println();     
                                           client.println("<HTML>");
                                
                                           client.println("<HEAD>");
                                           client.println("<TITLE>Smarthome Control</TITLE>");
                                           client.println("<meta charset='utf-8'>");
                                           client.println("<meta name='viewport' content='width=device-width, initial-scale=1'>");
                                           client.println("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>");
                                           client.println("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js'></script>");
                                           client.println("<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>");
                                           client.println("</HEAD>");
                                
                                           client.println("<BODY>");
                                           client.println("<div class='container'>");
                                           client.println("<div class='jumbotron'>");
                                           client.println("<h1><b>Smarthome Control</b></h1>");
                                           client.println("<br><br>");
                                
                                           client.println("<div class='featurette' id='control'>");
                                           client.println("<h2 class='featurette-heading'>Control");
                                           client.println("<span class='text-muted'>Panel</span>");
                                           client.println("</h2>");
                                           client.println("<p class='lead'>");
                                
                                           client.println("<div id='lights' ><br>");
                                           client.println("Wohnzimmerdecke<br><br>");
                                           client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerdeckenlichton\"\"> <button type='button' class='btn btn-success' <font color='white'> An </font> </button> </a>");
                                           client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerdeckenlichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a> ");
                                           client.println("<br><br>");
                                           client.println("Wohnzimmerwand<br><br>");
                                           client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerschranklichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
                                           client.println("<a style='text-decoration: none;' href=\"/?wohnzimmerschranklichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button></a> ");
                                           client.println("<br><br>");
                                           client.println("Bürodecke<br><br>");
                                           client.println("<a style='text-decoration: none;' href=\"/?buerodeckenlichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
                                           client.println("<a style='text-decoration: none;' href=\"/?buerodeckenlichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a>");
                                           client.println("<br><br>");
                                           client.println("Büroschrank <br><br>");
                                           client.println("<a style='text-decoration: none;' href=\"/?bueroschranklichton\"\"> <button type='button' class='btn btn-success'> <font color='white'> An </font> </button> </a>");
                                           client.println("<a style='text-decoration: none;' href=\"/?bueroschranklichtoff\"\"> <button type='button' class='btn btn-danger'> <font color='white'> Aus </font> </button> </a>");
                                           client.println("<br></div>");
                                
                                           client.println("</p></div>");
                                           client.println("</div>");
                                
                                           client.println("</BODY>");
                                           client.println("</HTML>");
                                
                                           delay(2);
                                           //stopping client
                                           client.stop();
                                           //controls the Arduino if you press the buttons
                                
                                           if (readString.indexOf("?buerodeckenlichton") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,4,1), true);
                                           }
                                           if (readString.indexOf("?buerodeckenlichtoff") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,4,1), false);
                                           }
                                           if (readString.indexOf("?bueroschranklichton") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,4,0), true);
                                           }
                                           if (readString.indexOf("?bueroschranklichtoff") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,4,0), false);
                                           }
                                           if (readString.indexOf("?wohnzimmerdeckenlichton") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,1,0), true);
                                           }
                                           if (readString.indexOf("?wohnzimmerdeckenlichtoff") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,1,0), false);
                                           }
                                           if (readString.indexOf("?wohnzimmerschranklichton") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,1,2), true);
                                           }
                                           if (readString.indexOf("?wohnzimmerschranklichtoff") >0){
                                               knx.groupWriteBool(GA_INTEGER(0,1,2), false);
                                           }
                                            //clearing string for next read
                                            readString="";  
                                
                                         }
                                       }
                                    }
                                }
                                }
                                Ach ja und: Sollte ich eventuell einen eigenen Thread dafür eröffnen?
                                This project is all about using an Arduino with an Ethernet shield. I'll be controlling one LED and a servo,...

                                Kommentar

                                Lädt...
                                X