diff --git a/custom_components/badnest/__init__.py b/custom_components/badnest/__init__.py index 5bfedfe..a4913f0 100644 --- a/custom_components/badnest/__init__.py +++ b/custom_components/badnest/__init__.py @@ -3,7 +3,7 @@ import voluptuous as vol from homeassistant.helpers import config_validation as cv from homeassistant.const import CONF_EMAIL, CONF_PASSWORD -from .const import DOMAIN, CONF_ISSUE_TOKEN, CONF_COOKIE, CONF_APIKEY +from .const import DOMAIN, CONF_ISSUE_TOKEN, CONF_COOKIE CONFIG_SCHEMA = vol.Schema( { @@ -15,7 +15,6 @@ CONFIG_SCHEMA = vol.Schema( { vol.Required(CONF_ISSUE_TOKEN, default=""): cv.string, vol.Required(CONF_COOKIE, default=""): cv.string, - vol.Required(CONF_APIKEY, default=""): cv.string } ) }, @@ -30,20 +29,17 @@ def setup(hass, config): password = config[DOMAIN].get(CONF_PASSWORD) issue_token = config[DOMAIN].get(CONF_ISSUE_TOKEN) cookie = config[DOMAIN].get(CONF_COOKIE) - api_key = config[DOMAIN].get(CONF_APIKEY) else: email = None password = None issue_token = None cookie = None - api_key = None hass.data[DOMAIN] = { CONF_EMAIL: email, CONF_PASSWORD: password, CONF_ISSUE_TOKEN: issue_token, CONF_COOKIE: cookie, - CONF_APIKEY: api_key } return True diff --git a/custom_components/badnest/api.py b/custom_components/badnest/api.py index d62dbbe..fe18ce2 100644 --- a/custom_components/badnest/api.py +++ b/custom_components/badnest/api.py @@ -10,6 +10,9 @@ USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) " \ "Chrome/75.0.3770.100 Safari/537.36" URL_JWT = "https://nestauthproxyservice-pa.googleapis.com/v1/issue_jwt" +# Nest website's (public) API key +NEST_API_KEY = "AIzaSyAdkSIMNc51XGNEAYWasX9UOWkS5P6sZE4" + _LOGGER = logging.getLogger(__name__) @@ -19,7 +22,6 @@ class NestAPI: password, issue_token, cookie, - api_key, device_id=None): self._user_id = None self._access_token = None @@ -30,12 +32,11 @@ class NestAPI: self._password = password self._issue_token = issue_token self._cookie = cookie - self._api_key = api_key self.login() def login(self): if not self._email and not self._password: - self._login_google(self._issue_token, self._cookie, self._api_key) + self._login_google(self._issue_token, self._cookie) else: self._login_nest(self._email, self._password) @@ -46,7 +47,7 @@ class NestAPI: self._user_id = r.json()["userid"] self._access_token = r.json()["access_token"] - def _login_google(self, issue_token, cookie, api_key): + def _login_google(self, issue_token, cookie): headers = { 'Sec-Fetch-Mode': 'cors', 'User-Agent': USER_AGENT, @@ -60,7 +61,7 @@ class NestAPI: headers = { 'Authorization': 'Bearer ' + access_token, 'User-Agent': USER_AGENT, - 'x-goog-api-key': api_key, + 'x-goog-api-key': NEST_API_KEY, 'Referer': 'https://home.nest.com' } params = { @@ -80,14 +81,12 @@ class NestThermostatAPI(NestAPI): password, issue_token, cookie, - api_key, device_id=None): super(NestThermostatAPI, self).__init__( email, password, issue_token, cookie, - api_key, device_id) self._czfe_url = None self._compressor_lockout_enabled = None @@ -290,14 +289,12 @@ class NestTemperatureSensorAPI(NestAPI): password, issue_token, cookie, - api_key, device_id=None): super(NestTemperatureSensorAPI, self).__init__( email, password, issue_token, cookie, - api_key, device_id) self.temperature = None self._device_id = device_id @@ -362,7 +359,6 @@ class NestCameraAPI(NestAPI): password, issue_token, cookie, - api_key, region, device_id=None): super(NestCameraAPI, self).__init__( @@ -370,7 +366,6 @@ class NestCameraAPI(NestAPI): password, issue_token, cookie, - api_key, device_id) # log into dropcam self._session.post( diff --git a/custom_components/badnest/camera.py b/custom_components/badnest/camera.py index 5aa8f76..b348aac 100644 --- a/custom_components/badnest/camera.py +++ b/custom_components/badnest/camera.py @@ -15,7 +15,6 @@ from homeassistant.util.dt import utcnow from .api import NestCameraAPI from .const import ( - CONF_APIKEY, CONF_COOKIE, CONF_ISSUE_TOKEN, CONF_REGION, @@ -41,7 +40,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY], config.get(CONF_REGION) ) @@ -55,7 +53,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY], config.get(CONF_REGION), camera["uuid"] )) diff --git a/custom_components/badnest/climate.py b/custom_components/badnest/climate.py index e56321f..b1a79a9 100644 --- a/custom_components/badnest/climate.py +++ b/custom_components/badnest/climate.py @@ -30,7 +30,7 @@ from homeassistant.const import ( ) from .api import NestThermostatAPI -from .const import DOMAIN, CONF_ISSUE_TOKEN, CONF_COOKIE, CONF_APIKEY +from .const import DOMAIN, CONF_ISSUE_TOKEN, CONF_COOKIE NEST_MODE_HEAT_COOL = "range" NEST_MODE_ECO = "eco" @@ -68,7 +68,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY] ) thermostats = [] @@ -80,7 +79,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY], thermostat ))) diff --git a/custom_components/badnest/const.py b/custom_components/badnest/const.py index e6d761d..86f557c 100644 --- a/custom_components/badnest/const.py +++ b/custom_components/badnest/const.py @@ -1,5 +1,4 @@ DOMAIN = 'badnest' CONF_ISSUE_TOKEN = 'issue_token' CONF_COOKIE = 'cookie' -CONF_APIKEY = 'api_key' CONF_REGION = 'region' diff --git a/custom_components/badnest/sensor.py b/custom_components/badnest/sensor.py index 7db78d9..cb2571d 100644 --- a/custom_components/badnest/sensor.py +++ b/custom_components/badnest/sensor.py @@ -3,7 +3,7 @@ import logging from homeassistant.helpers.entity import Entity from .api import NestTemperatureSensorAPI -from .const import DOMAIN, CONF_APIKEY, CONF_COOKIE, CONF_ISSUE_TOKEN +from .const import DOMAIN, CONF_COOKIE, CONF_ISSUE_TOKEN from homeassistant.const import ( ATTR_BATTERY_LEVEL, @@ -26,7 +26,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY] ) sensors = [] @@ -41,7 +40,6 @@ async def async_setup_platform(hass, hass.data[DOMAIN][CONF_PASSWORD], hass.data[DOMAIN][CONF_ISSUE_TOKEN], hass.data[DOMAIN][CONF_COOKIE], - hass.data[DOMAIN][CONF_APIKEY], sensor ))) diff --git a/info.md b/info.md index 1e7aa13..cb65922 100644 --- a/info.md +++ b/info.md @@ -45,7 +45,6 @@ sensor: badnest: issue_token: "https://accounts.google.com/o/oauth2/iframerpc....." cookie: "OCAK=......" - api_key : "#YOURAPIKEYHERE#" climate: - platform: badnest @@ -61,7 +60,7 @@ sensor: Google Login support added with many thanks to: chrisjshull from -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). +The values of `"issue_token"` and `"cookie"` 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). 1. Open a Chrome browser tab in Incognito Mode (or clear your cache). 2. Open Developer Tools (View/Developer/Developer Tools). @@ -73,6 +72,3 @@ The values of `"issue_token"`, `"cookie"` and `"api_key"` are specific to your G 8. In the 'Filter' box, enter `oauth2/iframe` 9. Several network calls will appear in the Dev Tools window. Click on the last `iframe` call. 10. In the Headers tab, under Request Headers, copy the entire `cookie` (beginning `OCAK=...` - **include the whole string which is several lines long and has many field/value pairs** - do not include the `cookie:` name). This is your `"cookie"` in `configuration.yaml`. -11. In the 'Filter' box, enter `issue_jwt` -12. Click on the last `issue_jwt` call. -13. In the Headers tab, under Request Headers, copy the entire `x-goog-api-key` (do not include the `x-goog-api-key:` name). This is your `"api_key"` in `configuration.yaml`.