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

Marcus Leithner marcus at leithner.net
Mon May 22 11:46:32 CEST 2017


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 
> <mailto: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 <http://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 <mailto: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 <mailto: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/20170522/1324ba98/attachment-0001.html>


More information about the volkszaehler-users mailing list