gboudreau / nest-api

Unofficial Nest Learning Thermostat API
GNU Lesser General Public License v3.0
299 stars 92 forks source link

Google Home migration?? #95

Open sparky672 opened 4 years ago

sparky672 commented 4 years ago

Google is pushing hard to get me to migrate my Nest account over to Google Home. Before I do that, can anyone tell me if doing such would break my access to this API?

Thank you!

gboudreau commented 4 years ago

Yes, it will (break your API access). Don't do it unless you find a working alternative that can work with the Google API, if there is such a thing (didn't look).

sparky672 commented 4 years ago

UGH!!!! Thank you! Stupid Google forced me to migrate grandma's Nest account to Google Home in order to update/add/delete family members (for Nest Protect notifications). Now I cannot add myself back into grandma's house without migrating my own Nest account over Google Home, which apparently is going to break this thing for my own house's thermostat.

I wrote a complex application that uses your API code to dump the thermostat data into my online database to track my tank's fuel oil level, graphs, average daily fuel consumption, etc. I really depend on this system since Nest does not have a usage counter built into it anyplace. My circa 1990 Honeywell actually had a resettable hourly usage meter built into it, so Nest takes a huge step backwards in this area.

This system I wrote keeps me from having to dip a stick into the oil tank like a caveman. Thanks Google for effing everything up so badly!

doctorkb commented 4 years ago

@sparky672 - I totally agree. The moment Google forces me to switch the account is the moment I head to Costco for the Ecobee 4.

sparky672 commented 4 years ago

I like the Nest. Not that I'm opposed to switching... but the amount of time I have invested into my custom data acquisition application is ridiculous. Does Ecobee have a similar API where I can get usage data?

sparky672 commented 4 years ago

@gboudreau, I thought your PHP class was accessing the same Nest API server as the Nest App so I'm confused about how this can be broken. Is it a matter of the user account? Once the user account is migrated to Google Home, then the API will reject access to that account, while somehow the Nest App is still able to connect?

doctorkb commented 4 years ago

@sparky672 > I like the Nest. Not that I'm opposed to switching... but the amount of time I have invested into my custom data acquisition application is ridiculous. Does Ecobee have a similar API where I can get usage data?

I don't mind the Nest. I do mind that my data is being held hostage.

It looks like Ecobee's API is much more supported: https://www.ecobee.com/home/developer/api/introduction/index.shtml

WRT authentication, I'm betting the Google account authentication uses the Google federated login, not the direct authentication.

sparky672 commented 4 years ago

Over in the Homebridge Nest project, they've developed a procedure to get and use the Google token, and login to the API.

And the part that gets the connection is here.

I cannot test this out since I have not migrated my Nest account. My grandmother's account was migrated but she only has Nest Protects. Is there anyone here who already migrated their Nest account to Google, who would be willing to experiment with getting this Nest API project working with the Google tokens?

cagivacode commented 4 years ago

I am in the same boat.....and have not migrated my nest account.

I have been recording multi zones and calculating oil usage with great success. Even ran a special "smart" script last year that adapted to outside conditions and saved 100 gallons over the season.

The homeassistant nest project is also stuck.....they all rushed to open API accounts before the cut off.

I am not switching units...so I keep looking for a solution.

sparky672 commented 4 years ago

Even ran a special "smart" script last year that adapted to outside conditions and saved 100 gallons over the season.

I've just been gathering and displaying usage data and calculating levels. Also wrote a script that tries to predict a refill date based on past usage. Never tried controlling it or gathering outside temperatures. I thought about trying to gather outside temps to display next to usage but didn't seem super useful.

What did your script do and how did it save your fuel usage?

cagivacode commented 4 years ago

Well...I have hydronic heating / oil /multi zone and live in the mid-atlantic which has variable temps in winter.

At first nest saved because it does vary "pre heat" times based on learning of the hydronic system.

After looking at my graphs, I realized that on a regular basis the heat was fighting the lowest temps of the day and not running during the highest temps. So the script does a little "heat banking" during the peak temps of the day (even when no one is home) and does a little deferment during the coldest.

Not real complicated....just heat bank if outside is above a certain temp / defer heating if outside is very cold and normal schedule the rest of the time. Just taking advantage of the non linear nature of heat loss based on the temperature gradient.

In operation it was not real noticeable....occasionally a little warmer / colder in the middle of the night than expected (which mirrored the outside climate).

sparky672 commented 4 years ago

Interesting. I have hydronic system too. But I also have variable rate electric, which is basically hourly pricing based on the wholesale market. When electricity is cheap at night, I would crank up the electric heaters and save oil.

I thought about tying my application into that but never finished figuring out how to get the hourly electric rates.

