[vz-users] ESP8266 mit Display soll Daten aus dem Volkszähler auslesen und anzeigen

Christian Wulff christianwulff at gmx.de
Sun Jun 25 15:46:06 CEST 2017


Hallo liebe Gemeinde,

 

an diesem Wochenende konnte ich nach längerer Pause endlich mal wieder voll dem VZ widmen.

 

Zuerst habe ich drei akkubetriebene, mobile Temperatursensoren mit ESP12F und stromsparendem Spannungsregler gebaut.

Darauf habe ich ESPEasy 2.0.0 dev 10 installiert. Das ist so genial einfach zu benutzen. Ein paar Einstellungen machen. Nix programmieren. Fertig. Supergenial!!!!!!

 

Datenerfassung läuft und läuft und läuft.

 

Aber nu endlich wieder zu meinem Anzeigedisplay Problemchen.

Auch dort habe ich weitergemacht, hab mir die schöne TFT_eSPI Library geholt. Dann habe ich in Arduino IDE damit ein Layout zusammengebaut, so wie ich mir vorstelle wie die Daten später mal angezeigt werden sollen. Das werde ich noch weiter optimieren, ist ja nur ein erster Entwurf, damit man sich das mal vorstellen kann. Siehe Anhang.

 

…fehlen „nur“ noch die richtigen Zahlen.

 

Und da komm ich leider noch überhaupt nicht weiter.

Ich weiss nicht mal wie ich da anfangen soll.

 

Vielleicht kann mich da nochmal jemand „an die Hand nehmen“?

 

Soweit hab ich mitgeschrieben, kann das aber noch nicht selber umsetzen:

 

Wie spiele ich denn im Browser mit der API rum?

Welches Ausgabeformat ist denn zum Beispiel gut zu gebrauchen?

PNG, GIF und JPG sind Grafikformate, das bringt mich nicht weiter.

Bleiben JSON, TXT und CSV ….ich denke die kommen in Frage, aber welches davon genau?

Ich will halt die Werte auslesen, wenn ich später Diagramme erzeugen will werden das viele Daten sein. Welches Format bietet sich da an?

 

Frank hatte geschrieben:

„sollte kein Problem sein die Daten als JSON von der Middleware zu bekommen. Min/Max mit zugehörigen Timestamps ist automatisch mit dabei. Kannst ja erst mal im Browser mit dem API spielen.

https://wiki.volkszaehler.org/development/api/reference“

 

Andreas hatte geschrieben:

„Du brauchst den Esp8266HttpClient um da VZ Api abzufragen und eine passende Json Bibliothek. Wenn Du Platformio nutzt wird das mit den Bibliotheken einfacher als mit der rudimentären Arduino Ide.“

und

„Dann fang doch mal mit den Beispielen aus github/esp8266 an- da siehst Du schonmal wie Du http Requests machen kannst. Wenn das läuft gehts mit json parser weiter.“

 

Marcus hatte den untenstehenden Code geschrieben. Vielen Dank dafür. Das ist immerhin schon mal ein Anfang.

 

 

Danke für Eure Geduld und lieben Gruß,

Christian

 

 

 

 

 

Von: Marcus Leithner [mailto:marcus at leithner.net] 
Gesendet: Montag, 22. Mai 2017 11:47
An: volkszaehler-users at demo.volkszaehler.org
Betreff: Re: [vz-users] [vz-dev] ESP8266 mit Display soll Daten aus dem Volkszähler auslesen und anzeigen

 

Moin Allerseits,

ich hab mal an VZ-Users geantwortet. passt wohl besser.

Ich hab einen ESP (nodeMCU) laufen um Temperaturen von der Heizung an den VZ zu schicken. Vielleicht hilft dir der Code zu starten.

Das ist auch zusammengeklaut und sicherlich keine schöner Code. läuft aber prächtig und kann nach dem ersten flashen über USB sogar über WIFI neu geflasht werden.

Was macht das Ganze:

Erstmal Setup vom WIFI, OTA und den DS18B20 Sensoren.

Dann wird eine Webseite mit den letzten ausgelesenen Werten gebaut. Wenn einer danach fragt ;)

Der nächste Block liest die Sensoren aus und meldet das an die middleware. Und zwar wenn der Timer abgelaufen ist 10*60*1000 millisekunden.

Ich denke so wie man die Werte schreibt, bekommt man sie auch gelesen und dann weiterverarbeitet.

 

Viele Grüße

Marcus

 

// Including the ESP8266 WiFi library
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

// Replace with your network details
const char* ssid = "SSID";
const char* password = "WIFI-KEY";
const char* host = "ESP-Heizung";

#define ONE_WIRE_BUS_1 D4

