VoxCommando

Help and Support (Using VoxCommando) => Tutorials => Topic started by: jitterjames on January 17, 2015, 12:28:25 PM

Title: Nest Thermostat and Nest Protect - Command Collection
Post by: jitterjames on January 17, 2015, 12:28:25 PM
Here is a tutorial and demonstration showing how to voice control (or automate) your Nest devices using VoxCommando version 2.1.3.6 or later: Downloads (http://voxcommando.com/home/downloads/)



The command collection is attached to this post.  Save the xml file and then drag it into your VoxCommando command editor window.

15-Aug-2015 update: Changes to Nest site required updates to 2 commands for generating payload XML files for Protects and thermostats.

2-Mar-2016 update: Fixed some typos, added command to get target temp, fixed Protect battery health command, and made sure Nest data is refreshed in commands retrieving current data.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Soda97 on January 18, 2015, 12:03:03 AM
AWESOME!

I have a few problems tho. I could get the current temp and set thermostat to heat or cool but I'm unable to get status report and set it to away.  I have attached a log file (I edited out some info).

Also, is "more" mean you going to make a Fahrenheit version?  ;D

Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Haddood on January 18, 2015, 04:14:08 AM
 :clap :clap :clap :clap :clap :clap
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: jitterjames on January 19, 2015, 10:03:13 PM
I updated the xml attached to the first post.  There were a few bugs that did not affect my particular setup that are hopefully resolved now.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Soda97 on January 20, 2015, 01:08:47 AM
thanks, it all works now.

I just figured out the structure id under generate device list too but you beat me to it.  :P
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: nime5ter on January 20, 2015, 08:58:49 AM
@Soda97, internally Nest stores temp data in Celsius so you'll need to convert to and from Celsius in your commands if you want them to be in Fahrenheit.

There's already info on the forum on how to use one line of Python directly in a command to do simple math, so it should be possible for American VC users to do this themselves. Just search the forum for "Fahrenheit" or "simple math" or terms like that.

The main "trick" is that currently when we pass temperatures we're adding a decimal place in the Scrape action. That extra ".0" in the Scrape actions should be deleted in Fahrenheit versions (actually, it's not really needed in the Celsius version either).

Obviously it would be great if someone were to post the Fahrenheit commands once they've made them for their own configuration.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Soda97 on January 20, 2015, 03:28:27 PM
Thank you so much guys, I hope this is the correct way.

Here's the Fahrenheit for American users.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1237" name="Get current temperature" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="80" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>File.Read</cmdType>
    <params>
      <param>Nest\Nest_dev_status.txt</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegEx</cmdType>
    <params>
      <param>shared".*?"{1}".*?"current.temperature".(.*?),</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>PY.ExecString</cmdType>
    <params>
      <param>result=int({Match.1}*1.8+32)</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>{PF.1} shows a current temperature of {LastResult} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>TTSMS.Speak</cmdType>
    <params>
      <param>{PF.1} shows a current temperature of {LastResult} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>Get current temperature of</phrase>
  <phrase optional="true">the</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">Nest\thermoList.xml</payloadFromXML>
</command>
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: nime5ter on January 20, 2015, 03:59:18 PM
Yup, good stuff, thanks for posting. The same method can be used with the two "set temperature" commands as well (but in reverse, of course).

I think you'll find that if you use round(x) instead of int(x) you'll more often get a result that matches what your Nest thermostat is showing you.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Soda97 on January 20, 2015, 05:04:13 PM
thanks, nim5star.

Fahrenheit version.

Get current temperture,

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1237" name="Get current temperature" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="80" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>File.Read</cmdType>
    <params>
      <param>Nest\Nest_dev_status.txt</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Results.RegEx</cmdType>
    <params>
      <param>shared".*?"{1}".*?"current.temperature".(.*?),</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>PY.ExecString</cmdType>
    <params>
      <param>result=round({Match.1}*1.8+32)</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>{PF.1} shows a current temperature of {LastResult} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>TTSMS.Speak</cmdType>
    <params>
      <param>{PF.1} shows a current temperature of {LastResult} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>Get current temperature of</phrase>
  <phrase optional="true">the</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">Nest\thermoList.xml</payloadFromXML>
</command>

Set temperature.
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1262" name="Set temperature of {1} to {2}" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="80" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>TTS.Speak</cmdType>
    <params>
      <param>Setting {PF.1} to {2} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>Setting {PF.1} to {2} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>PY.ExecString</cmdType>
    <params>
      <param>result=round(({2}-32)/1.8)</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Scrape.Post</cmdType>
    <params>
      <param>{M:Nest.transport_url}/v2/put/shared.{1}</param>
      <param>{"target_change_pending":true,"target_temperature":{LastResult}.0}</param>
      <param />
      <param />
      <param>application/json</param>
      <param>Authorization: Basic {M:Nest.access_token}</param>
      <param>X-nl-protocol-version: 1</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>Set</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">Nest\thermoList.xml</payloadFromXML>
  <phrase>to</phrase>
  <payloadRange>50,90</payloadRange>
  <phrase optional="true">degrees, degrees Fahrenheit</phrase>
</command>

