Ankündigung

Einklappen
Keine Ankündigung bisher.

Einbindung ESP mit ESPEasy-Firmware

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

    Einbindung ESP mit ESPEasy-Firmware

    Hallo,

    ich bin von den Möglichkeiten der ESPs total begeistet. Ob als Schalter, oder Dimmer oder OneWire Master...
    Zu den ESPs gibt es eine Firmware ESPEasy https://www.letscontrolit.com/wiki/index.php/ESPEasy

    In dieser sind bereits diverse Protokolle integriert, um des ESP mit anderen Systemen zu verbinden. hier

    Welches ist aus Eurer Sicht das beste zur Anbindung diverser ESPs and shNG?

    Danke und Gruß

    #2
    Sisamiwe ohne ESPEasy zu kennen: die esp32 Implementierung Impl. in C, die ich hier habe, nutzt das Network Plugin. Sinnvoll wäre aber sicher, die REST Schnittstelle des neuen WebServices Plugins zu nutzen (https://github.com/smarthomeNG/plugi...er/webservices).

    Dazu kannst Du mE. das hier verwenden: https://www.letscontrolit.com/wiki/i...s#Generic_HTTP - mglw. musst Du auf das simple webservices interface ausweichen, wenn diese implementierung keinen POST / PUT Payload unterstützt. Wobei die Advanced Version das wohl kann: "This Controller allows you to send HTTP GET, POST and PUT Requests to the given webserver."

    Erfahrungsberichte oder Beispiele sind gerne erwünscht.

    Bitte beachten, dass das Webservice Plugin in 1.4.2 eine Web GUI hat, in der Du die konfigurierten Services siehst. Bei REST kann man eine Schnittstelle testen, wenn man mit dem entsprechenden Firefox Addon bspw. POST Daten setzt.
    Zuletzt geändert von psilo; 30.01.2018, 17:29.

    Kommentar


      #3
      Also, smarthomeng 1.4 unterstützt meineswissens easpeasy zu 100% von haus aus durch die nutzung des network plugins, Udp protokoll..
      selbst die sendeparameter müssen nicht wirklich angepasst werden..
      Nutze ca 10 1wire sensoren sensoren an meiner heizung damit

      Kommentar


        #4
        Bonze

        Das klingt sehr interessant. Könntest Du Deine Lösung bzw. Implementierung hier vorstellen?
        Danke Dir.

        Kommentar


          #5
          Also, ich habe die Kommunikation des Esps auf Generic UDP eingestellt:
          IP Einstellungen sind die des SmarthomeNGs:
          Unter ControllerPublish lässt sich der vom Esp gesendetet String anpassen.
          Er setzt sich Standartmässig aus dem ESP Namen, dem Task , dem Namen des Devices und dem Wert zusammen

          Bei mir wird in etwa ein String an smarthomeNG gesendet der so Aussieht: "Heizung | | temp_vl = 23.05"
          Die Devices sind nach unten stehendem Bild benannt.



          da ich noch eine Ältere Version von SmarthomeNG nutze, muss ich die Auswertung über eine Logik machen.

          Logik:
          Code:
          datastring = sh.kg.heizung.daten()
          print("UDP Datenstring: {0}".format(datastring))
          logger.info(datastring)
          #%sysname%|%tskname%|%valname%=%value%
          if (datastring != ''):
              data = datastring.split('|')
              if len(data) >= 2:
                  werte = data[2].split('=')
                  logger.info("UDP erkannte Werte:", werte[0],werte[1])
          
                  for item in sh.match_items('*.udpkey'):
                     if (item() == str(werte[0])):
                          parent = item.return_parent()
                          parent(float(werte[1]))
          Items:
          Code:
          [kg]
              [[heizung]]
                  name = Heizungsdaten
                  [[[daten]]]
                      name = "UDP Daten  von Heizung"
                      type = str
                      nw_udp_listen = 8890
                  [[[pumpe_heizung]]]
                      name = "Status Vorlauf Heizungspumpe"
                      type = bool
                      visu = yes
                      visu_acl = rw
                      sqlite = true
                      [[[[udpkey]]]]
                              type = str
                              value = pumpe_vl
          das ist die komplizierte Variante
          im neuen SmarthomeNG Network Plugin müsste es laut Beschreibung eigentlich möglich sein, direkt durch senden von |itemname|wert an smarthomeNG das item mit dem Namen Itemname = wert zu setzen.

          Steuern lassen sich die Ausgänge mit dem Aufrufen der Url
          Pin 5 Setzen auf Aus:
          http://192.168.178.69/control?cmd=GPIO,5,0 bzw.
          auf Ein http://192.168.178.69/control?cmd=GPIO,5,1

          Der ESP funktioniert sehr gut und zuverlässig.

          You do not have permission to view this gallery.
          This gallery has 2 photos.

          Kommentar


            #6
            Mir ist zwar irgendwie nicht so klar, warum man einen HTTP GET Request (normalerweise auf tcp aufbauend) per UDP schickt, aber andererseits habe ich das aus einem Beispiel bei mir auch so - hatte nur noch nie drüber nachgedacht im Webservices Plugin kann man in der simple variante den Wert einfach als Teil der URL übergeben.

            Zudem lässt sich über die modules Konfiguration eine Basic Auth setzen..

            Code:
            #### Set Value
            
            Sets a value of an item.
            
            http://<your_server_ip>:<your_services_port>/ws/items/<item_path>/<value>
            
            E.g. http://192.168.178.100:1234/ws/items/office.light/0 or http://192.168.178.100:1234/ws/items/office.light/False turns off the light.

            Kommentar


              #7
              psilo
              Zitat von psilo Beitrag anzeigen
              Sisamiwe ohne ESPEasy zu kennen: die esp32 Implementierung Impl. in C, die ich hier habe, nutzt das Network Plugin. Sinnvoll wäre aber sicher, die REST Schnittstelle des neuen WebServices Plugins zu nutzen (https://github.com/smarthomeNG/plugi...er/webservices).

              Dazu kannst Du mE. das hier verwenden: https://www.letscontrolit.com/wiki/i...s#Generic_HTTP - mglw. musst Du auf das simple webservices interface ausweichen, wenn diese implementierung keinen POST / PUT Payload unterstützt. Wobei die Advanced Version das wohl kann: "This Controller allows you to send HTTP GET, POST and PUT Requests to the given webserver."

              Erfahrungsberichte oder Beispiele sind gerne erwünscht.

              Bitte beachten, dass das Webservice Plugin in 1.4.2 eine Web GUI hat, in der Du die konfigurierten Services siehst. Bei REST kann man eine Schnittstelle testen, wenn man mit dem entsprechenden Firefox Addon bspw. POST Daten setzt.

              Ich würde ein Beispiel generieren und ein kleines "How-to" erstellen, wie man ESPeasy mit dem Generic-http und dem WebService Plugin an shNG anbindet.
              Leider brauche ich noch etwas Starthilfe.

              Das WebService-Plugin habe ich eingebunden und kann auch die WebGui sehen. Die module.yaml habe ich nicht verändert.
              Im ESPeasy habe ich generic-http-advanced ausgewählt und dort wie folgt konfiguriert:
              • controller ip: IP des shNG RPIs
              • controller port: port, der in module.yaml konfiguriert ist (8383)
              • controller user: user, der in module.yaml konfiguriert ist (admin)
              • controller passwort: leer, da in module.yaml nicht gesetzt
              So nun weiß ich nicht mehr weiter:
              • HTTP method
              • HTTP URI
              • HTTP Header
              Hier ist ein Beispiel.

              Wie müssten dann die Items aussehen?

              Danke!

              Kommentar


                #8
                Was willst du denn machen? Items vom esp in smarthome setzen, oder vom esp daten auslesen?

                Wenn du z.b. einen pin 0 am esp setzen möchtest

                http://192.168.178.69/control?cmd=GPIO,0,1
                Bzw status
                http://192.168.178.69/status?cmd=GPIO,0,1

                Erzeugt folgendes "
                { "log": "GPIO 0 Set to 1", "plugin": 1, "pin": 0, "mode": "output", "state": 1 }"

                Wenn du ein item an smarthome setzen möchtest gehst glaube ich mit
                dem network-plugin
                # http request to set the item 'network.incoming' to '123' $ wget "http://XX.XX.XX.XX:8090/item|network.incoming|123 falls ich das richtig verstehe
                Zuletzt geändert von Bonze; 19.03.2018, 21:11.

                Kommentar


                  #9
                  Im ersten Schritt mal Daten vom ESP auslesen (Sensorwerte).

                  Ich möchte das mit dem WebService Plugin machen. Ich habe das Generic HTTP in ESPEasy konfiguriert
                  esp.JPG


                  und ich bekomme im Log auch schon Daten:
                  Code:
                  2018-03-19  21:32:53 INFO     Main         Ignoring input ESP_Easy_Abstand_Distance=15.48. Format not recognized.
                  2018-03-19  21:32:53 INFO     CP Server Thread-23 192.168.2.25 - - [19/Mar/2018:21:32:53] "GET /name=ESP_Easy&task=Abstand&valuename=Distance&value=15.48 HTTP/1.1" 404 613 "" ""
                  Jetzt muss ich noch auf ein Item bekommen.
                  Ggf. kann psilo hier nochmal unterstützen.
                  Zuletzt geändert von Sisamiwe; 19.03.2018, 21:35.

                  Kommentar


                    #10
                    Sisamiwe das URL Schema "/name=ESP_Easy&task=Abstand&valuename=Distance&valu e=15.4" wird derzeit von keinem Plugin supported. Ich könnte neben dem Simple und REST WS Interface noch eines für GenericHTTP bauen, da ich derzeit aber fast rund um die Uhr mit meinem Job beschäftigt bin [siehe die Uhrzeit dieses Posts: 05:14], kann ich das frühestens am Wochenende machen. Testen müsstest das aber Du. Soweit ich das in der Doku sehe, hast du in ESPEASY aber Bordmittel (im bereits von mir erwähnten Generic HTTP Advanced), mit denen Du auch auf Deiner Seite anpassen kannst.

                    Bitte checke vorher, wie Du den von mir oben zitierten ADVANCED Modus bekommst. Da wird der Datensatz über PUT und POST übergeben, dann dürfte er aber auch nicht in der URL stehen, wie im zitierten Beispiel.
                    Weiterhin ist die Frage, ob Du das Webservices Plugin überhaupt schon konfiguriert hast?!

                    PS: soweit ich die Doku sehe, kannst Du Dir die URL und den HTTP Header unnd Body (das sollte der bereich sein über den via REST bei einem POST Daten mitgeschickt werden) komplett customizen: https://www.letscontrolit.com/wiki/i...s#Generic_HTTP
                    ff.PNG
                    Die "URI" muss halt dynamisch vermutlich /ws/items/<itempfad>/<wert> sein (siehe text unten). Welche Platzhalter das jetzt genau machen, musst Du probieren.. In Deinem Screenshot sehe ich diese Definitionsmöglichkeit aber nirgends..
                    ESPEasy zu installieren und das auszuprobieren kann ich Dir frühestens nach den Osterferien liefern.

                    Wie bereits geschrieben ist die Doku des Plugins unter https://github.com/smarthomeNG/plugi...er/webservices, da steht auch, wie die URL aussehen muss... bspw. http://<ip>:<port>ws/items/office.light/0 , das letzte ist der Wert!
                    Bei REST steht der Wert im Payload, die URL wäre aber analog http://<ip>:<port>ws/items/office.light/
                    Beides kannst Du erstmal auch im Browser testen, bei REST mit einsprechenden Browser-Plugins, die Dir erlauben die POST Daten zu modifizieren.

                    Für das Serviceinterface kann man in der modules.yaml auch getrennte credentials definieren, d.h. Du musst nicht mit dem User für die WebGUI authentifizieren..

                    Bitte erstmal selber hinsetzen und Doku lesen / probieren. Ich weiss, andere Leute zu fragen spart viel eigenen Aufwand. Aber Zeit ist derzeit bei mir echt kostbar.. Muss jetzt ins Büro...
                    Zuletzt geändert von psilo; 20.03.2018, 17:58.

                    Kommentar


                      #11
                      Kurzer Nachtrag: trotz "heavy workload" schaue ich mir ESPEASY jetzt doch mal an.. Ich hoffe bis Sonntag vielleicht schon konkret Aussagen machen zu können. Mir liegt natürlich auch daran, dass das Plugin genutzt wird.. Auch könnte das das "C Gebastel" etwas erleichtern, wegen dem ich meinen Use Case noch nicht vollständig umgesetzt habe.

                      Update: Geht aber offenbar nur mit einem ESP8266, mit meinem ESP32 komme ich nicht weit, oder?
                      Hab mir mal einen geordert, kommt aber erst Übermorgen.

                      Soll natürlich niemanden hindern, da auch selber zu experimentieren.
                      Zuletzt geändert von psilo; 20.03.2018, 18:03.

                      Kommentar


                        #12
                        psilo
                        Erst einmal ein großes Danke!
                        Bevor ich jemanden um Hilfe frage, habe ich schon den Anspruch an mich, es selbst zu schaffen. Gelingt mir aber nicht immer, da ich auch nicht im IT bzw. Software Bereich zu Hause bin.

                        Ich finde es eine super Ergänzung / Erweiterung, wenn wir es schaffen, die Vorteile von ESPeasy und smarthomeNG zu verbinden. Man kann damit sehr einfach Sensoren oder auch Aktoren einbinden. Neben dem "reinen" ESP8266 gibt es auch eine Reihe von Geräte, die diesen MCU nutzen. Ich denke hier an die ganze SONOFF Reihe oder auch den H801 Dimmer oder auch eine Ventus Wetterstation. Für alle diese Geräte gibt es bereits Plugins für ESPeasy. Man kann übrigends auch eine Plugins für ESPeasy erzeugen und mit kompilieren. Das geht für Sensoren aber aber für Controller (ESPesay meint mit Controller eigentlich Protokolle). Es gibt schon spezielle Protokolle für FHEM, Domoticz oder auch openHAB. Ich kann nicht einschätzen, ob ein solches Schnittstellen-Plugin für ESPeasy einfacher ist als das WebService Plugin für shNG zu erweitern / anzupassen.

                        Meine Testergebnisse bislang:
                        A) ESPeasy HTTP generic:
                        Controller IP: IP des shNG Servers
                        Controller Port: 8384
                        Controller Publish: /ws/items/%sysname%.%tskname%.%valname%/%value%

                        führt im Log zu:
                        Code:
                        2018-03-20  21:57:44 INFO     CP Server Thread-21 192.168.2.25 - - [20/Mar/2018:21:57:44] "GET /items/ESP_Easy.Abstand.Distance/442.02 HTTP/1.1" 404 582 "" ""
                        das /ws/ zu Beginn des Publish werden verschluckt.

                        Ich habe auch ein Item ESP_Easy.Abstand.Distance mit type: num angelegt Es kommt aber nichts an.


                        B) ESPeasy HTTP generic advanced
                        Controller IP: IP des shNG Servers
                        Controller Port: 8384
                        HTTP method: GET
                        HTTP URl: /ws/items/%sysname%.%tskname%.%vname1%
                        HTTP Header:
                        HTTP Body: %val1%

                        führt im Log zu:
                        Code:
                        2018-03-20  22:11:16 INFO     CP Server Thread-22 192.168.2.25 - - [20/Mar/2018:22:11:16] "GET /items/ESP_Easy.Abstand.Distance HTTP/1.1" 404 575 "" ""
                        das /ws/ zu Beginn des Publish werden verschluckt.

                        Ich habe auch ein Item ESP_Easy.Abstand.Distance mit type: num angelegt Es kommt aber nichts an.

                        meine Plugin Config: etc/module.yaml
                        Code:
                        %YAML 1.1
                        ---
                        # etc/module.yaml
                        http:
                            module_name: http
                            starturl: backend
                        #    threads: 8
                        #    showtraceback: False
                        #    showpluginlist: True
                        
                        #    port: 8383
                        #    user: admin
                        #    password: ''
                        #    hashed_password: 'xxx'
                        
                            servicesport: 8384
                            service_user: serviceuser
                            service_password: ''
                        #    service_hashed_password: 'xxx'
                        
                        
                        #dummy:
                        #    module_name: dummy

                        Tja, nun bin ich wieder mit meinem Latein am Ende.

                        Ich selbst nutze nur den ESP8266. Ich habe mich für den Wemos D1 mini entschieden. Die funktionieren super.
                        Zuletzt geändert von Sisamiwe; 20.03.2018, 22:23.

                        Kommentar


                          #13
                          Sisamiwe sieht ja erstmal schon gut aus. kleine anmerkung: wenn du den wert nicht via url (simple webservices) übergibst, nutzt du die REST services. dann steht als teil der url /rest anstatt /ws drin. siehst du in der web gui des plugins in den beispielen.

                          für den /ws service: kannst du schon mal direkt im browser den wert setzen lassen? dann geht zumindest das webservices plugin. die nachkommastellen sind aber eine gute anmerkung, ich glaube das hatte ich auch nie getestet. ist jetzt derzeit aber nicht das problem

                          warum espeasy das verschluckt muss ich dann erstmal testen, wenn ich das device habe. das ist dann eher ein thema von espeasy

                          wenn wir es dann mal hinbekommen haben wäre toll, wenn du als gegenleistung ein kurzes howto schreiben könntest, wie man von anfang an (inkl espeasy) vorgehen muss... bitte aber die botschaft mitnehmen, dass es ggf auch etwas dauern kann. über das osterwochenende bin ich mit der familie unterwegs und ich muss ja auch erstmal espeasy zum laufen bekommen (da würde der erste teil des howtos jetzt schon helfen :-) )
                          Zuletzt geändert von psilo; 21.03.2018, 05:27.

                          Kommentar


                            #14
                            so, mein proof of concept eines C programms, das via arduino IDE auf einen esp32 aufgespielt wurde, sendet jetzt cm entfernungen meines ultraschallmessers an shng:

                            Code:
                            #include <ETH.h>
                            #include <WiFi.h>
                            #include <WiFiAP.h>
                            #include <WiFiClient.h>
                            #include <WiFiGeneric.h>
                            #include <WiFiMulti.h>
                            #include <WiFiScan.h>
                            #include <WiFiServer.h>
                            #include <WiFiSTA.h>
                            #include <WiFiType.h>
                            #include <WiFiUdp.h>
                            #include <Wire.h>
                            
                            // PINs
                            const int triggerPin = 15;
                            const int echoPin = 4;
                            
                            // VARs
                            const int durchgaenge = 3;
                            float cm, dauer, dauergesamt;
                            
                            // Wifi / SmartHomeNG Configuration
                            char ssid[] = "<id des wlans>";    // Your network SSID (name)
                            char pass[] = "<pw des wlans>";    // Your network password
                            char host[] = "192.168.178.100";   // IP of SmartHomeNG (Webservices Plugin needs to be running!)
                            int port = 4321;                   // Port of service interface in SmartHomeNG
                            char cm_item[] = "test.numeric";   // SmartHomeNG Item to write Data to
                            int status = WL_IDLE_STATUS;
                            
                            // Initialize the Ethernet client library
                            WiFiClient client;
                            
                            static void initialise_wifi(void)
                            {
                              // attempt to connect to Wifi network:
                              while (status != WL_CONNECTED) {
                                Serial.println("");
                                Serial.println("Attempting to connect to SSID: ");
                                Serial.println(ssid);
                                // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
                                status = WiFi.begin(ssid, pass);
                            
                                // wait 10 seconds for connection:
                                delay(10000);    
                              }
                              Serial.println("Connected to wifi");
                              printWifiStatus();
                            }
                            
                            void setup() {
                              Serial.begin(19200);
                              initialise_wifi();
                            
                              // PIN-Modes
                              pinMode(triggerPin, OUTPUT);
                              pinMode(echoPin, INPUT);
                            }
                            
                            void loop() {
                              // Reset Dauergesamt
                              dauergesamt = 0;
                            
                              for (int i=0; i<durchgaenge; i++) {
                                // Trigger für High Pulse
                                digitalWrite(triggerPin, LOW);
                                delayMicroseconds(2);
                                digitalWrite(triggerPin, HIGH);
                                delayMicroseconds(10);
                                digitalWrite(triggerPin, LOW);
                            
                                // Erfassung - Dauer in Mikrosekunden
                                dauer = pulseIn(echoPin, HIGH);
                            
                                // Berechnung
                                dauergesamt = dauergesamt + dauer;
                            
                                delay(500);
                              }
                            
                              // Berechne Mikrosekunden in cm
                              cm = ((dauergesamt/durchgaenge)/2)/29;
                            
                              Serial.println("\nStarting connection to server...");
                              //if you get a connection, report back via serial:
                              while (client.available()) {
                                char c = client.read();
                                Serial.write(c);
                              }
                              Serial.println();
                              Serial.println(cm);
                              if (client.connect(host, port)) {
                                Serial.println("\nconnected to server");
                                // Make a HTTP request:
                                char buffer[64];
                                int ret = snprintf(buffer, sizeof buffer, "GET /ws/items/%s/%f HTTP/1.1", cm_item, cm);
                                Serial.println(buffer);
                                client.println(buffer);
                                client.println("Host: ");
                                client.println();
                              }
                              Serial.print("\n");
                            
                              delay(100);
                            }
                            
                            
                            void printWifiStatus() {
                              // print the SSID of the network you're attached to:
                              Serial.print("SSID: ");
                              Serial.println(WiFi.SSID());
                            
                              // print your WiFi shield's IP address:
                              IPAddress ip = WiFi.localIP();
                              Serial.print("IP Address: ");
                              Serial.println(ip);
                            
                              // print the received signal strength:
                              long rssi = WiFi.RSSI();
                              Serial.print("signal strength (RSSI):");
                              Serial.print(rssi);
                              Serial.println(" dBm");
                            }
                            Nachkommastellen gehen übrigens!

                            Fehlerfreiheit ist nicht zwingend im Code... Falls irgendwelche C Cracks Optimierungen haben gerne jederzeit


                            Im Seriellen Monitor zeigt die Arduino IDE dann sowas an:
                            Code:
                            Starting connection to server...
                            HTTP/1.1 200 OK
                            Content-Length: 66
                            Date: Wed, 21 Mar 2018 06:00:58 GMT
                            Content-Type: application/json
                            Server: CherryPy/14.0.0
                            
                            {"Success": "Item with item path test.numeric set to 100.040230."}
                            100.60
                            
                            connected to server
                            GET /ws/items/test.numeric/100.597702 HTTP/1.1
                            Zuletzt geändert von psilo; 21.03.2018, 08:03.

                            Kommentar


                              #15
                              psilo

                              auch von mir ein Update (irgendwie lässt mir das keine Ruhe):
                              • Ja, ich kann vom Browser aus über die entsprechende URl den Wert setzen. Das Webservice Plugin funktioniert also.
                              • Nach ESPEasy scheinbar immer den ersten Teil der URl verschuckt, habe ich ein Dummy davor geschrieben.
                                Der Controller Publish im HTTP Generic sieht jetzt so aus:
                                Code:
                                /shNG/ws/items/%sysname%.%tskname%.%valname%/%value%
                                Damit kommen die Werte auf dem entsprechendem Item in shNG an, auch mit Nachkommastelle. Testen müsste ich noch, was passiert, wenn der Sensor mehrer Werte liefert (Bspw. DHT der Temp und Hum liefert)
                              • gleiches habe ich auch bei HTTP Generic Advanced gemacht:
                                Die URl sieht so aus:
                                Code:
                                /shNG/rest/items/%sysname%.%tskname%.%vname1%
                                der HTTP Body
                                Code:
                                %val1%
                                Der Eintrag im shNG Log:
                                Code:
                                2018-03-21  07:30:12 INFO     CP Server Thread-20 192.168.2.25 - - [21/Mar/2018:07:30:12] "GET /rest/items/ESP_Easy.Abstand.Distance HTTP/1.1" 200 700 "" ""
                                Es kommt aber bei shNG nichts an.
                              • Das "Howto" mache ich gern. Teil1 mit Installation von ESPEasy kommt gleich.
                              Und auch ich bin geschäftlich stark eingespannt und auch Ostern mit Familie unterwegs. Also don't worry! Es ist "nur" Hobby.

                              Kommentar

                              Lädt...
                              X