Systemvariablen auf CCU2 von NodeMCU

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 30.04.2019, 11:52

Hallo!

Bin gerade dabei mir eine Wetterstation für meine Homematic selbst zusammenzubauen. Die Daten sollen per WiFi an Systemvariablen weitergegeben werden. Da klappt, solange ich nur einen Wert sende. Wenn ich mehrere Werte senden will, wird entweder der erste oder der letzte übertragen, jenachdem ob ich mittels "http.begin" oder "serial.print" übertrage.
Vielleicht hat ja jemand eine Idee dazu?

Danke und LG
Thomas


Code: Alles auswählen

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;

WiFiClient client;
const char* ssid="XXXXXXXX";
const char* password = "YYYYYYYY";

const char* Homematic = "192.168.0.11";

void setup() {
 Serial.begin(115200);
  delay(50);
  Serial.println();
  Serial.print("Wifi verbindet zu ");
  Serial.println( ssid );
  WiFi.begin(ssid,password);
  Serial.println();
  Serial.print("Verbinde");

  while( WiFi.status() != WL_CONNECTED ){
      delay(500);
      Serial.print(".");
  }
  Serial.println();
  Serial.println("Wifi Verbunden!");
  Serial.print("NodeMCU IP Addresse : ");
  Serial.println(WiFi.localIP() );
  Serial.println();
}

void loop() {
  if (client.connect(Homematic,80)) {
  
  // Testwerte
String Windrichtung = "70";
String Himmelsrichtung = "190";



String Windurl2 = "http://192.168.0.11/config/xmlapi/statechange.cgi?ise_id=12025&new_value=";
      Windurl2 += Windrichtung;
      
     Serial.print(String("GET ") + Windurl2 + " HTTP/1.1\r\n" +
              "Host: " + Homematic + "\r\n" + 
               "Connection: close\r\n\r\n");
     client.println(String("GET ") + Windurl2 + " HTTP/1.1\r\n" +
              "Host: " + Homematic + "\r\n" + 
               "Connection: close\r\n\r\n");

               delay(1000);

String Windurl = "http://192.168.0.11/config/xmlapi/statechange.cgi?ise_id=12024&new_value=";
      Windurl += Himmelsrichtung;
 
     Serial.print(String("GET ") + Windurl + " HTTP/1.1\r\n" +
              "Host: " + Homematic + "\r\n" + 
               "Connection: close\r\n\r\n");
     client.println(String("GET ") + Windurl + " HTTP/1.1\r\n" +
              "Host: " + Homematic + "\r\n" + 
               "Connection: close\r\n\r\n");

delay(2000);
  
  // Server-Antwort ausgeben
  while(client.available()){
    String antwort = client.readStringUntil('\r');
    Serial.print(antwort);
  }
  
  delay(1000);
}
}

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 30.04.2019, 14:33

So, habe noch weiter herumprobiert und die Lösung eventuell selbst gefunden. Habe es dieses mal zwar mit dom.GetObject gemacht, die Lösung dürfte aber die selbe sein. und zwar habe ich nicht nach jedem senden "Connection: close\r\n\r\n" sondern nur mehr nach dem letzten. Mit zwei Systemvariablen funktioniert es. Mal schauen wie es ist wenn noch einige dazukommen...

Gruß
Thomas

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 30.04.2019, 22:10

So, leider bin ich auf ein weiteres Problem gestoßen. Wenn ich

Code: Alles auswählen

String Himmelsrichtung ="120";  //Testwert

String urlWindrichtung = "http://192.168.0.11/config/xmlapi/statechange.cgi?ise_id=12024&new_value=";
			urlWindrichtung += Himmelsrichtung;
			
client.println(String("GET ") + urlWindrichtung + " HTTP/1.1\r\n" +
              "Host: " + HomematicIP + "\r\n" +
              "Connection: close\r\n\r\n");
verwende, funktioniert es. sobald "Himmelsrichtung" aber meine Variable ist, geht es nicht mehr. Deklariert ist die "Himmelsrichtung" als unsigned int. Also dürfe wahrscheilichdas Problem sein, das diese Variable nicht als String weitergegeben wird?!? Leider habe ich aber keine Ahnung wie das zu lösen ist!

Danke und Gruß
Thomas

jp112sdl
Beiträge: 3346
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 34 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von jp112sdl » 30.04.2019, 23:05

Thomas76 hat geschrieben:
30.04.2019, 22:10
Leider habe ich aber keine Ahnung wie das zu lösen ist!
Machst nen String draus...

Code: Alles auswählen

urlWindrichtung += String(Himmelsrichtung);
Ich hab früher auch mal WiFi Sensoren gebaut.
Schau mal hier.
Ich hatte mir quick&dirty eine kleine Funktion gebaut, um Werte an die CCU zu senden.

