Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 über WLAN an KNX

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

    SirUli

    Danke für Deine Infos.

    Für mich als "Nicht-Elektroniker" sind noch eine Fragen offen: Wie sieht dann so ein 1wire Netzwerk am Arduino bzw Wemos aus? An welche Pins kommt dann der DS2482-10 und wie geht es dann weiter zu den Sensoren?

    Kommentar


      Der Anschluss des Chips erfolgt via I2C Pins SDA und SCL. Bei Arduinos ist das vorgegeben, beim ESP8266 gibt es keine vordefinierten, dort nimmt man zwei beliebige Pins und definiert diese dann im Code entsprechend (siehe hier: https://learn.sparkfun.com/tutorials...-arduino-addon). Wemos habe ich leider nicht, musst du vermutlich mal nach I2C und Wemo gucken

      Zu den Sensoren sieht man rechts in meinem Schaltbild. VDD (Betriebsspannung) = Rotes Kabel, GND(Masse) = Schwarz und OW (OneWire) = Gelb.

      Hilft dir das?

      Kommentar


        OleDeluxe

        Bist Du mit der Überlegung hinsichtlich Sketches und Framework schon weitergekommen?
        Wäre die Erweiterung von ESPEasy um KNX eine Option?
        Macht es Sinn, dass in ein Repository bspw bei GitHub zu bringen?

        Danke für Deine Rückmeldung.

        Kommentar


          Sisamiwe das steht noch auf meiner Liste, wird aber sicher nichts sein was kurzfristig passiert. Zum einen muss ich mich da auch mal in die Webserver Lib einarbeiten und zum anderen fehlt mir atm auch etwas die Zeit das intensiver zu betreiben.

          Eine Einbindung in ESPEasy oder Tasmota wäre ne richtig feine Sache, doch übersteigt das nüchtern betrachtet meine Fähigkeiten

          Aktuell habe ich nur die paar Sketche am laufen, die ich vorne gepostet habe. Werde die Tage noch im Wetterstations-Thread einen kurzen Sketch zur Messung von Temp/Hum/Lux posten, quasi ne Mini-Wetterstation.

          Mit GitHub könnte man überlegen, glaube aber im Moment ist es noch überschaubar und wird sicher hier auch reichen.

          Gruß, Sven

          Kommentar


            OleDeluxe

            Danke für die Rückmeldung. Alles klar.

            Bzgl. Einbindung von der KNX-lib in ESPEasy habe ich meine Fühler ausgestreckt und bei GitHub einen entsprechenden Issue geöffnet.
            Leider konnte ich dort bislang nicht überzeugen, dass sich der Aufwand lohnt. Vielleicht könnt ihr auch entsprechende Argumente vorbringen.
            Das wäre Super!

            Kommentar


              Ich habe bei ESPEasy irgendwo gelesen, dass spätestens alle 20ms eine interne Routine aufgerufen werden muss. Das könnte die Engstelle sein, gerade wenn mal viel Bustraffic ist oder viele Leseanfragen auf einmal kommen...die Antwort auf Deine Anfrage ist da auch eindeutig: für zeitkritische Applikationen ist ESPEasy eher nicht geeignet.
              Viele Grüße,
              Stefan

              DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

              Kommentar


                Habe am Wochenende mal gebastelt. Mir fehlten als Segler schon immer der Luftdruck bei meiner KNX-Wetterstation.
                Auf den Bildern ist ein BMP280, ESP8266 01 und ein 3.3V Step-Down-Regler. Was die Kramkiste im Keller so hergab.
                Versorgt wird das über den Hilfsspannungsausgang der KNX-Spannungsversorgung und hängt provisorisch in der UV.
                Der Luftdruck von BMP weicht um 1hPa von den aktuellen Angaben vom DWD in meiner Region ab. Das finde ich mehr als OK.

                Habe mal nach bezahlbaren Ultraschall-Windsensoren gesucht aber nichts brauchbares gefunden.
                Angehängte Dateien
                Gruß Christian

                Kommentar


                  ChristianB
                  Zitat von ChristianB Beitrag anzeigen
                  Habe am Wochenende mal gebastelt. Mir fehlten als Segler schon immer der Luftdruck bei meiner KNX-Wetterstation.
                  Auf den Bildern ist ein BMP280, ESP8266 01 und ein 3.3V Step-Down-Regler. Was die Kramkiste im Keller so hergab.
                  Versorgt wird das über den Hilfsspannungsausgang der KNX-Spannungsversorgung und hängt provisorisch in der UV.
                  Der Luftdruck von BMP weicht um 1hPa von den aktuellen Angaben vom DWD in meiner Region ab. Das finde ich mehr als OK.

                  Habe mal nach bezahlbaren Ultraschall-Windsensoren gesucht aber nichts brauchbares gefunden.
                  Das klingt aus interessant. Kannst Du Deinen Aufbau und die Sketches noch etwas besser beschreiben?

                  Kommentar


                    Kein Hexenwerk! Habe nur das Beispiel angepasst.
                    Hier mein Sketch. Doku ist da quasi enthalten.
                    Der ESP befüllt dann über zwei KNX-Adressen ein HS-Archiv.

                    Wenn das Dein erstes ESP-Projekt ist, nimm den Node-muc oder den Wemos D1 mini aus dem Beispiel. Mit den wenigen Pin´s am ESP01 tut man sich da keinen Gefallen ;-)

                    Viel Spaß beim Nachbauen!
                    Geteste habe ich das mit einem ENERTEX-IP-Router.

                    Code:
                    /*
                     * * Stand 02.02.2018
                    * Quelle: https://github.com/envy/esp-knx-ip
                    * https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/1158719-esp8266-%C3%BCber-wlan-an-knx
                    * ChristianB
                    *
                    * ESP 8266 01
                    * Angepasst für BMP208 / I2C
                    *
                    * GiPO 0 --> GND => Flash
                    * CH_PD --> Vcc => RUN enable
                    * I2C Pin 0,2
                    * *************************
                    *         RX      VCC
                    *         GIPO0   RESET
                    *ANT.     GIPO2   CH_PD
                    *         GND      tx
                    * **************************
                     */
                    #include <Wire.h>
                    #include <Adafruit_BMP280.h>
                    #include <esp-knx-ip.h>
                    
                    //#define MULTICAST_IP IPAddress(192, 168, 2, 167)
                    
                    // WiFi config here
                    const char* ssid = "DeineSSID";
                    const char* pass = "DeinPasswort";
                    
                    #define UPDATE_INTERVAL 10000 // This is the default send interval ms
                    
                    unsigned long next_change = 0;
                    
                    config_id_t hostname_id;
                    config_id_t temp_rate_id;
                    config_id_t enable_sending_id;
                    
                    Adafruit_BMP280 bmp;
                    
                    void setup() {
                      Serial.begin(115200);
                    
                      // Register the group addresses where to send information to and the other config
                      hostname_id = knx.config_register_string("Hostname", 20, String("ESP-KNX"));
                      enable_sending_id = knx.config_register_bool("Enable periodic sending", true);
                      temp_rate_id = knx.config_register_int("Send rate (ms)", UPDATE_INTERVAL, show_periodic_options);
                      temp_ga = knx.config_register_ga("Temperature", show_periodic_options);
                      pres_ga = knx.config_register_ga("Pressure", show_periodic_options);
                    
                      // Load previous values from EEPROM
                      knx.load();
                    
                      // Init WiFi
                      WiFi.hostname(knx.config_get_string(hostname_id));
                      WiFi.begin(ssid, pass);
                    
                      Serial.println("");
                      Serial.print("[Connecting]");
                      Serial.print(ssid);
                    
                      while (WiFi.status() != WL_CONNECTED) {
                        delay(500);
                        Serial.print(".");
                    
                      }
                      // Start knx
                      knx.start();
                    
                      Serial.println();
                      Serial.println("Connected to wifi");
                      Serial.println(WiFi.localIP());
                    
                      // Init Sensor
                      Wire.pins(0, 2);
                      Wire.begin(0, 2);
                      if (!bmp.begin(0x76)) {  
                        Serial.println("Could not find a sensor, check wiring!");
                        //while (1) {}  // wait
                      }
                    }
                    
                    void loop() {
                      // Process knx events, e.g. webserver
                      knx.loop();
                    
                      unsigned long now = millis();
                    
                      if (next_change < now)
                      {
                        next_change = now + knx.config_get_int(temp_rate_id);
                        Serial.print("T: ");
                        float temp = bmp.readTemperature();
                        float pres = bmp.readPressure()/100.0f;
                        Serial.print(temp);
                        Serial.print("°C H: ");
                        Serial.print("% P: ");
                        Serial.print(pres);
                        Serial.println("hPa");
                        knx.write2ByteFloat(knx.config_get_ga(temp_ga), temp);
                        knx.write2ByteFloat(knx.config_get_ga(pres_ga), pres);
                      }
                    
                      delay(50);
                    }
                    
                    // This is a enable condition function that is checked by the webui to figure out if some config options should be hidden
                    bool show_periodic_options()
                    {
                      return knx.config_get_bool(enable_sending_id);
                    }
                    Gruß Christian

                    Kommentar


                      Hi,

                      anbei noch wie angekündigt ein Code von mir. Mit diesem Script ist es möglich, 12stck DS12B18 Sensoren an einen ESP8266 anzuschließen und direkt auf den KNX Bus zu senden. GA'S werden wie in den anderen Scripten auch über Webinterface konfiguriert. Diese Kombination ist z.B perfekt um Temperaturen im FBHKV zu ermitteln.

                      Die Sensoren werden automatisch sortiert, Reihenfolge kann über den SerielMonitor ausgelesen werden oder einfach via Gruppenmonitor in der ETS getestet werden.

                      Code:
                      #include <esp-knx-ip.h>
                      #include <OneWire.h>
                      #include <DallasTemperature.h>
                      
                      
                      //------------------------------------------
                      //DS18B20
                      #define ONE_WIRE_BUS D3 //Pin to which is attached a temperature sensor
                      #define ONE_WIRE_MAX_DEV 12 //The maximum number of devices
                      
                      OneWire oneWire(ONE_WIRE_BUS);
                      DallasTemperature DS18B20(&oneWire);
                      int numberOfDevices; //Number of temperature devices found
                      DeviceAddress devAddr[ONE_WIRE_MAX_DEV];  //An array device temperature sensors
                      float tempDev[ONE_WIRE_MAX_DEV]; //Saving the last measurement of temperature
                      float tempDevLast[ONE_WIRE_MAX_DEV]; //Previous temperature measurement
                      long lastTemp; //The last measurement
                      const int durationTemp = 5000; //The frequency of temperature measurement
                      
                      //-------------------------------------------
                      // WiFi config
                      const char* ssid = "SSID";
                      const char* pass = "Kennwort";
                      
                      #define LED_PIN LED_BUILTIN
                      #define UPDATE_INTERVAL 10000 // Default send and debug interval
                      
                      unsigned long next_data_change = 0;
                      unsigned long next_debug_change = 0;
                      
                      config_id_t temp1_ga, temp2_ga, temp3_ga, temp4_ga, temp5_ga, temp6_ga, temp7_ga, temp8_ga, temp9_ga, temp10_ga, temp11_ga, temp12_ga;
                      config_id_t hostname_id;
                      config_id_t temp_rate_id;
                      config_id_t debug_rate_id;
                      
                      
                      //------------------------------------------
                      //Device ID to string
                      String GetAddressToString(DeviceAddress deviceAddress){
                        String str = "";
                        for (uint8_t i = 0; i < 8; i++){
                          if( deviceAddress[i] < 16 ) str += String(0, HEX);
                          str += String(deviceAddress[i], HEX);
                        }
                        return str;
                      }
                      
                      //Setup Sensor
                      void SetupDS18B20(){
                        DS18B20.begin();
                      
                        Serial.print("Parasite power is: "); 
                        if( DS18B20.isParasitePowerMode() ){ 
                          Serial.println("ON");
                        }else{
                          Serial.println("OFF");
                        }
                      
                        numberOfDevices = DS18B20.getDeviceCount();
                        Serial.print( "Device count: " );
                        Serial.println( numberOfDevices );
                      
                        lastTemp = millis();
                        DS18B20.requestTemperatures();
                      
                        // Loop through each device, print out address
                        for(int i=0;i<numberOfDevices; i++){
                          // Search the wire for address
                          if( DS18B20.getAddress(devAddr[i], i) ){
                            //devAddr[i] = tempDeviceAddress;
                            Serial.print("Found device ");
                            Serial.print(i, DEC);
                            Serial.print(" with address: " + GetAddressToString(devAddr[i]));
                            Serial.println();
                          }else{
                            Serial.print("Found ghost device at ");
                            Serial.print(i, DEC);
                            Serial.print(" but could not detect address. Check power and cabling");
                          }
                      
                          //Get resolution of DS18b20
                          Serial.print("Resolution: ");
                          Serial.print(DS18B20.getResolution( devAddr[i] ));
                          Serial.println();
                      
                          //Read temperature from DS18b20
                          float tempC = DS18B20.getTempC( devAddr[i] );
                          Serial.print("Temp C: ");
                          Serial.println(tempC);
                        }
                      }
                      
                      //Loop 
                      void TempLoop(long now){
                        if( now - lastTemp > durationTemp ){ //Take a measurement at a fixed time (durationTemp = 5000ms, 5s)
                          for(int i=0; i<numberOfDevices; i++){
                            float tempC = DS18B20.getTempC( devAddr[i] ); //Measuring temperature in Celsius
                            tempDev[i] = tempC; //Save the measured value to the array
                          }
                          DS18B20.setWaitForConversion(false); //No waiting for measurement
                          DS18B20.requestTemperatures(); //Initiate the temperature measurement
                          lastTemp = millis();  //Remember the last time measurement
                        }
                      }
                      
                      //------------------------------------------
                      
                      
                      
                      
                      void setup() {
                          pinMode(LED_PIN, OUTPUT);
                          Serial.begin(115200);
                      
                          // Registrierung Gruppenadressen
                          temp1_ga = knx.config_register_ga("Temperatur 1");
                          temp2_ga = knx.config_register_ga("Temperatur 2");
                          temp3_ga = knx.config_register_ga("Temperatur 3");
                          temp4_ga = knx.config_register_ga("Temperatur 4");
                          temp5_ga = knx.config_register_ga("Temperatur 5");
                          temp6_ga = knx.config_register_ga("Temperatur 6");
                          temp7_ga = knx.config_register_ga("Temperatur 7");
                          temp8_ga = knx.config_register_ga("Temperatur 8");
                          temp9_ga = knx.config_register_ga("Temperatur 9");
                          temp10_ga = knx.config_register_ga("Temperatur 10");
                          temp11_ga = knx.config_register_ga("Temperatur 11");
                          temp12_ga = knx.config_register_ga("Temperatur 12");   
                      
                      
                          // And the config options
                          hostname_id = knx.config_register_string("Hostname", 20, String("env"));
                          temp_rate_id = knx.config_register_int("Send rate (ms)", UPDATE_INTERVAL);
                          debug_rate_id = knx.config_register_int("Serial debug rate (ms)", UPDATE_INTERVAL);
                      
                          // Load previous values from EEPROM
                          knx.load();
                      
                      
                          // Init WiFi
                          WiFi.hostname(knx.config_get_string(hostname_id));
                          WiFi.begin(ssid, pass);
                      
                          Serial.println("");
                          Serial.print("[Connecting]");
                          Serial.print(ssid);
                      
                          digitalWrite(LED_PIN, HIGH);
                          while (WiFi.status() != WL_CONNECTED) {
                              digitalWrite(LED_PIN, LOW);
                              delay(500);
                              Serial.print(".");
                              digitalWrite(LED_PIN, HIGH);
                          }
                          digitalWrite(LED_PIN, LOW);
                      
                      
                          // Start knx
                          knx.start();
                      
                          Serial.println();
                          Serial.println("Connected to wifi");
                          Serial.println(WiFi.localIP());
                          Serial.println(" ");
                      
                      
                        //Setup DS18b20 temperature sensor
                        SetupDS18B20();
                      }
                      
                      void loop() {
                      
                          knx.loop();
                      
                          long t = millis();
                          TempLoop( t );
                      
                      
                      
                          unsigned long now = millis();
                      
                          // Debug Loop
                          if (next_debug_change < now)
                          {
                              next_debug_change = now + knx.config_get_int(debug_rate_id); // Read debug rate setting
                      
                              if (WiFi.status() != WL_CONNECTED)
                              {
                                  digitalWrite(LED_PIN, HIGH);
                                  Serial.println("WIFI ERROR");
                              }else
                              {
                                  digitalWrite(LED_PIN, LOW);
                                  Serial.println("WIFI OK");
                              }
                          }
                      
                          // Data Loop Ausgabe
                          if (next_data_change < now)
                          {
                              next_data_change = now + knx.config_get_int(temp_rate_id);
                      
                              knx.write2ByteFloat(knx.config_get_ga(temp1_ga), tempDev[0]);
                              knx.write2ByteFloat(knx.config_get_ga(temp2_ga), tempDev[1]); 
                              knx.write2ByteFloat(knx.config_get_ga(temp3_ga), tempDev[2]);               
                              knx.write2ByteFloat(knx.config_get_ga(temp4_ga), tempDev[3]);
                              knx.write2ByteFloat(knx.config_get_ga(temp5_ga), tempDev[4]);
                              knx.write2ByteFloat(knx.config_get_ga(temp6_ga), tempDev[5]); 
                              knx.write2ByteFloat(knx.config_get_ga(temp7_ga), tempDev[6]);               
                              knx.write2ByteFloat(knx.config_get_ga(temp8_ga), tempDev[7]);
                          delay(20);
                              knx.write2ByteFloat(knx.config_get_ga(temp9_ga), tempDev[8]);
                              knx.write2ByteFloat(knx.config_get_ga(temp10_ga), tempDev[9]); 
                              knx.write2ByteFloat(knx.config_get_ga(temp11_ga), tempDev[10]);               
                              knx.write2ByteFloat(knx.config_get_ga(temp12_ga), tempDev[11]);               
                          }
                          delay(50);
                      }

                      Kommentar


                        Hi Leute,

                        das senden div. Daten hab ich jetzt schon gut hinbekommen.. was ich aber noch nicht kapier ist das senden,
                        bei einer Leseanforderung. Würde gern min Skript dahingehend erweitern. Leider haben meine Versuche
                        bis jetzt keinen wirklichen Erfolg gezeigt.. hat einer von euch ein einfaches Beispiel wie sowas auszusehen
                        hat ?

                        Gruß Martin
                        Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                        Kommentar


                          Brick

                          Moin Martin,
                          eine Leseanfrage verarbeitest du in einem Callback mit dem Aufruft als "KNX_CT_READ". Innerhalb der Callback-Funktion kannst du dann den Code ausführen. Im Beispiel antwortet eben diese GA auf die Anfrage. Analog zum beim "KNX_CT_WRITE"

                          hier mal ein Beispiel:
                          Code:
                          void Ch1State_callback(knx_command_type_t ct, address_t const &received_on, uint8_t data_len, uint8_t *data)
                          {
                              switch (ct)
                              {
                                case KNX_CT_READ:                      //Das passiert auf eine Leseanfrage
                                  Ch1State = digitalRead(Ch1_Pin);
                                  knx.answer1Bit(knx.config_get_ga(Ch1Ack_GA), Ch1State);
                                  break;
                               case KNX_CT_WRITE:
                                                                                         //Das hier würde bei einem Schreiben auf die GA passieren
                                  break;
                              }
                          }
                          Diesen Callback musst du natürlich noch in der void Setup() verknuspern:
                          Code:
                          knx.register_callback("Kanal 1 Rückmeldung", Ch1State_callback);
                          Gruß, Sven

                          Kommentar


                            Werden die Temperatursensoren direkt angeschlossen oder ist noch ein Busmaster dazwischen ?

                            Kommentar


                              Ich gehe davon aus, dass die Frage auf mich bezogen war. Die Sensoren werden direkt auf den NodeMCU angeklemmt. Hier ein Bild zum Anschluss für das Scipt oben.




                              schematic_Mmklsxmjth.png

                              Kommentar


                                Hallo,

                                Zitat von benji Beitrag anzeigen

                                anbei noch wie angekündigt ein Code von mir. Mit diesem Script ist es möglich, 12stck DS12B18 Sensoren an einen ESP8266 anzuschließen und direkt auf den KNX Bus zu senden. GA'S werden wie in den anderen Scripten auch über Webinterface konfiguriert.
                                Ich bin beeindruckt. Könntest du noch ein Screenshot vom Web-Interface der GA Konfiguration machen&schicken?

                                Gruß&Danke,
                                Hendrik

                                Kommentar

                                Lädt...
                                X