SCT-013-030 current monitor sensor



  • I starting to understand.
    The SCT-013-030 is used only to get Ampere, nothing more ? Is it correct ?
    If I want the Watt I need more sensors connected to the arduino, right ?


  • Hero Member

    @chatainsim, if you know the Voltage, just multiply the voltage by the amperage and you will have the wattage...

    http://en.wikipedia.org/wiki/Ohm's_law



  • In Emonlib you have example to measure watt etc. without measure voltage.
    https://github.com/openenergymonitor/EmonLib



  • @rvendrame Thanks, I will try this.
    @maglo18 I will try to use some example.
    First I need to check if my sketch and my assemble works at least.

    Thanks for your help. I think I will need more from you guys !



  • Hello guys,

    I've working on my sensor.
    It's seems working, but I have some trouble with Watt or Kwh.

    Here is the sketch:

    // 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 
    MySensor gw;
    unsigned long lastSend;
    unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    
    MyMessage IrmsMsg(CHILD_ID,V_WATT);
    void setup()
    {  
      gw.begin();
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Energy Meter", "1.0");
    
      // Register this device as power sensor
      gw.present(CHILD_ID, S_POWER);
      emon1.current(A0, 29.0);       // Current: input pin, calibration.
    }
    
    void loop()
    {
      gw.process();
      unsigned long now = millis();
      double Irms = emon1.calcIrms(1480);
      //emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
      //emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (sendTime) { 
        //float Irms = emon1.Irms;             //extract Irms into Variable
        gw.send(IrmsMsg.set(Irms*232.0,1));
        Serial.println(Irms*232.0);
        lastSend = now;
      }
    }
    

    I've got around 390 for the Irms*232, do you thinks it's a correct value ?
    Can I calculated the current kwh with the ampere ?

    Thank you.



  • Hello,

    I've made some change in the code :

    // 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_WATT 0
    #define CHILD_ID_KWH 1
    MySensor gw;
    unsigned long lastSend;
    unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    
    MyMessage IrmsMsg(CHILD_ID_WATT,V_WATT);
    MyMessage kWhMsg(CHILD_ID_KWH,V_KWH);
    void setup()
    {  
      gw.begin();
      gw.sendSketchInfo("Energy Meter", "1.0");  // Send the sketch version information to the gateway and Controller
      gw.present(CHILD_ID_WATT, S_POWER);  // Register this device as power sensor
      gw.present(CHILD_ID_KWH, S_POWER);
      emon1.current(A0, 29.0);       // Current: input pin, calibration.
    }
    
    void loop()
    {
      gw.process();
      unsigned long now = millis();
      //emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
      double Irms = emon1.calcIrms(1480);
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (sendTime) {
        gw.send(IrmsMsg.set((Irms*232.0)*1000, 1));
    //    Serial.print("Watt: ");
    //    Serial.println(Irms*232.0);
        gw.send(kWhMsg.set((Irms*232.0)/1000, 1));
    //    Serial.print("kWH: ");
    //    Serial.println((Irms*232.0)/1000);
        lastSend = now;
      }
    }
    

    But in Domoticz, I've two line for this but in kWh and not on in kWh and other in Watt :
    Capture.PNG

    Do you know why ?

    Regards,


  • Hero Member

    @chatainsim Domoticz does not have a different device for power (Watt) and energy(kWh) but combines them in a single device. What you need to do is send both the power and energy to the same child.



  • Thanks, but I've already test this and only the kWh is updated in domoticz, not watt.

    // 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
    MySensor gw;
    unsigned long lastSend;
    unsigned long SEND_FREQUENCY = 20000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway.
    
    MyMessage IrmsMsg(CHILD_ID,V_WATT);
    MyMessage kWhMsg(CHILD_ID,V_KWH);
    void setup()
    {  
      gw.begin();
      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
      emon1.current(A0, 29.0);       // Current: input pin, calibration.
    }
    
    void loop()
    {
      gw.process();
      unsigned long now = millis();
      //emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
      double Irms = emon1.calcIrms(1480);
      bool sendTime = now - lastSend > SEND_FREQUENCY;
      if (sendTime) {
        gw.send(IrmsMsg.set((Irms*232.0)*1000, 1));
    //    Serial.print("Watt: ");
    //    Serial.println(Irms*232.0);
        gw.send(kWhMsg.set((Irms*232.0)/1000, 1));
    //    Serial.print("kWH: ");
    //    Serial.println((Irms*232.0)/1000);
        lastSend = now;
      }
    }
    

    Can you help me with this ?

    Thanks


  • Hero Member

    @chatainsim I am pretty sure it is a combined device which shows Watt only when added ...:
    upload-40825a2f-8628-4412-8fdb-44b222576843

    upload-11b440e7-718e-46ae-87f1-a4eb3c913c7e

    upload-408228f1-e921-418e-bae9-db19b6d47eee

    Although I am not sure if the Domoticz MySensors plug-in handles it right (I'm still using my own script).



  • Ok, thanks.
    How do you get your watt info ? With teleinfo ?


  • Hero Member

    @chatainsim
    I send the V_Watt messages from the Power meter to Domoticz.



  • @AWI

    MyMessage IrmsMsg(CHILD_ID,V_WATT);
    MyMessage kWhMsg(CHILD_ID,V_KWH);

    I also send both data but it's seems that Domoticz is ingnoring it !
    I don't know why.


  • Hero Member

    @chatainsim Sounds you like you need to consult the Domoticz forum. The Domoticz code shows that is interpreted.

    case V_WATT:
    		{
    			_tMySensorSensor *pSensorKwh = FindSensor(pSensor->nodeID, V_KWH);
    			if (pSensorKwh) {
    				SendKwhMeter(pSensorKwh->nodeID, pSensorKwh->childID, pSensorKwh->batValue, pSensor->floatValue / 1000.0f, pSensorKwh->floatValue, "Meter");
    			}
    			else {
    				_tUsageMeter umeter;
    				umeter.id1 = 0;
    				umeter.id2 = 0;
    				umeter.id3 = 0;
    				umeter.id4 = pSensor->nodeID;
    				umeter.dunit = pSensor->childID;
    				umeter.fusage = pSensor->floatValue/1000.0f;
    				sDecodeRXMessage(this, (const unsigned char *)&umeter);
    			}
    		}
    		break;
    	case V_KWH:
    		{
    			_tMySensorSensor *pSensorWatt = FindSensor(pSensor->nodeID, V_WATT);
    			if (pSensorWatt) {
    				SendKwhMeter(pSensor->nodeID, pSensor->childID, pSensor->batValue, pSensorWatt->floatValue / 1000.0f, pSensor->floatValue, "Meter");
    			}
    			else {
    				SendKwhMeter(pSensor->nodeID, pSensor->childID, pSensor->batValue, 0, pSensor->floatValue, "Meter");
    			}
    		}
    		break;```


  • Does anyone have some OpenHab items and rules for @chatainsim sketch posted above? I have a SCT-013-000 can anyone help me use it in my project?
    Thanks!



  • Hello, anybody can help me here?
    What I want to do is to get the instant watt or kW read from my SCT013000 and to get also the kWh from a certain date, let's say fro first of this month!
    Any idea will be kindly appreciated!
    I'm using openhanb to display info and I'll need some rules for this!
    Thanks all!



  • Nobody here?



  • I have got this to work on my Cdn system 120/240 vac using A0 and A1 pins. The code needed to be changed to address our voltage and another clamp added., but I do have a few questions;

    1. Is there a way I can record or view amps consumed in the vera dashboard?

    2. I used the sketch above displayed by @chatainsim and in it there are two lines of code with values 29.0 and second 1480 both in green and in brackets. For the life of me I can not find an explanation of these or how the values were arrived at. Can anyone help with explanation?

         gw.present(CHILD_ID, S_POWER);
         emon1.current(A0, 29.0);       // Current: input pin, calibration.
         }
    
         void loop()
        {
        gw.process();
        unsigned long now = millis();
        double Irms = emon1.calcIrms(1480);
    
    1. Is there a method to show current in phase. I tried presenting CHILD_ID, S_MULTIMETER and MyMessage IrmsMsg(CHILD_ID,V_CURRENT); but got nowhere.

    2. There is/was much running up and down stairs from electrical panel to computer and back is OTA IDE what I think it might be-- firmware or sketches can be updated over the air from my computer>vera>gw>node while not needing to access the node? If so there is much learning for me to do.

    3. Using arduino 1.6.5, Lib 1.4.1, vera 3/veralite, ui5, Ethernet g/w , win 8.1, pro mini clone



  • Hello, last week i buy SCT013-30 (ebay.fr) and follow this topic for have powermeter with mysensors. I need only energy (kWh) and power (W) same my OWL sensors (use with domoticz controler)
    I modifie the sketch from mysensors/pulse powermeter (http://www.mysensors.org/build/pulse_power)

    // 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 = 90000; // Minimum time between send (in milliseconds).
    unsigned long SEND_FREQUENCY2 = SEND_FREQUENCY / 25;
    int index = 0;
    double Irms=0;
    double power;
    boolean pcReceived = false;
    double 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.getLong();
        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()
    {
      gw.process(); 
      unsigned long now = millis();
      unsigned long now2 = millis();
      bool sendTime2 = now2 - 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 = now2;
      }
      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,3));
        lastSend = now;
        index = 0;
        old_nrj=nrj;
      }
     else if (sendTime && !pcReceived)
     {
      gw.request(CHILD_ID, V_VAR1);
      lastSend=now;
     }
    }
    

    it seems that it works for now (but not optimal).
    0_1456322448197_upload-3801900a-dd69-437d-ac99-6f2baa635713

    Note 1) my cosphy=1 because i use only ampere clamp, i cant measure the phase between curent i and tension v.
    2) my calibration constant (used in emonlib) is 30

    1. Sorry for my english :disappointed: - Je suis français.


  • Hello,
    The cos phi applies only to the three-phase, single phase not

    Je suis français aussi...



  • 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...


Log in to reply
 

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.