Systemvariablen in CCU3 von nodemcu per HTTP setzen

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

Moderator: Co-Administratoren

Antworten
Thomas76
Beiträge: 23
Registriert: 04.04.2014, 11:32

Systemvariablen in CCU3 von nodemcu per HTTP setzen

Beitrag von Thomas76 » 17.09.2022, 19:32

Hallo!

Habe vor einiger Zeit eine kleine Wetterstation mt einer NodeMCU gebaut die mi der CCU2 problemlos funktionierte. Seit dem Umstieg auf die CCU3 habe ich aber leider das Problem, das die per HTTP gesendeten Daten ein paar Stunden die Systemvariablen in der CCU3 einwandfrei setzten, danach ich aber den Fehlercode -2 erhalte. Nachdem ich die NodeMCU neu starte funktioniert es wieder eine Weile. Ich konnte leider auch nicht herausfinden was -2 zu bedeuten hat. Für etwaige Tipps wäre ich sehr dankbar!

Danke Thomas

Code: Alles auswählen

// Adresse BME 280: 0x76
// Adresse BH1750: 0x23

#include <Arduino.h>

//Netzwerk
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>


//Update per wlan
#include <ArduinoOTA.h> // OTA Upload via ArduinoIDE    funktioniert leider nicht

// I2C
#include <Wire.h>

// BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Temperatursensor TSIC306
#include "TSIC.h"

// Helligkeitssensor BH1750   I2C 0x23
#include <BH1750.h>

BH1750 lightMeter;
Adafruit_BME280 bme; // I2C 0x76

TSIC TemperaturSensor(D5);
const byte Windsensorpin = D7;
const byte LED_Uebertragung = D0;

// Variablen, für die Zeitverzögerung bei der Übertragung
unsigned long previousMillis = 0;
const long Uebertragungsintervall = (3*60*1000);
unsigned long delayTime;

// Variablen für Temperaturmessung mit TSIC306
uint16_t temperature = 0;
float Temperatur_C = 0;
float BME280Luftdruck, BME280Luftfeuchtigkeit;
float BME280Temperatur;

// Variable für die Helligkeit
float Helligkeit = 0;

// 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;

//Variablen für die Übertragung
unsigned int Windrichtung1, Windrichtung2;
unsigned int Windgeschwindigkeit1, Windgeschwindigkeit2, Windgeschwindigkeit3;
float Helligkeit1, Helligkeit2;

ESP8266WiFiMulti WiFiMulti;
WiFiClient client;
HTTPClient http;
int httpCode = http.GET();

ESP8266WebServer server(80); 
 
const char* ssid="FRITZ!Box 4040 PL";
const char* password = "Passwort";
const char* HomematicIP = "192.168.0.11";

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

/*
 * SETUP
 */
void setup() {
  pinMode(Windsensorpin, INPUT);
  pinMode(LED_Uebertragung, OUTPUT);
  digitalWrite(LED_Uebertragung, HIGH);

  ArduinoOTA.begin(); // OTA Upload via ArduinoIDE 
  
  bool status;
  status = bme.begin(0x76);
  Wire.begin();
  lightMeter.begin();
  
  attachInterrupt(digitalPinToInterrupt(Windsensorpin), isTX20Rising, RISING);
  Serial.begin(115200);
  delay(50);
  Serial.println();
  Serial.print("Wifi verbindet zu ");
  Serial.println( ssid );
  
  WiFi.begin(ssid,password);
  IPAddress staticIP(192, 168, 0, 120);
  IPAddress gateway(192,168,0,1);   
  IPAddress subnet(255,255,255,0);   
  WiFi.config(staticIP, gateway, subnet);
  ArduinoOTA.setHostname("Wetterstation");
  
  Serial.println();
  Serial.print("Verbinde");

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

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);
  server.begin();
  Serial.println("HTTP server started");
  