VG,
Jérôme

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 01.05.2019, 10:58

Hallo,

danke für deine Antwort! Dein Beispiel habe ich schon ausprobiert, funktioniert leider auch nicht. Die Ausgabe am Seriellen Monitor ist genau so wie sie sein soll, und wenn ich die Ausgabe in den Browser kopiere, funktioniert es auch, nur direkt von der NodeMCU nicht.
Habe mir auch den Link angesehen Ist ein bisschen zu komplex für mich. Habe aber gesehen, das du http.begin verwendest. Mit http.begin klappt es aber ich schaffe es nur einen Wert zu übertragent. Wie müsste es aufgebaut sein, damit ich auch zb. fünf Werte senden kann. Hänge mal meinen halbwegs aufgeräumten Code an.

Danke nochmals und Gruß
Thomas

Code: Alles auswählen

#include <Wire.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>

const byte Windsensorpin = D4;

unsigned long previousMillisUebertragung = 0;
const long Uebertragungsintervall = 5000;


// Variablen für Windmessung
volatile boolean TX20IncomingData = false;
unsigned char chk;
unsigned char sa,sb,sd,se;
unsigned int sc,sf, pin;
unsigned int Himmelsrichtung;
String tx20RawDataS = "";
String Windrichtung_Gartensensor;

const char* ssid="XXXXXXXX";
const char* password = "YYYYYYYY";
const char* HomematicIP = "192.168.0.11";
WiFiClient client;

void setup() {
  pinMode(Windsensorpin, INPUT);
  attachInterrupt(digitalPinToInterrupt(Windsensorpin), isTX20Rising, RISING);
  Serial.begin(115200);
  delay(50);
  Serial.println();
  Serial.print("Wifi verbindet zu ");
  Serial.println( ssid );
  WiFi.begin(ssid,password);
  Serial.println();
  Serial.print("Verbinde");

  while( WiFi.status() != WL_CONNECTED ){
      delay(500);
      Serial.print(".");
  }
      Serial.println();
      Serial.println("Wifi Verbunden!");
      Serial.print("NodeMCU IP Addresse : ");
      Serial.println(WiFi.localIP() );
      Serial.println();

  if (client.connect(HomematicIP, 80)) {
     Serial.println("Connected to Homematic!");
 } else {
     Serial.println("Connection to Homematic failed");
 }

}

void loop() {

   Windmessung();
   
  unsigned long currentMillisUebertragung = millis();
  if (currentMillisUebertragung - previousMillisUebertragung >= Uebertragungsintervall) {
    previousMillisUebertragung = currentMillisUebertragung;
Uebertragung();
  }
}

void Uebertragung() {
  Himmelsrichtung = map(sb, 0, 16, 0, 360);
    Serial.print("Himmelsrichtung: ");
    Serial.print(Himmelsrichtung);
    Serial.println();
    HTTPClient http;

    
String urlWindrichtung = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windrichtung_Gartensensor\").State(" + Himmelsrichtung + ")";
String urlWindgeschwindigkeit = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(" + sc + ")";
Serial.println(urlWindrichtung);
Serial.println(urlWindgeschwindigkeit);
http.begin(urlWindrichtung);
http.begin(urlWindgeschwindigkeit);
int httpCode = http.GET();
Serial.print("httpcode = " + String(httpCode));

/*
    String urlWindrichtung = "http://192.168.0.11/config/xmlapi/statechange.cgi?ise_id=12024&new_value=";
            urlWindrichtung += String(Himmelsrichtung);
            
    client.println(String("GET ") + urlWindrichtung + " HTTP/1.1\r\n" +
              "Host: " + HomematicIP + "\r\n" +
              "Connection: close\r\n\r\n");
*/
    delay(2000);
}

void isTX20Rising() {
  if (!TX20IncomingData) {
    TX20IncomingData = true;
  }  
}

void Windmessung() {

   if (TX20IncomingData) {
    char a[90];
    boolean validData = readTX20();
    Serial.println(tx20RawDataS);
    sprintf(a, "ID: %d\t%d\n", sa, B00100);
    Serial.write (a);
    sprintf(a, "Wind direction: %d\t%d\n", sb, se);
    Serial.write (a);
    sprintf(a, "Wind speed: %d\t%d\n", sc, sf);
    Serial.write (a);
    sprintf(a, "Checksum: %d\t%d\n", sd, chk);
    Serial.write (a);
 //   Windrichtung();
    if (validData){      
      Serial.println(" :) OK :) OK :) OK :) OK");
    } else {
      Serial.println(" !!! ERROR !!! ERROR !!!");
    }
    Serial.println("");
  }
}


