[Release] HubDuino v1.1.9 - Hubitat to Arduino / ESP8266 / ESP32 / ThingShield Integration (ST_Anything)

One last question on the sketch...you have it mapped to only go up to 4? Why is that exactly? That isn't right is it? Wouldn't i want to do this instead:

static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 256, 0, 15.84, 10, 100);

I'm confused why you dropped the mapped to value rather than the mapped from value.

Edit: I should have multiplied instead of dividing in these calculations. The error is corrected in a later post.

See my previous comments on using a half wave rectifier (divide by 2) and voltage drop due to the diode forward voltage (divide by 2 again). I divided 15.84 by 4, then rounded to 4 because the second divide by 2 is a guess on how much the diode will drop the voltage. I'm also ignoring a peak to peak voltage conversion to RMS that is going on with this circuit that offsets things the other way a bit.

This will not give a precise reading in kilowatts, but should be good enough for determining if the dryer is running.

15.54 vs 4 is not critical to see if the circuit works. Just look for near 0 reading with the device disconnected, and increasing values as load is increased. Adjusting the 15.54 or 4 value can be done later if you want to dial in the accuracy of the reported power consumption in kilowatts.

Okay. Makes sense. Thanks. It worked on small scale with my hair dryer. So, we'll see how it works scaled up to the dryer.

Do you get near zero with the hair dryer off?
What is the power rating of the hair dryer and the reported power consumption?

Dan's calculation for power consupmtion was for the dryer at 240V. The hair dryer is 120V, so the 15.84 scaling factor he gave you would be cut in half to 7.92 for the hair dryer. I checked my math and notice my adjustments for the rectifier circuit are incorrect. I divided when I should have multiplied.

For your dryer I suggest:
static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 1023, 0, 64, 10, 100);

For your hair dryer:
static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 1023, 0, 32, 10, 100);

I ended up going with the following:
static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 512, 0, 16, 10, 100);

That gave me readings of that maxed out around 8 or 9. However, there are some very strange things I learned about my dryer.

  1. It doesn't heat with a lower power on the low-heat cycle. It just turns the heater on less often. I'll have to watch what the numbers do for a full dryer cycle.
  2. Tumbling and Off are COMPLETELY indistinguishable with this method of sensing. I got readings below off when it was spinning with no heat. I tried all 3 wires and different orientations of the transformer and nothing was able to detect both the heated cycles and the spin-only cycles. I don't use no-heat very often so that isn't a deal-breaker. But it is very, VERY odd.

I'm using global variables in conjunction with a webCoRE piston running on the ST cloud to capture the readings in Google Sheets while it's running. So, I will report back what i see once I run a full dryer cycle, most likely later today or tomorrow.

Thanks for all your help and wonderful suggestions.

@ogiewon, when you get the new device type ready for Hubduino, def let me know. I have a great test bench now for beta testing. The split-core transformer has a mini plug on the end of it and I have a bunch of TRS adapters so I could def swap over to a "test" board to test it out for you. :smiley:

2 Likes

@Ryan780 - I have uploaded a new device class called PS_Power and the associated EmonLib library to my GitHub. I also created a simple example sketch called ST_Anything_Power_ESP8266WiFi.ino that you can use to test with.

You will need to adjust the number of samples and the CAL values in the constructor to suit your needs and CT.

If you read up on the Emon Library you should be able to glean some information on these parameters. You can use the default number of samples (1480) as a starting point. The CAL contstant will probably need to be tweaked to ~20 for your SCT-013-020 CT as I used a SCT-013-030 for my testing.

The results are consistent, however not very accurate with no power flowing. I think you should be able to use it for monitoring a washer or dryer, but not for calculating true energy usage. Without a second analog input with a calibrated voltage reference, the accuracy of this will be limited. But since it seems to be consistent, it might be alright for your use-case.

1 Like

@ogiewon Please share your external interface circuit including component values that worked in your testing.

I used the circuit above, but used 10K ohm resistors as they were on hand. I also used a 10uF capacitor because it’s all I had laying around.

Probably not the ideal circuit, but it allowed me to run some quick tests.

Okay, so I shouldn't use the circuit with the diode that I built yesterday? @VooDooFiveTwo, if I was going to use a 6.3v 1F capacitor, what value should I use for R1 and R2? If you want to share how you're calculating that, I could probably reproduce it myself, i just have no idea what formula you're using.

@ogiewon I will probably not have time to give it a try until this weekend. I will be out of town on a business trip for the rest of the week. But thanks a bunch for working this out!

1 Like

@Ryan780 based on your previous comments, I think you have components on hand to match the example circuit values. That's what I would recommend given it has been shown to work.

Your suggested 1F cap is overkill, but I don't think it will harm circuit function. Did you intend to type 1000uF? Even that is larger than needed . For this particular circuit, the two resistor values should be equal. The effective wemos A0 input impedance is roughly 320kOhm, so you want to keep the sum of the two resistors significantly less than 320kOhm. The two resistors at 22kOhm is a good upper limit. The other consideration is keeping the current draw from the 3.3v supply less than 1mA. That means the sum of the two resistors should be at least 3.3kOhm, so 2.2kOhm each would work as a lower limit, but higher would be better. You could consider calculation of low pass filter cutoff frequency, but with the big caps in play here, the frequency is very low relative to the 60Hz noise that is being introduced on the voltage divider.

