commit f8ec2684cbce43f78bcc75b3cd983e11479ddedc Author: Otto Winter Date: Thu Dec 13 21:34:57 2018 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c73bb38 --- /dev/null +++ b/.gitignore @@ -0,0 +1,94 @@ +# Hide sublime text stuff +*.sublime-project +*.sublime-workspace + +# Hide some OS X stuff +.DS_Store +.AppleDouble +.LSOverride +Icon + +# Thumbnails +._* + +# IntelliJ IDEA +.idea +*.iml + +# pytest +.pytest_cache +.cache + +# GITHUB Proposed Python stuff: +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +.eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 + +# Logs +*.log +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml +htmlcov/ + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +.python-version + +# emacs auto backups +*~ +*# +*.orig + +# venv stuff +pyvenv.cfg +pip-selfcheck.json +venv +.venv +Pipfile* +share/* + +# vimmy stuff +*.swp +*.swo + +ctags.tmp + +# Visual Studio Code +.vscode + +# Built docs +docs/build + +# Windows Explorer +desktop.ini +/.vs/* + +# mypy +/.mypy_cache/* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7db4cd5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Otto Winter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/aioesphomeapi/__init__.py b/aioesphomeapi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/aioesphomeapi/api.proto b/aioesphomeapi/api.proto new file mode 100644 index 0000000..8159b80 --- /dev/null +++ b/aioesphomeapi/api.proto @@ -0,0 +1,291 @@ +syntax = "proto3"; + +// The Home Assistant protocol is structured as a simple +// TCP socket with short binary messages encoded in the protocol buffers format +// First, a message in this protocol has a specific format: +// * VarInt denoting the size of the message object. (type is not part of this) +// * VarInt denoting the type of message. +// * The message object encoded as a ProtoBuf message + +// The connection is established in 4 steps: +// * First, the client connects to the server and sends a "Hello Request" identifying itself +// * The server responds with a "Hello Response" and selects the protocol version +// * After receiving this message, the client attempts to authenticate itself using +// the password and a "Connect Request" +// * The server responds with a "Connect Response" and notifies of invalid password. +// If anything in this initial process fails, the connection must immediately closed +// by both sides and _no_ disconnection message is to be sent. + +// Message sent at the beginning of each connection +// Can only be sent by the client and only at the beginning of the connection +message HelloRequest { + // Description of client (like User Agent) + // For example "Home Assistant" + // Not strictly necessary to send but nice for debugging + // purposes. + string client_info = 1; +} + +// Confirmation of successful connection request. +// Can only be sent by the server and only at the beginning of the connection +message HelloResponse { + // The version of the API to use. The _client_ (for example Home Assistant) needs to check + // for compatibility and if necessary adopt to an older API. + // Major is for breaking changes in the base protocol - a mismatch will lead to immediate disconnect_client_ + // Minor is for breaking changes in individual messages - a mismatch will lead to a warning message + uint32 api_version_major = 1; + uint32 api_version_minor = 2; + + // A string identifying the server (ESP); like client info this may be empty + // and only exists for debugging/logging purposes. + // For example "esphomelib v1.10.0 on ESP8266" + string server_info = 3; +} + +// Message sent at the beginning of each connection to authenticate the client +// Can only be sent by the client and only at the beginning of the connection +message ConnectRequest { + // The password to log in with + string password = 1; +} + +// Confirmation of successful connection. After this the connection is available for all traffic. +// Can only be sent by the server and only at the beginning of the connection +message ConnectResponse { + bool invalid_password = 1; +} + +// Request to close the connection. +// Can be sent by both the client and server +message DisconnectRequest { + // Do not close the connection before the acknowledgement arrives +} + +message DisconnectResponse { + // Empty - Both parties are required to close the connection after this + // message has been received. +} + +message PingRequest { + // Empty +} + +message PingResponse { + // Empty +} + +message DeviceInfoRequest { + // Empty +} + +message DeviceInfoResponse { + bool uses_password = 1; + + // The name of the node, given by "App.set_name()" + string name = 2; + + // The mac address of the device. For example "AC:BC:32:89:0E:A9" + string mac_address = 3; + + // A string describing the esphomelib version. For example "1.10.0" + string esphomelib_version = 4; + + // A string describing the date of compilation, this is generated by the compiler + // and therefore may not be in the same format all the time. + // If the user isn't using esphomeyaml, this will also not be set. + string compilation_time = 5; + + // The model of the board. For example NodeMCU + string model = 6; + + bool has_deep_sleep = 7; +} + +message ListEntitiesRequest { + // Empty +} + +message ListEntitiesBinarySensorResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string device_class = 5; + bool is_status_binary_sensor = 6; +} +message ListEntitiesCoverResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + bool is_optimistic = 5; +} +message ListEntitiesFanResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + bool supports_oscillation = 5; + bool supports_speed = 6; +} +message ListEntitiesLightResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + bool supports_brightness = 5; + bool supports_rgb = 6; + bool supports_white_value = 7; + bool supports_color_temperature = 8; + float min_mireds = 9; + float max_mireds = 10; + repeated string effects = 11; +} +message ListEntitiesSensorResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string icon = 5; + string unit_of_measurement = 6; + int32 accuracy_decimals = 7; +} +message ListEntitiesSwitchResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string icon = 5; +} +message ListEntitiesTextSensorResponse { + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string icon = 5; +} +message ListEntitiesDoneResponse { + // Empty +} + +message SubscribeStatesRequest { + // Empty +} +message BinarySensorStateResponse { + fixed32 key = 1; + bool state = 2; +} +message CoverStateResponse { + fixed32 key = 1; + enum CoverState { + OPEN = 0; + CLOSED = 1; + } + CoverState state = 2; +} +enum FanSpeed { + LOW = 0; + MEDIUM = 1; + HIGH = 2; +} +message FanStateResponse { + fixed32 key = 1; + bool state = 2; + bool oscillating = 3; + FanSpeed speed = 4; +} +message LightStateResponse { + fixed32 key = 1; + bool state = 2; + float brightness = 3; + float red = 4; + float green = 5; + float blue = 6; + float white = 7; + float color_temperature = 8; + string effect = 9; +} +message SensorStateResponse { + fixed32 key = 1; + float state = 2; +} +message SwitchStateResponse { + fixed32 key = 1; + bool state = 2; +} +message TextSensorStateResponse { + fixed32 key = 1; + string state = 2; +} + +message CoverCommandRequest { + fixed32 key = 1; + enum CoverCommand { + OPEN = 0; + CLOSE = 1; + STOP = 2; + } + bool has_state = 2; + CoverCommand command = 3; +} +message FanCommandRequest { + fixed32 key = 1; + bool has_state = 2; + bool state = 3; + bool has_speed = 4; + FanSpeed speed = 5; + bool has_oscillating = 6; + bool oscillating = 7; +} +message LightCommandRequest { + fixed32 key = 1; + bool has_state = 2; + bool state = 3; + bool has_brightness = 4; + float brightness = 5; + bool has_rgb = 6; + float red = 7; + float green = 8; + float blue = 9; + bool has_white = 10; + float white = 11; + bool has_color_temperature = 12; + float color_temperature = 13; + bool has_transition_length = 14; + uint32 transition_length = 15; + bool has_flash_length = 16; + uint32 flash_length = 17; + bool has_effect = 18; + string effect = 19; +} +message SwitchCommandRequest { + fixed32 key = 1; + bool state = 2; +} + +enum LogLevel { + NONE = 0; + ERROR = 1; + WARN = 2; + INFO = 3; + DEBUG = 4; + VERBOSE = 5; + VERY_VERBOSE = 6; +} + +message SubscribeLogsRequest { + LogLevel level = 1; +} + +message SubscribeLogsResponse { + LogLevel level = 1; + string tag = 2; + string message = 3; +} diff --git a/aioesphomeapi/api_pb2.py b/aioesphomeapi/api_pb2.py new file mode 100644 index 0000000..5ca00e2 --- /dev/null +++ b/aioesphomeapi/api_pb2.py @@ -0,0 +1,2039 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: api.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='api.proto', + package='', + syntax='proto3', + serialized_options=None, + serialized_pb=_b('\n\tapi.proto\"#\n\x0cHelloRequest\x12\x13\n\x0b\x63lient_info\x18\x01 \x01(\t\"Z\n\rHelloResponse\x12\x19\n\x11\x61pi_version_major\x18\x01 \x01(\r\x12\x19\n\x11\x61pi_version_minor\x18\x02 \x01(\r\x12\x13\n\x0bserver_info\x18\x03 \x01(\t\"\"\n\x0e\x43onnectRequest\x12\x10\n\x08password\x18\x01 \x01(\t\"+\n\x0f\x43onnectResponse\x12\x18\n\x10invalid_password\x18\x01 \x01(\x08\"\x13\n\x11\x44isconnectRequest\"\x14\n\x12\x44isconnectResponse\"\r\n\x0bPingRequest\"\x0e\n\x0cPingResponse\"\x13\n\x11\x44\x65viceInfoRequest\"\xab\x01\n\x12\x44\x65viceInfoResponse\x12\x15\n\ruses_password\x18\x01 \x01(\x08\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0bmac_address\x18\x03 \x01(\t\x12\x1a\n\x12\x65sphomelib_version\x18\x04 \x01(\t\x12\x18\n\x10\x63ompilation_time\x18\x05 \x01(\t\x12\r\n\x05model\x18\x06 \x01(\t\x12\x16\n\x0ehas_deep_sleep\x18\x07 \x01(\x08\"\x15\n\x13ListEntitiesRequest\"\x9a\x01\n ListEntitiesBinarySensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x14\n\x0c\x64\x65vice_class\x18\x05 \x01(\t\x12\x1f\n\x17is_status_binary_sensor\x18\x06 \x01(\x08\"s\n\x19ListEntitiesCoverResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x15\n\ris_optimistic\x18\x05 \x01(\x08\"\x90\x01\n\x17ListEntitiesFanResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1c\n\x14supports_oscillation\x18\x05 \x01(\x08\x12\x16\n\x0esupports_speed\x18\x06 \x01(\x08\"\x8a\x02\n\x19ListEntitiesLightResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1b\n\x13supports_brightness\x18\x05 \x01(\x08\x12\x14\n\x0csupports_rgb\x18\x06 \x01(\x08\x12\x1c\n\x14supports_white_value\x18\x07 \x01(\x08\x12\"\n\x1asupports_color_temperature\x18\x08 \x01(\x08\x12\x12\n\nmin_mireds\x18\t \x01(\x02\x12\x12\n\nmax_mireds\x18\n \x01(\x02\x12\x0f\n\x07\x65\x66\x66\x65\x63ts\x18\x0b \x03(\t\"\xa3\x01\n\x1aListEntitiesSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\x12\x1b\n\x13unit_of_measurement\x18\x06 \x01(\t\x12\x19\n\x11\x61\x63\x63uracy_decimals\x18\x07 \x01(\x05\"k\n\x1aListEntitiesSwitchResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\"o\n\x1eListEntitiesTextSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\"\x1a\n\x18ListEntitiesDoneResponse\"\x18\n\x16SubscribeStatesRequest\"7\n\x19\x42inarySensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"t\n\x12\x43overStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12-\n\x05state\x18\x02 \x01(\x0e\x32\x1e.CoverStateResponse.CoverState\"\"\n\nCoverState\x12\x08\n\x04OPEN\x10\x00\x12\n\n\x06\x43LOSED\x10\x01\"]\n\x10\x46\x61nStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x13\n\x0boscillating\x18\x03 \x01(\x08\x12\x18\n\x05speed\x18\x04 \x01(\x0e\x32\t.FanSpeed\"\xa8\x01\n\x12LightStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x12\n\nbrightness\x18\x03 \x01(\x02\x12\x0b\n\x03red\x18\x04 \x01(\x02\x12\r\n\x05green\x18\x05 \x01(\x02\x12\x0c\n\x04\x62lue\x18\x06 \x01(\x02\x12\r\n\x05white\x18\x07 \x01(\x02\x12\x19\n\x11\x63olor_temperature\x18\x08 \x01(\x02\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\t \x01(\t\"1\n\x13SensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x02\"1\n\x13SwitchStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"5\n\x17TextSensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\t\"\x98\x01\n\x13\x43overCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\x32\n\x07\x63ommand\x18\x03 \x01(\x0e\x32!.CoverCommandRequest.CoverCommand\"-\n\x0c\x43overCommand\x12\x08\n\x04OPEN\x10\x00\x12\t\n\x05\x43LOSE\x10\x01\x12\x08\n\x04STOP\x10\x02\"\x9d\x01\n\x11\x46\x61nCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x11\n\thas_speed\x18\x04 \x01(\x08\x12\x18\n\x05speed\x18\x05 \x01(\x0e\x32\t.FanSpeed\x12\x17\n\x0fhas_oscillating\x18\x06 \x01(\x08\x12\x13\n\x0boscillating\x18\x07 \x01(\x08\"\x95\x03\n\x13LightCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x16\n\x0ehas_brightness\x18\x04 \x01(\x08\x12\x12\n\nbrightness\x18\x05 \x01(\x02\x12\x0f\n\x07has_rgb\x18\x06 \x01(\x08\x12\x0b\n\x03red\x18\x07 \x01(\x02\x12\r\n\x05green\x18\x08 \x01(\x02\x12\x0c\n\x04\x62lue\x18\t \x01(\x02\x12\x11\n\thas_white\x18\n \x01(\x08\x12\r\n\x05white\x18\x0b \x01(\x02\x12\x1d\n\x15has_color_temperature\x18\x0c \x01(\x08\x12\x19\n\x11\x63olor_temperature\x18\r \x01(\x02\x12\x1d\n\x15has_transition_length\x18\x0e \x01(\x08\x12\x19\n\x11transition_length\x18\x0f \x01(\r\x12\x18\n\x10has_flash_length\x18\x10 \x01(\x08\x12\x14\n\x0c\x66lash_length\x18\x11 \x01(\r\x12\x12\n\nhas_effect\x18\x12 \x01(\x08\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x13 \x01(\t\"2\n\x14SwitchCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"0\n\x14SubscribeLogsRequest\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\"O\n\x15SubscribeLogsResponse\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12\x0b\n\x03tag\x18\x02 \x01(\t\x12\x0f\n\x07message\x18\x03 \x01(\t*)\n\x08\x46\x61nSpeed\x12\x07\n\x03LOW\x10\x00\x12\n\n\x06MEDIUM\x10\x01\x12\x08\n\x04HIGH\x10\x02*]\n\x08LogLevel\x12\x08\n\x04NONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x08\n\x04WARN\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\x0b\n\x07VERBOSE\x10\x05\x12\x10\n\x0cVERY_VERBOSE\x10\x06\x62\x06proto3') +) + +_FANSPEED = _descriptor.EnumDescriptor( + name='FanSpeed', + full_name='FanSpeed', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LOW', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MEDIUM', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HIGH', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3151, + serialized_end=3192, +) +_sym_db.RegisterEnumDescriptor(_FANSPEED) + +FanSpeed = enum_type_wrapper.EnumTypeWrapper(_FANSPEED) +_LOGLEVEL = _descriptor.EnumDescriptor( + name='LogLevel', + full_name='LogLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NONE', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WARN', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INFO', index=3, number=3, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEBUG', index=4, number=4, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='VERBOSE', index=5, number=5, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='VERY_VERBOSE', index=6, number=6, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3194, + serialized_end=3287, +) +_sym_db.RegisterEnumDescriptor(_LOGLEVEL) + +LogLevel = enum_type_wrapper.EnumTypeWrapper(_LOGLEVEL) +LOW = 0 +MEDIUM = 1 +HIGH = 2 +NONE = 0 +ERROR = 1 +WARN = 2 +INFO = 3 +DEBUG = 4 +VERBOSE = 5 +VERY_VERBOSE = 6 + + +_COVERSTATERESPONSE_COVERSTATE = _descriptor.EnumDescriptor( + name='CoverState', + full_name='CoverStateResponse.CoverState', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='OPEN', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLOSED', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=1786, + serialized_end=1820, +) +_sym_db.RegisterEnumDescriptor(_COVERSTATERESPONSE_COVERSTATE) + +_COVERCOMMANDREQUEST_COVERCOMMAND = _descriptor.EnumDescriptor( + name='CoverCommand', + full_name='CoverCommandRequest.CoverCommand', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='OPEN', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CLOSE', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STOP', index=2, number=2, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=2353, + serialized_end=2398, +) +_sym_db.RegisterEnumDescriptor(_COVERCOMMANDREQUEST_COVERCOMMAND) + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='client_info', full_name='HelloRequest.client_info', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=13, + serialized_end=48, +) + + +_HELLORESPONSE = _descriptor.Descriptor( + name='HelloResponse', + full_name='HelloResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='api_version_major', full_name='HelloResponse.api_version_major', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='api_version_minor', full_name='HelloResponse.api_version_minor', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='server_info', full_name='HelloResponse.server_info', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=50, + serialized_end=140, +) + + +_CONNECTREQUEST = _descriptor.Descriptor( + name='ConnectRequest', + full_name='ConnectRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='password', full_name='ConnectRequest.password', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=142, + serialized_end=176, +) + + +_CONNECTRESPONSE = _descriptor.Descriptor( + name='ConnectResponse', + full_name='ConnectResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='invalid_password', full_name='ConnectResponse.invalid_password', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=178, + serialized_end=221, +) + + +_DISCONNECTREQUEST = _descriptor.Descriptor( + name='DisconnectRequest', + full_name='DisconnectRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=223, + serialized_end=242, +) + + +_DISCONNECTRESPONSE = _descriptor.Descriptor( + name='DisconnectResponse', + full_name='DisconnectResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=244, + serialized_end=264, +) + + +_PINGREQUEST = _descriptor.Descriptor( + name='PingRequest', + full_name='PingRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=266, + serialized_end=279, +) + + +_PINGRESPONSE = _descriptor.Descriptor( + name='PingResponse', + full_name='PingResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=281, + serialized_end=295, +) + + +_DEVICEINFOREQUEST = _descriptor.Descriptor( + name='DeviceInfoRequest', + full_name='DeviceInfoRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=297, + serialized_end=316, +) + + +_DEVICEINFORESPONSE = _descriptor.Descriptor( + name='DeviceInfoResponse', + full_name='DeviceInfoResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='uses_password', full_name='DeviceInfoResponse.uses_password', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='DeviceInfoResponse.name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='mac_address', full_name='DeviceInfoResponse.mac_address', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='esphomelib_version', full_name='DeviceInfoResponse.esphomelib_version', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='compilation_time', full_name='DeviceInfoResponse.compilation_time', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='model', full_name='DeviceInfoResponse.model', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_deep_sleep', full_name='DeviceInfoResponse.has_deep_sleep', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=319, + serialized_end=490, +) + + +_LISTENTITIESREQUEST = _descriptor.Descriptor( + name='ListEntitiesRequest', + full_name='ListEntitiesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=492, + serialized_end=513, +) + + +_LISTENTITIESBINARYSENSORRESPONSE = _descriptor.Descriptor( + name='ListEntitiesBinarySensorResponse', + full_name='ListEntitiesBinarySensorResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesBinarySensorResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesBinarySensorResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesBinarySensorResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesBinarySensorResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='device_class', full_name='ListEntitiesBinarySensorResponse.device_class', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_status_binary_sensor', full_name='ListEntitiesBinarySensorResponse.is_status_binary_sensor', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=516, + serialized_end=670, +) + + +_LISTENTITIESCOVERRESPONSE = _descriptor.Descriptor( + name='ListEntitiesCoverResponse', + full_name='ListEntitiesCoverResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesCoverResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesCoverResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesCoverResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesCoverResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='is_optimistic', full_name='ListEntitiesCoverResponse.is_optimistic', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=672, + serialized_end=787, +) + + +_LISTENTITIESFANRESPONSE = _descriptor.Descriptor( + name='ListEntitiesFanResponse', + full_name='ListEntitiesFanResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesFanResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesFanResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesFanResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesFanResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_oscillation', full_name='ListEntitiesFanResponse.supports_oscillation', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_speed', full_name='ListEntitiesFanResponse.supports_speed', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=790, + serialized_end=934, +) + + +_LISTENTITIESLIGHTRESPONSE = _descriptor.Descriptor( + name='ListEntitiesLightResponse', + full_name='ListEntitiesLightResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesLightResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesLightResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesLightResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesLightResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_brightness', full_name='ListEntitiesLightResponse.supports_brightness', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_rgb', full_name='ListEntitiesLightResponse.supports_rgb', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_white_value', full_name='ListEntitiesLightResponse.supports_white_value', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='supports_color_temperature', full_name='ListEntitiesLightResponse.supports_color_temperature', index=7, + number=8, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='min_mireds', full_name='ListEntitiesLightResponse.min_mireds', index=8, + number=9, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='max_mireds', full_name='ListEntitiesLightResponse.max_mireds', index=9, + number=10, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='effects', full_name='ListEntitiesLightResponse.effects', index=10, + number=11, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=937, + serialized_end=1203, +) + + +_LISTENTITIESSENSORRESPONSE = _descriptor.Descriptor( + name='ListEntitiesSensorResponse', + full_name='ListEntitiesSensorResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesSensorResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesSensorResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesSensorResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesSensorResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='icon', full_name='ListEntitiesSensorResponse.icon', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unit_of_measurement', full_name='ListEntitiesSensorResponse.unit_of_measurement', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='accuracy_decimals', full_name='ListEntitiesSensorResponse.accuracy_decimals', index=6, + number=7, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1206, + serialized_end=1369, +) + + +_LISTENTITIESSWITCHRESPONSE = _descriptor.Descriptor( + name='ListEntitiesSwitchResponse', + full_name='ListEntitiesSwitchResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesSwitchResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesSwitchResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesSwitchResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesSwitchResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='icon', full_name='ListEntitiesSwitchResponse.icon', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1371, + serialized_end=1478, +) + + +_LISTENTITIESTEXTSENSORRESPONSE = _descriptor.Descriptor( + name='ListEntitiesTextSensorResponse', + full_name='ListEntitiesTextSensorResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='object_id', full_name='ListEntitiesTextSensorResponse.object_id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='ListEntitiesTextSensorResponse.key', index=1, + number=2, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='name', full_name='ListEntitiesTextSensorResponse.name', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_id', full_name='ListEntitiesTextSensorResponse.unique_id', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='icon', full_name='ListEntitiesTextSensorResponse.icon', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1480, + serialized_end=1591, +) + + +_LISTENTITIESDONERESPONSE = _descriptor.Descriptor( + name='ListEntitiesDoneResponse', + full_name='ListEntitiesDoneResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1593, + serialized_end=1619, +) + + +_SUBSCRIBESTATESREQUEST = _descriptor.Descriptor( + name='SubscribeStatesRequest', + full_name='SubscribeStatesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1621, + serialized_end=1645, +) + + +_BINARYSENSORSTATERESPONSE = _descriptor.Descriptor( + name='BinarySensorStateResponse', + full_name='BinarySensorStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='BinarySensorStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='BinarySensorStateResponse.state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1647, + serialized_end=1702, +) + + +_COVERSTATERESPONSE = _descriptor.Descriptor( + name='CoverStateResponse', + full_name='CoverStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='CoverStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='CoverStateResponse.state', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _COVERSTATERESPONSE_COVERSTATE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1704, + serialized_end=1820, +) + + +_FANSTATERESPONSE = _descriptor.Descriptor( + name='FanStateResponse', + full_name='FanStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='FanStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='FanStateResponse.state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='oscillating', full_name='FanStateResponse.oscillating', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='speed', full_name='FanStateResponse.speed', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1822, + serialized_end=1915, +) + + +_LIGHTSTATERESPONSE = _descriptor.Descriptor( + name='LightStateResponse', + full_name='LightStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='LightStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='LightStateResponse.state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='brightness', full_name='LightStateResponse.brightness', index=2, + number=3, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='red', full_name='LightStateResponse.red', index=3, + number=4, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='green', full_name='LightStateResponse.green', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='blue', full_name='LightStateResponse.blue', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='white', full_name='LightStateResponse.white', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='color_temperature', full_name='LightStateResponse.color_temperature', index=7, + number=8, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='effect', full_name='LightStateResponse.effect', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1918, + serialized_end=2086, +) + + +_SENSORSTATERESPONSE = _descriptor.Descriptor( + name='SensorStateResponse', + full_name='SensorStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='SensorStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='SensorStateResponse.state', index=1, + number=2, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2088, + serialized_end=2137, +) + + +_SWITCHSTATERESPONSE = _descriptor.Descriptor( + name='SwitchStateResponse', + full_name='SwitchStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='SwitchStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='SwitchStateResponse.state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2139, + serialized_end=2188, +) + + +_TEXTSENSORSTATERESPONSE = _descriptor.Descriptor( + name='TextSensorStateResponse', + full_name='TextSensorStateResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='TextSensorStateResponse.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='TextSensorStateResponse.state', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2190, + serialized_end=2243, +) + + +_COVERCOMMANDREQUEST = _descriptor.Descriptor( + name='CoverCommandRequest', + full_name='CoverCommandRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='CoverCommandRequest.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_state', full_name='CoverCommandRequest.has_state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='command', full_name='CoverCommandRequest.command', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _COVERCOMMANDREQUEST_COVERCOMMAND, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2246, + serialized_end=2398, +) + + +_FANCOMMANDREQUEST = _descriptor.Descriptor( + name='FanCommandRequest', + full_name='FanCommandRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='FanCommandRequest.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_state', full_name='FanCommandRequest.has_state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='FanCommandRequest.state', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_speed', full_name='FanCommandRequest.has_speed', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='speed', full_name='FanCommandRequest.speed', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_oscillating', full_name='FanCommandRequest.has_oscillating', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='oscillating', full_name='FanCommandRequest.oscillating', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2401, + serialized_end=2558, +) + + +_LIGHTCOMMANDREQUEST = _descriptor.Descriptor( + name='LightCommandRequest', + full_name='LightCommandRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='LightCommandRequest.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_state', full_name='LightCommandRequest.has_state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='LightCommandRequest.state', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_brightness', full_name='LightCommandRequest.has_brightness', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='brightness', full_name='LightCommandRequest.brightness', index=4, + number=5, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_rgb', full_name='LightCommandRequest.has_rgb', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='red', full_name='LightCommandRequest.red', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='green', full_name='LightCommandRequest.green', index=7, + number=8, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='blue', full_name='LightCommandRequest.blue', index=8, + number=9, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_white', full_name='LightCommandRequest.has_white', index=9, + number=10, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='white', full_name='LightCommandRequest.white', index=10, + number=11, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_color_temperature', full_name='LightCommandRequest.has_color_temperature', index=11, + number=12, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='color_temperature', full_name='LightCommandRequest.color_temperature', index=12, + number=13, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_transition_length', full_name='LightCommandRequest.has_transition_length', index=13, + number=14, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='transition_length', full_name='LightCommandRequest.transition_length', index=14, + number=15, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_flash_length', full_name='LightCommandRequest.has_flash_length', index=15, + number=16, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='flash_length', full_name='LightCommandRequest.flash_length', index=16, + number=17, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='has_effect', full_name='LightCommandRequest.has_effect', index=17, + number=18, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='effect', full_name='LightCommandRequest.effect', index=18, + number=19, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2561, + serialized_end=2966, +) + + +_SWITCHCOMMANDREQUEST = _descriptor.Descriptor( + name='SwitchCommandRequest', + full_name='SwitchCommandRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='SwitchCommandRequest.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='state', full_name='SwitchCommandRequest.state', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2968, + serialized_end=3018, +) + + +_SUBSCRIBELOGSREQUEST = _descriptor.Descriptor( + name='SubscribeLogsRequest', + full_name='SubscribeLogsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='level', full_name='SubscribeLogsRequest.level', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3020, + serialized_end=3068, +) + + +_SUBSCRIBELOGSRESPONSE = _descriptor.Descriptor( + name='SubscribeLogsResponse', + full_name='SubscribeLogsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='level', full_name='SubscribeLogsResponse.level', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='tag', full_name='SubscribeLogsResponse.tag', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='message', full_name='SubscribeLogsResponse.message', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3070, + serialized_end=3149, +) + +_COVERSTATERESPONSE.fields_by_name['state'].enum_type = _COVERSTATERESPONSE_COVERSTATE +_COVERSTATERESPONSE_COVERSTATE.containing_type = _COVERSTATERESPONSE +_FANSTATERESPONSE.fields_by_name['speed'].enum_type = _FANSPEED +_COVERCOMMANDREQUEST.fields_by_name['command'].enum_type = _COVERCOMMANDREQUEST_COVERCOMMAND +_COVERCOMMANDREQUEST_COVERCOMMAND.containing_type = _COVERCOMMANDREQUEST +_FANCOMMANDREQUEST.fields_by_name['speed'].enum_type = _FANSPEED +_SUBSCRIBELOGSREQUEST.fields_by_name['level'].enum_type = _LOGLEVEL +_SUBSCRIBELOGSRESPONSE.fields_by_name['level'].enum_type = _LOGLEVEL +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloResponse'] = _HELLORESPONSE +DESCRIPTOR.message_types_by_name['ConnectRequest'] = _CONNECTREQUEST +DESCRIPTOR.message_types_by_name['ConnectResponse'] = _CONNECTRESPONSE +DESCRIPTOR.message_types_by_name['DisconnectRequest'] = _DISCONNECTREQUEST +DESCRIPTOR.message_types_by_name['DisconnectResponse'] = _DISCONNECTRESPONSE +DESCRIPTOR.message_types_by_name['PingRequest'] = _PINGREQUEST +DESCRIPTOR.message_types_by_name['PingResponse'] = _PINGRESPONSE +DESCRIPTOR.message_types_by_name['DeviceInfoRequest'] = _DEVICEINFOREQUEST +DESCRIPTOR.message_types_by_name['DeviceInfoResponse'] = _DEVICEINFORESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesRequest'] = _LISTENTITIESREQUEST +DESCRIPTOR.message_types_by_name['ListEntitiesBinarySensorResponse'] = _LISTENTITIESBINARYSENSORRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesCoverResponse'] = _LISTENTITIESCOVERRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesFanResponse'] = _LISTENTITIESFANRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesLightResponse'] = _LISTENTITIESLIGHTRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesSensorResponse'] = _LISTENTITIESSENSORRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesSwitchResponse'] = _LISTENTITIESSWITCHRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesTextSensorResponse'] = _LISTENTITIESTEXTSENSORRESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesDoneResponse'] = _LISTENTITIESDONERESPONSE +DESCRIPTOR.message_types_by_name['SubscribeStatesRequest'] = _SUBSCRIBESTATESREQUEST +DESCRIPTOR.message_types_by_name['BinarySensorStateResponse'] = _BINARYSENSORSTATERESPONSE +DESCRIPTOR.message_types_by_name['CoverStateResponse'] = _COVERSTATERESPONSE +DESCRIPTOR.message_types_by_name['FanStateResponse'] = _FANSTATERESPONSE +DESCRIPTOR.message_types_by_name['LightStateResponse'] = _LIGHTSTATERESPONSE +DESCRIPTOR.message_types_by_name['SensorStateResponse'] = _SENSORSTATERESPONSE +DESCRIPTOR.message_types_by_name['SwitchStateResponse'] = _SWITCHSTATERESPONSE +DESCRIPTOR.message_types_by_name['TextSensorStateResponse'] = _TEXTSENSORSTATERESPONSE +DESCRIPTOR.message_types_by_name['CoverCommandRequest'] = _COVERCOMMANDREQUEST +DESCRIPTOR.message_types_by_name['FanCommandRequest'] = _FANCOMMANDREQUEST +DESCRIPTOR.message_types_by_name['LightCommandRequest'] = _LIGHTCOMMANDREQUEST +DESCRIPTOR.message_types_by_name['SwitchCommandRequest'] = _SWITCHCOMMANDREQUEST +DESCRIPTOR.message_types_by_name['SubscribeLogsRequest'] = _SUBSCRIBELOGSREQUEST +DESCRIPTOR.message_types_by_name['SubscribeLogsResponse'] = _SUBSCRIBELOGSRESPONSE +DESCRIPTOR.enum_types_by_name['FanSpeed'] = _FANSPEED +DESCRIPTOR.enum_types_by_name['LogLevel'] = _LOGLEVEL +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloResponse = _reflection.GeneratedProtocolMessageType('HelloResponse', (_message.Message,), dict( + DESCRIPTOR = _HELLORESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:HelloResponse) + )) +_sym_db.RegisterMessage(HelloResponse) + +ConnectRequest = _reflection.GeneratedProtocolMessageType('ConnectRequest', (_message.Message,), dict( + DESCRIPTOR = _CONNECTREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ConnectRequest) + )) +_sym_db.RegisterMessage(ConnectRequest) + +ConnectResponse = _reflection.GeneratedProtocolMessageType('ConnectResponse', (_message.Message,), dict( + DESCRIPTOR = _CONNECTRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ConnectResponse) + )) +_sym_db.RegisterMessage(ConnectResponse) + +DisconnectRequest = _reflection.GeneratedProtocolMessageType('DisconnectRequest', (_message.Message,), dict( + DESCRIPTOR = _DISCONNECTREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:DisconnectRequest) + )) +_sym_db.RegisterMessage(DisconnectRequest) + +DisconnectResponse = _reflection.GeneratedProtocolMessageType('DisconnectResponse', (_message.Message,), dict( + DESCRIPTOR = _DISCONNECTRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:DisconnectResponse) + )) +_sym_db.RegisterMessage(DisconnectResponse) + +PingRequest = _reflection.GeneratedProtocolMessageType('PingRequest', (_message.Message,), dict( + DESCRIPTOR = _PINGREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:PingRequest) + )) +_sym_db.RegisterMessage(PingRequest) + +PingResponse = _reflection.GeneratedProtocolMessageType('PingResponse', (_message.Message,), dict( + DESCRIPTOR = _PINGRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:PingResponse) + )) +_sym_db.RegisterMessage(PingResponse) + +DeviceInfoRequest = _reflection.GeneratedProtocolMessageType('DeviceInfoRequest', (_message.Message,), dict( + DESCRIPTOR = _DEVICEINFOREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:DeviceInfoRequest) + )) +_sym_db.RegisterMessage(DeviceInfoRequest) + +DeviceInfoResponse = _reflection.GeneratedProtocolMessageType('DeviceInfoResponse', (_message.Message,), dict( + DESCRIPTOR = _DEVICEINFORESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:DeviceInfoResponse) + )) +_sym_db.RegisterMessage(DeviceInfoResponse) + +ListEntitiesRequest = _reflection.GeneratedProtocolMessageType('ListEntitiesRequest', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesRequest) + )) +_sym_db.RegisterMessage(ListEntitiesRequest) + +ListEntitiesBinarySensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesBinarySensorResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESBINARYSENSORRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesBinarySensorResponse) + )) +_sym_db.RegisterMessage(ListEntitiesBinarySensorResponse) + +ListEntitiesCoverResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCoverResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESCOVERRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesCoverResponse) + )) +_sym_db.RegisterMessage(ListEntitiesCoverResponse) + +ListEntitiesFanResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesFanResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESFANRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesFanResponse) + )) +_sym_db.RegisterMessage(ListEntitiesFanResponse) + +ListEntitiesLightResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesLightResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESLIGHTRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesLightResponse) + )) +_sym_db.RegisterMessage(ListEntitiesLightResponse) + +ListEntitiesSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSensorResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESSENSORRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesSensorResponse) + )) +_sym_db.RegisterMessage(ListEntitiesSensorResponse) + +ListEntitiesSwitchResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSwitchResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESSWITCHRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesSwitchResponse) + )) +_sym_db.RegisterMessage(ListEntitiesSwitchResponse) + +ListEntitiesTextSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesTextSensorResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESTEXTSENSORRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesTextSensorResponse) + )) +_sym_db.RegisterMessage(ListEntitiesTextSensorResponse) + +ListEntitiesDoneResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesDoneResponse', (_message.Message,), dict( + DESCRIPTOR = _LISTENTITIESDONERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:ListEntitiesDoneResponse) + )) +_sym_db.RegisterMessage(ListEntitiesDoneResponse) + +SubscribeStatesRequest = _reflection.GeneratedProtocolMessageType('SubscribeStatesRequest', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIBESTATESREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SubscribeStatesRequest) + )) +_sym_db.RegisterMessage(SubscribeStatesRequest) + +BinarySensorStateResponse = _reflection.GeneratedProtocolMessageType('BinarySensorStateResponse', (_message.Message,), dict( + DESCRIPTOR = _BINARYSENSORSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:BinarySensorStateResponse) + )) +_sym_db.RegisterMessage(BinarySensorStateResponse) + +CoverStateResponse = _reflection.GeneratedProtocolMessageType('CoverStateResponse', (_message.Message,), dict( + DESCRIPTOR = _COVERSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:CoverStateResponse) + )) +_sym_db.RegisterMessage(CoverStateResponse) + +FanStateResponse = _reflection.GeneratedProtocolMessageType('FanStateResponse', (_message.Message,), dict( + DESCRIPTOR = _FANSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:FanStateResponse) + )) +_sym_db.RegisterMessage(FanStateResponse) + +LightStateResponse = _reflection.GeneratedProtocolMessageType('LightStateResponse', (_message.Message,), dict( + DESCRIPTOR = _LIGHTSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:LightStateResponse) + )) +_sym_db.RegisterMessage(LightStateResponse) + +SensorStateResponse = _reflection.GeneratedProtocolMessageType('SensorStateResponse', (_message.Message,), dict( + DESCRIPTOR = _SENSORSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SensorStateResponse) + )) +_sym_db.RegisterMessage(SensorStateResponse) + +SwitchStateResponse = _reflection.GeneratedProtocolMessageType('SwitchStateResponse', (_message.Message,), dict( + DESCRIPTOR = _SWITCHSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SwitchStateResponse) + )) +_sym_db.RegisterMessage(SwitchStateResponse) + +TextSensorStateResponse = _reflection.GeneratedProtocolMessageType('TextSensorStateResponse', (_message.Message,), dict( + DESCRIPTOR = _TEXTSENSORSTATERESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:TextSensorStateResponse) + )) +_sym_db.RegisterMessage(TextSensorStateResponse) + +CoverCommandRequest = _reflection.GeneratedProtocolMessageType('CoverCommandRequest', (_message.Message,), dict( + DESCRIPTOR = _COVERCOMMANDREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:CoverCommandRequest) + )) +_sym_db.RegisterMessage(CoverCommandRequest) + +FanCommandRequest = _reflection.GeneratedProtocolMessageType('FanCommandRequest', (_message.Message,), dict( + DESCRIPTOR = _FANCOMMANDREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:FanCommandRequest) + )) +_sym_db.RegisterMessage(FanCommandRequest) + +LightCommandRequest = _reflection.GeneratedProtocolMessageType('LightCommandRequest', (_message.Message,), dict( + DESCRIPTOR = _LIGHTCOMMANDREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:LightCommandRequest) + )) +_sym_db.RegisterMessage(LightCommandRequest) + +SwitchCommandRequest = _reflection.GeneratedProtocolMessageType('SwitchCommandRequest', (_message.Message,), dict( + DESCRIPTOR = _SWITCHCOMMANDREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SwitchCommandRequest) + )) +_sym_db.RegisterMessage(SwitchCommandRequest) + +SubscribeLogsRequest = _reflection.GeneratedProtocolMessageType('SubscribeLogsRequest', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIBELOGSREQUEST, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SubscribeLogsRequest) + )) +_sym_db.RegisterMessage(SubscribeLogsRequest) + +SubscribeLogsResponse = _reflection.GeneratedProtocolMessageType('SubscribeLogsResponse', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIBELOGSRESPONSE, + __module__ = 'api_pb2' + # @@protoc_insertion_point(class_scope:SubscribeLogsResponse) + )) +_sym_db.RegisterMessage(SubscribeLogsResponse) + + +# @@protoc_insertion_point(module_scope) diff --git a/aioesphomeapi/client.py b/aioesphomeapi/client.py new file mode 100644 index 0000000..10ce8f7 --- /dev/null +++ b/aioesphomeapi/client.py @@ -0,0 +1,722 @@ +import asyncio +import logging +import socket +from typing import Any, Callable, List, Optional, Tuple, Union, cast + +import attr +from google.protobuf import message + +import aioesphomeapi.api_pb2 as pb + +_LOGGER = logging.getLogger(__name__) + + +class APIConnectionError(Exception): + pass + + +MESSAGE_TYPE_TO_PROTO = { + 1: pb.HelloRequest, + 2: pb.HelloResponse, + 3: pb.ConnectRequest, + 4: pb.ConnectResponse, + 5: pb.DisconnectRequest, + 6: pb.DisconnectResponse, + 7: pb.PingRequest, + 8: pb.PingResponse, + 9: pb.DeviceInfoRequest, + 10: pb.DeviceInfoResponse, + 11: pb.ListEntitiesRequest, + 12: pb.ListEntitiesBinarySensorResponse, + 13: pb.ListEntitiesCoverResponse, + 14: pb.ListEntitiesFanResponse, + 15: pb.ListEntitiesLightResponse, + 16: pb.ListEntitiesSensorResponse, + 17: pb.ListEntitiesSwitchResponse, + 18: pb.ListEntitiesTextSensorResponse, + 19: pb.ListEntitiesDoneResponse, + 20: pb.SubscribeStatesRequest, + 21: pb.BinarySensorStateResponse, + 22: pb.CoverStateResponse, + 23: pb.FanStateResponse, + 24: pb.LightStateResponse, + 25: pb.SensorStateResponse, + 26: pb.SwitchStateResponse, + 27: pb.TextSensorStateResponse, + 28: pb.SubscribeLogsRequest, + 29: pb.SubscribeLogsResponse, + 30: pb.CoverCommandRequest, + 31: pb.FanCommandRequest, + 32: pb.LightCommandRequest, + 33: pb.SwitchCommandRequest, +} + + +def _varuint_to_bytes(value: int) -> bytes: + if value <= 0x7F: + return bytes([value]) + + ret = bytes() + while value: + temp = value & 0x7F + value >>= 7 + if value: + ret += bytes([temp | 0x80]) + else: + ret += bytes([temp]) + + return ret + + +def _bytes_to_varuint(value: bytes) -> Optional[int]: + result = 0 + bitpos = 0 + for val in value: + result |= (val & 0x7F) << bitpos + bitpos += 7 + if (val & 0x80) == 0: + return result + return None + + +async def resolve_ip_address(eventloop: asyncio.events.AbstractEventLoop, + host: str, port: int) -> Tuple[Any, ...]: + try: + res = await eventloop.getaddrinfo(host, port, family=socket.AF_INET, + proto=socket.IPPROTO_TCP) + except OSError as err: + raise APIConnectionError("Error resolving IP address: {}".format(err)) + + if not res: + raise APIConnectionError("Error resolving IP address: No matches!") + + _, _, _, _, sockaddr = res[0] + + return sockaddr + + +# Wrap some types in attr classes to make them serializable +@attr.s +class DeviceInfo: + uses_password = attr.ib(type=bool) + name = attr.ib(type=str) + mac_address = attr.ib(type=str) + esphomelib_version = attr.ib(type=str) + compilation_time = attr.ib(type=str) + model = attr.ib(type=str) + has_deep_sleep = attr.ib(type=bool) + + +@attr.s +class EntityInfo: + object_id = attr.ib(type=str) + key = attr.ib(type=int) + name = attr.ib(type=str) + unique_id = attr.ib(type=str) + + +@attr.s +class EntityState: + key = attr.ib(type=int) + + +@attr.s +class BinarySensorInfo(EntityInfo): + device_class = attr.ib(type=str) + is_status_binary_sensor = attr.ib(type=bool) + + +@attr.s +class BinarySensorState(EntityState): + state = attr.ib(type=bool) + + +@attr.s +class CoverInfo(EntityInfo): + is_optimistic = attr.ib(type=bool) + + +COVER_STATE_OPEN = 0 +COVER_SATE_CLOSED = 1 +COVER_STATES = [COVER_STATE_OPEN, COVER_SATE_CLOSED] + +COVER_COMMAND_OPEN = 0 +COVER_COMMAND_CLOSE = 1 +COVER_COMMAND_STOP = 2 +COVER_COMMANDS = [COVER_COMMAND_OPEN, COVER_COMMAND_CLOSE, COVER_COMMAND_STOP] + + +@attr.s +class CoverState(EntityState): + state = attr.ib(type=int, converter=int, + validator=attr.validators.in_(COVER_STATES)) + + +@attr.s +class FanInfo(EntityInfo): + supports_oscillation = attr.ib(type=bool) + supports_speed = attr.ib(type=bool) + + +FAN_SPEED_LOW = 0 +FAN_SPEED_MEDIUM = 1 +FAN_SPEED_HIGH = 2 +FAN_SPEEDS = [FAN_SPEED_LOW, FAN_SPEED_MEDIUM, FAN_SPEED_HIGH] + + +@attr.s +class FanState(EntityState): + state = attr.ib(type=bool) + oscillating = attr.ib(type=bool) + speed = attr.ib(type=int, converter=int, + validator=attr.validators.in_(FAN_SPEEDS)) + + +@attr.s +class LightInfo(EntityInfo): + supports_brightness = attr.ib(type=bool) + supports_rgb = attr.ib(type=bool) + supports_white_value = attr.ib(type=bool) + supports_color_temperature = attr.ib(type=bool) + min_mireds = attr.ib(type=float) + max_mireds = attr.ib(type=float) + effects = attr.ib(type=List[str], converter=list) + + +@attr.s +class LightState(EntityState): + state = attr.ib(type=bool) + brightness = attr.ib(type=float) + red = attr.ib(type=float) + green = attr.ib(type=float) + blue = attr.ib(type=float) + white = attr.ib(type=float) + color_temperature = attr.ib(type=float) + effect = attr.ib(type=str) + + +@attr.s +class SensorInfo(EntityInfo): + icon = attr.ib(type=str) + unit_of_measurement = attr.ib(type=str) + accuracy_decimals = attr.ib(type=int) + + +@attr.s +class SensorState(EntityState): + state = attr.ib(type=float) + + +@attr.s +class SwitchInfo(EntityInfo): + icon = attr.ib(type=str) + + +@attr.s +class SwitchState(EntityState): + state = attr.ib(type=bool) + + +@attr.s +class TextSensorInfo(EntityInfo): + icon = attr.ib(type=str) + + +@attr.s +class TextSensorState(EntityState): + state = attr.ib(type=str) + + +COMPONENT_TYPE_TO_INFO = { + 'binary_sensor': BinarySensorInfo, + 'cover': CoverInfo, + 'fan': FanInfo, + 'light': LightInfo, + 'sensor': SensorInfo, + 'switch': SwitchInfo, + 'text_sensor': TextSensorInfo, +} + + +class APIClient: + def __init__(self, eventloop, address: str, port: int, password: str): + self._eventloop = eventloop # type: asyncio.events.AbstractEventLoop + self._address = address # type: str + self._port = port # type: int + self._password = password # type: Optional[str] + self._socket = None # type: Optional[socket.socket] + self._connected = False # type: bool + self._authenticated = False # type: bool + self._message_handlers = [] # type: List[Callable[[message], None]] + self._keepalive = 60 # type: Union[float, int] + self._ping_timer = None # type: Optional[asyncio.Future] + self.on_disconnect = None + self.on_login = None + self.running_event = asyncio.Event() + self._stop_event = asyncio.Event() + self._socket_open_event = asyncio.Event() + self._sock_reader = None # type: Optional[asyncio.StreamReader] + self._sock_writer = None # type: Optional[asyncio.StreamWriter] + + self._refresh_ping() + + def _refresh_ping(self) -> None: + if self._ping_timer is not None: + self._ping_timer.cancel() + self._ping_timer = None + + async def func() -> None: + await asyncio.sleep(self._keepalive) + self._ping_timer = None + + if self._connected: + try: + await self.ping() + except APIConnectionError: + await self._on_error() + + self._refresh_ping() + + self._ping_timer = asyncio.ensure_future(func(), loop=self._eventloop) + + async def _close_socket(self) -> None: + if self._socket is not None: + self._socket.close() + self._socket = None + if self._sock_writer is not None: + self._sock_writer.close() + if hasattr(self._sock_writer, 'wait_closed'): + await self._sock_writer.wait_closed() + self._sock_writer = None + self._sock_reader = None + self._socket_open_event.clear() + self._connected = False + self._authenticated = False + + def _cancel_ping(self) -> None: + if self._ping_timer is not None: + self._ping_timer.cancel() + self._ping_timer = None + + async def start(self): + self._eventloop.create_task(self.run_forever()) + await self.running_event.wait() + + async def stop(self, force: bool = False) -> None: + if not self.running_event.is_set(): + raise ValueError + + if self._connected and not force: + try: + await self.disconnect() + except APIConnectionError: + pass + await self._close_socket() + + self._stop_event.set() + self._cancel_ping() + + async def connect(self) -> None: + if not self.running_event.is_set(): + raise APIConnectionError("You need to call start() first!") + + if self._connected: + raise APIConnectionError("Already connected!") + + self._message_handlers = [] + + try: + coro = resolve_ip_address(self._eventloop, self._address, self._port) + sockaddr = await asyncio.wait_for(coro, 15.0) + except APIConnectionError as err: + raise err + except asyncio.TimeoutError: + raise APIConnectionError("Timeout while resolving IP address") + + self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._socket.setblocking(False) + self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + _LOGGER.debug("Connecting to %s:%s (%s)", self._address, self._port, sockaddr) + try: + coro = self._eventloop.sock_connect(self._socket, sockaddr) + await asyncio.wait_for(coro, 15.0) + except OSError as err: + await self._on_error() + raise APIConnectionError("Error connecting to {}: {}".format(sockaddr, err)) + except asyncio.TimeoutError: + raise APIConnectionError("Timeout while connecting to {}".format(sockaddr)) + + self._sock_reader, self._sock_writer = await asyncio.open_connection(sock=self._socket) + + self._socket_open_event.set() + + hello = pb.HelloRequest() + hello.client_info = 'Home Assistant' + try: + resp = await self._send_message_await_response(hello, pb.HelloResponse) + except APIConnectionError as err: + await self._on_error() + raise err + _LOGGER.debug("Successfully connected to %s ('%s' API=%s.%s)", self._address, + resp.server_info, resp.api_version_major, resp.api_version_minor) + self._connected = True + + def _check_connected(self) -> None: + if not self._connected: + raise APIConnectionError("Must be connected!") + + async def login(self) -> None: + self._check_connected() + if self._authenticated: + raise APIConnectionError("Already logged in!") + + connect = pb.ConnectRequest() + if self._password is not None: + connect.password = self._password + resp = await self._send_message_await_response(connect, pb.ConnectResponse) + if resp.invalid_password: + raise APIConnectionError("Invalid password!") + + self._authenticated = True + if self.on_login is not None: + await self.on_login() + + async def _on_error(self) -> None: + was_connected = self._connected + + await self._close_socket() + + if was_connected and self.on_disconnect is not None: + await self.on_disconnect() + + async def _write(self, data: bytes) -> None: + _LOGGER.debug("Write: %s", ' '.join('{:02X}'.format(x) for x in data)) + try: + self._sock_writer.write(data) + await self._sock_writer.drain() + except OSError as err: + await self._on_error() + raise APIConnectionError("Error while writing data: {}".format(err)) + + async def _send_message(self, msg: message.Message) -> None: + for message_type, klass in MESSAGE_TYPE_TO_PROTO.items(): + if isinstance(msg, klass): + break + else: + raise ValueError + + encoded = msg.SerializeToString() + _LOGGER.debug("Sending %s: %s", type(msg), str(msg)) + req = bytes([0]) + req += _varuint_to_bytes(len(encoded)) + req += _varuint_to_bytes(message_type) + req += encoded + await self._write(req) + self._refresh_ping() + + async def _send_message_await_response_complex(self, send_msg: message.Message, + do_append: Callable[[Any], bool], + do_stop: Callable[[Any], bool], + timeout: float = 1.0) -> List[Any]: + fut = self._eventloop.create_future() + responses = [] + + def on_message(resp): + if do_append(resp): + responses.append(resp) + if do_stop(resp): + fut.set_result(responses) + + self._message_handlers.append(on_message) + await self._send_message(send_msg) + + try: + await asyncio.wait_for(fut, timeout) + except asyncio.TimeoutError: + raise APIConnectionError("Timeout while waiting for API response!") + + try: + self._message_handlers.remove(on_message) + except ValueError: + pass + + return responses + + async def _send_message_await_response(self, + send_msg: message.Message, + response_type: Any, timeout: float = 1.0) -> Any: + def is_response(msg): + return isinstance(msg, response_type) + + res = await self._send_message_await_response_complex( + send_msg, is_response, is_response, timeout=timeout) + if len(res) != 1: + raise APIConnectionError("Expected one result, got {}".format(len(res))) + + return res[0] + + async def device_info(self) -> DeviceInfo: + self._check_connected() + resp = await self._send_message_await_response( + pb.DeviceInfoRequest(), pb.DeviceInfoResponse) + return DeviceInfo( + uses_password=resp.uses_password, + name=resp.name, + mac_address=resp.mac_address, + esphomelib_version=resp.esphomelib_version, + compilation_time=resp.compilation_time, + model=resp.model, + has_deep_sleep=resp.has_deep_sleep, + ) + + async def ping(self) -> None: + self._check_connected() + await self._send_message_await_response(pb.PingRequest(), pb.PingResponse) + return + + async def disconnect(self) -> None: + self._check_connected() + + try: + await self._send_message_await_response(pb.DisconnectRequest(), pb.DisconnectResponse) + except APIConnectionError: + pass + await self._close_socket() + + if self.on_disconnect is not None: + await self.on_disconnect() + + def _check_authenticated(self) -> None: + if not self._authenticated: + raise APIConnectionError("Must login first!") + + async def list_entities(self) -> List[Any]: + self._check_authenticated() + response_types = { + pb.ListEntitiesBinarySensorResponse: BinarySensorInfo, + pb.ListEntitiesCoverResponse: CoverInfo, + pb.ListEntitiesFanResponse: FanInfo, + pb.ListEntitiesLightResponse: LightInfo, + pb.ListEntitiesSensorResponse: SensorInfo, + pb.ListEntitiesSwitchResponse: SwitchInfo, + pb.ListEntitiesTextSensorResponse: TextSensorInfo, + } + + def do_append(msg): + return isinstance(msg, tuple(response_types.keys())) + + def do_stop(msg): + return isinstance(msg, pb.ListEntitiesDoneResponse) + + resp = await self._send_message_await_response_complex( + pb.ListEntitiesRequest(), do_append, do_stop, timeout=5) + entities = [] + for msg in resp: + cls = None + for resp_type, cls in response_types.items(): + if isinstance(msg, resp_type): + break + kwargs = {} + for key, _ in attr.fields_dict(cls).items(): + kwargs[key] = getattr(msg, key) + entities.append(cls(**kwargs)) + return entities + + async def subscribe_states(self, on_state: Callable[[Any], None]) -> None: + self._check_authenticated() + + response_types = { + pb.BinarySensorStateResponse: BinarySensorState, + pb.CoverStateResponse: CoverState, + pb.FanStateResponse: FanState, + pb.LightStateResponse: LightState, + pb.SensorStateResponse: SensorState, + pb.SwitchStateResponse: SwitchState, + pb.TextSensorStateResponse: TextSensorState, + } + + def on_msg(msg): + for resp_type, cls in response_types.items(): + if isinstance(msg, resp_type): + break + else: + return + + kwargs = {} + for key, _ in attr.fields_dict(cls).items(): + kwargs[key] = getattr(msg, key) + on_state(cls(**kwargs)) + + self._message_handlers.append(on_msg) + await self._send_message(pb.SubscribeStatesRequest()) + + async def subscribe_logs(self, on_log: Callable[[pb.SubscribeLogsResponse], None], + log_level=None) -> None: + self._check_authenticated() + + def on_msg(msg): + if isinstance(msg, pb.SubscribeLogsResponse): + on_log(msg) + + self._message_handlers.append(on_msg) + req = pb.SubscribeLogsRequest() + if log_level is not None: + req.level = log_level + await self._send_message(req) + + async def cover_command(self, + key: int, + command: int + ) -> None: + self._check_authenticated() + + req = pb.CoverCommandRequest() + req.key = key + req.has_state = True + if command not in COVER_COMMANDS: + raise ValueError + req.command = command + await self._send_message(req) + + async def fan_command(self, + key: int, + state: Optional[bool] = None, + speed: Optional[int] = None, + oscillating: Optional[bool] = None + ) -> None: + self._check_authenticated() + + req = pb.FanCommandRequest() + req.key = key + if state is not None: + req.has_state = True + req.state = state + if speed is not None: + req.has_speed = True + if speed not in FAN_SPEEDS: + raise ValueError + req.speed = speed + if oscillating is not None: + req.has_oscillating = True + req.oscillating = oscillating + await self._send_message(req) + + async def light_command(self, + key: int, + state: Optional[bool] = None, + brightness: Optional[float] = None, + rgb: Optional[Tuple[float, float, float]] = None, + white: Optional[float] = None, + color_temperature: Optional[float] = None, + transition_length: Optional[float] = None, + flash_length: Optional[float] = None, + effect: Optional[str] = None, + ): + self._check_authenticated() + + req = pb.LightCommandRequest() + req.key = key + if state is not None: + req.has_state = True + req.state = state + if brightness is not None: + req.has_brightness = True + req.brightness = brightness + if rgb is not None: + req.has_rgb = True + req.red = rgb[0] + req.green = rgb[1] + req.blue = rgb[2] + if white is not None: + req.has_white = True + req.white = white + if color_temperature is not None: + req.has_color_temperature = True + req.color_temperature = color_temperature + if transition_length is not None: + req.has_transition_length = True + req.transition_length = int(round(transition_length / 1000)) + if flash_length is not None: + req.has_flash_length = True + req.flash_length = int(round(flash_length / 1000)) + if effect is not None: + req.has_effect = True + req.effect = effect + await self._send_message(req) + + async def switch_command(self, + key: int, + state: bool + ) -> None: + self._check_authenticated() + + req = pb.SwitchCommandRequest() + req.key = key + req.state = state + await self._send_message(req) + + async def _recv(self, amount: int) -> bytes: + if amount == 0: + return bytes() + + try: + ret = await self._sock_reader.readexactly(amount) + except (asyncio.IncompleteReadError, OSError) as err: + raise APIConnectionError("Error while receiving data: {}".format(err)) + + return ret + + async def _recv_varint(self) -> int: + raw = bytes() + while not raw or raw[-1] & 0x80: + raw += await self._recv(1) + return cast(int, _bytes_to_varuint(raw)) + + async def _run_once(self) -> None: + await self._socket_open_event.wait() + + preamble = await self._recv(1) + if preamble[0] != 0x00: + raise APIConnectionError("Invalid preamble") + + length = await self._recv_varint() + msg_type = await self._recv_varint() + + raw_msg = await self._recv(length) + if msg_type not in MESSAGE_TYPE_TO_PROTO: + _LOGGER.debug("Skipping message type %s", msg_type) + return + + msg = MESSAGE_TYPE_TO_PROTO[msg_type]() + msg.ParseFromString(raw_msg) + _LOGGER.debug("Got message of type %s: %s", type(msg), msg) + for msg_handler in self._message_handlers[:]: + msg_handler(msg) + await self._handle_internal_messages(msg) + self._refresh_ping() + + async def run_forever(self) -> None: + if self.running_event.is_set(): + raise ValueError + self.running_event.set() + try: + while True: + try: + await self._run_once() + except APIConnectionError as err: + if self._connected: + _LOGGER.debug("Error while reading incoming messages: %s", err) + await self._on_error() + except asyncio.CancelledError: + self.running_event.clear() + raise + + async def _handle_internal_messages(self, msg: Any) -> None: + if isinstance(msg, pb.DisconnectRequest): + await self._send_message(pb.DisconnectResponse()) + await self._close_socket() + if self.on_disconnect is not None: + await self.on_disconnect() + elif isinstance(msg, pb.PingRequest): + await self._send_message(pb.PingResponse()) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..637c747 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +protobuf +attrs diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..a736e4e --- /dev/null +++ b/setup.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""aioesphomeapi setup script.""" +from setuptools import find_packages, setup + +VERSION = '1.0.0' +PROJECT_NAME = 'aioesphomeapi' +PROJECT_PACKAGE_NAME = 'aioesphomeapi' +PROJECT_LICENSE = 'MIT' +PROJECT_AUTHOR = 'Otto Winter' +PROJECT_COPYRIGHT = ' 2018, Otto Winter' +PROJECT_URL = 'https://esphomelib.com/esphomeyaml/' +PROJECT_EMAIL = 'contact@otto-winter.com' + +PROJECT_GITHUB_USERNAME = 'OttoWinter' +PROJECT_GITHUB_REPOSITORY = 'aioesphomelibpy3haapiclient' + +PYPI_URL = 'https://pypi.python.org/pypi/{}'.format(PROJECT_PACKAGE_NAME) +GITHUB_PATH = '{}/{}'.format(PROJECT_GITHUB_USERNAME, PROJECT_GITHUB_REPOSITORY) +GITHUB_URL = 'https://github.com/{}'.format(GITHUB_PATH) + +DOWNLOAD_URL = '{}/archive/{}.zip'.format(GITHUB_URL, VERSION) + +REQUIRES = [ + 'attrs', + 'protobuf', +] + +setup( + name=PROJECT_PACKAGE_NAME, + version=VERSION, + url=PROJECT_URL, + download_url=DOWNLOAD_URL, + author=PROJECT_AUTHOR, + author_email=PROJECT_EMAIL, + packages=find_packages(), + include_package_data=True, + zip_safe=False, + install_requires=REQUIRES, + python_requires='>=3.5.3', +)