Seite 1 von 2

SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 14:07
von mafa
Hallo,
ich hab mir auf nem nodemcu esp8266 nen kleinen Sketch geschrieben um eine blinkende LED am Stromzähler mitzuzählen. Klappt auch.

Code: Alles auswählen

#include <BearSSLHelpers.h>
#include <CertStoreBearSSL.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiClientSecureAxTLS.h>
#include <WiFiClientSecureBearSSL.h>
#include <WiFiServer.h>
#include <WiFiServerSecure.h>
#include <WiFiServerSecureAxTLS.h>
#include <WiFiServerSecureBearSSL.h>
#include <WiFiUdp.h>

boolean reading = false;
boolean connected = false;

byte HomematicIP[]  = { 192, 333, 111, 22};            // Homematic IP-Adresse


WiFiClient client;


void setup() {

  
  Serial.begin(9600);
  Serial.println();

  WiFi.begin("netzwerkname", "xxxx");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)  //LOOP solange verbindung aufgebaut wird. stoppt erst wenn wifi verbindung erfolgeich
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected to WIFI!, IP address: ");
  Serial.println(WiFi.localIP());


 Serial.println("Connecting to Homematic..."); //Verbindung zu CCU Homematic

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


void loop() {
  int sensorValue = analogRead(A0);   // read the input on analog pin 0
  static unsigned int impulse = 0;

 if (sensorValue < 100 ) {
   impulse++;
    delay(500);
    Serial.println(sensorValue);
    Serial.println(impulse);
  // Messwert in Systemvariable auf der CCU eintragen
if (client.connect(HomematicIP,80)) {
   Serial.println(impulse);
   client.print("GET /config/xmlapi/statechange.cgi?ise_id=8112&new_value=");  
   client.print(impulse);
   client.println(" HTTP/1.0");
   client.println();
 }
 
 if (client.connected()){
   client.stop();
 }
 }

  
 // Serial.print("Connected, IP address2: ");
 // Serial.println(WiFi.localIP());

}
Problem: Nur wird der Counter sehr schlecht übertragen. Anfangs gut, dann gar nicht mehr oder sporadisch.

Netzwerkprobleme schliess ich aus. Router liegt gleich daneben, wlan funzt einwandfrei. Sollte ich den Wert iwie anders übertragen? Oder nur in bestimmten intervallen. Jetzt wird es ca. alle 10-15s sein

Re: SVs Update per XML nur in bestimmten Interballen möglch?

Verfasst: 24.12.2018, 14:18
von jp112sdl
Hmm...

also der Code sieht ganz schön nach "zusammenkopiert" aus.
2/3 deiner #includes können schon mal raus.

Dann würde ich es nicht mit WiFiClient machen, sondern mit HTTPClient und auch nicht die XML-API nutzen,sondern den Wert direkt der ReGa übergeben.
Ich mache das bspw. beim Wasserzähler so: https://github.com/jp112sdl/HM_Wasserza ... ndling.ino

Dann solltest du auch immer prüfen, ob das WLAN noch verbunden ist (WiFi.status() == WL_CONNECTED).

Zudem kommt noch, dass in der Zeit, wo übertragen wird, kein Impuls erfasst werden kann.
Der Sketch läuft an nur einem Faden durch... Entsteht irgendwo eine Wartepause, bleibt alles stehen.
Besser wäre es, mit Interrupts zu arbeiten, oder den Impulserfassung einem zweiten Arduino zu überlassen.

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 14:40
von mafa
ja, die includes hat mir die Adruino IDE einfach reingeballert. hatte eigentlich nur esp8266wifi ausgewählt. aber räum ich auf!

danke für die tipps. hab mir den Code angesehn. Bin noch neu in dem Thema Sketche. Was mich irriert...das is jetzt nur ein code-aussschnitt oder? Z.B. die variablendefinition hast du weg gelassen oder ? ccuip, payload etc fehlt ja oder?

Zwischen den Impuls is locker 10s...das sollte ja für die Übertragung reichen?!

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 14:43
von jp112sdl
Ja, das ist nur eine Datei des Gesamtprojekts.
Wenn du eine Ebene höher schaust, findest du alles: https://github.com/jp112sdl/HM_Wasserza ... er_ESP8266
Die Haupt-Datei ist immer die, die so heißt wie der Ordner: https://github.com/jp112sdl/HM_Wasserza ... SP8266.ino

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 15:18
von mafa
ok, da steig ich nur teilweise durch. Du frägst eine SVs per http ab und nimmst den Feedbackstring auseinander.
Ich will ja "nur" in eine SV reinschreiben. Du machst es auch über HTTP. Erkenne den Unterschied noch nicht bzw. wie das genau über REGA gemacht wird. Gibt es dazu eine Doku oder weitere Schlagwörter nach dem ich suchen kann?

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 15:22
von jp112sdl
mafa hat geschrieben:
24.12.2018, 15:18
Du frägst eine SVs per http ab und nimmst den Feedbackstring auseinander.
Nein, ich setze sie nur.
Und ja, ich schaue, ob in der Rückgabe nicht null drin steht.

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 17:25
von jp112sdl
Du kannst den Aufruf auch ganz fix im Browser testen:

