Page 1 of 1

esp8266 does not update counter

Posted: Sunday 09 January 2022 3:07
by bnwgraaf
I would like to count the pulses of a kWh meter.
I have made a test with a button (instead of the kWh meter) to test the code first.

I have made a virtual device and added a coutner to Domoticz.
If I enter this line in my webbrowser:
http://192.168.2.127:8080/json.htm?type ... 0&svalue=1
The counter in Domoticz is updated immediately by 1 unit, so this works.

No with the code it does not work. The http.GET does not return 200, but -1

Does anybody know what goes wrong?

Here is my code:

Code: Select all

// Wifi en netwerk
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>


const char* ssid     = "######";                    // verbinden met netwerk
const char* password = "#########";   	// verbinden met netwerk
const char* host = "192.168.2.127";            // tbv HTTP send Domoticz
const int   port = 8080;                              // tbv HTTP send Domoticz

IPAddress gateway(192, 168, 2, 254);          // verbinden met netwerk
IPAddress subnet(255, 255, 255, 0);            // verbinden met netwerk
IPAddress dns(213, 75, 63, 75); //DNS        // verbinden met netwerk

#define HOST_NAME "kWh_teller"               // verbinden met netwerk; esp host naam
IPAddress ip(192, 168, 2, 150);                   // verbinden met netwerk; esp ip adres

HTTPClient http;

// interrupt pin
uint8_t _interruptPin = 4; // = pin D4


void setup()
{
  Serial.begin(115200);
  Serial.println("gestart");

  attachInterrupt(digitalPinToInterrupt(_interruptPin), Count, RISING);

  // start wifi
  if (WiFi.status() != WL_CONNECTED)
  {
    WifiStart();
  }
}

void loop()
{
}


/////////////////////////////////////////
//////////////// VOIDS //////////////////

//Counter void
ICACHE_RAM_ATTR void Count()
{
  // verzenden naar Domoticz
  if (WiFi.status() != WL_CONNECTED)
  {
    WifiStart();
  }
  else
  {
    Serial.println("Wifi is nog actief...");
  }


  Serial.println("Verzenden naar Domoticz");
  sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1;");
  Serial.println("Waarde verzonden...");
}


void WifiStart()
{
  WiFi.forceSleepWake(); // Wifi on

  //wifi
  Serial.println("Connecting Wifi...");
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.mode(WIFI_AP_STA);
  WiFi.hostname(HOST_NAME);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("  Connected");
}

void sendDomoticz(String url)
{
  http.begin(host, port, url);

  int httpCode = http.GET();
  
  Serial.print("httpCode: ");
  Serial.println(httpCode);

  http.end();
}


Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 6:40
by gizmocuz
Just a quick thought that might solve the issue

remove the semicolon at the end of the svalue

sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1");

