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

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

Moderator: Co-Administratoren

mafa
Beiträge: 64
Registriert: 23.04.2018, 19:27

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

Beitrag von mafa » 24.12.2018, 14:07

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
Zuletzt geändert von mafa am 24.12.2018, 14:24, insgesamt 1-mal geändert.

jp112sdl
Beiträge: 3163
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 20 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 24.12.2018, 14:18

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.

VG,
Jérôme

mafa
Beiträge: 64
Registriert: 23.04.2018, 19:27

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

Beitrag von mafa » 24.12.2018, 14:40

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?!
Zuletzt geändert von mafa am 24.12.2018, 14:43, insgesamt 1-mal geändert.

jp112sdl
Beiträge: 3163
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 20 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 24.12.2018, 14:43

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

VG,
Jérôme

mafa
Beiträge: 64
Registriert: 23.04.2018, 19:27

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

Beitrag von mafa » 24.12.2018, 15:18

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?

jp112sdl
Beiträge: 3163
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 20 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 24.12.2018, 15:22

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.

VG,
Jérôme

jp112sdl
Beiträge: 3163
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 20 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 24.12.2018, 17:25

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>

VG,
Jérôme

mafa
Beiträge: 64
Registriert: 23.04.2018, 19:27

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

Beitrag von mafa » 24.12.2018, 19:01

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! ;-)

jp112sdl
Beiträge: 3163
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 20 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

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

Beitrag von jp112sdl » 24.12.2018, 20:21

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 + ")";

VG,
Jérôme

mafa
Beiträge: 64
Registriert: 23.04.2018, 19:27

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

Beitrag von mafa » 31.12.2018, 20:01

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.
Zuletzt geändert von mafa am 01.01.2019, 19:17, insgesamt 3-mal geändert.

Antworten

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