Set max/min temperature.
Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.1.3.6-->
<command id="1257" name="Set max/min temperature of {2} to {3}" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="80" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>TTS.Speak</cmdType>
    <params>
      <param>Setting {PF.2}'s {1} to {3} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>OSD.ShowText</cmdType>
    <params>
      <param>Setting {PF.2}'s {1} to {3} degrees.</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>PY.ExecString</cmdType>
    <params>
      <param>result=round(({3}-32)/1.8)</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <action>
    <cmdType>Scrape.Post</cmdType>
    <params>
      <param>{M:Nest.transport_url}/v2/put/shared.{2}</param>
      <param>{"target_temperature_{1}":{LastResult}.0}</param>
      <param />
      <param />
      <param>application/json</param>
      <param>Authorization: Basic {M:Nest.access_token}</param>
      <param>X-nl-protocol-version: 1</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <phrase>Set</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">Nest\Nest_therm_max-min.xml</payloadFromXML>
  <phrase optional="true">temp, temperature</phrase>
  <phrase>of</phrase>
  <payloadFromXML phraseOnly="False" use2partPhrase="False" phraseConnector="by" Phrase2wildcard="anyone" optional="False">Nest\thermoList.xml</payloadFromXML>
  <phrase>to</phrase>
  <payloadRange>50,90</payloadRange>
  <phrase optional="true">degrees, degress Fahrenheit</phrase>
</command>
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: MrWolf on August 14, 2015, 04:39:15 PM
Hi guys,

Just decided to set this up, but I'm getting stuck.  I've tried following the instructions from the YouTube video a few times but I'm getting the same issue every time.

Steps:
Import XML using drag and drop
Create nest folder using "Create Nest Folder" XML (confirmed folder is successfully created with 1 XML file therein)Enter my login details to Nest authorisation XML
Save the XML without executing the command
Restart Vox
Execute "Login to Nest" command vocally

...This is where it goes wrong.  If I open the thermolist XML file that this generates then I can see it has not populated my details, it has what I presume is an example in there...

<?xml version="1.0" encoding="UTF-8"?>

<!--A VoxCommando Payload file-->

-<PayloadsRoot>


-<payload>

<value>02AA01AC041500BA</value>

<phrase>Basement</phrase>

</payload>

</PayloadsRoot>


I definitely don't have an area/thermostat called "Basement" in my Nest account, the only Thermostat I can see when I login to the Nest web portal is called Bedroom and has a label of Bedroom.

Weirdly the commands for "Basement" control the "Bedroom" if I test them.  Any idea why Vox would be scraping the word Basement in place of the word bedroom?

Attached is the log.  My tiny mind can comprehend just about enough of it to remove my login details, but that's as far as my comprehension will take me, I can see errors about invalid files but I don't know why that would be.  Any help as always is much appreciated...

[Post edited to delete log with private data --nime5ter]
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: Kalle on August 14, 2015, 06:04:20 PM
Hi Paul, so far I can see your log file show in the scrape result basement, bedroom, master bedroom, kitchen ... , so it looks like the bedroom ID is assigned to the basement ID.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: nime5ter on August 14, 2015, 06:29:10 PM
Nest has changed its website slightly so the regex we use when scraping the Nest site in order to generate the device payload XML files give the wrong device names, but the device IDs are still correct -- at least for me the device IDs are still correct.

Assuming you don't have a million devices, you can manually edit your payload xml.

Log into the Nest website in your browser. Click on each device. The device ID should show up at the end of the URL. You can compare this to the payload XML, and change the device names accordingly.

I didn't test all the commands, but the ones I tested seem to work.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: nime5ter on August 15, 2015, 08:43:23 AM
@Paul

Please replace the 'thermostat payload generator' command with the version below and let us know whether this is working correctly for you.

Code: [Select]
<?xml version="1.0" encoding="utf-16"?>
<!--VoxCommando 2.2.0.7-->
<command id="1224" name="thermostat payload generator" enabled="true" alwaysOn="False" confirm="False" requiredConfidence="0" loop="False" loopDelay="0" loopMax="0" description="">
  <action>
    <cmdType>PayloadXML.GetPhrase</cmdType>
    <params>
      <param>Nest\thermoList.xml</param>
      <param>{1}</param>
    </params>
    <cmdRepeat>1</cmdRepeat>
  </action>
  <if ifBlockDisabled="False" ifNot="False">
    <ifType>LastActionSuccess</ifType>
    <ifParams>&amp;&amp;</ifParams>
    <then>
      <action>
        <cmdType>VC.StopMacro</cmdType>
        <params />
        <cmdRepeat>1</cmdRepeat>
      </action>
    </then>
    <else>
      <action>
        <cmdType>File.Read</cmdType>
        <params>
          <param>Nest\Nest_dev_status.txt</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>Results.RegEx</cmdType>
        <params>
          <param>},"shared.*?"{1}".*?"name":"(.*?)"</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
      <action>
        <cmdType>PayloadXML.AddPair</cmdType>
        <params>
          <param>Nest\thermoList.xml</param>
          <param>{1}</param>
          <param>{Match.1}</param>
        </params>
        <cmdRepeat>1</cmdRepeat>
      </action>
    </else>
  </if>
  <event>devLabelTherm</event>
</command>

Thanks for the alert about the change to Nest. It's hard to keep everything up-to-date when you don't use those programs or devices.

I will update the full collection in the first post as well.
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: MrWolf on August 16, 2015, 04:28:27 PM
You guys are the best.

I'll give it a go tomorrow and let you know.

Xxx
Title: Re: Nest Thermostat and Nest Protect - Command Collection
Post by: MrWolf on August 17, 2015, 11:51:38 AM
Yep, nailed it.  Thanks guys!

xxx