Sal-Tepedino commented 4 years ago

I've migrated my account and it broke access.

The badnest project (https://github.com/USA-RedDragon/badnest) managed to get google logins working. I'd be more than happy to test out google account logins with this project.

sparky672 commented 4 years ago

I've migrated my account and it broke access.

The badnest project (https://github.com/USA-RedDragon/badnest) managed to get google logins working. I'd be more than happy to test out google account logins with this project.

Yes, please!

Sal-Tepedino commented 4 years ago

The question is if Guillaume is even interested in modifying the code to fix it, at this point.

sparky672 commented 4 years ago

The question is if Guillaume is even interested in modifying the code to fix it, at this point.

Even if not, we can possibly modify it ourselves.

Sal-Tepedino commented 4 years ago

True, but I'm more of a bash developer (being a SysAdmin) than a php developer. If you wanna have a crack at it, I'll test it out.

gboudreau commented 4 years ago

I just checked the code of badnest; the implementation of how to use a Google account is pretty hackish. Expected, until Google releases better API access (early 2020 for enterprises; maybe later for individuals, if ever).

I could try to implement this, but to do so, I would need to migrate my Nest account to a Google account; not sure I want to do that until I'm sure I can make it work...

If someone who already migrated could provide me with their "issue_token", "cookie" and "api_key", per badnest's instructions, I could try to implement it using those values. (Of note: those values become unusable as soon as you logout from the Nest website, in the browser window that you used to get them. So I would suggest using a regular browser window, not an Incognito one, to get those values, in order to be able to Logout from this session, once I'm done.)

bauzer714 commented 4 years ago

Don't post these values publicly though. Please contact @gboudreau through a different medium if you're willing to do so.

Sal-Tepedino commented 4 years ago

Isn't there a more 'correct' way to get a google authentication token to your account than this way? Wouldn't that method break any time you close the browser you used to get the token? That wouldn't be good for any sort of long-standing system, right?

sparky672 commented 4 years ago

Isn't there a more 'correct' way to get a google authentication token to your account than this way?

No. That's the point. This is not officially sanctioned by Google. You're tricking the API into thinking you're getting access via the Nest app.

Wouldn't that method break any time you close the browser you used to get the token? That wouldn't be good for any sort of long-standing system, right?

My understanding is that you're good for as long as you don't log out of your account. My main browser on my primary computer never asks me to log back into Google... I open Gmail.com and there it is - no login prompt... unless of course I click the "logout" or "switch accounts".

I also maintain other Google accounts for clients so I'm guessing if I log into those with a different browser, I wouldn't be disturbing my own Google log in.

Sal-Tepedino commented 4 years ago

Well, yes, I get the 'unofficial-ness' of accessing nest this way, but I'm talking just standard Google auth tokens. Surely there's some application-level way to obtain them that actually IS official, seeing as it's needed for all the other Google application stuff... right? Using the Nest page as the fake API is the unofficial bit. The Google auth token should be well established since it's been around for a while... right? (Please note: I'm claiming no knowledge of how this stuff actually works. Just asking questions that I don't know the answers to)

gboudreau commented 4 years ago

When you login on the Nest website, Google uses your session (OCAK cookie) to know which Google account you are logged in as. Using this info, it can then check if you already granted the Nest website access to your Google account. If not, it prompts. If you already granted access, it will use your OCAK cookie (along with some other tidbits) to get a short-lived access token to use the internal Nest API.

Since we, as developers, cannot ask to get access to the internal Nest API from Google, we need to 'steal' the info that the Nest website has been able to get from Google, and use those secrets ourselves to connect to the Nest API, and ourselves get the same short-lived access token that the Nest website is able to get. This process requires the issue_token, cookie and api_key values.

The process might be simplified somewhat, but we can't use the usual Google API methods of getting an access token; Google are not allowing that.

sparky672 commented 4 years ago

Well, yes, I get the 'unofficial-ness' of accessing nest this way, but I'm talking just standard Google auth tokens. Surely there's some application-level way to obtain them that actually IS official, seeing as it's needed for all the other Google application stuff... right? Using the Nest page as the fake API is the unofficial bit. The Google auth token should be well established since it's been around for a while... right? (Please note: I'm claiming no knowledge of how this stuff actually works. Just asking questions that I don't know the answers to)

I'm not sure either. However, since Google is not yet giving anyone API access to Nest data, I doubt anything official they provide could work. Edit: what Guillaume just said ^^^

As a side note, the whole Google thing is still such a totally convoluted mess (cluster-f***):

gboudreau commented 4 years ago

I pushed some kind of test code in the dev/google-account branch. Maybe try that; see test.php on how to test it. Really not sure my old implementation, which uses the {transport_url}/v3/mobile URL, would work with the info we can get with a Google account...

Sending a post to https://home.nest.com/api/0.1/user/{$this->userid}/app_launch seems to return many URLs; maybe one we need is in there. Old code also needs a 'user', which I didn't find in basnest code... Not sure it's available in the response of app_launch or not...

gboudreau commented 4 years ago

Seems to be working! :) Try this code, people with migrated Google account: https://github.com/gboudreau/nest-api/blob/dev/google-account/nest.class.php