String url1 = "GET /vz/htdocs/middleware.php/data/";
const char* vzhost1 = "192.168.1.XX"; // IP-Adresse des Servers (mit Punkten!)
const char* uuid_t1 = "XXXXXXXXXXXX-11e4-9ff2-XXXXXXXXXXXX"; //EG R
const char* uuid_t2 = "XXXXXXXXXXXX-e92d-11e4-99e7-XXXXXXXXXXXX"; //EG V
const char* uuid_t3 = "XXXXXXXXXXXX-e92d-11e4-83b4-XXXXXXXXXXXX"; //OG R
const char* uuid_t4 = "XXXXXXXXXXXX-e92d-11e4-a7fb-XXXXXXXXXXXX"; //OG V
const char* uuid_t5 = "XXXXXXXXXXXX-e92d-11e4-8721-XXXXXXXXXXXX"; //Raum

const long interval1 = 10*60*1000; //meldeintervall an middelware
unsigned long timer1 = 0 - interval1;

// Web Server on port 80
WiFiServer server(80);

OneWire oneWire1(ONE_WIRE_BUS_1);
DallasTemperature sensors(&oneWire1);
DeviceAddress Probe01 = { 0x28, 0xFF, 0x52, 0xCE, 0x69, 0x14, 0x04, 0xEF }; 
DeviceAddress Probe02 = { 0x28, 0xFF, 0x79, 0x34, 0x65, 0x14, 0x01, 0x89 };
DeviceAddress Probe03 = { 0x28, 0xFF, 0x98, 0xD0, 0x69, 0x14, 0x04, 0x5D };
DeviceAddress Probe04 = { 0x28, 0xFF, 0x36, 0xA8, 0x65, 0x14, 0x01, 0xFC };
DeviceAddress Probe05 = { 0x28, 0xFF, 0x0B, 0xA8, 0x65, 0x14, 0x01, 0x94 };


float temp1(NAN), temp2(NAN), temp3(NAN), temp4(NAN), temp5(NAN);

void setup() {
  // Initialize the Temperature measurement library
  sensors.begin();
  // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
  sensors.setResolution(Probe03, 10);
  sensors.setResolution(Probe04, 10);
  sensors.setResolution(Probe05, 10);

  WiFi.mode(WIFI_STA);
  WiFi.hostname(host);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    }
    
// Starting the web server
  server.begin();
  delay(1000);
  ArduinoOTA.setHostname(host);
  ArduinoOTA.begin();
  
}

void loop() {
   ArduinoOTA.handle();

  // Listenning for new clients
  WiFiClient client = server.available();
  if (client) {
//    New client
    // bolean to locate when the http request ends
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && blank_line) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
//            client.println("<head><meta http-equiv='refresh' content='60'/><title>ESP8266 - Temperature and Humidity</title></head>");
            client.println("<head><title>ESP8266 - Temperature DS18B20</title></head>");
            client.println("<body><h1>ESP8266 - Temperature DS18B20</h1>");
            client.println("<h3>EG R Temperature in Celsius: ");
            client.println(temp1);
            client.println("C</h3>");
            client.println("<h3>EG V Temperatur in Celsius: ");
            client.println(temp2);
            client.println("C</h3>");
            client.println("<h3>OG R Temperatur in Celsius: ");
            client.println(temp3);
            client.println("C</h3>");
            client.println("<h3>OG V Temperatur in Celsius: ");
            client.println(temp4);
            client.println("C</h3>");
            client.println("<h3>Heizraum Temperatur in Celsius: ");
            client.println(temp5);
            client.println("C</h3>");            
            client.println("<h3> ESP IP: ");
            client.println(WiFi.localIP());
            client.println("</h3>");
            client.println("<h3> WLAN SSID: ");
            client.println(WiFi.SSID());
            client.println("</h3>");
            client.println("<h3> Channel: ");
            client.println(WiFi.channel());
            client.println("</h3>");                        
            client.println("<h3> Signal-Strength: ");
            client.println(WiFi.RSSI());
            client.println("dbm </h3>");
            client.println("<h3> Uptime: ");
            client.println(millis() / 1000);
            client.println(" seconds</h3>");
            client.println("</body></html>");
            break;
        }
        if (c == '\n') {
          // when starts reading a new line
          blank_line = true;
        }
        else if (c != '\r') {
          // when finds a character on the current line
          blank_line = false;
        }
      }
    }  
    // closing the client connection
    delay(1);
    client.stop();

  }
  if (millis() >= interval1 + timer1) {
    // save the last time 
    timer1 = millis();
    //do something
        int i=0;
        do { 
        sensors.requestTemperatures();
        delay(50);
        i++;
            }
        while ((sensors.getTempC(Probe05) < 0) && (i<100));
        temp1 = sensors.getTempC(Probe01);
        temp2 = sensors.getTempC(Probe02);
        temp3 = sensors.getTempC(Probe03);
        temp4 = sensors.getTempC(Probe04);
        temp5 = sensors.getTempC(Probe05);
        String url;
        // Daten  melden
        // mit dem Port 80 verbinden
        if (temp1 > 0) {
        client.connect(vzhost1, 80);
        url = url1;
        url += uuid_t1;
        url += ".json?&value=";
        url += temp1;
        url += "&operation=add";
        url += " HTTP/1.1";
        client.print(url + "\r\n" + "Host: " + WiFi.localIP() + "\r\n" + "Connection: close\r\n\r\n");
        int i1=0;
        while((!client.available()) && (i1<1000)){
          delay(10);
          i1++;
          }
        client.stop();
        }
        if (temp2 > 0) {
        client.connect(vzhost1, 80);
        url = url1;
        url += uuid_t2;
        url += ".json?&value=";
        url += temp2;
        url += "&operation=add";
        url += " HTTP/1.1";
        client.print(url + "\r\n" + "Host: " + WiFi.localIP() + "\r\n" + "Connection: close\r\n\r\n");
        int i2=0;
        while((!client.available()) && (i2<1000)){
          delay(10);
          i2++;
          }
        client.stop();
        }
        
        if (temp3 > 0) {
        client.connect(vzhost1, 80);
        url = url1;
        url += uuid_t3;
        url += ".json?&value=";
        url += temp3;
        url += "&operation=add";
        url += " HTTP/1.1";
        client.print(url + "\r\n" + "Host: " + WiFi.localIP() + "\r\n" + "Connection: close\r\n\r\n");
        int i3=0;
        while((!client.available()) && (i3<1000)){
          delay(10);
          i3++;
          }
        client.stop();
        }
        
        if (temp4 > 0) {
        client.connect(vzhost1, 80);
        url = url1;
        url += uuid_t4;
        url += ".json?&value=";
        url += temp4;
        url += "&operation=add";
        url += " HTTP/1.1";
        client.print(url + "\r\n" + "Host: " + WiFi.localIP() + "\r\n" + "Connection: close\r\n\r\n");
        int i4=0;
        while((!client.available()) && (i4<1000)){
          delay(10);
          i4++;
          }
        client.stop();
        }
        
        if (temp5 > 0) {
        client.connect(vzhost1, 80);
        url = url1;
        url += uuid_t5;
        url += ".json?&value=";
        url += temp5;
        url += "&operation=add";
        url += " HTTP/1.1";
        client.print(url + "\r\n" + "Host: " + WiFi.localIP() + "\r\n" + "Connection: close\r\n\r\n");
        int i5=0;
        while((!client.available()) && (i5<1000)){
          delay(10);
          i5++;
          }
        client.stop();
        }
        
      }

}

 