if that does not work, try the command in your browser first
(adding http://yourip:port in front of it)

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 10:26
by bnwgraaf
gizmocuz wrote: Sunday 09 January 2022 6:40 Just a quick thought that might solve the issue

remove the semicolon at the end of the svalue

sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1");

if that does not work, try the command in your browser first
(adding http://yourip:port in front of it)
Hi, thank you for your reply!

I thought that I already had tried this code without that semicolon, but I will check that one.

As told in my first post, entering the command (with ip address and portnumber) directly in a webbrowser does work, so the problem is somewhere in the esp or its code.

I did use this same esp before for measuring temperature and send it to Domoticz, of course with some different code, but I have copied.parts of it.
In the serial monitor I can see that the esp does connect to my wifi network.

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 10:53
by bnwgraaf
gizmocuz wrote: Sunday 09 January 2022 6:40 Just a quick thought that might solve the issue

remove the semicolon at the end of the svalue
Just double checked, but removing the semicolon did not work.

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:04
by jvdz
Are you using Userid&Password on your Domoticz?
If so you either need to exclude this node for that or provide it in the ESP code.

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:08
by bnwgraaf
Well, I have added the one line to my other code where I send the temperature to Domoticz and there it works, so I will check the differences!

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:13
by jvdz
Not totally sure I understand the reply about the other line, but you didn't answer my question about using Userid&Password to access domoticz. ;)

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:38
by bnwgraaf
jvdz wrote: Sunday 09 January 2022 11:13 Not totally sure I understand the reply about the other line, but you didn't answer my question about using Userid&Password to access domoticz. ;)
Sorry, I was not reacting on your post and my reacting wass also not very clear, as I am reading it back! Sorry! :-)

What I ment was, that I took antoher code which I have used to measure temperature and send the values to Domoticz. This code was working well.
Than I added only this, additional to that code:

Code: Select all

sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1");
And now it works, so I do not need to use the Userid nor the Password.

Now I have rebuild this older code and discovered, that if I place the line

Code: Select all

sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1");
in the Loop, than it works, but if I place it in "interrupt-void" than it does not.....
So for some reason the void which is called when the interrupt takes place, can not execute the http.begin command?

I hope I have made it clear, English is not ny native language....

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:56
by bnwgraaf
Okay, I have discovered that it might not be a good idea to do the http reqest within the interrupt handler.
I now do only count in this handler and check in the loop if there has been interrupts counted and than I will send the command to Domoticz.

That seems to work now, I only discover it sometimes miss a count. '

This is the code for now:

Code: Select all

// Wifi en netwerk
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>


const char* ssid     = "#######";                      // verbinden met netwerk
const char* password = "#########";   // verbinden met netwerk
const char* host = "192.168.2.127";                   // tbv HTTP send Domoticz
const int   port = 8080;                              // tbv HTTP send Domoticz

IPAddress gateway(192, 168, 2, 254);                 // verbinden met netwerk
IPAddress subnet(255, 255, 255, 0);                   // verbinden met netwerk
IPAddress dns(213, 75, 63, 75); //DNS                 // verbinden met netwerk

#define HOST_NAME "kWh_teller"                    // verbinden met netwerk; esp host naam
IPAddress ip(192, 168, 2, 200);                       // verbinden met netwerk; esp ip adres

HTTPClient http;

// interrupt pin
uint8_t _interruptPin = 14; // = pin D5

int _Count = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println("gestart");

  attachInterrupt(digitalPinToInterrupt(_interruptPin), Count, RISING);

  // start wifi
  if (WiFi.status() != WL_CONNECTED)
  {
    WifiStart();
  }
}

void loop()
{
  // verzenden naar Domoticz
  if (WiFi.status() != WL_CONNECTED)
  {
    WifiStart();
  }
  
  if (_Count > 1)
  {
    sendDomoticz("/json.htm?type=command&param=udevice&idx=31&nvalue=0&svalue=1");
    _Count = 0;
  }
  yield();
}


/////////////////////////////////////////
//////////////// VOIDS //////////////////

//Counter void
ICACHE_RAM_ATTR void Count()
{
  Serial.println("Interrupt detected...");
  _Count++;
}



void WifiStart()
{
  WiFi.forceSleepWake(); // Wifi on

  //wifi
  Serial.println("Connecting Wifi...");
  WiFi.config(ip, dns, gateway, subnet);
  WiFi.mode(WIFI_AP_STA);
  WiFi.hostname(HOST_NAME);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("  Connected");
}

void sendDomoticz(String url)
{
  http.begin(host, port, url);

  int httpCode = http.GET();
  
  Serial.print("httpCode: ");
  Serial.println(httpCode);

  http.end();
}


Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 11:58
by jvdz
Something similar like this maybe?
https://www.reddit.com/r/arduino/commen ... rrupt_not/

ah I see you found out the same :)

Re: esp8266 does not update counter

Posted: Sunday 09 January 2022 12:53
by bnwgraaf
jvdz wrote: Sunday 09 January 2022 11:58 Something similar like this maybe?
https://www.reddit.com/r/arduino/commen ... rrupt_not/

ah I see you found out the same :)
Thank you! That is indeed something similar.
For testing I am using a push button, because I still need to buy the kWh meter module. But I have learned, one button click sometimes causes two counts, and as I did understand it well, there is the debounce part for.
I do not know if I need that also with the kWh meter though....

Re: esp8266 does not update counter

Posted: Tuesday 11 January 2022 18:02
by bnwgraaf
Well, even I don't have the kWh meter module yet, the test setup does work and counts every pulse I (manually) generate.

Right now I have used the Virtual Sensor "Counter Incremental".
Is it possible to make the high and low rates visible (lower rate during nighttime and in the weekends, high rate all the other times), just like with the P1 Smart meter option?

On the esp8266 I can determine if the pulse was generated during high or during low rate. Of course I can create two virtual sensors, but it would be nice if those two values are combined in one widget, just like the Smart Meter widget (P1)...

Re: esp8266 does not update counter

