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

Frank Richter frank.richter83 at gmail.com
Sun Jun 25 16:12:53 CEST 2017


Hallo Christian,

fang doch mal ganz einfach an:

http://IP/middleware.php/data/UUID.json

Nur noch deine IP und eine UUID einsetzen, dann schaust du dir an was du
zurückbekommst. Danach kannst du anfangen das Ergebnis weiter zu
beeinflussen/einzuschränken, z.B. mit from, to, tuples, group usw. oder
durch ein anderes Format (siehe API-Referenz im Wiki). Für dein ESP-Projekt
wird JSON aber bestimmt am besten passen.

Wenn du dann weißt, mit welchem Request du die passenden Daten bekommst,
kannst du daran gehen die entsprechenden Requests mit dem ESP auszuführen
und auszuwerten.

Grüße
Frank

Am 25.06.2017 15:46 schrieb "Christian Wulff" <christianwulff at gmx.de>:

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 <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/8899ba1e/attachment-0001.html>


More information about the volkszaehler-users mailing list