Code: Alles auswählen

http://<ccu>:8181/cuxd.exe?ret=dom.GetObject("<MeineVariable>").State(<Wert>)
Schreibt den <Wert> in <MeineVariable>

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 19:01
von mafa
Hi Jérôme,
wow danke für Dein Support. Das hab ich mitterlweile schon getan und hab ein paar sachen ausprobiert bzw. dein Code vorerst reduziert damit erst mal die kernfunktion geht. Die URL im Browser geht. Mich hatte nur das cuxd in der url irritiert. aber ich glaub es is egal was da steht.
Ich muss auf jedem fall kein extra cuxd device dafür anlegen.

Momentan steck ich aber hier fest:

String url = "http://" + String(HomematicIP) + ":8181/cuxd.exe?ret=dom.GetObject(%22" + id + "%22).State(" + value + ")";

Da bekomme ich immer die FM:

Code: Alles auswählen

Mehrere Bibliotheken wurden für "WiFiClient.h" gefunden
 Benutzt: C:\Users\Matze\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.4.2\libraries\ESP8266WiFi
 Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\libraries\WiFi
 Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\libraries\WiFi
 Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\libraries\WiFi
 Nicht benutzt: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\libraries\WiFi
exit status 1
call of overloaded 'String(byte [4])' is ambiguous
hab schon mehre varianten probiert. wenn ich das string weg lassen und den wert direkt reinschreibe (und gleiches auch bei dem SV namen) hängt er sich an der + Operatoren auf. Idee?

p.S.: Frohe Weihnachten! ;-)

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 24.12.2018, 20:21
von jp112sdl
Frohe Weihnachten :)

Von welchem Typ ist denn dein HomematicIP?
Ich vermute fast "IPAddress".
Das ist hier eher kontraproduktiv. Eine einfache Zeichenkette wäre für den Anfang ausreichend.

z.B.:

Code: Alles auswählen

String HomematicIP = "192.168.1.1";
String url = "http://" + HomematicIP + ":8181/cuxd.exe?ret=dom.GetObject(%22" + id + "%22).State(" + value + ")";

Re: SVs Update per XML nur in bestimmten Intervallen möglch?

Verfasst: 31.12.2018, 20:01
von mafa
du hattest natürlich recht. Es läuft soweit :-).
Mach jetzt schon die ganze Zeit rum die Rückgabe auszuwerten. Aber iwie krieg ich den Code nicht zum laufen. Vermutlich Kleinigkeiten aber ich finds ned. Es fehlt hier iwo ne klammer....find sie aber nicht.

Code: Alles auswählen

#include <ESP8266HTTPClient.h>


#include <ESP8266WiFi.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>

boolean reading = false;
boolean connected = false;

static unsigned int impulse = 0;

enum _SyslogSeverity {
  _slEmergency,
  _slAlert,
  _slCritical,
  _slError,
  _slWarning,
  _slNotice,
  _slInformational,
  _slDebug
};

     
String HomematicIP = "192.168.178.65";  // Homematic IP-Adresse

#define             HTTPTIMEOUT   1500

WiFiClient client;


void setup() {

  
  Serial.begin(9600);
  Serial.println();

  WiFi.begin("Fritz!repeater", "75093282089848339082");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)  //LOOP solange verbindung aufgebaut wird. stoppt erst wenn wifi verbindung erfolgeich
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected to WIFI!, IP address: ");
  Serial.println(WiFi.localIP());


 Serial.println("Connecting to Homematic..."); //Verbindung zu CCU Homematic

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


void loop() {
  int sensorValue = analogRead(A0);   // read the input on analog pin 0


 if (sensorValue < 100 ) {
   impulse++;
    delay(500);
    Serial.println(sensorValue);
    Serial.println(impulse);
 }}

///////

bool setStateCCUCUxD(String id, String value) {
  if (WiFi.status() == WL_CONNECTED)
  {
    HTTPClient http;
    http.setTimeout(HTTPTIMEOUT);
    String url = "http://" + String(HomematicIP) + ":8181/rega.exe?ret=dom.GetObject('Stromverbrauch').State(" + impulse + ")";
    http.begin(url);
    int httpCode = http.GET();
  }
   String payload = "";


     if (httpCode != 200) {   //prüft ob in der rückgabe kein null steht
     DEBUG("HTTP " + id +  " / " + value + " fail ("+String(impulse)+")","setStateCCUCUxD()",_slError);
    } else {
      DEBUG("HTTP " + id +  " / " + value + " success", "setStateCCUCUxD()",_slInformational);
      payload = http.getString();
    }

    http.end();

    payload = payload.substring(payload.indexOf("<ret>"));
    payload = payload.substring(5, payload.indexOf("</ret>"));
    //DEBUG("setStateCCUCUxD payload = " + payload);

   return (payload != "null" && httpCode == 200)

  } else ESP.restart();
}

FM ist: a function-definition is not allowed here before '{' token
Markiert wird diese zeile: bool setStateCCUCUxD(String id, String value) {

Für jede offene Klammer gibt es eine geschlossene. Syntax hab ich von dir 1:1 übernommen. komisch.