SCT-013-030 current monitor sensor
-
Sorry, I'm late debause i come back holiday today
This sketch send Power and energy (kWh) every Sendfrequency=90s but the sketch not measure power every 90s but everyre 90/25=3,6s and send to the GW the mean power (Pmean)
this is calculate here :
if (index==0) Irms=emon1.calcIrms(1480);
else {
index++;
Irms = (index*Irms+emon1.calcIrms(1480))/(index+1);
}
lastSend2 = now; -
Hello, if i remember physics course in university Power P=u.i and energy E=integrale(Pdt)=integrale(u.i.dt)=UeffxIeffxcos(phi)
but for particular citizen same me, energy provider non consider cos(phi)So, i correct my last sketch for request last nrj value to the gw.
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3 ***/ #include <SPI.h> #include <MySensor.h> #include "EmonLib.h" // Include Emon Library EnergyMonitor emon1; // Create an instance #define CHILD_ID 0 #define PIN_ANALOG_I A2 MySensor gw; unsigned long lastSend; unsigned long lastSend2; unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25; int index = 0; double Irms=0; double power; boolean pcReceived = false; boolean onyva=true; float nrj=0, old_nrj; MyMessage IrmsMsg(CHILD_ID,V_WATT); MyMessage kWhMsg(CHILD_ID,V_KWH); MyMessage pcMsg(CHILD_ID,V_VAR1); void incomingMessage(const MyMessage &message) { if (message.type==V_VAR1) { nrj = old_nrj = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj); pcReceived = true; } } void setup() { gw.begin(incomingMessage); gw.sendSketchInfo("Energy Meter", "1.0"); // Send the sketch version information to the gateway and Controller gw.present(CHILD_ID, S_POWER); // Register this device as power sensor gw.request(CHILD_ID, V_VAR1); emon1.current(PIN_ANALOG_I, 30.0); // Current: input pin, calibration. } void loop() { if (onyva) gw.process(); onyva = false; unsigned long now = millis(); //unsigned long now2 = millis(); bool sendTime2 = now - lastSend2 > SEND_FREQUENCY2; if (sendTime2) //calcul Irms moy { if (index==0) Irms=emon1.calcIrms(1480); else { index++; Irms = (index*Irms+emon1.calcIrms(1480))/(index+1); } lastSend2 = now; } bool sendTime = now - lastSend > SEND_FREQUENCY; if (sendTime && pcReceived) { power = Irms*232.0; gw.send(IrmsMsg.set(power,1)); Serial.println(Irms*232.0); nrj += (power*SEND_FREQUENCY/1000)/3.6E6; gw.send(kWhMsg.set(nrj,5)); gw.send(pcMsg.set(nrj,5)); lastSend = now; index = 0; old_nrj=nrj; onyva=true; } else if (sendTime && !pcReceived) { gw.request(CHILD_ID, V_VAR1); lastSend=now; index=0; onyva=true; } }thx...
Thanks @fredok I will give a try !
And I'm french too ;)
-
Sorry, I'm late debause i come back holiday today
This sketch send Power and energy (kWh) every Sendfrequency=90s but the sketch not measure power every 90s but everyre 90/25=3,6s and send to the GW the mean power (Pmean)
this is calculate here :
if (index==0) Irms=emon1.calcIrms(1480);
else {
index++;
Irms = (index*Irms+emon1.calcIrms(1480))/(index+1);
}
lastSend2 = now;Hi @fredok
Your sketch working fine.
Except in domoticz only the kWh is updated. Watt is not.
Do you have a clue about that ?
-
Hello chatainsim, in my domoticz i have only one device counting (kWh+instant Power)
The instant power updated every 90s is writing in Watt value(83.3) , the kWh of the day (1.174) and total energy (61.582 kWh).... the device log show the power = f(t).
Look if Watt value in (kWhMeter) device change, look the log graph ... if is ok, u not need Wattmeter device.
Thx Fredok -
Hello chatainsim, in my domoticz i have only one device counting (kWh+instant Power)
The instant power updated every 90s is writing in Watt value(83.3) , the kWh of the day (1.174) and total energy (61.582 kWh).... the device log show the power = f(t).
Look if Watt value in (kWhMeter) device change, look the log graph ... if is ok, u not need Wattmeter device.
Thx Fredok@fredok Yes, the kWhMeter is working fine:
-
Ok, so it just stop working after almost 24 hours ...
I have some issue with mysensors, I don't know why, sometimes sensors stop working but I don't know why ...send: 10-10-2-0 s=255,c=3,t=15,pt=2,l=2,sg=0,st=ok:0 send: 10-10-2-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=ok:1.5.4 send: 10-10-2-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:2 sensor started, id=10, parent=2, distance=2 send: 10-10-2-0 s=255,c=3,t=11,pt=0,l=12,sg=0,st=ok:Energy Meter send: 10-10-2-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=fail:1.0 send: 10-10-2-0 s=0,c=0,t=13,pt=0,l=0,sg=0,st=ok: send: 10-10-2-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=fail: send: 10-10-2-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok: send: 10-10-2-0 s=0,c=2,t=24,pt=0,l=0,sg=0,st=ok: -
This is a recurring problem I have with MySensors.
All my sensors stop working, I have to clear the eprom then reupload the sketch.
Now It's working fine, until it fail again ;) -
Hello All,
I have tried this code and it works fine.
I was questionning myself though. If the index request fails at some point, what would be the behaviour of the code ? From my understanding of it, it will try to get the index again and again until it succeeds. May be a another way would be not to reset the index to 0 and send the additionnal index the next time.
What do you think ?QQ.
-
Hello, sorry for my late reply.
About the sketch,- At the beginning, the sketch request the last kWh to the GW (I use Domoticz, so GW ask Domoticz the last kWh value) and send to the node.
- If node receiv, the variable pcreceiv=true and it working fine else node wait for the request until he receiv. A serial.print will inform if receiv.
Fredok
-
Yep, got that lately :)
Thanks.QQ.
-
Hello, if i remember physics course in university Power P=u.i and energy E=integrale(Pdt)=integrale(u.i.dt)=UeffxIeffxcos(phi)
but for particular citizen same me, energy provider non consider cos(phi)So, i correct my last sketch for request last nrj value to the gw.
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3 ***/ #include <SPI.h> #include <MySensor.h> #include "EmonLib.h" // Include Emon Library EnergyMonitor emon1; // Create an instance #define CHILD_ID 0 #define PIN_ANALOG_I A2 MySensor gw; unsigned long lastSend; unsigned long lastSend2; unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25; int index = 0; double Irms=0; double power; boolean pcReceived = false; boolean onyva=true; float nrj=0, old_nrj; MyMessage IrmsMsg(CHILD_ID,V_WATT); MyMessage kWhMsg(CHILD_ID,V_KWH); MyMessage pcMsg(CHILD_ID,V_VAR1); void incomingMessage(const MyMessage &message) { if (message.type==V_VAR1) { nrj = old_nrj = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj); pcReceived = true; } } void setup() { gw.begin(incomingMessage); gw.sendSketchInfo("Energy Meter", "1.0"); // Send the sketch version information to the gateway and Controller gw.present(CHILD_ID, S_POWER); // Register this device as power sensor gw.request(CHILD_ID, V_VAR1); emon1.current(PIN_ANALOG_I, 30.0); // Current: input pin, calibration. } void loop() { if (onyva) gw.process(); onyva = false; unsigned long now = millis(); //unsigned long now2 = millis(); bool sendTime2 = now - lastSend2 > SEND_FREQUENCY2; if (sendTime2) //calcul Irms moy { if (index==0) Irms=emon1.calcIrms(1480); else { index++; Irms = (index*Irms+emon1.calcIrms(1480))/(index+1); } lastSend2 = now; } bool sendTime = now - lastSend > SEND_FREQUENCY; if (sendTime && pcReceived) { power = Irms*232.0; gw.send(IrmsMsg.set(power,1)); Serial.println(Irms*232.0); nrj += (power*SEND_FREQUENCY/1000)/3.6E6; gw.send(kWhMsg.set(nrj,5)); gw.send(pcMsg.set(nrj,5)); lastSend = now; index = 0; old_nrj=nrj; onyva=true; } else if (sendTime && !pcReceived) { gw.request(CHILD_ID, V_VAR1); lastSend=now; index=0; onyva=true; } }thx...
-
hi , do you have please updated sketch for newest version of domoticz ? This old cause problems when I compiling it.
Thanks :+1:
-
@warmaniac
Sorry i not update this sketch ... -
tried to modify but I always get error
/MySensors.h:328:2: error: #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
#error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3 ***/ #include <SPI.h> #include <MySensors.h> #include "EmonLib.h" // Include Emon Library EnergyMonitor emon1; // Create an instance #define CHILD_ID 0 #define MY_RADIO_NRF24 #define PIN_ANALOG_I A1 //MySensor gw; unsigned long lastSend; unsigned long lastSend2; unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25; int index = 0; double Irms=0; double power; boolean pcReceived = false; boolean onyva=true; float nrj=0, old_nrj; MyMessage IrmsMsg(CHILD_ID,V_WATT); MyMessage kWhMsg(CHILD_ID,V_KWH); MyMessage pcMsg(CHILD_ID,V_VAR1); //void incomingMessage(const MyMessage &message) void receive(const MyMessage &message) { if (message.type==V_VAR1) { nrj = old_nrj = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj); pcReceived = true; } } void presentation () { sendSketchInfo("Energy Meter", "1.0"); // Send the sketch version information to the gateway and Controller present(CHILD_ID, S_POWER); // Register this device as power sensor request(CHILD_ID, V_VAR1); } void setup() { begin(incomingMessage); emon1.current(PIN_ANALOG_I, 30.0); // Current: input pin, calibration. } void loop() { if (onyva) process(); onyva = false; unsigned long now = millis(); //unsigned long now2 = millis(); bool sendTime2 = now - lastSend2 > SEND_FREQUENCY2; if (sendTime2) //calcul Irms moy { if (index==0) Irms=emon1.calcIrms(1480); else { index++; Irms = (index*Irms+emon1.calcIrms(1480))/(index+1); } lastSend2 = now; } bool sendTime = now - lastSend > SEND_FREQUENCY; if (sendTime && pcReceived) { power = Irms*232.0; send(IrmsMsg.set(power,1)); Serial.println(Irms*232.0); nrj += (power*SEND_FREQUENCY/1000)/3.6E6; send(kWhMsg.set(nrj,5)); send(pcMsg.set(nrj,5)); lastSend = now; index = 0; old_nrj=nrj; onyva=true; } else if (sendTime && !pcReceived) { request(CHILD_ID, V_VAR1); lastSend=now; index=0; onyva=true; } }It is possible to compile it with old mysensors library ? It will work with gateway which has a newest version ?
-
Hello, at the end i write a v2.0 of the sketch
//#include <Arduino.h> #define MY_DEBUG #define MY_RADIO_NRF24 // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3 ***/ #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #include "EmonLib.h" // Include Emon Library EnergyMonitor emon1; // Create an instance EnergyMonitor emon2; #define CHILD_ID_CLAMP1 0 #define CHILD_ID_CLAMP2 1 #define CHILD_ID_TEMP 2 #define CHILD_ID_LDR 3 #define PIN_ANALOG_I1 A2 //pince amperemetrique1 #define PIN_ANALOG_I2 A3 #define PIN_LDR A0 // LDR #define PIN_DALLAS 3 //Definition de dallas #define MAX_ATTACHED_DS18B20 1 #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No OneWire oneWire(PIN_DALLAS); DallasTemperature sensors(&oneWire); float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors = 1; bool receivedConfig = false; bool metric = true; //truc v2.0 //int compat = 0; unsigned long lastSend_temp = millis(); unsigned long lastSend_power = millis(); unsigned long lastSend_c; unsigned long SEND_FREQUENCY = 120000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long SEND_FREQUENCY_TEMP = 300000; //delais d'emission entre 2 mesures de temps unsigned long SEND_FREQUENCY_C = SEND_FREQUENCY / 30; int index = 0; double Irms1 = 0; double Irms2 = 0; boolean pcReceived1 = false; boolean pcReceived2 = false; boolean first_time_temp = HIGH; float nrj1 = 0, old_nrj1; float nrj2 = 0, old_nrj2; int ldr = 0, old_ldr; MyMessage IrmsMsg1(CHILD_ID_CLAMP1, V_WATT); MyMessage kWhMsg1(CHILD_ID_CLAMP1, V_KWH); MyMessage pcMsg1(CHILD_ID_CLAMP1, V_VAR1); MyMessage IrmsMsg2(CHILD_ID_CLAMP2, V_WATT); MyMessage kWhMsg2(CHILD_ID_CLAMP2, V_KWH); MyMessage pcMsg2(CHILD_ID_CLAMP2, V_VAR2); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgLight(CHILD_ID_LDR, V_LIGHT_LEVEL); void before() { sensors.begin(); } void presentation() { sendSketchInfo("Multisensors_Entree", "2.0"); // Send the sketch version information to the gateway and Controller present(CHILD_ID_CLAMP1, S_POWER); // Register this device as power sensor request(CHILD_ID_CLAMP1, V_VAR1); present(CHILD_ID_CLAMP2, S_POWER); // Register this device as power sensor request(CHILD_ID_CLAMP2, V_VAR2); numSensors = sensors.getDeviceCount(); //compte le nb de ds18 present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_LDR, S_LIGHT_LEVEL); } void receive(const MyMessage &message) { if (message.type == V_VAR1) { nrj1 = old_nrj1 = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj1); pcReceived1 = true; } if (message.type == V_VAR2) { nrj2 = old_nrj2 = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj2); pcReceived2 = true; } } void setup() { sensors.setWaitForConversion(false); emon1.current(PIN_ANALOG_I1, 30.0); // Current: input pin, calibration. emon2.current(PIN_ANALOG_I2, 30.0); Serial.println("SETUP completed"); } void envoi_donnees(double intrms, int id_clamp) { Serial.print("Envoi des donnees .... clamp="); Serial.println(id_clamp); double energie = (intrms * 232.0 * SEND_FREQUENCY / 1000) / 3.6E6; switch (id_clamp) { case 1: { send(IrmsMsg1.set(intrms * 232.0, 1)); nrj1 += energie; send(kWhMsg1.set(nrj1, 5)); send(pcMsg1.set(nrj1, 5)); old_nrj1 = nrj1; } break; case 2: { send(IrmsMsg2.set(intrms * 232.0, 1)); nrj2 += energie; send(kWhMsg2.set(nrj2, 5)); send(pcMsg2.set(nrj2, 5)); old_nrj2 = nrj2; } break; } } void loop() { unsigned long now = millis(); bool sendTime_c = now - lastSend_c > SEND_FREQUENCY_C; // Calcul de Irms1 et Irms2 if (sendTime_c) //calcul Irms moy clamp1/clamp2 { if (index == 0) { Irms1 = emon1.calcIrms(1480); Irms2 = emon2.calcIrms(1480); } else { Irms1 = (index * Irms1 + emon1.calcIrms(1480)) / (index + 1); Irms2 = (index * Irms2 + emon2.calcIrms(1480)) / (index + 1); } lastSend_c = now; index++; } bool sendTime_temp = now - lastSend_temp > SEND_FREQUENCY_TEMP; if (sendTime_temp || first_time_temp) { Serial.println("........ quoiqu'il arrive, on envoi la temp+ldr"); first_time_temp = LOW; //Send Temp // Envoi Température d'après https://github.com/mysensors/MySensorsArduinoExamples/blob/master/examples/DallasTemperatureSensor/DallasTemperatureSensor.ino sensors.requestTemperatures(); sleep(750); for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) { // float temperature = static_cast<float>(static_cast<int>((getConfig().isMetric ? sensors.getTempCByIndex(i) : sensors.getTempFByIndex(i)) * 10.)) / 10.; float temperature = static_cast<float>(static_cast<int>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { // Send in the new temperature send(msgTemp.setSensor(i).set(temperature, 1)); Serial.println(".....................Envoi Temp"); // Save new temperatures for next compare lastTemperature[i] = temperature; } } //Send light LDR //Envoi Light LDR ldr = (1023 - analogRead(PIN_LDR)) / 10.23; if (old_ldr != ldr) { send(msgLight.set(ldr)); old_ldr = ldr; } lastSend_temp=now; } bool sendTime_power = now - lastSend_power > SEND_FREQUENCY; if (sendTime_power) { // Envoi ou request Puissance1 if (pcReceived1) envoi_donnees(Irms1, 1); else { request(CHILD_ID_CLAMP1, V_VAR1); Serial.println("Request VAR1"); } // Envoi ou request Puissance2 if (pcReceived2) envoi_donnees(Irms2, 2); else { request(CHILD_ID_CLAMP2, V_VAR2); Serial.println("Request VAR2"); } //on reinitialise les compteurs lastSend_power = now; index = 0; } }attention, i use in the same node a ds18b20 for temp and LRD for light measurment
so u need to delete part of sketch.
i just compiling/Verifying this with mysensors v2.1 (but not loaded in arduino pro) and no error
for emonlib => https://github.com/openenergymonitor/EmonLib -
.... u must to look the monitor for see "Envoi des données .... clamp=0" and after (a few minutes after) "Envoi des données .... clamp=1"
Look after ur domotic soft for see if your gw become something.