if (client.connect(HomematicIP, 80)) {
     Serial.println("Connected to Homematic!");
     Serial.println();
 } else {
     Serial.println("Connection to Homematic failed");
     Serial.println();
 }
  String urlWindgeschwindigkeit = "http://Benutzername:Passwort@" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(0)";
            Serial.println(urlWindgeschwindigkeit);
            http.begin(urlWindgeschwindigkeit);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      digitalWrite(LED_Uebertragung, LOW);
            String Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
      digitalWrite(LED_Uebertragung, HIGH);
}

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;      
    }

}

/*
 * LOOP
 */
void loop() {
  /* Wenn Webserver aktiv, funktioniert Anemometer nicht mehr
    handle_OnConnect();
    server.handleClient();
  */
    ArduinoOTA.handle(); 
  
  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);
    if (validData){      
      Serial.println(" :) OK :) OK :) OK :) OK");

// Übertragung Windgeschwindigkeit
      Windgeschwindigkeit2 = Windgeschwindigkeit1;
      Serial.print("Windgeschwindigkeit 2: ");
      Serial.println(Windgeschwindigkeit2);
      Windgeschwindigkeit1 = sf;
      Serial.print("Windgeschwindigkeit 1: ");
      Serial.println(Windgeschwindigkeit1);

      if (Windgeschwindigkeit2 != Windgeschwindigkeit1) { 
      digitalWrite(LED_Uebertragung, LOW);
          String urlWindgeschwindigkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(" + sc + ")";
            Serial.println(urlWindgeschwindigkeit);
            http.begin(urlWindgeschwindigkeit);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      digitalWrite(LED_Uebertragung, LOW);
            String Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      }
   
// Übertragung Windrichtung
      Windrichtung2 = Windrichtung1;
      Serial.print("Windrichtung 2: ");
      Serial.println(Windrichtung2);
      Windrichtung1 = se;
      Serial.print("Windrichtung 1: ");
      Serial.println(Windrichtung1);

      if (Windrichtung2 != Windrichtung1) { 
      digitalWrite(LED_Uebertragung, LOW);
         Windrichtung();
          String urlWindrichtung = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windrichtung_Gartensensor\").State(" + Himmelsrichtung + ")";
            Serial.println(urlWindrichtung);
            http.begin(urlWindrichtung);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      digitalWrite(LED_Uebertragung, LOW);
            String Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      }
    } else {
      Serial.println(" !!! ERROR !!! ERROR !!!");
    }
    Serial.println("");
  }
Uebertragung();

}