boolean readTX20() {
    int bitcount=0;
    
    sa=sb=sd=se=0;
    sc=0;sf=0;
    tx20RawDataS = "";

    for (bitcount=41; bitcount>0; bitcount--) {
      pin = (digitalRead(Windsensorpin));
      if (!pin) {
        tx20RawDataS += "1";      
      } else {
        tx20RawDataS += "0";      
      }
      if ((bitcount==41-4) || (bitcount==41-8) || (bitcount==41-20)  || (bitcount==41-24)  || (bitcount==41-28)) {
        tx20RawDataS += " ";
      }      
      if (bitcount > 41-5){
        // start, inverted
        sa = (sa<<1)|(pin^1);
      } else
      if (bitcount > 41-5-4){
        // wind dir, inverted
        sb = sb>>1 | ((pin^1)<<3);
      } else
      if (bitcount > 41-5-4-12){
        // windspeed, inverted
        sc = sc>>1 | ((pin^1)<<11);
      } else
      if (bitcount > 41-5-4-12-4){
        // checksum, inverted
        sd = sd>>1 | ((pin^1)<<3);
      } else 
      if (bitcount > 41-5-4-12-4-4){
        // wind dir
        se = se>>1 | (pin<<3);
      } else {
        // windspeed
        sf = sf>>1 | (pin<<11);
      } 
          
      delayMicroseconds(1220);    
    }
    chk= ( sb + (sc&0xf) + ((sc>>4)&0xf) + ((sc>>8)&0xf) );chk&=0xf;
    delayMicroseconds(2000);  // just in case
    TX20IncomingData = false;  

    if (sa==4 && sb==se && sc==sf && sd==chk){      
      return true;
    } else {
      return false;      
    }
}

jp112sdl
Beiträge: 3346
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 34 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von jp112sdl » 01.05.2019, 12:52

Thomas76 hat geschrieben:
01.05.2019, 10:58
Wie müsste es aufgebaut sein, damit ich auch zb. fünf Werte senden kann.
Mit dom.GetObject gehts m.W. nicht. Mit XML-API hab ich mich nie großartig befasst.
Aber was spricht dagegen, 5 einzelne HTTP Requests abzusenden?

VG,
Jérôme

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 01.05.2019, 14:08

Grundsätzlich spricht nichts dagegen, aber er tut es leider nicht! Weiß es jetzt nicht auswendig, aber er sendet immer nur den ersten oder letzten!
Jetzt hast du mich noch auf eine Idee gebracht! Werde das heute am Abend nochmal angehen.

Danke und Gruß
Thomas

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 01.05.2019, 20:16

So, leider schaffe ich es nicht einzelne http requests abzuschicken. Es wird immer nur derjenige übertragen, wo

Code: Alles auswählen

int httpCode = http.GET();
dabeisteht. Mein Code für die Übertragung sieht so aus:

Code: Alles auswählen

void Uebertragung() {
  Himmelsrichtung = map(sb, 0, 16, 0, 360);
    Serial.print("Himmelsrichtung: ");
    Serial.print(Himmelsrichtung);
    Serial.println();
    HTTPClient http;
    
        String urlWindrichtung = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windrichtung_Gartensensor\").State(" + Himmelsrichtung + ")";
            Serial.println(urlWindrichtung);
            http.begin(urlWindrichtung);
            int httpCode = http.GET();
            
    delay(2000);

        String urlWindgeschwindigkeit = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(" + sc + ")";
            Serial.println(urlWindgeschwindigkeit);
            http.begin(urlWindgeschwindigkeit);
            Serial.println("httpcode = " + String(httpCode));

    delay(2000);
}
Danke Thomas

jp112sdl
Beiträge: 3346
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 34 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von jp112sdl » 01.05.2019, 20:27

da fehlt ja auch noch das zweite http.get()

Code: Alles auswählen

void Uebertragung() {
  Himmelsrichtung = map(sb, 0, 16, 0, 360);
    Serial.print("Himmelsrichtung: ");
    Serial.print(Himmelsrichtung);
    Serial.println();
    HTTPClient http;
    
        String urlWindrichtung = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windrichtung_Gartensensor\").State(" + Himmelsrichtung + ")";
            Serial.println(urlWindrichtung);
            http.begin(urlWindrichtung);
            int httpCode = http.GET();
            
    delay(2000);

        String urlWindgeschwindigkeit = "http://" + String(HomematicIP) + ":80/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(" + sc + ")";
            Serial.println(urlWindgeschwindigkeit);
            http.begin(urlWindgeschwindigkeit);
            int httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));

    delay(2000);
}

VG,
Jérôme

Thomas76
Beiträge: 21
Registriert: 04.04.2014, 11:32

Re: Systemvariablen auf CCU2 von NodeMCU

Beitrag von Thomas76 » 01.05.2019, 21:45

Hallo!

Das nimmt er leider nicht zweimal. Das Kompiliert er nicht.

Danke und Gruß Thomas

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“