Posted: Tuesday 11 January 2022 22:15
by waltervl
You can use the P1 meter for this but then you have your ESP do the counting as this meter uses a total counter (like the counter on the kWh Meters).
So you have to find a way to have the ESP remember the total count.
One way is to first get the current total count from Domoticz by http API call add the count by ESP en send it back to Domoticz.

Domoticz will do the high/low counting for you.

Re: esp8266 does not update counter

Posted: Sunday 23 January 2022 23:56
by bnwgraaf
waltervl wrote: Tuesday 11 January 2022 22:15 You can use the P1 meter for this but then you have your ESP do the counting as this meter uses a total counter (like the counter on the kWh Meters).
So you have to find a way to have the ESP remember the total count.
One way is to first get the current total count from Domoticz by http API call add the count by ESP en send it back to Domoticz.

Domoticz will do the high/low counting for you.
I did read your post twice, but I do understand now and I will give that also a try!

For now, I have it working with incremental counters; one for low and one for high tariff, and a third for total.
But I will also try your suggestion, because that is a nicer way if you see all the kWh usage in one Domoticz widget.

Re: esp8266 does not update counter

Posted: Monday 24 January 2022 0:05
by waltervl
If you have high/low tariffs you can also use the P1 smart meter device.
https://www.domoticz.com/wiki/Domoticz_ ... mart_meter

Re: esp8266 does not update counter

Posted: Tuesday 25 January 2022 11:46
by bnwgraaf
waltervl wrote: Tuesday 11 January 2022 22:15 You can use the P1 meter for this but then you have your ESP do the counting as this meter uses a total counter (like the counter on the kWh Meters).
So you have to find a way to have the ESP remember the total count.
One way is to first get the current total count from Domoticz by http API call add the count by ESP en send it back to Domoticz.

Domoticz will do the high/low counting for you.
Can someone help me with receiving/reading the data from Domoticz?

Does someone have some example code?
I succeed to let the esp8266 read the values of the new made P1 meter. The retreived text looks like a json, but I do not succeed to get the wanted value from the json. So my problem is in the decoding of the retceived text.

The text/data I can read with my esp is, for example:

Code: Select all

{
	"ActTime" : 1643103244,
	"AstrTwilightEnd" : "19:14",
	"AstrTwilightStart" : "06:31",
	"CivTwilightEnd" : "17:53",
	"CivTwilightStart" : "07:51",
	"DayLength" : "08:48",
	"NautTwilightEnd" : "18:34",
	"NautTwilightStart" : "07:10",
	"ServerTime" : "2022-01-25 10:34:04",
	"SunAtSouth" : "12:52",
	"Sunrise" : "08:28",
	"Sunset" : "17:16",
	"app_version" : "2021.1",
	"result" : 
	[
		{
			"AddjMulti" : 1.0,
			"AddjMulti2" : 1.0,
			"AddjValue" : 0.0,
			"AddjValue2" : 0.0,
			"BatteryLevel" : 255,
			"Counter" : "3.400",
			"CounterDeliv" : "0.000",
			"CounterDelivToday" : "0.000 kWh",
			"CounterToday" : "0.000 kWh",
			"CustomImage" : 0,
			"Data" : "1200;2200;0;0;0;0",
			"Description" : "",
			"Favorite" : 0,
			"HardwareDisabled" : false,
			"HardwareID" : 17,
			"HardwareName" : "kWh meter",
			"HardwareType" : "Dummy (Does nothing, use for virtual switches only)",
			"HardwareTypeVal" : 15,
			"HaveTimeout" : true,
			"ID" : "14072",
			"LastUpdate" : "2022-01-24 08:17:48",
			"Name" : "test",
			"Notifications" : "false",
			"PlanID" : "0",
			"PlanIDs" : 
			[
				0
			],
			"Protected" : false,
			"ShowNotifications" : true,
			"SignalLevel" : "-",
			"SubType" : "Energy",
			"SwitchTypeVal" : 0,
			"Timers" : "false",
			"Type" : "P1 Smart Meter",
			"TypeImg" : "counter",
			"Unit" : 1,
			"Usage" : "0 Watt",
			"UsageDeliv" : "0 Watt",
			"Used" : 1,
			"XOffset" : "0",
			"YOffset" : "0",
			"idx" : "34"
		}
	],
	"status" : "OK",
	"title" : "Devices"
}
From this, I would like to extraxt the values of "Data", which in this example has the next value: "1200;2200;0;0;0;0"
If I can read this value, I can add one to it and send it back to the P1 meter in Domoticz.