This shows you how to instantiate the class, to provide the new information: https://github.com/gboudreau/nest-api/commit/26ac4de3664d01bded94967e242d6c948a35f950#diff-93bc3c03503d8768cf7cc1e39ce16fcb

Follow the instructions here to get the required values: https://github.com/USA-RedDragon/badnest#example-configurationyaml---when-you-are-using-the-google-auth-login

Make sure, for the cookie value, to provide all the cookies on one line:

$cookie = 'GoogleAccountsLocale_session=en; GALX=... ; SIDCC=...';

@Sal-Tepedino : maybe now would be a good time to logout, and re-login, in your browser! Thanks for providing the required detail to work on this.

sparky672 commented 4 years ago

Follow the instructions here to get the required values: https://github.com/USA-RedDragon/badnest#example-configurationyaml---when-you-are-using-the-google-auth-login

Instructions copy & pasted here:

The values of "issue_token", "cookie" and "api_key" are specific to your Google Account. To get them, follow these steps (only needs to be done once, as long as you stay logged into your Google Account).

gboudreau commented 4 years ago

Pretty sure the $api_key would be the same for everyone: AIzaSyAd...sZE4 (I think this is an API key that was created by the Nest website developers, and will be the same for everyone, until they change it on their side.) Can you confirm yours is like that?

gboudreau commented 4 years ago

Similarly, only the login_hint will be unique in $issue_token :

https://accounts.google.com/o/oauth2/iframerpc?action=issueToken&response_type=token%20id_token&login_hint=UNIQUE_VALUE_HERE&client_id=733249279899-44tchle2kaa9afr5v9ov7jbuojfr9lrq.apps.googleusercontent.com&origin=https%3A%2F%2Fhome.nest.com&scope=openid%20profile%20email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fnest-account&ss_domain=https%3A%2F%2Fhome.nest.com
gboudreau commented 4 years ago

Of note: you'll get this, if the cookie ever becomes invalid (because you logged out, or timed out):

$ php test.php
Error: Response to login request doesn't contain required access token. Response: '(object) array(
   'error' => 'USER_LOGGED_OUT',
   'detail' => 'No active session found.',
)'
$
sparky672 commented 4 years ago

Pretty sure the $api_key would be the same for everyone: AIzaSyAd...sZE4 (I think this is an API key that was created by the Nest website developers, and will be the same for everyone, until they change it on their side.) Can you confirm yours is like that?

I logged into my grandmother's converted Nest account and cannot find x-goog-api-key. Maybe because she only has Nest Protects?

gboudreau commented 4 years ago

I logged into my grandmother's converted Nest account and cannot find x-goog-api-key. Maybe because she only has Nest Protects?

I doubt; that API key is pretty much required for all subsequent API calls. You don't see a HTTP request to issue_jwt?

sparky672 commented 4 years ago

You don't see a HTTP request to issue_jwt?

Oops. I failed to follow the directions and skipped to the last step.

Here is what I got:

x-goog-api-key: AIzaSyAdkSIMNc51XGNEAYWasX9UOWkS5P6sZE4
gboudreau commented 4 years ago

Yeah, it's the same for everyone. I'll simplify my implementation to not require it.

gboudreau commented 4 years ago

Done; updated code, and README

sparky672 commented 4 years ago

Awesome, awesome, awesome! Thank you! However, with heating season just getting started, I'm not going to rush into this. Maybe see how it goes for the others first.

Hopefully, this all won't be for nothing once Google shuts down the Nest app.

Sal-Tepedino commented 4 years ago

I'm getting a dump of HTML then an error:

PHP Fatal error: Uncaught Error: Class 'Nest' not found in /var/www/html/rrd/nest-vars-test.php:14 Stack trace:

0 {main}

thrown in /var/www/html/rrd/nest-vars-test.php on line 14

Line 14 is the $nest = new Nest(NULL, NULL, $issue_token, $cookies); line. The require line's in there and the class is there and permissions check out. I'm probably missing something obvious...

Sal-Tepedino commented 4 years ago

Nevermind. I was right. Obvious error...

Sal-Tepedino commented 4 years ago

Works! Updated the Request URL (issue token) and the cookie and it's working great!

Thanks!

sparky672 commented 4 years ago

