HomeAbout MeContact Me
Sleep automation with Mi Band and Home Assistant
Smart Home
Sleep automation with Mi Band and Home Assistant
Emanuele Papa
Emanuele Papa
November 23, 2019
1 min

Have you ever thought about using your Mi Band to help you automate stuff? Read this article and you will know how you can use your Mi Band sleep detection to trigger automations in your Home Assistant!

You will need:

  • Tasker
  • Notify & Fitness for Mi Band
  • A Mi Band
  • An automation which creates a webhook and then publishes your sleep status on a MQTT topic
  • A sensor based on the MQTT topic previously defined (it can be avoided for the purpose of this automation but I prefer to have it to keep track of the sleep status)
  • Tasker profiles which react to your sleep status

Create a sleep_status.yaml file in your packages directory with the following content.

Replace [YOUR_NAME] and [YOUR_WEBHOOK_ID].

homeassistant:
automation:
- alias: [YOUR_NAME] Sleep Status
initial_state: true
trigger:
- platform: webhook
webhook_id: [YOUR_WEBHOOK_ID]
condition: []
action:
- service: mqtt.publish
data_template:
payload: "{\"sleepStatus\": \"{{trigger.json.sleepStatus}}\"}"
topic: "sleepstatus/[YOUR_NAME]"
sensor:
- platform: mqtt
name: "[YOUR_NAME] Sleep Status"
state_topic: "sleepstatus/[YOUR_NAME]"
value_template: '{{ value_json["sleepStatus"] }}'

Take now your phone, open Tasker and setup the following profiles which will send your sleep status events (when you wake up and fall asleep) to your Home Assistant.

Replace [YOUR_HOME_ASSISTANT_DOMAIN_NAME] and [YOUR_WEBHOOK_ID]

<TaskerData sr="" dvi="1" tv="5.9.rc">
<Profile sr="prof61" ve="2">
<cdate>1574199690392</cdate>
<clp>true</clp>
<edate>1574529186304</edate>
<flags>8</flags>
<id>61</id>
<mid0>63</mid0>
<nme>MiBand Fell Asleep</nme>
<Event sr="con0" ve="2">
<code>599</code>
<Str sr="arg0" ve="3">com.mc.miband.tasker.fellAsleep</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
</Event>
</Profile>
<Task sr="task63">
<cdate>1574199712492</cdate>
<edate>1574529096550</edate>
<id>63</id>
<nme>Send Asleep Payload</nme>
<pri>6</pri>
<Action sr="act0" ve="7">
<code>339</code>
<Bundle sr="arg0">
<Vals sr="val">
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<StringArray sr="">
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%http_data
Data
Data that the server responded from the HTTP request.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%http_file_output
File Output
Will always contain the file's full path even if you specified a directory as the File to save.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%http_response_code
Response Code
The HTTP Code the server responded</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%http_headers()
Response Headers
The HTTP Headers the server sent in the response. Each header is in the 'key:value' format</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%http_response_length
Response Length
The size of the response in bytes</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>
</StringArray>
</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
</Vals>
</Bundle>
<Int sr="arg1" val="1"/>
<Str sr="arg2" ve="3">https://[YOUR_HOME_ASSISTANT_DOMAIN_NAME]/api/webhook/[YOUR_WEBHOOK_ID]y</Str>
<Str sr="arg3" ve="3">Content-Type:application/json</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">{ "sleepStatus" : "Asleep" }</Str>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="30"/>
<Int sr="arg9" val="0"/>
</Action>
</Task>
</TaskerData>
<TaskerData sr="" dvi="1" tv="5.9.rc">
<Profile sr="prof66" ve="2">
<cdate>1574200024388</cdate>
<edate>1574529166065</edate>
<flags>8</flags>
<id>66</id>
<mid0>65</mid0>
<nme>MiBand WokeUp</nme>
<Event sr="con0" ve="2">
<code>599</code>
<Str sr="arg0" ve="3">com.mc.miband.tasker.wokeUp</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
</Event>
</Profile>
<Task sr="task65">
<cdate>1574199886906</cdate>
<edate>1574529090100</edate>
<id>65</id>
<nme>Send Awake Payload</nme>
<pri>6</pri>
<Action sr="act0" ve="7">
<code>339</code>
<Bundle sr="arg0">
<Vals sr="val">
<net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<StringArray sr="">
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%http_data
Data
Data that the server responded from the HTTP request.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%http_file_output
File Output
Will always contain the file's full path even if you specified a directory as the File to save.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%http_response_code
Response Code
The HTTP Code the server responded</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%http_headers()
Response Headers
The HTTP Headers the server sent in the response. Each header is in the 'key:value' format</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>
<_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%http_response_length
Response Length
The size of the response in bytes</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>
</StringArray>
</net.dinglisch.android.tasker.RELEVANT_VARIABLES>
<net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>[Ljava.lang.String;</net.dinglisch.android.tasker.RELEVANT_VARIABLES-type>
</Vals>
</Bundle>
<Int sr="arg1" val="1"/>
<Str sr="arg2" ve="3">https://[YOUR_HOME_ASSISTANT_DOMAIN_NAME]/api/webhook/[YOUR_WEBHOOK_ID]</Str>
<Str sr="arg3" ve="3">Content-Type:application/json</Str>
<Str sr="arg4" ve="3"/>
<Str sr="arg5" ve="3">{ "sleepStatus" : "Awake" }</Str>
<Str sr="arg6" ve="3"/>
<Str sr="arg7" ve="3"/>
<Int sr="arg8" val="30"/>
<Int sr="arg9" val="0"/>
</Action>
</Task>
</TaskerData>

Now, you can create a Node-RED flow which reacts to sensor.[YOUR_NAME]_sleep_status with Awake/Asleep value and executes your preferred stuff (e.g. turn off all the lights as soon as you fall asleep).

I have used my Mi Band 2 and it detects my sleep activity usually within 5 minutes so don’t use it for real-time automations.

Edit: it works on my Mi Band 4, too!

Let me know what automations you are going to create!


Tags

Share


Previous Article
Light control using an Aqara Wireless Remote Switch with Home Assistant and Node-RED
Emanuele Papa

Emanuele Papa

Android Developer

Related Posts

Block ads using DNS over TLS with AdGuard Home, Let's Encrypt, and Cloudflare for Android Devices
Block ads using DNS over TLS with AdGuard Home, Let's Encrypt, and Cloudflare for Android Devices
October 22, 2024
3 min

Quick Links

HomeAbout MeContact MeRSS Feed

Social Media