Am 22.05.2017 um 07:55 schrieb Andreas Götz:

Dann fang doch mal mit den Beispielen aus github/esp8266 an- da siehst Du schonmal wie Du http Requests machen kannst. Wenn das läuft gehts mit json parser weiter.

 

Viele Grüße, Andreas 


Am 21.05.2017 um 22:23 schrieb Christian Wulff <christianwulff at gmx.de>:

Moin Andreas,

 

Hmm, verstehe momentan nur Bahnhof.

Hat das vielleicht schon jemand gemacht?

Wenn ich ein paar Codeschnipsel hätte, dann könnte ich mich da gut einfuchsen.

 

Lieben Gruß,

Christian

 

Von: Andreas Götz [mailto:cpuidle at gmail.com] 
Gesendet: Samstag, 20. Mai 2017 14:40
An: volkszaehler.org
Betreff: Re: [vz-dev] ESP8266 mit Display soll Daten aus dem Volkszähler auslesen und anzeigen

 

Du brauchst den Esp8266HttpClient um da VZ Api abzufragen und eine passende Json Bibliothek. Wenn Du Platformio nutzt wird das mit den Bibliothen einfacher als mit der rudimentären Arduino Ide. 

Viele Grüße,

Andreas


Am 19.05.2017 um 23:33 schrieb Frank Richter <frank.richter83 at gmail.com>:

Hallo Christian,

 

sollte kein Problem sein die Daten als JSON von der Middleware zu bekommen. Min/Max mit zugehörigen Timestamps ist automatisch mit dabei. Kannst ja erst mal im Browser mit dem API spielen.

 

https://wiki.volkszaehler.org/development/api/reference

 

Grüße

Frank

 

Am 19.05.2017 23:20 schrieb "Christian Wulff" <christianwulff at gmx.de>:

Moin,

 

ich möchte einen ESP8266 mit einem Display nutzen, um ein paar Werte anzeigen zu lassen.

Aktuelle Zeit

Aktuelles Datum

Aktuelle Außentemperatur

Mindesttemperatur in den letzten 24h

Uhrzeit wann die Mindesttemperatur geloggt wurde

Maximaltemperatur in den letzten 24h

Uhrzeit wann die Maximaltemperatur geloggt wurde

 

Ich möchte kein Android Tablet benutzen und ein Frontend darstellen (hab ich schon, ich will aber ein kleines separates Display nutzen), sondern genau oben genannte Hardware benutzen.

 

Die Hardware ist vorhanden.

Grafik und Text kann ich schon darstellen.

Programmiert werden soll mit der Arduino IDE.

 

Nun ist nur die Frage wie kann ich auf die Daten vom Volkszähler zugreifen?

Hat sowas schon mal jemand gemacht?

 

Lieben Gruß,

Christian

 

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20170625/8c46e094/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 20170625_150027.png
Type: image/png
Size: 260771 bytes
Desc: not available
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20170625/8c46e094/attachment-0001.png>


More information about the volkszaehler-users mailing list