void Uebertragung() {
  unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previousMillis) >= Uebertragungsintervall) {

// Damit sollen die Markisen bei starken Wind nach X Minuten eingefahren werden
  Windgeschwindigkeit3 = Windgeschwindigkeit2;
    Serial.print("Windgeschwindigkeit 3: ");
    Serial.println(Windgeschwindigkeit3);

      digitalWrite(LED_Uebertragung, LOW);
      String urlWindgeschwindigkeit3 = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Einfahrwert\").State(" + Windgeschwindigkeit3 + ")";
      http.begin(urlWindgeschwindigkeit3);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);
      digitalWrite(LED_Uebertragung, LOW);
            String Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
      digitalWrite(LED_Uebertragung, HIGH);
          delay(500);


  
    // Übertragung Helligkeit
    int Helligkeit = lightMeter.readLightLevel();
      Helligkeit2 = Helligkeit1;
      Serial.print("Helligkeit 2: ");
      Serial.println(Helligkeit2);
      Helligkeit1 = Helligkeit;
      Serial.print("Helligkeit 1: ");
      Serial.println(Helligkeit1);

      if (Helligkeit1 != Helligkeit2) {
          digitalWrite(LED_Uebertragung, LOW);
          String urlHelligkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Helligkeit\").State(" + Helligkeit + ")";
            Serial.println(urlHelligkeit);
            http.begin(urlHelligkeit);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
          digitalWrite(LED_Uebertragung, HIGH);
            delay(500);
          digitalWrite(LED_Uebertragung, LOW);
            String Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
          digitalWrite(LED_Uebertragung, HIGH);

        // Übertragung und Temperaturmessung TSIC306
        if (TemperaturSensor.getTemperature(&temperature)) {
          Temperatur_C = TemperaturSensor.calc_Celsius(&temperature);
        }
        digitalWrite(LED_Uebertragung, LOW);
          String urlTSIC306 = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Temperatur_Gartensensor_TSIC306\").State(" + Temperatur_C + ")";
            Serial.println(urlTSIC306);
            http.begin(urlTSIC306);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
          digitalWrite(LED_Uebertragung, HIGH);
            delay(500);
          digitalWrite(LED_Uebertragung, LOW);
            Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
          digitalWrite(LED_Uebertragung, HIGH);

         // Übertragung BME280 Temperatur
        BME280Temperatur = (bme.readTemperature());
        digitalWrite(LED_Uebertragung, LOW);
         String urlBME280Temperatur = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Temperatur\").State(" + BME280Temperatur + ")";
            Serial.println(urlBME280Temperatur);
            http.begin(urlBME280Temperatur);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
          digitalWrite(LED_Uebertragung, HIGH);
            delay(500);
          digitalWrite(LED_Uebertragung, LOW);
            Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
          digitalWrite(LED_Uebertragung, HIGH); 

          // Übertragung BME280 Luftfeuchtigkeit
        BME280Luftfeuchtigkeit = (bme.readHumidity());
        digitalWrite(LED_Uebertragung, LOW);
         String urlBME280Luftfeuchtigkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Luftfeuchtigkeit\").State(" + BME280Luftfeuchtigkeit + ")";
            Serial.println(urlBME280Luftfeuchtigkeit);
            http.begin(urlBME280Luftfeuchtigkeit);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
          digitalWrite(LED_Uebertragung, HIGH);
            delay(500);
          digitalWrite(LED_Uebertragung, LOW);
            Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
          digitalWrite(LED_Uebertragung, HIGH); 

          // Übertragung BME280 Luftdruck
        BME280Luftdruck = (bme.readPressure() / 100.0F);
        digitalWrite(LED_Uebertragung, LOW);
         String urlBME280Luftdruck = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Luftdruck\").State(" + BME280Luftdruck + ")";
            Serial.println(urlBME280Luftdruck);
            http.begin(urlBME280Luftdruck);
            httpCode = http.GET();
            Serial.println("httpcode = " + String(httpCode));
          digitalWrite(LED_Uebertragung, HIGH);
            delay(500);
          digitalWrite(LED_Uebertragung, LOW);
            Leerzeile ="/n";
            http.begin(Leerzeile);
            httpCode = http.GET();
          digitalWrite(LED_Uebertragung, HIGH); 
      } 
      previousMillis = currentMillis;
  }
}

jp112sdl
Beiträge: 12085
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 847 Mal
Danksagung erhalten: 2139 Mal
Kontaktdaten:

Re: Systemvariablen in CCU3 von nodemcu per HTTP setzen

Beitrag von jp112sdl » 17.09.2022, 22:18


VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

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

Re: Systemvariablen in CCU3 von nodemcu per HTTP setzen

Beitrag von Thomas76 » 18.09.2022, 14:23

Danke für den Link! Das ist mir bei meiner Suche nicht untergekommen.
Habe weiterrecherchiert, bis jetzt aber nichts brauchbares gefunden. Vielleicht muss der Code für die CCU3 anders aussehen? Habe über die FritzBox unabsichhtlich die ip-Adresse der NodeMCU angeklickt und danach die NodeMCU angepingt. Interessanterweise funktioniert es jetzt wieder (für ein paar Stunden!?!) Da mein Anemometer wenn der Webserver aktiv ist nicht funktioniert, werde ich mal den Code aufräumen und versuchen ihn etwas abzuändern.

Danke und Gruß Thomas

Antworten

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