In summary, resistors equal in the range 2.2kOhm to 22kOhm will work. Capacitor value at least 10uF will work. No need to go crazy big.

And to be clear, the first circuit I gave you only works with the newly created PS_Power device class. The second circuit (with diode) only works with the PS_Voltage device class. They cannot be interchanged.

Yes, my apologies, 1000 uF. I guess there isn't a mF is there. LOL

Dud you have any luck recording a dryer cycle?

I didn't do a full cycle but I did a short one and what I got is a little surprising.

image

It seems that my dryer only has two states, heating or not. I figured it would just heat at a lower temp to keep it hot in the dryer but I guess I was wrong.

Btw, I pulled this out using RM and a global variable. That is sent to ST and webCoRE (don't have my hub plugged in, just use the cloud). webCoRE then takes the data and passes it off to IFTTT in the correct format to add it to Google Sheets. Easy peasy. I know that some folks are using InfluxDB to record data. Seems that this might be less labor intensive for the hub, depending on how many sensors you want to capture and how often.

I am going to build the other circuit that @ogiewon detailed earlier and try again this weekend.

I also kept the reporting at 15 seconds but built logic (using the callback) to put the board into deep sleep when not in use. Then, I wake it up with a button wired to the rst pin. I wired an LED that automatically turns on I'm then able to capture all the data only when the led is on. Then, when I turn the LED off, the callback put the board to sleep. I figure that's better than having it report all that unnecessary data to HE. Have everything wired to a proto-board for my D1 mini so I can swap out the board if I want to. I'll take a pic of the final product when I get my project box all squared away. Gotta get the Dremel out this weekend. :slight_smile:

1 Like

Before you change to the other circuit and device type, try running this with:

static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 1023, 0, 64000, 1, 100);

And then

static st::PS_Voltage sensor3(F("power1"), 15, 0, PIN_VOLTAGE, 0, 1023, 0, 64000, 1, 5);

Be sure to record some time at the end of the cycle where you are trying to determine that the cycle is complete. I think you might be able to get a better look at the signal with one of these device configurations.

Even with the data you collected, looking for a value less than 1 for more than 2 minutes would give you an indicator that the dryer was no longer running.

Edit: looking at the data more carefully, I see a couple things. The transition from heater on to heater off has a shape that is likely driven by the low pass filter frequency being extremely low. I would reduce the capacitor size to address this.

Your dryer has 3 states:

  1. off
  2. motor on
  3. motor and heat element on

State 3 is easy to see. The magnitude of state 3 is so large compared to state 2 that it makes seeing state 2 on the plot very difficult. I wonder if you could distinguish the difference between state 2 and state 1 if the existing data was plotted with a vertical axis maximum of 1 instead of 10. State 3 would be off the chart, but that's ok.

Well, that's where it gets tricky. I don't really need to distinguish between 1 and 2. The dryer keeps spinning long after the cycle is complete to prevent wrinkles. I would want to be notified that it's complete then. But on other settings both the heat and the motor turn off simultaneously. So, it's really not an issue distinguishing between the two.

You might be able to use filtering to keep the reported value from getting near 0 in the 90 second period that the heater is off mid cycle. There are two ways to try this:

-software: last term in the sketch function call can be set to 5 for maximum filtering
-hardware circuit: keep your big 1000uF capacitor and increase the resistor value. Try 100kOhm.

If you filter to dampen the 90 second signal drop, you will also see that much of a delay in response at the end of cycle.

Okay. I've got a few things I might try. But like I said, it works now. At the end of the cycle there's a cool down anyway. So waiting 3 minutes is no big deal. And the heat on cycle will probably be longer with longer loads. We'll see.

1 Like

Hi Ryan,

I joined this thread late however I have a suggestion you might add to the things you are going to try.

This device converts current going through the opening to a voltage.

If you want to get more voltage out of it you can pass the wire you are measuring current on through the hole two times. This will give you a 10A = 1 Volt. Twice the voltage of the normal usage.

It could provide some strange output waveforms but it will absolutely not damage anything.

Unfortunately, that would require disconnecting the line inside the dryer. As it stands, the line going to the wall had about 1/8" between each of the sets of wires. So, with a little patience, I was able to separate the 3 wires without damaging them. The problem is that the voltage output is only 1V and the ADC of my board is 3.3V max.

Also, if the current going through the line is 11A,wouldny doubling it make it 22A? Greater than the max rating of my transformer?

Also, if the current going through the line is 11A,wouldny doubling it make it 22A? Greater than the max rating of my transformer?

Yes that is correct, however in this case the result of over driving your transformer will simply be a limiting of the output voltage.

My assumption was that all you want to do is determine what state the dryer is in, and an actual linear measurement of current was not required. This being so I see two approaches:

  1. You could send the current transformer to the analog input and read it very fast. For 50 Hz you would need at least: 1/50 * 5 would be better if you could do 1/50 * 10
    So really you only have to perform 10 or 20 samples every second or so. I don't think it will be too bad but I've not tried it on your board.
    Then you could look through the data, throw away the highest, average the next 3 highest and use that number.

  1. You would have to build a Rectifier using an opamp. Not difficult but more that #1. However it will yield a measurement capable circuit. I can give you a relatively simple circuit if you want.

The reason the simple rectifier gave poor results is a rectifier drops about 1/2 volt. So your current would have to be 10 amps or so just to make the diode conduct.

John