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
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:
- Nespresso Coffee Machine - Inissia
- ESP8266 NodeMCU - WiFi enabled microcontroller
- HomeAssistant Software - Centre for your smart home - Last extra step avoids this
- MQTT Broker - Easy message sending software for between HomeAssistant and ESP8266 - Last extra step avoids this
- Amazon Echo Dot - Voice control HomeAssistant - Last extra step avoids this
- N-Type MOSFET
- 1 KΩ Resistor
- 9V Battery
- Battery Case
Opening Up the Machine
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
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
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
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
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
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
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:
I will try and answer questions,
Skelectronics