Incorrect readings with a SMPSU

I am not sure if this is the correct place for the issue I have but here goes! I have built an Arduino Mini Pro with a current CT and a mains voltage monitor using a 2mA transformer. It is linked to an ESP12 to send data to I calibrated it using a 30w tubular heater and all works well.
I wanted to monitor the power used to control my greenhouse irrigation / propagator units. These units operate of 12 VDC supplied by 3 SMPSU’s. I already monitor the DC side using INA 3221 three channel sensors and all is well there. I also wanted to monitor the 240 VAC supply to the SMPSU’s and here lies the problem!
The readings I get from the emon code for current and PF are way off, my Fluke meter says the current is 84 mA, emon says approx. 120 mA with a PF of approx 0.3. The mains voltage is correct @ 240 VAC. As a consequence the ‘real’ power is incorrect too.
I guess the SMPSU’s are screwing up the current waveform like mains LED’s do. I could add an offset to the current to match the Fluke reading but is there a better to accurately determine the energy used by this system. I guess this issue is down to electrical engineering.

Which c.t. are you using on the mains input - is it rated appropriately for the current? What does its phase error look like? How frequently are you sampling?

Hi Robert, thanks for the reply. I am using an Efergy CT, nominally 1400 turns, with the internal components removed and replaced by a 150 Ohm burden resistor and a 0.1uf ceramic capacitor across the coil. I calculated the burden resistor for a nominal current of 12A. I aimed for a nominal burden voltage of 1.6 V rms which should giv 4.25 V p - p to match the Arduino 0 - 5 V ADC.
It isn’t rated optimally for the current I am trying to measure and I plan to change that.
I am not sure what the phase error is and I need to put the scope on today.
Sampling code is based on code from the OEM Git,
if ((now - last) >= 9800 || firstrun)
last = now;
firstrun = false;

for (int i = 0; i < 10; i++)
ct1.calcVI(30, 2000);
int OEMct1 = ct1.realPower; 

Today I plan to try a 5a/5mA CT (1000 turns) with a 560 ohm buden resitor to get a range of 0 to 3 amp. Does that sound reasonable to you?
It seems odd to me that in my original test the 60W resistive load produced the expected result of approx 250 mA and 60 W apparent power and matched the readings on my multimeter, I also tested that set up with 1 kW, and 2 kW loads and got expected results. Yet the three connected SMPSU’s (12 volt 5A devices) give results from the sensors that don’t match my multimeter results. However, it occured to me that my Fluke multimeter, although a decent mid range model, may not be measuring true RMS. Hopefully scope checks can confirm if the current waveform is distorted.
Does the emon software, that used for the EmonTx v3 I believe, measure true RMS? If so, it could be my multimeter readings are in error.

The capacitor across the c.t is bad news, I can’t imagine it’s helping at all.

I don’t know much about “branded” c.t’s (i.e. Efergy) so I’ve no idea of its nominal current rating nor its overall performance. But any c.t. is inherently inaccurate at “low” currents (as I’ve written here so many times before), so unless your c.t. is very expensive and good, anything below about 5 - 10% of the rating is likely to be questionable.

On that basis, a 5 A c.t. stands a better chance. Also, you’re pushing the c.t. really hard asking for 1.68 V out of it. Small c.t’s don’t usually have the VA rating to drive a high voltage, if you can use the 1 V reference in your Arduino and drop the input range to 0 - 1 V (0.333 V rms approx.), this should reduce the c.t. errors.

Unless your multimeter specifically claims “True rms”, it’s almost certainly reading the rectified average scaled to show the rms value for a sine wave.

All OEM software has always calculated the true rms values, within the limitation of the sampling rate (i.e., it should be good up to the point where harmonics contain very little power - around the 15th from memory for very early versions, but it depends on the processor and particularly how the ADC performs).

Hi Robert, thanks for your reply. I will try your suggestions. I have confirmed that my Fluke 115 is true rms, although that wasn’t the one I used for the test. For the test I used my much older Fluke 83. I thought I had read that OEM used to use the Efergy CT and I have a couple of other CT’s that I bought from OEM years ago, with an EmonTx v1.4 kit still in its bags unassembled!). Anyway, I greatly appreciate your help and expertise. I’ll report back when I have done more trials.