Smart Nespresso Machine Using HomeAssistant, Alexa, or Web Browser

by skelectronics in Circuits > Assistive Tech

34450 Views, 37 Favorites, 0 Comments

Smart Nespresso Machine Using HomeAssistant, Alexa, or Web Browser

nespresso_homeAssistant.png

In my quest to become even lazier, and to awaken myself with minimum effort in the mornings, I have decided to upgrade my coffee machine.

If you would like to do this, and are willing to void your machine's warranty, then try and follow along!

There are a few things you will require prior to starting this project:

Opening Up the Machine

IMG_4638.JPG
IMG_4639.JPG
IMG_4640.JPG
IMG_4641.JPG

The bolts on the side of the horseshoe shaped lever appear to be an anti-fiddle size, however a firm grip and a flat head screwdriver allowed me to undo them.

After that, using a flat head screw driver, pry open the plastic covering (*gently*).

It should reveal [1] & [2].

Then, you must pry further to open the point where the buttons are [3].

Underneath the buttons you should see something like this [4].

These two rings are an opening in the circuit, which by pressing the button down are connected telling the machine to activate.

Controlling the Nespresso's Switch

Switch-controlling-1.png
IMG_4643.JPG
IMG_4642.JPG

The double ring switch operates a circuit of ~ 14 Volts. This means that you cannot control it directly from the ESP8266 NodeMCU as it can only output 3V.

To get around this it I used a N-type MOSFET, in particular I used the BUZZ11.

This allows you to control the 14V on or off, using the 3V of the ESP8266 NodeMCU.

The circuit looks like this [5] & [6].

I recommend soldering onto the Nespresso machine's switch rings very quickly, and using a dab of solder.

You should have to wires leaving the machine one from the positive and another from the negative terminal [7].

The ESP8266 NodeMCU's Code

Writing code for this module can be done in the Arduino IDE.

Here is the code

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////// Skelectronics Coffee Machine ////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////


#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
const char* ssid = "YOUR_WIFI_NAME";
const char* password ="YOUR_WIFI_PASSWORD";

#define mqtt_server "YOUR_MQTT_SERVER_IP_ADDRESS"
#define mqtt_user "YOUR_MQTT_USERNAME"
#define mqtt_password "YOUR_MQTT_PASSWORD"
#define mqtt_topic "dev/coffeeMachine"

WiFiClient espClient;
PubSubClient client(espClient);



String strTopic;
String strPayload;
int switchingPin = D8;


