Washing Machine Notifications

About the project

Get your "dumb" washing machine talking to Google Home and Android devices - never forget about the washing again!

Items used in this project

Hardware components

Sonoff POW R2 Sonoff POW R2 x 1

Software apps and online services

Node-RED Node-RED
Join app for Android Join app for Android

Story

I have a “dumb” cheapo washing machine for about £150. The size was the biggest constraint, so don’t judge me too harshly. The dumber thing in my household is me.

Washing white underwear with red jumpers is one of my sins. The other one is not remembering that something has been put into the washing machine. In result, I have washed the same batch about 3 times once, leaving it in for days to come. It was time to adjust my behaviours, especially as failure to comply will result in a divorce.

I’m getting old, I cannot have this happen. Time for the washing machine notifications, there is no remedy for pink underwear, I guess I just have to wear it.

Features:

  • Google Home integration with (optional) nagging
  • Random nagging notifications every 5 min
  • Android notifications
  • Cost of wash and total time of the wash
  • neat graph (because of big data)
  • absolutely no hardware hacks to the washing machine (full warranty retained)
  • no need to arm or disarm the alarms (Start washing to start, turn off washing machine to stop)

Step 1: Washing Machine Notifications

There is more than one way to skin this cat. I think mine is the most sensible and probably one of the cheapest options to pick. If you try hard, you won’t even have to touch the washing machine, to begin with, and spare its warranty.

I want to have a notification on my mobile/computer/Google Home when the washing is done. I don’t want to remind myself about setting timers, arming anything, just put the washing in and get someone else other than my wife to remind me that the washing needs attending.

So in order to save my marriage from the impending doom, and make some extra bucks from affiliated sales (which also saves my marriage from the impending doom), I found the solution to the problem.

The answer is Sonoff POW R2.

Wait, how are you going to issue washing machine notifications with Sonoff? – Let me tell you all about it!

You will need to get Sonoff POW R2 - I linked few shops for you, but if you find a better deal, it's even more awesome:

(Just don't think I'm so nice, these links give me a tiny kickback if you use it - thank you!)

Sonoff POW R2

None of the required functions is really available in the off-the-shelf version of the device so I’m going to flash Tasmota firmware on it. This way, I can do whatever I want with the data coming from the Sonoff POW R2.

The unique ability of the Sonoff POW R2 is to share information about the power used by the device connected via Sonoff. I’m able to tell when the washing machine is operational, and when is no longer washing. All I have to do at this point is to dress it up with some logic to create the washing machine notifications. No modifications needed to the washing machine!Just make sure to check the power ratings for your washing machine. This Sonoff POW R2 can handle 15A with 3500W of power – I’m on the safe side as my washing machine is rated for 2000W.

If you are clever enough, you can splice the cable from a short extension instead of cutting the power cord. This way your “dumb” washing machine remains intact and gets all the smart features.

Step 2: Using NodeRED for Washing Machine Notifications

You know by now, I love NodeRED. You can argue how cool is Home Assistant all day, but you won’t come close to what you can achieve with NodeRED. I have a series for beginners if you are ready to make the jump.

I’m actually going to reuse an idea I had for my 3D Printer notifications . I calculated the power consumption before, there is no point in reinventing the wheel. Time to modify it.

I’m trying to make this as user-friendly as possible so you don’t have to change much code yourself, therefore, a lot of things are coded in for you. This means we have to configure the flow to work with your washing machine. There are a couple of things that you have to provide:

  • Cost of electricity (a JSON object that has 2 tariffs. Fill in the price and times the tariff changes, if you only have a single tariff, duplicate your price)
  • Timeout (time in minutes after which the notification will be issued. It’s set to 5 min, but feel free to change it. Increase the timeout if your washing machine notification triggers mid wash)
  • Standby Power (the power draw of your washing machine measured when in standby – powered on, but not in use)
  • Nagging (on/off repeat Google Home notifications every 5min until the washing machine is turned off, nagging has to be enabled each time)

How does it work? I used a clever trick of trimming an array to number of values which equal the timeout in minutes. This means the flow ALWAYS checks the average power draw of the washing machine.

average === 0 (washing machine is off)
average <= x && average > 0 (washing machine in standby)
average > 0 (washing machine in use)