Just to confirm... everything else works the same? Energy data dump looks the same as before?

$nest->getEnergyLatest();
Sal-Tepedino commented 4 years ago

Looks the same as far as I can tell. I'm using $infos = $nest->getDeviceInfo("MySerialHere");

To grab the data and then a printf to output it. Works exactly as it did before.

gboudreau commented 4 years ago

Everything should be the same. I only changed how it logs in; it use another way to login, and fetch the required information (user ID, transport URL, etc.), but everything else was kept as-is, so unless for some reason the access token obtained using this new way to login is unusable for some of the API calls (which I doubt), it should work exactly the same as before.

sparky672 commented 4 years ago

Looks the same as far as I can tell. I'm using $infos = $nest->getDeviceInfo("MySerialHere");

To grab the data and then a printf to output it. Works exactly as it did before.

Can you try $nest->getEnergyLatest() just to be sure? Thanks!

so unless for some reason the access token obtained using this new way to login is unusable for some of the API calls (which I doubt), it should work exactly the same as before.

Just wanting to be sure before I break anything unnecessarily.

Sal-Tepedino commented 4 years ago

I did and it didn't output anything. Note: I'm not a php coder, so there's probably another step I don't know...

sparky672 commented 4 years ago

I did and it didn't output anything. Note: I'm not a php coder, so there's probably another step I don't know...

Do this....

var_dump($nest->getEnergyLatest());

and it should look something like this....

object(stdClass)#261 (1) { ["objects"]=> array(1) { [0]=> object(stdClass)#262 (4) { ["object_revision"]=> int(1) ["object_timestamp"]=> int(1) ["object_key"]=> string(30) "energy_latest.09AA01AC34150AGX" ["value"]=> object(stdClass)#263 (2) { ["recent_max_used"]=> int(0) ["days"]=> array(10) { [0]=> object(stdClass)#282 (16) { ["day"]=> string(10) "2019-10-21" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#283 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [1]=> object(stdClass)#280 (16) { ["day"]=> string(10) "2019-10-22" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#281 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [2]=> object(stdClass)#278 (16) { ["day"]=> string(10) "2019-10-23" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#279 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [3]=> object(stdClass)#276 (16) { ["day"]=> string(10) "2019-10-24" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#277 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [4]=> object(stdClass)#274 (16) { ["day"]=> string(10) "2019-10-25" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#275 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [5]=> object(stdClass)#272 (16) { ["day"]=> string(10) "2019-10-26" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#273 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [6]=> object(stdClass)#270 (16) { ["day"]=> string(10) "2019-10-27" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#271 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [7]=> object(stdClass)#268 (16) { ["day"]=> string(10) "2019-10-28" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#269 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [8]=> object(stdClass)#266 (16) { ["day"]=> string(10) "2019-10-29" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#267 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } [9]=> object(stdClass)#264 (16) { ["day"]=> string(10) "2019-10-30" ["device_timezone_offset"]=> int(-18000) ["total_heating_time"]=> int(0) ["total_cooling_time"]=> int(0) ["total_fan_cooling_time"]=> int(0) ["total_humidifier_time"]=> int(0) ["total_dehumidifier_time"]=> int(0) ["leafs"]=> int(1) ["whodunit"]=> int(-1) ["recent_avg_used"]=> int(0) ["usage_over_avg"]=> int(0) ["cycles"]=> array(0) { } ["events"]=> array(1) { [0]=> object(stdClass)#265 (6) { ["start"]=> int(0) ["end"]=> int(86399) ["type"]=> int(5) ["event_touched_by"]=> int(6) ["event_touched_where"]=> int(0) ["continuation"]=> bool(true) } } ["rates"]=> array(0) { } ["system_capabilities"]=> int(1) ["incomplete_fields"]=> int(0) } } } } } }

Sal-Tepedino commented 4 years ago

Ah yes. It comes out more sane-ly formatted than what you pasted, but it's all there.

doctorkb commented 4 years ago

For those who have tested... are any of you using two-factor authentication (2FA) with their Google account?

I imagine it will still work with the token, but just wanted to ask.

Sal-Tepedino commented 4 years ago

Single-factor here.

sparky672 commented 4 years ago

I could try to implement this, but to do so, I would need to migrate my Nest account to a Google account; not sure I want to do that until I'm sure I can make it work...

So now that you implemented this successfully, did you end up migrating your account yet?

gboudreau commented 4 years ago

For those who have tested... are any of you using two-factor authentication (2FA) with their Google account?

Yes; I have 2FA enabled, and migrated my Nest account to a Google account, and it works fine.

gboudreau commented 4 years ago

So now that you implemented this successfully, did you end up migrating your account yet?

Yes. Working fine for now.