void setup_wifi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("."); 
  }
  Serial.println("WiFi connected");
  delay(500);
}

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';
  strTopic = String((char*)topic);
  if(strTopic == mqtt_topic)
    {
    strPayload = String((char*)payload);
    if(strPayload == "onn")<br>      {
        digitalWrite(switchingPin, 1);
        delay(500);
        digitalWrite(switchingPin, 0);<br>        delay(500);
        digitalWrite(switchingPin, 1);<br>        delay(500);
        digitalWrite(switchingPin, 0);<br>        client.publish(mqtt_topic, String("done").c_str(), true);
      }
    }
}
 
 
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("CoffeeClient", mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.subscribe(mqtt_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
 
void setup()
{
  pinMode(switchedPin, OUTPUT);
  Serial.begin(9600);
  setup_wifi(); 
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}
 
void loop()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Adding to Your HomeAssistant

Screen Shot 2017-10-19 at 22.24.31.png

In your HomeAssistant configuration.yaml file add this:

switch:
  - platform: mqtt
    name: "Coffee Machine"
    command_topic: "dev/coffeeMachine"
    qos: 0
    payload_on: "onn"

And in your groups.yaml add:

###Views###
default_view:
  view: yes
  entities:
    - switch.coffee_machine

Then add switch.coffee_machine to your main screen, it should look like [8].

Adding Alexa

Nespresso Alexa

To add Amazon's Alexa control to any of your switches in HomeAssistant, it is as simple as adding this to your configuration.yaml file, and then scanning for smart home devices in your Alexa app.

emulated hue:

From there, it should be as simple as saying "Alexa, please turn on the coffee machine" [9].

More Fun With Home Assistant

Screen Shot 2017-10-23 at 22.31.28.png

If you would like to include your new automated coffee machine into your alarm, then a great HomeAssistant community member and guru has made a clear set up to add an alarm clock to your HomeAssistant GUI and automations can include your coffee machine!

Include these additions to your configuration, automation, and groups files:

configuration.yaml

mqtt:
  broker: yourbroker_address
  username: !secret mqtt_username
  password: !secret mqtt_password

sensor:
  - platform: template
    sensors:
      alarm_time:
        friendly_name: 'Time'
        value_template: '{{ "%0.02d:%0.02d" | format(states("input_slider.alarmhour") | int, states("input_slider.alarmminutes") | int) }}'

  - platform: time_date
    display_options:
      - 'time'
      - 'date'
      - 'date_time'
      - 'time_date'
      - 'time_utc'

switch:
  - platform: mqtt
    name: "Coffee Machine"
    state_topic: "dev/coffeeMachine"
    command_topic: "dev/coffeeMachine"
    qos: 0
    payload_on: "onn"

input_slider: 
  alarmhour:
    name: Hour
    icon: mdi:timer
    initial: 9
    min: 0
    max: 23
    step: 1


  alarmminutes:
    name: Minutes
    icon: mdi:timer
    initial: 0
    min: 0
    max: 59
    step: 5

input_boolean:
  alarmstatus:
    name: Alarm Status
    initial: off
    icon: mdi:timer

  alarmweekday:
    name: Weekdays Only
    initial: off
    icon: mdi:calendar

  morningcoffee:
    name: Coffee
    initial: off
    icon: mdi:coffee-outline

automation.yaml

- alias: 'Wake Me Up'
  trigger:
    platform: template
    value_template: '{{ states.sensor.time.state == states.sensor.alarm_time.state }}'
  condition:
    condition: and
    conditions:
      -  condition: state
         entity_id: input_boolean.alarmstatus
         state: 'on'
      - condition: or
        conditions:
          - condition: and
            conditions:
              - condition: state
                entity_id: input_boolean.alarmweekday
                state: 'on'
              - condition: time
                weekday:
                  - mon
                  - tue
                  - wed
                  - thu
                  - fri
          - condition: state
            entity_id: input_boolean.alarmweekday
            state: 'off'

  action:
    - condition: state
      entity_id: input_boolean.morningcoffee
      state: 'on'
    - service: switch.turn_on
      entity_id: switch.coffee_machine

groups.yaml

###Views###
default_view:
  view: yes
  icon: mdi:home
  entities:
    - group.alarmclock


###groups###
alarmclock:
  name: Wake Me Up
  entities:
    - input_boolean.alarmstatus
    - sensor.alarm_time
    - input_slider.alarmhour
    - input_slider.alarmminutes
    - input_boolean.alarmweekday
    - input_boolean.morningcoffee

Ayy [10]!

Extra: for Those Who Don't Have HomeAssistant

Screen Shot 2017-10-27 at 17.30.32.png
Screen Shot 2017-10-27 at 17.30.39.png

The ESP8266 can host a webpage which you means you can control it from your browser to turn on your coffee machine.

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
////////////// Skelectronics Coffee Machine ////////////////////////
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

#include <ESP8266WiFi.h>

const char* ssid = "YOUR_WIFI_NAME";
const char* password = "YOUR_WIFI_PASSWORD";
int switchingPin = D8;

WiFiServer server(80);

void setup() {
  Serial.begin(9600);
  delay(10);
  pinMode(switchingPin, OUTPUT);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  server.begin();
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  delay(3000);

}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while (!client.available()) {
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request


  if (request.indexOf("/coffeeMachine") > 0)  {
     digitalWrite(switchingPin, 1);
     delay(500);
     digitalWrite(switchingPin, 0);
     delay(500);
     digitalWrite(switchingPin, 1);
     delay(500);
     digitalWrite(switchingPin, 0);
  }
  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("");
  client.println("");
  client.println("");
  client.println("");
  client.println("");
  client.println("");
  client.println("");
  client.println("<hr><hr>");
  client.println("<h4 style="font-size: 250.0%;"><center> Coffee Machine Controlling Website Ay </center></h4>");
  client.println("<br><br>");
  client.println("<br><br>");
  client.println("<center>");
  client.println("Nespresso");
  client.println("<button><a>Turn On </a></button>");
  client.println("</center>");
  client.println("");
  client.println("");
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");

}

When you upload this to your ESP8266 NodeMCU, and open the serial monitor you should see the IP address where the website is located [11].

When you put this IP address in the url bar of your browser, you should receive the webpage [12].

Just click the button and it will control your coffee machine!

Final Comments

nespresso_homeAssistant.png

Battery life seems to be a problem; 0.2A, 5.1V - I will investigate sleep mode for the ESP8266 NodeMCU. But, for the moment I will just use a phone charger to supply power.

I will try and make my solution a bit more pretty once I get started with 3D printing.

The Nespresso requires two button pushes on turning on to make the first coffee. However, after the machine has warmed up, it only requires one push to make a coffee. This isnt a problem for me, as I usually only have one coffee in the morning using this machine. It should be easy to adapt the code to tap the switch once after the machine has heated up.

Here, are some good tutorials I have found:

Setting up HomeAssistant

Setting up MQTTBroker

I will try and answer questions,

Skelectronics