Since I'm checking the power use of the washing machine every 60 sec (the lowest value I recorded was 3W), I can easily tell when the machine is washing, in standby or off. It's time to wrap a working logic around it and add some notifications.

FUNCTION NODE: Calculate the power

var power = msg.payload.StatusSNS.ENERGY.Power;var timer = flow.get("timeout");
var total = flow.get("Total");
var cost = flow.get("CostArray");//check if array exists
if(!total || !total.length || total === undefined){
        total = [];
    }//push element
total.unshift(power);
//remove X elementh
if(total[timer] === undefined) {
    
    flow.set("Total", total);
}
else {
    total.splice(timer, 1);
    flow.set("Total", total);
}

When the washing machine goes into standby after being odd, nothing really happens. The first event is recorded when the power uses exceeds the standby value. The washing has started (plus/minus 60 sec) and the time is noted. At this point, I also start calculating how much each minute costs me and push that value into another array. I’m also arming the notification.

If the washing machine stops, I calculate the cost of power used (sum of all elements of the array ), time taken to complete (minus timeout) and push that as a notification to Google Home or Android via Join. If you never used Join in NodeRED I have a handy tutorial to get you started . I also created loa op that goes on every 5 min, and issues a nagging notification to Google Home. That loop is stopped when the power used by washing machine = 0. I also have to disarm the notifications.

FUNCTION NODE: announce false

function secondsToHms(d) {    d = Number(d);
    var h = Math.floor(d / 3600);
    var m = Math.floor(d % 3600 / 60);
    return ('0' + h).slice(-2) + "h " + ('0' + m).slice(-2)+"min";
}flow.set("announce", false);
var start = flow.get("WashStart");
var timer =  flow.get("timeout");//calculate wash time
var date = new Date();
var ms = date.getTime();var totaltimeinsec = (ms-start)/1000 - 60 *timer;
var totalWashTime = secondsToHms(totaltimeinsec);flow.set("TotalWashTime",totalWashTime);
flow.set("WashStart", 0);// save the wash power session
var washtotal = flow.get("WashTotal");
var sum = washtotal;function add(accumulator, a) {
    return accumulator + a;
}var average = sum.reduce(add);
msg.average = average / washtotal.length;
flow.set("WashTotal", null);//total cost
var sum = flow.get("CostArray");function add(accumulator, a) {
    return accumulator + a;
}var costofpower = sum.reduce(add);
var totalcost =  Math.round(costofpower * 100) / 100;
flow.set("CostArray", null);
flow.set("TotalCost", totalcost);msg = {};msg.payload = "Your washing is ready";
msg.ms = ms;
msg.totalWashTime = totalWashTime;return msg;

My notifications are issued to 3 devices (phone, desktop and laptop) I used the credential system to serve the API keys, and I also enabled context storing for my NodeRED .

FUNCTION NODE: reset notification

flow.set("announce", true);var power = msg.payload;
var total = flow.get("WashTotal");
var start = flow.get("WashStart");
// just starting the wash
if(start === 0){
    var date = new Date();
    var sec = date.getTime();
    flow.set("WashStart", sec);
}
//check if array exists
if(!total || !total.length || total === undefined){
        total = [];
    }
//push element
total.unshift(power);
flow.set("WashTotal", total);
msg.payload =  total;
return msg;

I created a small nagging generator which picks the random nag each time Google Home needs to remind you. There is a basic function to pick a random number from the range specified by the number of elements from the nagging array.

Step 3: Final Words

For less than $15 you can smart up your washing machine and probably save yourself a lot of nagging! That’s a great deal. I’m looking forward to the reaction of my misses, as she is away. She is not expecting the washing machine to talk back to her with her “favourite” quotes! You can download the NodeRED flow here

In addition, if you want to get informed about the updates to this or other projects - consider following me on the platform of your choice:

and if you feeling like buying me a coffee or supporting me in a more continuous way:

I hope you have enjoyed the project! Check more projects out on notenoughtech.com

Code

Code snippet #4

Code snippet #2

Code snippet #3

Credits

Photo of NotEnoughTech

NotEnoughTech

Some say I run a decent tech blog online. The truth is I needed to find a hobby that fits between my bicycle rides. Robotics engineer in making at Labman.

   

Leave your feedback...