bye.
-
tried to modify but I always get error
/MySensors.h:328:2: error: #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
#error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3 ***/ #include <SPI.h> #include <MySensors.h> #include "EmonLib.h" // Include Emon Library EnergyMonitor emon1; // Create an instance #define CHILD_ID 0 #define MY_RADIO_NRF24 #define PIN_ANALOG_I A1 //MySensor gw; unsigned long lastSend; unsigned long lastSend2; unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25; int index = 0; double Irms=0; double power; boolean pcReceived = false; boolean onyva=true; float nrj=0, old_nrj; MyMessage IrmsMsg(CHILD_ID,V_WATT); MyMessage kWhMsg(CHILD_ID,V_KWH); MyMessage pcMsg(CHILD_ID,V_VAR1); //void incomingMessage(const MyMessage &message) void receive(const MyMessage &message) { if (message.type==V_VAR1) { nrj = old_nrj = message.getFloat(); Serial.print("Received last nrj count from gw:"); Serial.println(nrj); pcReceived = true; } } void presentation () { sendSketchInfo("Energy Meter", "1.0"); // Send the sketch version information to the gateway and Controller present(CHILD_ID, S_POWER); // Register this device as power sensor request(CHILD_ID, V_VAR1); } void setup() { begin(incomingMessage); emon1.current(PIN_ANALOG_I, 30.0); // Current: input pin, calibration. } void loop() { if (onyva) process(); onyva = false; unsigned long now = millis(); //unsigned long now2 = millis(); bool sendTime2 = now - lastSend2 > SEND_FREQUENCY2; if (sendTime2) //calcul Irms moy { if (index==0) Irms=emon1.calcIrms(1480); else { index++; Irms = (index*Irms+emon1.calcIrms(1480))/(index+1); } lastSend2 = now; } bool sendTime = now - lastSend > SEND_FREQUENCY; if (sendTime && pcReceived) { power = Irms*232.0; send(IrmsMsg.set(power,1)); Serial.println(Irms*232.0); nrj += (power*SEND_FREQUENCY/1000)/3.6E6; send(kWhMsg.set(nrj,5)); send(pcMsg.set(nrj,5)); lastSend = now; index = 0; old_nrj=nrj; onyva=true; } else if (sendTime && !pcReceived) { request(CHILD_ID, V_VAR1); lastSend=now; index=0; onyva=true; } }It is possible to compile it with old mysensors library ? It will work with gateway which has a newest version ?