openapi-directory
Version:
Building & bundling https://github.com/APIs-guru/openapi-directory for easy use from JS
1 lines • 114 kB
JSON
{"openapi":"3.0.0","servers":[{"url":"http://example.com/setup","variables":{}}],"info":{"contact":{},"description":"# Google Home Local API\nThis is an unofficial documentation of the local API used by the Home app to communicate with GH devices.\n[GitHub Repo](https://github.com/rithvikvibhu/GHLocalApi)\n\n[](https://github.com/rithvikvibhu/GHLocalApi/stargazers) [](https://github.com/rithvikvibhu/GHLocalApi/blob/master/LICENSE.md)\n\n## Getting Started\n\nRequests must be made over HTTPS, port 8443, so the base URL for these endpoints is: `https://<google-home-ip>:8443/setup/`\n\nGet the IP of Google Home from the Google Home app (Device Settings -> End of the list) or from your router.\n\nGET requests are simple, in the browser kind. \nPOST requests need to set the header (when there's a body): `content-type: application/json`\n\n## Authentication\n\nSince June 2019, most requests (with exceptions like `/setup/eureka_info`) need a local authorization token.\n\nThere are 3 kinds of tokens involved here:\n\n### Local Authorization Token\nThis token must be sent in all requests in the header `cast-local-authorization-token`. It is short-lived (~1 day) and may change unexpectedly (with a sync, change in homegraph, etc.)\n##### Get this token\n- With access to an android device, [get this token directly by either method](https://gist.github.com/rithvikvibhu/1a0f4937af957ef6a78453e3be482c1f).\n- Without a device, or to integrate it with a script, use an access token to get the homegraph and extract the token. To get an access token, read the next section. Check the example section for more info.\n\n### Access Token\nThis is a standard google oauth2 access token. It is in the form `ya29.***`.\nThis gives access to the Google Home Foyer API. These expire in an hour.\nUse this to get the homegraph (and then the local authorization token above).\n##### Get this token\nTo get this access token, either a Google account username/password or a Google Master Token is needed. More info in the gist.\nUse the script [from this gist](https://gist.github.com/rithvikvibhu/952f83ea656c6782fbd0f1645059055d).\n\n### Master Token\nThis is in the form `aas_et/***` and can be used to request access tokens.\n##### Get this token\nThe same [script in the gist](https://gist.github.com/rithvikvibhu/952f83ea656c6782fbd0f1645059055d) that gets the access token can also get the master token. Needs Google account creds.\n\n## Example\n\nHere's the whole flow from just a pair of username/password to using the local API.\n\nPrerequisites:\n- [grpcurl](https://github.com/fullstorydev/grpcurl)\n- [Proto files](https://drive.google.com/drive/folders/1RvnN3y-G23pd2SWHmfV_7sef8QU5GNF4?usp=sharing) (preserve folder structure)\n\n### 1. Get an access token with the script\n- Download get_tokens.py\n- Fill in username and password\n```sh\npython3 get_tokens.py\n# Note down the access token printed.\n```\n\n### 2. Use the access token and get home graph\n- This prints the json and uses jq to parse and filter out the fields deviceName and localAuthToken\n- This will give a list of all devices and their local auth tokens\n```sh\n./grpcurl -H 'authorization: Bearer ya29.a0Af****' \\\n\t-import-path /path/to/protos \\\n\t-proto /path/to/protos/google/internal/home/foyer/v1.proto \\\n\tgooglehomefoyer-pa.googleapis.com:443 \\\n\tgoogle.internal.home.foyer.v1.StructuresService/GetHomeGraph | jq '.home.devices[] | {deviceName, localAuthToken}'\n# Note down the local auth token for the device you want.\n```\n\n### 3. Make the call to the local device using the local auth token\n```sh\ncurl -H \"cast-local-authorization-token: LOCAL_AUTH_TOKEN\" --verbose --insecure https://192.168.0.18:8443/setup/bluetooth/status\n```","title":"Google Home","version":"2.0","x-codegen-settings":{"AllowSkippingSSLCertVerification":false,"AndroidHttpClient":"ANDROID_OK","AndroidUseAppManifest":false,"AppendContentHeaders":true,"ApplyCustomizations":[],"ArraySerialization":"Indexed","BackoffFactor":0,"BodySerialization":0,"CSharpHttpClient":"UNIREST","CollectParameters":false,"DisableDocs":false,"DisableLinting":false,"DoNotSplitWords":[],"EnableAdditionalModelProperties":false,"EnableGlobalUserAgent":true,"EnableHttpCache":false,"EnableImmutableModels":false,"EnableLogging":false,"EnablePHPComposerVersionString":false,"EncodeTemplateParameters":true,"ForceKeywordArgsInRuby":false,"GenerateAdvancedDocs":true,"GenerateAppveyorConfig":false,"GenerateAsyncCode":true,"GenerateCircleConfig":false,"GenerateEnums":true,"GenerateExceptions":true,"GenerateInterfaces":false,"GenerateJenkinsConfig":false,"GenerateModels":true,"GenerateTravisConfig":false,"IgnoreIfNullJson":false,"IsLatestVersion":false,"JavaHttpClient":"JAVA_OK","JavaUsePropertiesConfig":false,"LiftParameterDescriptionFromCustomType":false,"ModelSerializationScheme":"Json","NodeHttpClient":"NODE_REQUEST","Nullify404":false,"ObjCHttpClient":"UNIREST","PHPHttpClient":"UNIREST","ParameterArrayFormat":"ParamArrayWithIndex","PreserveParameterOrder":true,"ResponseMapping":{"Type":"Simple"},"Retries":0,"RetryInterval":1,"ReturnCompleteHttpResponse":false,"RunscopeEnabled":false,"SecurityProtocols":["Ssl3","Tls"],"SortResources":false,"StoreTimezoneInformation":false,"SymbolizeHashKeysInRuby":false,"ThrowForHttpErrorStatusCodes":true,"Timeout":0,"UnderscoreNumbers":true,"UsageExampleEndpoint":{"Description":"","EndpointGroupName":"","EndpointName":""},"UseCommonSDKLibrary":false,"UseConstructorsForConfig":false,"UseControllerPrefix":true,"UseEndpointMethodName":false,"UseEnumPostfix":true,"UseExceptionPrefix":true,"UseMethodPrefix":true,"UseModelPostfix":false,"UseSingletonPattern":true,"UserConfigurableRetries":true,"ValidateRequiredParameters":false,"iOSGenerateCoreData":false,"iOSUseAppInfoPlist":false},"x-image-uri":"","x-origin":[{"format":"openapi","url":"https://raw.githubusercontent.com/rithvikvibhu/GHLocalApi/master/GoogleHome.openapi3.json","version":"3.0"}],"x-providerName":"google.home","x-server-configuration":{"default-environment":"production","default-server":"Server 1","environments":[{"name":"production","servers":[{"name":"Server 1","url":"http://example.com/setup"}]}],"parameters":[]},"x-unofficialSpec":true},"security":[{"cast-local-authorization-token":[]}],"tags":[{"description":"Endpoints in this folder give information about the device.","name":"Device Info"},{"description":"This folder consists of all endpoints to modify and control the device.","name":"Device Settings"},{"description":"This folder contains all endpoints related to Assistant's tasks like Do Not Disturb, Alarms and Timers, Accessibility and equalizer.","name":"Assistant"},{"description":"This folder contains Bluetooth related endpoints.","name":"Bluetooth"},{"description":"This folder contains Wi-Fi related endpoints.","name":"Wifi"},{"description":"This folder contains a list of static files stored in Home.","name":"Static Files"}],"paths":{"/NOTICE.html.gz":{"get":{"deprecated":false,"description":"All licenses of programs used by Home.","operationId":"LegalNotice","parameters":[],"responses":{"200":{"content":{"text/plain":{"example":"<html><!-- a long page --></html>","schema":{"example":"<html><!-- a long page --></html>","type":"string"}}},"description":"","headers":{}}},"summary":"Legal Notice","tags":["Static Files"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"<html><!-- a long page --></html>","headers":{"Access-Control-Allow-Headers":"Range","Access-Control-Allow-Methods":"GET, OPTIONS","Content-Encoding":"gzip","Content-Length":"131302","Content-Type":"text/html"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"RAW","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/NOTICE.html.gz"},"x-testDescription":"All licenses of programs used by Home.","x-testEnabled":false,"x-testName":"Legal Notice","x-testShouldPass":true}]}},"/assistant/a11y_mode":{"post":{"deprecated":false,"description":"This controls Accessibility sounds. `hotword_enabled` is for 'Play start sound' and `endpoint_enabled` is for 'Play end sound'. \nSending an empty-body POST request returns the current values. \nEither of the fields or both can be sent and new values will be saved.","operationId":"Accessibility","parameters":[],"requestBody":{"content":{"application/json":{"example":{"endpoint_enabled":false,"hotword_enabled":false},"schema":{"$ref":"#/components/schemas/AccessibilityRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"endpoint_enabled":false,"hotword_enabled":false},"schema":{"$ref":"#/components/schemas/Getcurrentvalues"}}},"description":"","headers":{}}},"summary":"Accessibility","tags":["Assistant"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\"endpoint_enabled\":false,\"hotword_enabled\":false}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"50","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"body":"{\r\n \"hotword_enabled\": false,\r\n \"endpoint_enabled\": false\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/a11y_mode"},"x-testDescription":"This controls Accessibility sounds. `hotword_enabled` is for 'Play start sound' and `endpoint_enabled` is for 'Play end sound'. \nSending an empty-body POST request returns the current values. \nEither of the fields or both can be sent and new values will be saved.","x-testEnabled":true,"x-testName":"Accessibility","x-testShouldPass":true}]}},"/assistant/alarms":{"get":{"deprecated":false,"description":"This gives a list of all active alarms and timers.\n\nBoth alarms and timers have `id`s which can be used to delete them. (There is no known way of creating/deleting yet). The value of `status` have different meanings for alarms and timers (given below).\n\nAlarms have `date_pattern` and `time_pattern` with day, month, year, hour, minute, second. `fire_time` is the same in unix time (milliseconds, not seconds). \n`status` is 1 for set up and 2 for ringing.\n\nTimers have `original_duration` is the original duration. \n`status` is 1 for set up and 3 for ringing.","operationId":"GetAlarmsandTimers","parameters":[],"responses":{"200":{"content":{"application/json":{"example":{"alarm":[{"date_pattern":{"day":15,"month":1,"year":2018},"fire_time":1515995400000,"id":"alarm/xxx","status":1,"time_pattern":{"hour":6,"minute":50,"second":0}}],"timer":[{"fire_time":1516176765589,"id":"timer/xxx","original_duration":20000,"status":1}]},"schema":{"$ref":"#/components/schemas/Example18"}}},"description":"","headers":{}}},"summary":"Get Alarms and Timers","tags":["Assistant"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\r\n \"alarm\": [\r\n {\r\n \"date_pattern\": {\r\n \"day\": 15,\r\n \"month\": 1,\r\n \"year\": 2018\r\n },\r\n \"time_pattern\": {\r\n \"hour\": 6,\r\n \"minute\": 50,\r\n \"second\": 0\r\n },\r\n \"fire_time\": 1515995400000.0,\r\n \"id\": \"alarm/xxx\",\r\n \"status\": 1\r\n }\r\n ],\r\n \"timer\": [\r\n {\r\n \"fire_time\": 1516176765589,\r\n \"id\": \"timer/xxx\",\r\n \"original_duration\": 20000,\r\n \"status\": 1\r\n }\r\n ]\r\n}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"23","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/assistant/alarms"},"x-testDescription":"This gives a list of all active alarms and timers.\n\nBoth alarms and timers have `id`s which can be used to delete them. (There is no known way of creating/deleting yet). The value of `status` have different meanings for alarms and timers (given below).\n\nAlarms have `date_pattern` and `time_pattern` with day, month, year, hour, minute, second. `fire_time` is the same in unix time (milliseconds, not seconds). \n`status` is 1 for set up and 2 for ringing.\n\nTimers have `original_duration` is the original duration. \n`status` is 1 for set up and 3 for ringing.","x-testEnabled":true,"x-testName":"Get Alarms and Timers","x-testShouldPass":true}]}},"/assistant/alarms/delete":{"post":{"deprecated":false,"description":"This deletes alarms and timers by their id.\n\n`ids` is a list of ids to be deleted. Sending invalid id still returns a 200 OK. The `/` in the ids have to be escaped like `\\/`.","operationId":"DeleteAlarmsandTimers","parameters":[],"requestBody":{"content":{"application/json":{"example":{"ids":["timer/xxx","alarm/xxx"]},"schema":{"$ref":"#/components/schemas/DeleteAlarmsandTimersRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"success":true},"schema":{"$ref":"#/components/schemas/Example19"}}},"description":"","headers":{}}},"summary":"Delete Alarms and Timers","tags":["Assistant"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\"success\":true}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"16","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"body":"{\r\n \"ids\": [\r\n \"timer/xxx\",\r\n \"alarm/xxx\"\r\n ]\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/alarms/delete"},"x-testDescription":"This deletes alarms and timers by their id.\n\n`ids` is a list of ids to be deleted. Sending invalid id still returns a 200 OK. The `/` in the ids have to be escaped like `\\/`.","x-testEnabled":true,"x-testName":"Delete Alarms and Timers","x-testShouldPass":true}]}},"/assistant/alarms/volume":{"post":{"deprecated":false,"description":"This gets and sets alarms and timers volume. \n**Note:** This is not the same as normal volume.\n\nVolume is a float number in [0, 1] where 0 is minimum and 1 is maximum. \nSending an empty body gets the volume. Sending `volume` sets the volume.","operationId":"AlarmVolume","parameters":[],"requestBody":{"content":{"application/json":{"example":{"volume":1},"schema":{"$ref":"#/components/schemas/AlarmVolumeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"volume":1},"schema":{"$ref":"#/components/schemas/Getvolume"}}},"description":"","headers":{}}},"summary":"Alarm Volume","tags":["Assistant"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\"volume\":1.0}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"14","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"body":"{\r\n \"volume\": 1\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/alarms/volume"},"x-testDescription":"This gets and sets alarms and timers volume. \n**Note:** This is not the same as normal volume.\n\nVolume is a float number in [0, 1] where 0 is minimum and 1 is maximum. \nSending an empty body gets the volume. Sending `volume` sets the volume.","x-testEnabled":true,"x-testName":"Alarm Volume","x-testShouldPass":true}]}},"/assistant/check_ready_status":{"post":{"deprecated":false,"description":"**Update:** This seems to have changed now and is no longer possible. The error is also new.\n\nSetting `play_ready_message` to true plays a welcome message on the device saying \"Hi, I'm your Google Assistant. I'm here to help. To learn a few things you can do, continue in the Google Home app.\"","operationId":"CheckReadyStatus","parameters":[],"requestBody":{"content":{"application/json":{"example":{"play_ready_message":true,"user_id":"xxxxx"},"schema":{"$ref":"#/components/schemas/CheckReadyStatusRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"can_enroll":true,"enrollment_state":0,"error_code":0,"ready":false,"retryable":true},"schema":{"$ref":"#/components/schemas/Example13"}}},"description":"","headers":{}}},"summary":"Check Ready Status","tags":["Device Info"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\r\n \"can_enroll\": true,\r\n \"enrollment_state\": 0,\r\n \"error_code\": 0,\r\n \"ready\": false,\r\n \"retryable\": true\r\n}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"86","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"body":"{\r\n \"play_ready_message\": true,\r\n \"user_id\": \"xxxxx\"\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/check_ready_status"},"x-testDescription":"**Update:** This seems to have changed now and is no longer possible. The error is also new.\n\nSetting `play_ready_message` to true plays a welcome message on the device saying \"Hi, I'm your Google Assistant. I'm here to help. To learn a few things you can do, continue in the Google Home app.\"","x-testEnabled":true,"x-testName":"Check Ready Status","x-testShouldPass":true}]}},"/assistant/notifications":{"post":{"deprecated":false,"description":"This is for the Do Not Disturb option. Sending an empty-body POST returns the current value. Sending a new value changes it.","operationId":"DoNotDisturb","parameters":[{"in":"header","name":"Content-Type","required":true,"schema":{"example":"application/json","type":"string"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"example":{"notifications_enabled":true},"schema":{"$ref":"#/components/schemas/Getcurrentstate"}}},"description":"","headers":{}}},"summary":"Do Not Disturb","tags":["Assistant"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\"notifications_enabled\":true}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"30","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/notifications"},"x-testDescription":"This is for the Do Not Disturb option. Sending an empty-body POST returns the current value. Sending a new value changes it.","x-testEnabled":true,"x-testName":"Do Not Disturb","x-testShouldPass":true}]}},"/assistant/set_night_mode_params":{"post":{"deprecated":false,"description":"This sets night mode options. \nTo view currently set values, use /setup/eureka_info. \nIf `enabled` is set to false, night mode is disabled and the other values do not matter. \n`led_brightness` and `volume` refer to the maximum LED Brightness and Volume that is set during night mode. \n`demo_to_user` is always set to `true` so change in values will be visible in realtime (like brightness). \n`windows`: A combination of `length_hours` and `start_hour` is used to define start and end times for night mode. In this example, night mode starts at 10 PM (22) and ends at 6 AM (8 hours later). `windows.days` is an array of days of week when night mode will be enabled. Example: 0->Sunday, 1-> Monday, ..., 6->Saturday.","operationId":"NightModesettings","parameters":[],"requestBody":{"content":{"application/json":{"example":{"demo_to_user":true,"do_not_disturb":true,"enabled":false,"led_brightness":0.44999998807907104,"volume":0.46000000834465027,"windows":[{"days":[0,1,2,3,4,5,6],"length_hours":8,"start_hour":22}]},"schema":{"$ref":"#/components/schemas/NightModesettingsRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"do_not_disturb":true,"enabled":false,"led_brightness":0.44999998807907104,"volume":0.46000000834465027,"windows":[{"days":[0,1,2,3,4,5,6],"length_hours":8,"start_hour":22}]},"schema":{"$ref":"#/components/schemas/Example17"}}},"description":"","headers":{}}},"summary":"Night Mode settings","tags":["Device Settings"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\"do_not_disturb\":true,\"enabled\":false,\"led_brightness\":0.44999998807907104,\"volume\":0.46000000834465027,\"windows\":[{\"days\":[0,1,2,3,4,5,6],\"length_hours\":8.0,\"start_hour\":22.0}]}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"179","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"body":"{\r\n \"enabled\": false,\r\n \"do_not_disturb\": true,\r\n \"led_brightness\": 0.44999998807907104,\r\n \"volume\": 0.46000000834465027,\r\n \"demo_to_user\": true,\r\n \"windows\": [\r\n {\r\n \"length_hours\": 8,\r\n \"days\": [\r\n 0,\r\n 1,\r\n 2,\r\n 3,\r\n 4,\r\n 5,\r\n 6\r\n ],\r\n \"start_hour\": 22\r\n }\r\n ]\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/assistant/set_night_mode_params"},"x-testDescription":"This sets night mode options. \nTo view currently set values, use /setup/eureka_info. \nIf `enabled` is set to false, night mode is disabled and the other values do not matter. \n`led_brightness` and `volume` refer to the maximum LED Brightness and Volume that is set during night mode. \n`demo_to_user` is always set to `true` so change in values will be visible in realtime (like brightness). \n`windows`: A combination of `length_hours` and `start_hour` is used to define start and end times for night mode. In this example, night mode starts at 10 PM (22) and ends at 6 AM (8 hours later). `windows.days` is an array of days of week when night mode will be enabled. Example: 0->Sunday, 1-> Monday, ..., 6->Saturday.","x-testEnabled":true,"x-testName":"Night Mode settings","x-testShouldPass":true}]}},"/bluetooth/bond":{"post":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For both parts**\n\nThis is to forget paired devices by mac address. Works for both kinds of devices (Part 1 and Part 2).","operationId":"Forgetpaireddevice","parameters":[],"requestBody":{"content":{"application/json":{"example":{"bond":false,"mac_address":"xx:xx:xx:xx:xx:xx"},"schema":{"$ref":"#/components/schemas/ForgetpaireddeviceRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"object","x-is-dynamic":true}}},"description":"","headers":{}}},"summary":"Forget paired device","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"headers":{},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"NONE","x-matchResponseSchema":true},"request":{"body":"{\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"bond\": false\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/bluetooth/bond"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For both parts**\n\nThis is to forget paired devices by mac address. Works for both kinds of devices (Part 1 and Part 2).","x-testEnabled":true,"x-testName":"Forget paired device","x-testShouldPass":true}]}},"/bluetooth/connect":{"post":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis pairs with other bluetooth speakers by mac address.","operationId":"PairwithSpeaker","parameters":[],"requestBody":{"content":{"application/json":{"example":{"connect":true,"mac_address":"54:13:79:49:19:22","profile":2},"schema":{"$ref":"#/components/schemas/PairwithSpeakerRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"object","x-is-dynamic":true}}},"description":"","headers":{}}},"summary":"Pair with Speaker","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"0"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"NONE","x-matchResponseSchema":true},"request":{"body":"{\r\n \"mac_address\": \"54:13:79:49:19:22\",\r\n \"connect\": true,\r\n \"profile\": 2\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/bluetooth/connect"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis pairs with other bluetooth speakers by mac address.","x-testEnabled":true,"x-testName":"Pair with Speaker","x-testShouldPass":true}]}},"/bluetooth/discovery":{"post":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 1 only**\n\nThis enables/disables Home's bluetooth discovery and other devices can pair with Home (where Home acts as a speaker).","operationId":"ChangeDiscoverability","parameters":[],"requestBody":{"content":{"application/json":{"example":{"enable_discovery":true},"schema":{"$ref":"#/components/schemas/ChangeDiscoverabilityRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"object","x-is-dynamic":true}}},"description":"","headers":{}}},"summary":"Change Discoverability","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"headers":{},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"NONE","x-matchResponseSchema":true},"request":{"body":"{\r\n \"enable_discovery\": true\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/bluetooth/discovery"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 1 only**\n\nThis enables/disables Home's bluetooth discovery and other devices can pair with Home (where Home acts as a speaker).","x-testEnabled":true,"x-testName":"Change Discoverability","x-testShouldPass":true}]}},"/bluetooth/get_bonded":{"get":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For both parts**\n\nThis gives a list of all paired or 'bonded' devices. The response field names are self-descriptive.","operationId":"GetPairedDevices","parameters":[],"responses":{"200":{"content":{"application/json":{"example":[{"bond_date":1503212407260.55,"device_class":5898764,"device_type":1,"last_connect_date":1514807829482.111,"mac_address":"xx:xx:xx:xx:xx:xx","name":"Device Name","rssi":-255,"service_uuids":["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]}],"schema":{"items":{"$ref":"#/components/schemas/Example111"},"type":"array"}}},"description":"","headers":{}}},"summary":"Get Paired Devices","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"[\r\n {\r\n \"bond_date\": 1503212407260.55,\r\n \"device_class\": 5898764,\r\n \"device_type\": 1,\r\n \"last_connect_date\": 1514807829482.1111,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"Device Name\",\r\n \"rssi\": -255,\r\n \"service_uuids\": [\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\n ]\r\n }\r\n]","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"2","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/bluetooth/get_bonded"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For both parts**\n\nThis gives a list of all paired or 'bonded' devices. The response field names are self-descriptive.","x-testEnabled":true,"x-testName":"Get Paired Devices","x-testShouldPass":true}]}},"/bluetooth/scan":{"post":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis initiates scan for other bluetooth speakers/devices. Scan results will be updated continuously for `timeout` seconds. \nTo get the scan results, see /setup/bluetooth/scan_results.","operationId":"Scanfordevices","parameters":[],"requestBody":{"content":{"application/json":{"example":{"clear_results":true,"enable":true,"timeout":60},"schema":{"$ref":"#/components/schemas/ScanfordevicesRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"object","x-is-dynamic":true}}},"description":"","headers":{}}},"summary":"Scan for devices","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"0"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"NONE","x-matchResponseSchema":true},"request":{"body":"{\r\n \"enable\": true,\r\n \"clear_results\": true,\r\n \"timeout\": 60\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/bluetooth/scan"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis initiates scan for other bluetooth speakers/devices. Scan results will be updated continuously for `timeout` seconds. \nTo get the scan results, see /setup/bluetooth/scan_results.","x-testEnabled":true,"x-testName":"Scan for devices","x-testShouldPass":true}]}},"/bluetooth/scan_results":{"get":{"deprecated":false,"description":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis returns a list of all nearby bluetooth devices. While the Home app only shows speakers, this list contains all devices including TVs, mobiles, etc.\n\n`rssi` is signal strength, `name` is name, `mac_address` is mac address. \n`device_class` and `device_type` are bluetooth codes. \n\nThe Home app only lists those devices with `expected_profiles` > 0. Basically, the device should function as a speaker.","operationId":"GetScanResults","parameters":[],"responses":{"200":{"content":{"application/json":{"example":[{"device_class":525372,"device_type":3,"expected_profiles":0,"mac_address":"xx:xx:xx:xx:xx:xx","name":"KD-49X8200E","rssi":-90},{"device_class":5898764,"device_type":1,"expected_profiles":0,"mac_address":"xx:xx:xx:xx:xx:xx","name":"vivo 1714","rssi":-96},{"device_class":2491396,"device_type":1,"expected_profiles":1,"mac_address":"xx:xx:xx:xx:xx:xx","name":"Bluetooth Speaker","rssi":-93}],"schema":{"items":{"$ref":"#/components/schemas/Example112"},"type":"array"}}},"description":"","headers":{}}},"summary":"Get Scan Results","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"[\r\n {\r\n \"device_class\": 525372,\r\n \"device_type\": 3,\r\n \"expected_profiles\": 0,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"KD-49X8200E\",\r\n \"rssi\": -90\r\n },\r\n {\r\n \"device_class\": 5898764,\r\n \"device_type\": 1,\r\n \"expected_profiles\": 0,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"vivo 1714\",\r\n \"rssi\": -96\r\n },\r\n {\r\n \"device_class\": 2491396,\r\n \"device_type\": 1,\r\n \"expected_profiles\": 1,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"Bluetooth Speaker\",\r\n \"rssi\": -93\r\n }\r\n]","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"256","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/bluetooth/scan_results"},"x-testDescription":"*See note for Bluetooth under `/setup/bluetooth/status`*\n\n**For Part 2 only**\n\nThis returns a list of all nearby bluetooth devices. While the Home app only shows speakers, this list contains all devices including TVs, mobiles, etc.\n\n`rssi` is signal strength, `name` is name, `mac_address` is mac address. \n`device_class` and `device_type` are bluetooth codes. \n\nThe Home app only lists those devices with `expected_profiles` > 0. Basically, the device should function as a speaker.","x-testEnabled":true,"x-testName":"Get Scan Results","x-testShouldPass":true}]}},"/bluetooth/status":{"get":{"deprecated":false,"description":"> **There are 2 parts of Bluetooth.**\n>\n> *Part 1*: Devices like phones connect to Home and play audio through Home. \n> For this, /setup/bluetooth/discovery is used to make Home discoverable. Then devices can connect to it as if Home is just another bluetooth speaker.\n>\n> *Part 2*: Bluetooth speakers connect to Home and Home plays audio through the speakers.\n> For this, /setup/bluetooth/scan and /setup/bluetooth/scan_results are used to connect to other speakers.\n>\n> The other endpoints are common for both parts.\n\n\n**For both parts**\n\nThis gives the status of all bluetooth things.\n- Not sure what `audio_mode` is.\n- `discovery_enabled` states whether Home is discoverable. (**Part 1**)\n- `connecting_devices` is a list of all media sources (like phones) connected to Home. (**Part 1**)\n- `scanning_enabled` states whether Home scanning for other bluetooth speakers/devices. (**Part 2**)\n- `connected_devices` is a list of all speakers connected to Home. (**Part 2**)","operationId":"Status","parameters":[],"responses":{"200":{"content":{"application/json":{"example":{"audio_mode":0,"connected_devices":[{"device":{"bond_date":1529248165656.613,"device_class":2491396,"device_type":1,"last_connect_date":0,"mac_address":"xx:xx:xx:xx:xx:xx","name":"PHILIPS BT64","rssi":-255,"service_uuids":["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]},"enabled_profiles":2}],"connecting_devices":[],"discovery_enabled":false,"remote_sink":{"bond_date":1529248165656.613,"device_class":2491396,"device_type":1,"last_connect_date":0,"mac_address":"xx:xx:xx:xx:xx:xx","name":"PHILIPS BT64","rssi":-255,"service_uuids":["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]},"scanning_enabled":false},"schema":{"$ref":"#/components/schemas/Example110"}}},"description":"","headers":{}}},"summary":"Status","tags":["Bluetooth"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\r\n \"audio_mode\": 0,\r\n \"connecting_devices\": [],\r\n \"connected_devices\": [\r\n {\r\n \"device\": {\r\n \"bond_date\": 1529248165656.613,\r\n \"device_class\": 2491396,\r\n \"device_type\": 1,\r\n \"last_connect_date\": 0,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"PHILIPS BT64\",\r\n \"rssi\": -255,\r\n \"service_uuids\": [\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\n ]\r\n },\r\n \"enabled_profiles\": 2\r\n }\r\n ],\r\n \"remote_sink\": {\r\n \"bond_date\": 1529248165656.613,\r\n \"device_class\": 2491396,\r\n \"device_type\": 1,\r\n \"last_connect_date\": 0,\r\n \"mac_address\": \"xx:xx:xx:xx:xx:xx\",\r\n \"name\": \"PHILIPS BT64\",\r\n \"rssi\": -255,\r\n \"service_uuids\": [\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\r\n \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\r\n ]\r\n },\r\n \"discovery_enabled\": false,\r\n \"scanning_enabled\": false\r\n}","headers":{"Access-Control-Allow-Headers":"Content-Type","Cache-Control":"no-cache","Content-Length":"114","Content-Type":"application/json"},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/bluetooth/status"},"x-testDescription":"> **There are 2 parts of Bluetooth.**\n>\n> *Part 1*: Devices like phones connect to Home and play audio through Home. \n> For this, /setup/bluetooth/discovery is used to make Home discoverable. Then devices can connect to it as if Home is just another bluetooth speaker.\n>\n> *Part 2*: Bluetooth speakers connect to Home and Home plays audio through the speakers.\n> For this, /setup/bluetooth/scan and /setup/bluetooth/scan_results are used to connect to other speakers.\n>\n> The other endpoints are common for both parts.\n\n\n**For both parts**\n\nThis gives the status of all bluetooth things.\n- Not sure what `audio_mode` is.\n- `discovery_enabled` states whether Home is discoverable. (**Part 1**)\n- `connecting_devices` is a list of all media sources (like phones) connected to Home. (**Part 1**)\n- `scanning_enabled` states whether Home scanning for other bluetooth speakers/devices. (**Part 2**)\n- `connected_devices` is a list of all speakers connected to Home. (**Part 2**)","x-testEnabled":true,"x-testName":"Status","x-testShouldPass":true}]}},"/configured_networks":{"get":{"deprecated":false,"description":"This gets a list of all saved Wi-Fi networks.\n\nEach network has `ssid`, `wpa_auth`, `wpa_cipher` and `wpa_id`. \n`wpa_id` is an incrementing number used to identify a saved network. \n#TODO: Add values for `wpa_auth` and `wpa_cipher`.","operationId":"GetSavedNetworks","parameters":[],"responses":{"200":{"content":{"application/json":{"example":[{"ssid":"Wifi name","wpa_auth":7,"wpa_cipher":4,"wpa_id":0}],"schema":{"items":{"$ref":"#/components/schemas/Example113"},"type":"array"}}},"description":"","headers":{}}},"summary":"Get Saved Networks","tags":["Wifi"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"[\r\n {\r\n \"ssid\": \"Wifi name\",\r\n \"wpa_auth\": 7,\r\n \"wpa_cipher\": 4,\r\n \"wpa_id\": 0\r\n }\r\n]","headers":{},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"KEYS","x-matchResponseSchema":true},"request":{"method":"GET","uri":"/configured_networks"},"x-testDescription":"This gets a list of all saved Wi-Fi networks.\n\nEach network has `ssid`, `wpa_auth`, `wpa_cipher` and `wpa_id`. \n`wpa_id` is an incrementing number used to identify a saved network. \n#TODO: Add values for `wpa_auth` and `wpa_cipher`.","x-testEnabled":true,"x-testName":"Get Saved Networks","x-testShouldPass":true}]}},"/connect_wifi":{"post":{"deprecated":false,"description":"**Note:** Not sure how the password is encrypted. Might be using the public certificate from /setup/eureka_info. So this cannot be used as of now. If someone figures it out, please [create a new issue here](https://github.com/rithvikvibhu/GHLocalApi/issues/new).","operationId":"ConnecttoWi-FiNetwork","parameters":[],"requestBody":{"content":{"application/json":{"example":{"bssid":"5c:0a:xx:xx:xx:xx","enc_passwd":"xxxxxfPY=","signal_level":-42,"ssid":"myotherssid","wpa_auth":7,"wpa_cipher":4},"schema":{"$ref":"#/components/schemas/ConnecttoWi-FiNetworkRequest"}}},"required":true},"responses":{"200":{"description":"","headers":{}}},"summary":"Connect to Wi-Fi Network","tags":["Wifi"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"headers":{},"statusCode":"200","x-allowExtraHeaders":true,"x-arrayCheckCount":false,"x-arrayOrderedMatching":false,"x-bodyMatchMode":"NONE","x-matchResponseSchema":true},"request":{"body":"{\r\n \"bssid\": \"5c:0a:xx:xx:xx:xx\",\r\n \"signal_level\": -42,\r\n \"ssid\": \"myotherssid\",\r\n \"wpa_auth\": 7,\r\n \"wpa_cipher\": 4,\r\n \"enc_passwd\": \"xxxxxfPY=\"\r\n}","headers":{"Content-Type":"application/json"},"method":"POST","uri":"/connect_wifi"},"x-testDescription":"**Note:** Not sure how the password is encrypted. Might be using the public certificate from /setup/eureka_info. So this cannot be used as of now. If someone figures it out, please [create a new issue here](https://github.com/rithvikvibhu/GHLocalApi/issues/new).","x-testEnabled":true,"x-testName":"Connect to Wi-Fi Network","x-testShouldPass":true}]}},"/eureka_info":{"get":{"deprecated":false,"description":"This gives most of the device info. The GET parameter `param` is a comma separated list of json keys to fetch. Currently, these params are known: `version,audio,name,build_info,detail,device_info,net,wifi,setup,settings,opt_in,opencast,multizone,proxy,night_mode_params,user_eq,room_equalizer,sign,aogh,ultrasound,mesh`\n\nNested items can also be filtered using the dot notation. Example: `audio.digital`\n\nThe `options` GET parameter is always set to `detail` or `detail,sign`. `sign` signs the `nonce` and returns some value.\n\nThe `nonce` GET parameter is an integer value signed with needed (see `option` parameter above).","operationId":"EurekaInfo","parameters":[{"explode":true,"in":"query","name":"params","required":true,"schema":{"example":"version,audio,name,build_info,detail,device_info,net,wifi,setup,settings,opt_in,opencast,multizone,proxy,night_mode_params,user_eq,room_equalizer,sign,aogh,ultrasound,mesh","type":"string"},"style":"form"},{"explode":true,"in":"query","name":"options","required":true,"schema":{"example":"detail,sign","type":"string"},"style":"form"},{"explode":true,"in":"query","name":"nonce","required":true,"schema":{"example":1234512345,"format":"int32","type":"integer"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"example":{"aogh":{"aogh_api_version":"2"},"audio":{"digital":false},"build_info":{"build_type":2,"cast_build_revision":"1.46.195690","cast_control_version":1,"preview_channel_state":4,"release_track":"preview-joining-stable-channel","system_build_number":"195690"},"detail":{"icon_list":[{"depth":32,"height":55,"mimetype":"image/png","url":"/setup/icon.png","width":98}],"locale":{"display_string":"English (United States)"},"timezone":{"display_string":"India Standard Time (Kolkata)","offset":330}},"device_info":{"4k_blocked":0,"capabilities":{"aogh_supported":true,"assistant_supported":true,"audio_hdr_supported":false,"audio_surround_mode_supported":false,"ble_supported":true,"bluetooth_audio_sink_supported":true,"bluetooth_audio_source_supported":true,"bluetooth_supported":true,"cloudcast_supported":true,"content_filters_supported":true,"display_supported":false,"fdr_supported":false,"hdmi_prefer_50hz_supported":false,"hdmi_prefer_high_fps_supported":false,"hotspot_supported":true,"https_setup_supported":true,"input_management_supported":true,"keep_hotspot_until_connected_supported":true,"multi_user_supported":true,"multichannel_group_supported":true,"multizone_supported":true,"night_mode_supported":true,"night_mode_supported_v2":true,"opencast_supported":false,"preview_channel_supported":true,"reboot_supported":true,"remote_ducking_supported":true,"separate_tts_volume_supported":true,"setup_supported":true,"sleep_mode_supported":true,"stats_supported":true,"system_sound_effects_supported":false,"user_eq_supported":true,"wifi_auto_save_supported":true,"wifi_regulatory_domain_locked":true,"wifi_supported":true},"cloud_device_id":"003D...","factory_country_code":"US","hotspot_bssid":"FA:8F:CA:30:41:71","local_authorization_token_hash":"hBt2...","mac_address":"F4:F5:...","manufacturer":"Google Inc.","model_name":"Google Home","product_name":"pineapple","public_key":"MIIB...","ssdp_udn":"baab...","uma_client_id":"8ce0...","uptime":48509.169282,"weave_device_id":""},"multizone":{"audio_output_delay":0,"audio_output_delay_hdmi":0,"audio_output_delay_oem":0,"aux_in_group":"","dynamic_groups":[],"groups":[],"multichannel_status":0},"name":"Bedroom Speaker","net":{"ethernet_connected":false,"ip_address":"192.168.0.18","online":true},"night_mode_params":{"device_override_do_not_disturb":0,"do_not_disturb":true,"enabled":true,"led_brightness":0.5799999833106995,"volume":0.5899999737739563,"windows":[{"days":[0,1,2,3,4,5,6],"length_hours":6,"start_hour":23}]},"opencast":{"pin_code":""},"opt_in":{"audio_hdr":false,"audio_surround_mode":0,"autoplay_on_signal":true,"cloud_ipc":true,"hdmi_prefer_50hz":false,"hdmi_prefer_high_fps":true,"managed_mode":false,"opencast":true,"preview_channel":true,"remote_ducking":true,"stats":true,"ui_flipped":false,"wpa3_support_enabled":false},"proxy":{"mode":"system"},"settings":{"closed_caption":{},"control_notifications":1,"country_code":"IN","locale":"en-US","network_standby":0,"system_sound_effects":true,"time_format":1,"timezone":"Asia/Kolkata","wake_on_cast":1},"setup":{"qr_ssid_suffix":"","setup_state":60,"ssid_suffix":"k","stats":{"num_check_connectivity":0,"num_connect_wifi":0,"num_connected_wifi_not_saved":0,"num_initial_eureka_info":0,"num_obtain_ip":0},"tos_accepted":true},"sign":{"certificate":"-----BEGIN CERTIFICATE-----\nMIID...Oeb0\n-----END CERTIFICATE-----\n","intermediate_certs":["-----BEGIN CERTIFICATE-----\nMIID...O/bYS\n-----END CERTIFICATE-----\n"],"nonce":"1234512345","signed_data":"Rr5Q..."},"user_eq":{"high_shelf":{"frequency":4500,"gain_db":0,"quality":0.707},"low_shelf":{"frequency":150,"gain_db":0,"quality":0.707},"max_peaking_eqs":0,"peaking_eqs":[]},"version":10,"wifi":{"bssid":"a0:ab:...","has_changes":false,"noise_level":-90,"signal_level":-50,"ssid":"Nucl...","wpa_configured":true,"wpa_id":1,"wpa_state":10}},"schema":{"$ref":"#/components/schemas/Example1"}}},"description":"","headers":{}}},"summary":"Eureka Info","tags":["Device Info"],"x-operation-settings":{"AllowDynamicFormParameters":false,"AllowDynamicQueryParameters":false,"CollectParameters":false,"IsMultiContentStreaming":false},"x-unitTests":[{"expectedResponse":{"body":"{\r\n \"aogh\": {\r\n \"aogh_api_version\": \"2\"\r\n },\r\n \"audio\": {\r\n \"digital\": false\r\n },\r\n \"build_info\": {\r\n \"build_type\": 2,\r\n \"cast_build_revision\": \"1.46.195690\",\r\n \"cast_control_version\": 1,\r\n \"preview_channel_state\": 4,\r\n \"release_track\": \"preview-joining-stable-channel\",\r\n \"system_build_number\": \"195690\"\r\n },\r\n \"detail\": {\r\n \"icon_list\": [\r\n {\r\n \"depth\": 32,\r\n \"height\": 55,\r\n \"mimetype\": \"image/png\",\r\n \"url\": \"/setup/icon.png\",\r\n \"width\": 98\r\n }\r\n ],\r\n \"locale\": {\r\n \"display_string\":