From 52cf01e11a92f3aa4ecf0a83e845a0eb21057bea Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Fri, 18 Jun 2021 17:57:02 +0200 Subject: [PATCH] Add flake8, black, isort and mypy linting (#39) --- .github/workflows/ci.yml | 65 +- .github/workflows/matchers/flake8.json | 30 + .github/workflows/matchers/isort.json | 14 + .github/workflows/matchers/mypy.json | 16 + .github/workflows/matchers/pylint.json | 32 + .github/workflows/protoc-update.yml | 37 + aioesphomeapi/__init__.py | 7 +- aioesphomeapi/api_options_pb2.py | 42 +- aioesphomeapi/api_pb2.py | 1330 +++++++++++++----------- aioesphomeapi/client.py | 389 ++++--- aioesphomeapi/connection.py | 192 ++-- aioesphomeapi/core.py | 147 ++- aioesphomeapi/host_resolver.py | 56 +- aioesphomeapi/model.py | 193 ++-- aioesphomeapi/util.py | 41 +- gen-protoc.sh | 7 - pylintrc | 1 + pyproject.toml | 4 + requirements_test.txt | 5 + script/gen-protoc | 26 + script/lint | 10 + setup.cfg | 18 + 22 files changed, 1677 insertions(+), 985 deletions(-) create mode 100644 .github/workflows/matchers/flake8.json create mode 100644 .github/workflows/matchers/isort.json create mode 100644 .github/workflows/matchers/mypy.json create mode 100644 .github/workflows/matchers/pylint.json create mode 100644 .github/workflows/protoc-update.yml delete mode 100755 gen-protoc.sh create mode 100644 pyproject.toml create mode 100755 script/gen-protoc create mode 100755 script/lint create mode 100644 setup.cfg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c8d8d0..fc377d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,5 +18,68 @@ jobs: run: | pip3 install -e . pip3 install -r requirements_test.txt - + - name: Register problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/pylint.json" - run: pylint aioesphomeapi + flake8: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Set up Python environment + run: | + pip3 install -e . + pip3 install -r requirements_test.txt + - name: Register problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/flake8.json" + - run: flake8 aioesphomeapi + black: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Set up Python environment + run: | + pip3 install -e . + pip3 install -r requirements_test.txt + - run: black --safe --exclude 'api_pb2.py|api_options_pb2.py' aioesphomeapi + isort: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Set up Python environment + run: | + pip3 install -e . + pip3 install -r requirements_test.txt + - name: Register problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/isort.json" + - run: isort --check aioesphomeapi + mypy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Set up Python environment + run: | + pip3 install -e . + pip3 install -r requirements_test.txt + - name: Register problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/mypy.json" + - run: mypy --strict aioesphomeapi diff --git a/.github/workflows/matchers/flake8.json b/.github/workflows/matchers/flake8.json new file mode 100644 index 0000000..e059a1c --- /dev/null +++ b/.github/workflows/matchers/flake8.json @@ -0,0 +1,30 @@ +{ + "problemMatcher": [ + { + "owner": "flake8-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.*):(\\d+):(\\d+):\\s([EF]\\d{3}\\s.*)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4 + } + ] + }, + { + "owner": "flake8-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.*):(\\d+):(\\d+):\\s([CDNW]\\d{3}\\s.*)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4 + } + ] + } + ] +} diff --git a/.github/workflows/matchers/isort.json b/.github/workflows/matchers/isort.json new file mode 100644 index 0000000..83802b7 --- /dev/null +++ b/.github/workflows/matchers/isort.json @@ -0,0 +1,14 @@ +{ + "problemMatcher": [ + { + "owner": "isort", + "pattern": [ + { + "regexp": "^ERROR:\\s+(.+)\\s+(.+)$", + "file": 1, + "message": 2 + } + ] + } + ] +} diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json new file mode 100644 index 0000000..f048fce --- /dev/null +++ b/.github/workflows/matchers/mypy.json @@ -0,0 +1,16 @@ +{ + "problemMatcher": [ + { + "owner": "mypy", + "pattern": [ + { + "regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + ] + } + ] +} diff --git a/.github/workflows/matchers/pylint.json b/.github/workflows/matchers/pylint.json new file mode 100644 index 0000000..5624ca6 --- /dev/null +++ b/.github/workflows/matchers/pylint.json @@ -0,0 +1,32 @@ +{ + "problemMatcher": [ + { + "owner": "pylint-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + }, + { + "owner": "pylint-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + } + ] +} diff --git a/.github/workflows/protoc-update.yml b/.github/workflows/protoc-update.yml new file mode 100644 index 0000000..b3300ba --- /dev/null +++ b/.github/workflows/protoc-update.yml @@ -0,0 +1,37 @@ +name: Update protobuf generated files + +on: + push: + branches: [master] + +jobs: + protoc-update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Install protoc + run: | + sudo apt-get install protobuf-compiler + - name: Set up Python environment + run: | + pip3 install -e . + pip3 install -r requirements_test.txt + + - name: Generate protoc + run: | + script/gen-protoc + # github actions email from here: https://github.community/t/github-actions-bot-email-address/17204 + - name: Commit changes + run: | + if git diff-index --quiet HEAD --; then + echo "No changes detected, protobuf files are up to date!" + else + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git commit -am "Update protobuf files" + git push + fi diff --git a/aioesphomeapi/__init__.py b/aioesphomeapi/__init__.py index b7b7cd3..94e6e50 100644 --- a/aioesphomeapi/__init__.py +++ b/aioesphomeapi/__init__.py @@ -1,5 +1,6 @@ +# flake8: noqa from .client import APIClient -from .connection import ConnectionParams, APIConnection -from .core import APIConnectionError, MESSAGE_TYPE_TO_PROTO +from .connection import APIConnection, ConnectionParams +from .core import MESSAGE_TYPE_TO_PROTO, APIConnectionError from .model import * -from .util import resolve_ip_address_getaddrinfo, resolve_ip_address +from .util import resolve_ip_address, resolve_ip_address_getaddrinfo diff --git a/aioesphomeapi/api_options_pb2.py b/aioesphomeapi/api_options_pb2.py index e690a2c..83b7fd6 100644 --- a/aioesphomeapi/api_options_pb2.py +++ b/aioesphomeapi/api_options_pb2.py @@ -1,8 +1,8 @@ +# type: ignore +# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: api_options.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 @@ -21,7 +21,8 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto2', serialized_options=None, - serialized_pb=_b('\n\x11\x61pi_options.proto\x1a google/protobuf/descriptor.proto\"\x06\n\x04void*F\n\rAPISourceType\x12\x0f\n\x0bSOURCE_BOTH\x10\x00\x12\x11\n\rSOURCE_SERVER\x10\x01\x12\x11\n\rSOURCE_CLIENT\x10\x02:E\n\x16needs_setup_connection\x12\x1e.google.protobuf.MethodOptions\x18\x8e\x08 \x01(\x08:\x04true:C\n\x14needs_authentication\x12\x1e.google.protobuf.MethodOptions\x18\x8f\x08 \x01(\x08:\x04true:/\n\x02id\x12\x1f.google.protobuf.MessageOptions\x18\x8c\x08 \x01(\r:\x01\x30:M\n\x06source\x12\x1f.google.protobuf.MessageOptions\x18\x8d\x08 \x01(\x0e\x32\x0e.APISourceType:\x0bSOURCE_BOTH:/\n\x05ifdef\x12\x1f.google.protobuf.MessageOptions\x18\x8e\x08 \x01(\t:3\n\x03log\x12\x1f.google.protobuf.MessageOptions\x18\x8f\x08 \x01(\x08:\x04true:9\n\x08no_delay\x12\x1f.google.protobuf.MessageOptions\x18\x90\x08 \x01(\x08:\x05\x66\x61lse') + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\x11\x61pi_options.proto\x1a google/protobuf/descriptor.proto\"\x06\n\x04void*F\n\rAPISourceType\x12\x0f\n\x0bSOURCE_BOTH\x10\x00\x12\x11\n\rSOURCE_SERVER\x10\x01\x12\x11\n\rSOURCE_CLIENT\x10\x02:E\n\x16needs_setup_connection\x12\x1e.google.protobuf.MethodOptions\x18\x8e\x08 \x01(\x08:\x04true:C\n\x14needs_authentication\x12\x1e.google.protobuf.MethodOptions\x18\x8f\x08 \x01(\x08:\x04true:/\n\x02id\x12\x1f.google.protobuf.MessageOptions\x18\x8c\x08 \x01(\r:\x01\x30:M\n\x06source\x12\x1f.google.protobuf.MessageOptions\x18\x8d\x08 \x01(\x0e\x32\x0e.APISourceType:\x0bSOURCE_BOTH:/\n\x05ifdef\x12\x1f.google.protobuf.MessageOptions\x18\x8e\x08 \x01(\t:3\n\x03log\x12\x1f.google.protobuf.MessageOptions\x18\x8f\x08 \x01(\x08:\x04true:9\n\x08no_delay\x12\x1f.google.protobuf.MessageOptions\x18\x90\x08 \x01(\x08:\x05\x66\x61lse' , dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,]) @@ -30,19 +31,23 @@ _APISOURCETYPE = _descriptor.EnumDescriptor( full_name='APISourceType', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='SOURCE_BOTH', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SOURCE_SERVER', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SOURCE_CLIENT', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -63,7 +68,7 @@ needs_setup_connection = _descriptor.FieldDescriptor( has_default_value=True, default_value=True, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) NEEDS_AUTHENTICATION_FIELD_NUMBER = 1039 needs_authentication = _descriptor.FieldDescriptor( name='needs_authentication', full_name='needs_authentication', index=1, @@ -71,7 +76,7 @@ needs_authentication = _descriptor.FieldDescriptor( has_default_value=True, default_value=True, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) ID_FIELD_NUMBER = 1036 id = _descriptor.FieldDescriptor( name='id', full_name='id', index=2, @@ -79,7 +84,7 @@ id = _descriptor.FieldDescriptor( has_default_value=True, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) SOURCE_FIELD_NUMBER = 1037 source = _descriptor.FieldDescriptor( name='source', full_name='source', index=3, @@ -87,15 +92,15 @@ source = _descriptor.FieldDescriptor( has_default_value=True, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) IFDEF_FIELD_NUMBER = 1038 ifdef = _descriptor.FieldDescriptor( name='ifdef', full_name='ifdef', index=4, number=1038, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) LOG_FIELD_NUMBER = 1039 log = _descriptor.FieldDescriptor( name='log', full_name='log', index=5, @@ -103,7 +108,7 @@ log = _descriptor.FieldDescriptor( has_default_value=True, default_value=True, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) NO_DELAY_FIELD_NUMBER = 1040 no_delay = _descriptor.FieldDescriptor( name='no_delay', full_name='no_delay', index=6, @@ -111,7 +116,7 @@ no_delay = _descriptor.FieldDescriptor( has_default_value=True, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR) + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key) _VOID = _descriptor.Descriptor( @@ -120,6 +125,7 @@ _VOID = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -148,11 +154,11 @@ DESCRIPTOR.extensions_by_name['log'] = log DESCRIPTOR.extensions_by_name['no_delay'] = no_delay _sym_db.RegisterFileDescriptor(DESCRIPTOR) -void = _reflection.GeneratedProtocolMessageType('void', (_message.Message,), dict( - DESCRIPTOR = _VOID, - __module__ = 'api_options_pb2' +void = _reflection.GeneratedProtocolMessageType('void', (_message.Message,), { + 'DESCRIPTOR' : _VOID, + '__module__' : 'api_options_pb2' # @@protoc_insertion_point(class_scope:void) - )) + }) _sym_db.RegisterMessage(void) google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(needs_setup_connection) diff --git a/aioesphomeapi/api_pb2.py b/aioesphomeapi/api_pb2.py index 81b5bac..c84b31c 100644 --- a/aioesphomeapi/api_pb2.py +++ b/aioesphomeapi/api_pb2.py @@ -1,8 +1,8 @@ +# type: ignore +# -*- coding: utf-8 -*- # 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 @@ -21,7 +21,8 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=None, - serialized_pb=_b('\n\tapi.proto\x1a\x11\x61pi_options.proto\".\n\x0cHelloRequest\x12\x13\n\x0b\x63lient_info\x18\x01 \x01(\t:\t\xe0@\x01\xe8@\x02\x80\x41\x01\"e\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:\t\xe0@\x02\xe8@\x01\x80\x41\x01\"-\n\x0e\x43onnectRequest\x12\x10\n\x08password\x18\x01 \x01(\t:\t\xe0@\x03\xe8@\x02\x80\x41\x01\"6\n\x0f\x43onnectResponse\x12\x18\n\x10invalid_password\x18\x01 \x01(\x08:\t\xe0@\x04\xe8@\x01\x80\x41\x01\"\x1e\n\x11\x44isconnectRequest:\t\xe0@\x05\xe8@\x00\x80\x41\x01\"\x1f\n\x12\x44isconnectResponse:\t\xe0@\x06\xe8@\x00\x80\x41\x01\"\x15\n\x0bPingRequest:\x06\xe0@\x07\xe8@\x00\"\x16\n\x0cPingResponse:\x06\xe0@\x08\xe8@\x00\"\x1b\n\x11\x44\x65viceInfoRequest:\x06\xe0@\t\xe8@\x02\"\xb0\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\x17\n\x0f\x65sphome_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:\x06\xe0@\n\xe8@\x01\"\x1d\n\x13ListEntitiesRequest:\x06\xe0@\x0b\xe8@\x02\"%\n\x18ListEntitiesDoneResponse:\t\xe0@\x13\xe8@\x01\x80\x41\x01\" \n\x16SubscribeStatesRequest:\x06\xe0@\x14\xe8@\x02\"\xb6\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:\x1a\xe0@\x0c\xe8@\x01\xf2@\x11USE_BINARY_SENSOR\"m\n\x19\x42inarySensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x1d\xe0@\x15\xe8@\x01\xf2@\x11USE_BINARY_SENSOR\x80\x41\x01\"\xcf\x01\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\rassumed_state\x18\x05 \x01(\x08\x12\x19\n\x11supports_position\x18\x06 \x01(\x08\x12\x15\n\rsupports_tilt\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65vice_class\x18\x08 \x01(\t:\x12\xe0@\r\xe8@\x01\xf2@\tUSE_COVER\"\xad\x01\n\x12\x43overStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\'\n\x0clegacy_state\x18\x02 \x01(\x0e\x32\x11.LegacyCoverState\x12\x10\n\x08position\x18\x03 \x01(\x02\x12\x0c\n\x04tilt\x18\x04 \x01(\x02\x12*\n\x11\x63urrent_operation\x18\x05 \x01(\x0e\x32\x0f.CoverOperation:\x15\xe0@\x16\xe8@\x01\xf2@\tUSE_COVER\x80\x41\x01\"\xd8\x01\n\x13\x43overCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x1a\n\x12has_legacy_command\x18\x02 \x01(\x08\x12+\n\x0elegacy_command\x18\x03 \x01(\x0e\x32\x13.LegacyCoverCommand\x12\x14\n\x0chas_position\x18\x04 \x01(\x08\x12\x10\n\x08position\x18\x05 \x01(\x02\x12\x10\n\x08has_tilt\x18\x06 \x01(\x08\x12\x0c\n\x04tilt\x18\x07 \x01(\x02\x12\x0c\n\x04stop\x18\x08 \x01(\x08:\x15\xe0@\x1e\xe8@\x02\xf2@\tUSE_COVER\x80\x41\x01\"\xde\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\x12\x1a\n\x12supports_direction\x18\x07 \x01(\x08\x12\x1e\n\x16supported_speed_levels\x18\x08 \x01(\x05:\x10\xe0@\x0e\xe8@\x01\xf2@\x07USE_FAN\"\xad\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\x1c\n\x05speed\x18\x04 \x01(\x0e\x32\t.FanSpeedB\x02\x18\x01\x12 \n\tdirection\x18\x05 \x01(\x0e\x32\r.FanDirection\x12\x13\n\x0bspeed_level\x18\x06 \x01(\x05:\x13\xe0@\x17\xe8@\x01\xf2@\x07USE_FAN\x80\x41\x01\"\xa1\x02\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\x15\n\thas_speed\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x05speed\x18\x05 \x01(\x0e\x32\t.FanSpeedB\x02\x18\x01\x12\x17\n\x0fhas_oscillating\x18\x06 \x01(\x08\x12\x13\n\x0boscillating\x18\x07 \x01(\x08\x12\x15\n\rhas_direction\x18\x08 \x01(\x08\x12 \n\tdirection\x18\t \x01(\x0e\x32\r.FanDirection\x12\x17\n\x0fhas_speed_level\x18\n \x01(\x08\x12\x13\n\x0bspeed_level\x18\x0b \x01(\x05:\x13\xe0@\x1f\xe8@\x02\xf2@\x07USE_FAN\x80\x41\x01\"\x9e\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:\x12\xe0@\x0f\xe8@\x01\xf2@\tUSE_LIGHT\"\xbf\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:\x15\xe0@\x18\xe8@\x01\xf2@\tUSE_LIGHT\x80\x41\x01\"\xac\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:\x15\xe0@ \xe8@\x02\xf2@\tUSE_LIGHT\x80\x41\x01\"\x8c\x02\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\x12\x14\n\x0c\x66orce_update\x18\x08 \x01(\x08\x12\x14\n\x0c\x64\x65vice_class\x18\t \x01(\t\x12&\n\x0bstate_class\x18\n \x01(\x0e\x32\x11.SensorStateClass:\x13\xe0@\x10\xe8@\x01\xf2@\nUSE_SENSOR\"`\n\x13SensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x02\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x16\xe0@\x19\xe8@\x01\xf2@\nUSE_SENSOR\x80\x41\x01\"\x97\x01\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\x12\x15\n\rassumed_state\x18\x06 \x01(\x08:\x13\xe0@\x11\xe8@\x01\xf2@\nUSE_SWITCH\"I\n\x13SwitchStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08:\x16\xe0@\x1a\xe8@\x01\xf2@\nUSE_SWITCH\x80\x41\x01\"J\n\x14SwitchCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08:\x16\xe0@!\xe8@\x02\xf2@\nUSE_SWITCH\x80\x41\x01\"\x89\x01\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:\x18\xe0@\x12\xe8@\x01\xf2@\x0fUSE_TEXT_SENSOR\"i\n\x17TextSensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\t\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x1b\xe0@\x1b\xe8@\x01\xf2@\x0fUSE_TEXT_SENSOR\x80\x41\x01\"M\n\x14SubscribeLogsRequest\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12\x13\n\x0b\x64ump_config\x18\x02 \x01(\x08:\x06\xe0@\x1c\xe8@\x02\"r\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\x12\x13\n\x0bsend_failed\x18\x04 \x01(\x08:\x0c\xe0@\x1d\xe8@\x01\xf8@\x00\x80\x41\x00\"/\n%SubscribeHomeassistantServicesRequest:\x06\xe0@\"\xe8@\x02\"5\n\x17HomeassistantServiceMap\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xd2\x01\n\x1cHomeassistantServiceResponse\x12\x0f\n\x07service\x18\x01 \x01(\t\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12/\n\rdata_template\x18\x03 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12+\n\tvariables\x18\x04 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12\x10\n\x08is_event\x18\x05 \x01(\x08:\t\xe0@#\xe8@\x01\x80\x41\x01\"-\n#SubscribeHomeAssistantStatesRequest:\x06\xe0@&\xe8@\x02\"S\n#SubscribeHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\x11\n\tattribute\x18\x02 \x01(\t:\x06\xe0@\'\xe8@\x01\"\\\n\x1aHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\x12\x11\n\tattribute\x18\x03 \x01(\t:\t\xe0@(\xe8@\x02\x80\x41\x01\"\x18\n\x0eGetTimeRequest:\x06\xe0@$\xe8@\x00\"3\n\x0fGetTimeResponse\x12\x15\n\repoch_seconds\x18\x01 \x01(\x07:\t\xe0@%\xe8@\x00\x80\x41\x01\"K\n\x1cListEntitiesServicesArgument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\x04type\x18\x02 \x01(\x0e\x32\x0f.ServiceArgType\"n\n\x1cListEntitiesServicesResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12+\n\x04\x61rgs\x18\x03 \x03(\x0b\x32\x1d.ListEntitiesServicesArgument:\x06\xe0@)\xe8@\x01\"\xc8\x01\n\x16\x45xecuteServiceArgument\x12\r\n\x05\x62ool_\x18\x01 \x01(\x08\x12\x12\n\nlegacy_int\x18\x02 \x01(\x05\x12\x0e\n\x06\x66loat_\x18\x03 \x01(\x02\x12\x0f\n\x07string_\x18\x04 \x01(\t\x12\x0c\n\x04int_\x18\x05 \x01(\x11\x12\x16\n\nbool_array\x18\x06 \x03(\x08\x42\x02\x10\x00\x12\x15\n\tint_array\x18\x07 \x03(\x11\x42\x02\x10\x00\x12\x17\n\x0b\x66loat_array\x18\x08 \x03(\x02\x42\x02\x10\x00\x12\x14\n\x0cstring_array\x18\t \x03(\t\"V\n\x15\x45xecuteServiceRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12%\n\x04\x61rgs\x18\x02 \x03(\x0b\x32\x17.ExecuteServiceArgument:\t\xe0@*\xe8@\x02\x80\x41\x01\"x\n\x1aListEntitiesCameraResponse\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:\x19\xe0@+\xe8@\x01\xf2@\x10USE_ESP32_CAMERA\"Y\n\x13\x43\x61meraImageResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08:\x19\xe0@,\xe8@\x01\xf2@\x10USE_ESP32_CAMERA\"R\n\x12\x43\x61meraImageRequest\x12\x0e\n\x06single\x18\x01 \x01(\x08\x12\x0e\n\x06stream\x18\x02 \x01(\x08:\x1c\xe0@-\xe8@\x02\xf2@\x10USE_ESP32_CAMERA\x80\x41\x01\"\xe1\x03\n\x1bListEntitiesClimateResponse\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$\n\x1csupports_current_temperature\x18\x05 \x01(\x08\x12-\n%supports_two_point_target_temperature\x18\x06 \x01(\x08\x12%\n\x0fsupported_modes\x18\x07 \x03(\x0e\x32\x0c.ClimateMode\x12\x1e\n\x16visual_min_temperature\x18\x08 \x01(\x02\x12\x1e\n\x16visual_max_temperature\x18\t \x01(\x02\x12\x1f\n\x17visual_temperature_step\x18\n \x01(\x02\x12\x15\n\rsupports_away\x18\x0b \x01(\x08\x12\x17\n\x0fsupports_action\x18\x0c \x01(\x08\x12,\n\x13supported_fan_modes\x18\r \x03(\x0e\x32\x0f.ClimateFanMode\x12\x30\n\x15supported_swing_modes\x18\x0e \x03(\x0e\x32\x11.ClimateSwingMode:\x14\xe0@.\xe8@\x01\xf2@\x0bUSE_CLIMATE\"\xca\x02\n\x14\x43limateStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x1a\n\x04mode\x18\x02 \x01(\x0e\x32\x0c.ClimateMode\x12\x1b\n\x13\x63urrent_temperature\x18\x03 \x01(\x02\x12\x1a\n\x12target_temperature\x18\x04 \x01(\x02\x12\x1e\n\x16target_temperature_low\x18\x05 \x01(\x02\x12\x1f\n\x17target_temperature_high\x18\x06 \x01(\x02\x12\x0c\n\x04\x61way\x18\x07 \x01(\x08\x12\x1e\n\x06\x61\x63tion\x18\x08 \x01(\x0e\x32\x0e.ClimateAction\x12!\n\x08\x66\x61n_mode\x18\t \x01(\x0e\x32\x0f.ClimateFanMode\x12%\n\nswing_mode\x18\n \x01(\x0e\x32\x11.ClimateSwingMode:\x17\xe0@/\xe8@\x01\xf2@\x0bUSE_CLIMATE\x80\x41\x01\"\xc9\x03\n\x15\x43limateCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x10\n\x08has_mode\x18\x02 \x01(\x08\x12\x1a\n\x04mode\x18\x03 \x01(\x0e\x32\x0c.ClimateMode\x12\x1e\n\x16has_target_temperature\x18\x04 \x01(\x08\x12\x1a\n\x12target_temperature\x18\x05 \x01(\x02\x12\"\n\x1ahas_target_temperature_low\x18\x06 \x01(\x08\x12\x1e\n\x16target_temperature_low\x18\x07 \x01(\x02\x12#\n\x1bhas_target_temperature_high\x18\x08 \x01(\x08\x12\x1f\n\x17target_temperature_high\x18\t \x01(\x02\x12\x10\n\x08has_away\x18\n \x01(\x08\x12\x0c\n\x04\x61way\x18\x0b \x01(\x08\x12\x14\n\x0chas_fan_mode\x18\x0c \x01(\x08\x12!\n\x08\x66\x61n_mode\x18\r \x01(\x0e\x32\x0f.ClimateFanMode\x12\x16\n\x0ehas_swing_mode\x18\x0e \x01(\x08\x12%\n\nswing_mode\x18\x0f \x01(\x0e\x32\x11.ClimateSwingMode:\x17\xe0@0\xe8@\x02\xf2@\x0bUSE_CLIMATE\x80\x41\x01*N\n\x10LegacyCoverState\x12\x1b\n\x17LEGACY_COVER_STATE_OPEN\x10\x00\x12\x1d\n\x19LEGACY_COVER_STATE_CLOSED\x10\x01*j\n\x0e\x43overOperation\x12\x18\n\x14\x43OVER_OPERATION_IDLE\x10\x00\x12\x1e\n\x1a\x43OVER_OPERATION_IS_OPENING\x10\x01\x12\x1e\n\x1a\x43OVER_OPERATION_IS_CLOSING\x10\x02*r\n\x12LegacyCoverCommand\x12\x1d\n\x19LEGACY_COVER_COMMAND_OPEN\x10\x00\x12\x1e\n\x1aLEGACY_COVER_COMMAND_CLOSE\x10\x01\x12\x1d\n\x19LEGACY_COVER_COMMAND_STOP\x10\x02*G\n\x08\x46\x61nSpeed\x12\x11\n\rFAN_SPEED_LOW\x10\x00\x12\x14\n\x10\x46\x41N_SPEED_MEDIUM\x10\x01\x12\x12\n\x0e\x46\x41N_SPEED_HIGH\x10\x02*D\n\x0c\x46\x61nDirection\x12\x19\n\x15\x46\x41N_DIRECTION_FORWARD\x10\x00\x12\x19\n\x15\x46\x41N_DIRECTION_REVERSE\x10\x01*E\n\x10SensorStateClass\x12\x14\n\x10STATE_CLASS_NONE\x10\x00\x12\x1b\n\x17STATE_CLASS_MEASUREMENT\x10\x01*\xa3\x01\n\x08LogLevel\x12\x12\n\x0eLOG_LEVEL_NONE\x10\x00\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x01\x12\x12\n\x0eLOG_LEVEL_WARN\x10\x02\x12\x12\n\x0eLOG_LEVEL_INFO\x10\x03\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x04\x12\x15\n\x11LOG_LEVEL_VERBOSE\x10\x05\x12\x1a\n\x16LOG_LEVEL_VERY_VERBOSE\x10\x06*\x84\x02\n\x0eServiceArgType\x12\x19\n\x15SERVICE_ARG_TYPE_BOOL\x10\x00\x12\x18\n\x14SERVICE_ARG_TYPE_INT\x10\x01\x12\x1a\n\x16SERVICE_ARG_TYPE_FLOAT\x10\x02\x12\x1b\n\x17SERVICE_ARG_TYPE_STRING\x10\x03\x12\x1f\n\x1bSERVICE_ARG_TYPE_BOOL_ARRAY\x10\x04\x12\x1e\n\x1aSERVICE_ARG_TYPE_INT_ARRAY\x10\x05\x12 \n\x1cSERVICE_ARG_TYPE_FLOAT_ARRAY\x10\x06\x12!\n\x1dSERVICE_ARG_TYPE_STRING_ARRAY\x10\x07*\x99\x01\n\x0b\x43limateMode\x12\x14\n\x10\x43LIMATE_MODE_OFF\x10\x00\x12\x15\n\x11\x43LIMATE_MODE_AUTO\x10\x01\x12\x15\n\x11\x43LIMATE_MODE_COOL\x10\x02\x12\x15\n\x11\x43LIMATE_MODE_HEAT\x10\x03\x12\x19\n\x15\x43LIMATE_MODE_FAN_ONLY\x10\x04\x12\x14\n\x10\x43LIMATE_MODE_DRY\x10\x05*\xda\x01\n\x0e\x43limateFanMode\x12\x12\n\x0e\x43LIMATE_FAN_ON\x10\x00\x12\x13\n\x0f\x43LIMATE_FAN_OFF\x10\x01\x12\x14\n\x10\x43LIMATE_FAN_AUTO\x10\x02\x12\x13\n\x0f\x43LIMATE_FAN_LOW\x10\x03\x12\x16\n\x12\x43LIMATE_FAN_MEDIUM\x10\x04\x12\x14\n\x10\x43LIMATE_FAN_HIGH\x10\x05\x12\x16\n\x12\x43LIMATE_FAN_MIDDLE\x10\x06\x12\x15\n\x11\x43LIMATE_FAN_FOCUS\x10\x07\x12\x17\n\x13\x43LIMATE_FAN_DIFFUSE\x10\x08*{\n\x10\x43limateSwingMode\x12\x15\n\x11\x43LIMATE_SWING_OFF\x10\x00\x12\x16\n\x12\x43LIMATE_SWING_BOTH\x10\x01\x12\x1a\n\x16\x43LIMATE_SWING_VERTICAL\x10\x02\x12\x1c\n\x18\x43LIMATE_SWING_HORIZONTAL\x10\x03*\xab\x01\n\rClimateAction\x12\x16\n\x12\x43LIMATE_ACTION_OFF\x10\x00\x12\x1a\n\x16\x43LIMATE_ACTION_COOLING\x10\x02\x12\x1a\n\x16\x43LIMATE_ACTION_HEATING\x10\x03\x12\x17\n\x13\x43LIMATE_ACTION_IDLE\x10\x04\x12\x19\n\x15\x43LIMATE_ACTION_DRYING\x10\x05\x12\x16\n\x12\x43LIMATE_ACTION_FAN\x10\x06\x32\xe5\x07\n\rAPIConnection\x12.\n\x05hello\x12\r.HelloRequest\x1a\x0e.HelloResponse\"\x06\xf0@\x00\xf8@\x00\x12\x34\n\x07\x63onnect\x12\x0f.ConnectRequest\x1a\x10.ConnectResponse\"\x06\xf0@\x00\xf8@\x00\x12=\n\ndisconnect\x12\x12.DisconnectRequest\x1a\x13.DisconnectResponse\"\x06\xf0@\x00\xf8@\x00\x12+\n\x04ping\x12\x0c.PingRequest\x1a\r.PingResponse\"\x06\xf0@\x00\xf8@\x00\x12;\n\x0b\x64\x65vice_info\x12\x12.DeviceInfoRequest\x1a\x13.DeviceInfoResponse\"\x03\xf8@\x00\x12.\n\rlist_entities\x12\x14.ListEntitiesRequest\x1a\x05.void\"\x00\x12\x34\n\x10subscribe_states\x12\x17.SubscribeStatesRequest\x1a\x05.void\"\x00\x12\x30\n\x0esubscribe_logs\x12\x15.SubscribeLogsRequest\x1a\x05.void\"\x00\x12S\n subscribe_homeassistant_services\x12&.SubscribeHomeassistantServicesRequest\x1a\x05.void\"\x00\x12P\n\x1fsubscribe_home_assistant_states\x12$.SubscribeHomeAssistantStatesRequest\x1a\x05.void\"\x00\x12\x32\n\x08get_time\x12\x0f.GetTimeRequest\x1a\x10.GetTimeResponse\"\x03\xf8@\x00\x12\x32\n\x0f\x65xecute_service\x12\x16.ExecuteServiceRequest\x1a\x05.void\"\x00\x12.\n\rcover_command\x12\x14.CoverCommandRequest\x1a\x05.void\"\x00\x12*\n\x0b\x66\x61n_command\x12\x12.FanCommandRequest\x1a\x05.void\"\x00\x12.\n\rlight_command\x12\x14.LightCommandRequest\x1a\x05.void\"\x00\x12\x30\n\x0eswitch_command\x12\x15.SwitchCommandRequest\x1a\x05.void\"\x00\x12,\n\x0c\x63\x61mera_image\x12\x13.CameraImageRequest\x1a\x05.void\"\x00\x12\x32\n\x0f\x63limate_command\x12\x16.ClimateCommandRequest\x1a\x05.void\"\x00\x62\x06proto3') + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\tapi.proto\x1a\x11\x61pi_options.proto\".\n\x0cHelloRequest\x12\x13\n\x0b\x63lient_info\x18\x01 \x01(\t:\t\xe0@\x01\xe8@\x02\x80\x41\x01\"e\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:\t\xe0@\x02\xe8@\x01\x80\x41\x01\"-\n\x0e\x43onnectRequest\x12\x10\n\x08password\x18\x01 \x01(\t:\t\xe0@\x03\xe8@\x02\x80\x41\x01\"6\n\x0f\x43onnectResponse\x12\x18\n\x10invalid_password\x18\x01 \x01(\x08:\t\xe0@\x04\xe8@\x01\x80\x41\x01\"\x1e\n\x11\x44isconnectRequest:\t\xe0@\x05\xe8@\x00\x80\x41\x01\"\x1f\n\x12\x44isconnectResponse:\t\xe0@\x06\xe8@\x00\x80\x41\x01\"\x15\n\x0bPingRequest:\x06\xe0@\x07\xe8@\x00\"\x16\n\x0cPingResponse:\x06\xe0@\x08\xe8@\x00\"\x1b\n\x11\x44\x65viceInfoRequest:\x06\xe0@\t\xe8@\x02\"\xb0\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\x17\n\x0f\x65sphome_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:\x06\xe0@\n\xe8@\x01\"\x1d\n\x13ListEntitiesRequest:\x06\xe0@\x0b\xe8@\x02\"%\n\x18ListEntitiesDoneResponse:\t\xe0@\x13\xe8@\x01\x80\x41\x01\" \n\x16SubscribeStatesRequest:\x06\xe0@\x14\xe8@\x02\"\xb6\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:\x1a\xe0@\x0c\xe8@\x01\xf2@\x11USE_BINARY_SENSOR\"m\n\x19\x42inarySensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x1d\xe0@\x15\xe8@\x01\xf2@\x11USE_BINARY_SENSOR\x80\x41\x01\"\xcf\x01\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\rassumed_state\x18\x05 \x01(\x08\x12\x19\n\x11supports_position\x18\x06 \x01(\x08\x12\x15\n\rsupports_tilt\x18\x07 \x01(\x08\x12\x14\n\x0c\x64\x65vice_class\x18\x08 \x01(\t:\x12\xe0@\r\xe8@\x01\xf2@\tUSE_COVER\"\xad\x01\n\x12\x43overStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\'\n\x0clegacy_state\x18\x02 \x01(\x0e\x32\x11.LegacyCoverState\x12\x10\n\x08position\x18\x03 \x01(\x02\x12\x0c\n\x04tilt\x18\x04 \x01(\x02\x12*\n\x11\x63urrent_operation\x18\x05 \x01(\x0e\x32\x0f.CoverOperation:\x15\xe0@\x16\xe8@\x01\xf2@\tUSE_COVER\x80\x41\x01\"\xd8\x01\n\x13\x43overCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x1a\n\x12has_legacy_command\x18\x02 \x01(\x08\x12+\n\x0elegacy_command\x18\x03 \x01(\x0e\x32\x13.LegacyCoverCommand\x12\x14\n\x0chas_position\x18\x04 \x01(\x08\x12\x10\n\x08position\x18\x05 \x01(\x02\x12\x10\n\x08has_tilt\x18\x06 \x01(\x08\x12\x0c\n\x04tilt\x18\x07 \x01(\x02\x12\x0c\n\x04stop\x18\x08 \x01(\x08:\x15\xe0@\x1e\xe8@\x02\xf2@\tUSE_COVER\x80\x41\x01\"\xde\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\x12\x1a\n\x12supports_direction\x18\x07 \x01(\x08\x12\x1e\n\x16supported_speed_levels\x18\x08 \x01(\x05:\x10\xe0@\x0e\xe8@\x01\xf2@\x07USE_FAN\"\xad\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\x1c\n\x05speed\x18\x04 \x01(\x0e\x32\t.FanSpeedB\x02\x18\x01\x12 \n\tdirection\x18\x05 \x01(\x0e\x32\r.FanDirection\x12\x13\n\x0bspeed_level\x18\x06 \x01(\x05:\x13\xe0@\x17\xe8@\x01\xf2@\x07USE_FAN\x80\x41\x01\"\xa1\x02\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\x15\n\thas_speed\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x05speed\x18\x05 \x01(\x0e\x32\t.FanSpeedB\x02\x18\x01\x12\x17\n\x0fhas_oscillating\x18\x06 \x01(\x08\x12\x13\n\x0boscillating\x18\x07 \x01(\x08\x12\x15\n\rhas_direction\x18\x08 \x01(\x08\x12 \n\tdirection\x18\t \x01(\x0e\x32\r.FanDirection\x12\x17\n\x0fhas_speed_level\x18\n \x01(\x08\x12\x13\n\x0bspeed_level\x18\x0b \x01(\x05:\x13\xe0@\x1f\xe8@\x02\xf2@\x07USE_FAN\x80\x41\x01\"\x9e\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:\x12\xe0@\x0f\xe8@\x01\xf2@\tUSE_LIGHT\"\xbf\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:\x15\xe0@\x18\xe8@\x01\xf2@\tUSE_LIGHT\x80\x41\x01\"\xac\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:\x15\xe0@ \xe8@\x02\xf2@\tUSE_LIGHT\x80\x41\x01\"\x8c\x02\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\x12\x14\n\x0c\x66orce_update\x18\x08 \x01(\x08\x12\x14\n\x0c\x64\x65vice_class\x18\t \x01(\t\x12&\n\x0bstate_class\x18\n \x01(\x0e\x32\x11.SensorStateClass:\x13\xe0@\x10\xe8@\x01\xf2@\nUSE_SENSOR\"`\n\x13SensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x02\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x16\xe0@\x19\xe8@\x01\xf2@\nUSE_SENSOR\x80\x41\x01\"\x97\x01\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\x12\x15\n\rassumed_state\x18\x06 \x01(\x08:\x13\xe0@\x11\xe8@\x01\xf2@\nUSE_SWITCH\"I\n\x13SwitchStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08:\x16\xe0@\x1a\xe8@\x01\xf2@\nUSE_SWITCH\x80\x41\x01\"J\n\x14SwitchCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08:\x16\xe0@!\xe8@\x02\xf2@\nUSE_SWITCH\x80\x41\x01\"\x89\x01\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:\x18\xe0@\x12\xe8@\x01\xf2@\x0fUSE_TEXT_SENSOR\"i\n\x17TextSensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\t\x12\x15\n\rmissing_state\x18\x03 \x01(\x08:\x1b\xe0@\x1b\xe8@\x01\xf2@\x0fUSE_TEXT_SENSOR\x80\x41\x01\"M\n\x14SubscribeLogsRequest\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12\x13\n\x0b\x64ump_config\x18\x02 \x01(\x08:\x06\xe0@\x1c\xe8@\x02\"r\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\x12\x13\n\x0bsend_failed\x18\x04 \x01(\x08:\x0c\xe0@\x1d\xe8@\x01\xf8@\x00\x80\x41\x00\"/\n%SubscribeHomeassistantServicesRequest:\x06\xe0@\"\xe8@\x02\"5\n\x17HomeassistantServiceMap\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xd2\x01\n\x1cHomeassistantServiceResponse\x12\x0f\n\x07service\x18\x01 \x01(\t\x12&\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12/\n\rdata_template\x18\x03 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12+\n\tvariables\x18\x04 \x03(\x0b\x32\x18.HomeassistantServiceMap\x12\x10\n\x08is_event\x18\x05 \x01(\x08:\t\xe0@#\xe8@\x01\x80\x41\x01\"-\n#SubscribeHomeAssistantStatesRequest:\x06\xe0@&\xe8@\x02\"S\n#SubscribeHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\x11\n\tattribute\x18\x02 \x01(\t:\x06\xe0@\'\xe8@\x01\"\\\n\x1aHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\x12\x11\n\tattribute\x18\x03 \x01(\t:\t\xe0@(\xe8@\x02\x80\x41\x01\"\x18\n\x0eGetTimeRequest:\x06\xe0@$\xe8@\x00\"3\n\x0fGetTimeResponse\x12\x15\n\repoch_seconds\x18\x01 \x01(\x07:\t\xe0@%\xe8@\x00\x80\x41\x01\"K\n\x1cListEntitiesServicesArgument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\x04type\x18\x02 \x01(\x0e\x32\x0f.ServiceArgType\"n\n\x1cListEntitiesServicesResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12+\n\x04\x61rgs\x18\x03 \x03(\x0b\x32\x1d.ListEntitiesServicesArgument:\x06\xe0@)\xe8@\x01\"\xc8\x01\n\x16\x45xecuteServiceArgument\x12\r\n\x05\x62ool_\x18\x01 \x01(\x08\x12\x12\n\nlegacy_int\x18\x02 \x01(\x05\x12\x0e\n\x06\x66loat_\x18\x03 \x01(\x02\x12\x0f\n\x07string_\x18\x04 \x01(\t\x12\x0c\n\x04int_\x18\x05 \x01(\x11\x12\x16\n\nbool_array\x18\x06 \x03(\x08\x42\x02\x10\x00\x12\x15\n\tint_array\x18\x07 \x03(\x11\x42\x02\x10\x00\x12\x17\n\x0b\x66loat_array\x18\x08 \x03(\x02\x42\x02\x10\x00\x12\x14\n\x0cstring_array\x18\t \x03(\t\"V\n\x15\x45xecuteServiceRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12%\n\x04\x61rgs\x18\x02 \x03(\x0b\x32\x17.ExecuteServiceArgument:\t\xe0@*\xe8@\x02\x80\x41\x01\"x\n\x1aListEntitiesCameraResponse\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:\x19\xe0@+\xe8@\x01\xf2@\x10USE_ESP32_CAMERA\"Y\n\x13\x43\x61meraImageResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08:\x19\xe0@,\xe8@\x01\xf2@\x10USE_ESP32_CAMERA\"R\n\x12\x43\x61meraImageRequest\x12\x0e\n\x06single\x18\x01 \x01(\x08\x12\x0e\n\x06stream\x18\x02 \x01(\x08:\x1c\xe0@-\xe8@\x02\xf2@\x10USE_ESP32_CAMERA\x80\x41\x01\"\xe1\x03\n\x1bListEntitiesClimateResponse\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$\n\x1csupports_current_temperature\x18\x05 \x01(\x08\x12-\n%supports_two_point_target_temperature\x18\x06 \x01(\x08\x12%\n\x0fsupported_modes\x18\x07 \x03(\x0e\x32\x0c.ClimateMode\x12\x1e\n\x16visual_min_temperature\x18\x08 \x01(\x02\x12\x1e\n\x16visual_max_temperature\x18\t \x01(\x02\x12\x1f\n\x17visual_temperature_step\x18\n \x01(\x02\x12\x15\n\rsupports_away\x18\x0b \x01(\x08\x12\x17\n\x0fsupports_action\x18\x0c \x01(\x08\x12,\n\x13supported_fan_modes\x18\r \x03(\x0e\x32\x0f.ClimateFanMode\x12\x30\n\x15supported_swing_modes\x18\x0e \x03(\x0e\x32\x11.ClimateSwingMode:\x14\xe0@.\xe8@\x01\xf2@\x0bUSE_CLIMATE\"\xca\x02\n\x14\x43limateStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x1a\n\x04mode\x18\x02 \x01(\x0e\x32\x0c.ClimateMode\x12\x1b\n\x13\x63urrent_temperature\x18\x03 \x01(\x02\x12\x1a\n\x12target_temperature\x18\x04 \x01(\x02\x12\x1e\n\x16target_temperature_low\x18\x05 \x01(\x02\x12\x1f\n\x17target_temperature_high\x18\x06 \x01(\x02\x12\x0c\n\x04\x61way\x18\x07 \x01(\x08\x12\x1e\n\x06\x61\x63tion\x18\x08 \x01(\x0e\x32\x0e.ClimateAction\x12!\n\x08\x66\x61n_mode\x18\t \x01(\x0e\x32\x0f.ClimateFanMode\x12%\n\nswing_mode\x18\n \x01(\x0e\x32\x11.ClimateSwingMode:\x17\xe0@/\xe8@\x01\xf2@\x0bUSE_CLIMATE\x80\x41\x01\"\xc9\x03\n\x15\x43limateCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x10\n\x08has_mode\x18\x02 \x01(\x08\x12\x1a\n\x04mode\x18\x03 \x01(\x0e\x32\x0c.ClimateMode\x12\x1e\n\x16has_target_temperature\x18\x04 \x01(\x08\x12\x1a\n\x12target_temperature\x18\x05 \x01(\x02\x12\"\n\x1ahas_target_temperature_low\x18\x06 \x01(\x08\x12\x1e\n\x16target_temperature_low\x18\x07 \x01(\x02\x12#\n\x1bhas_target_temperature_high\x18\x08 \x01(\x08\x12\x1f\n\x17target_temperature_high\x18\t \x01(\x02\x12\x10\n\x08has_away\x18\n \x01(\x08\x12\x0c\n\x04\x61way\x18\x0b \x01(\x08\x12\x14\n\x0chas_fan_mode\x18\x0c \x01(\x08\x12!\n\x08\x66\x61n_mode\x18\r \x01(\x0e\x32\x0f.ClimateFanMode\x12\x16\n\x0ehas_swing_mode\x18\x0e \x01(\x08\x12%\n\nswing_mode\x18\x0f \x01(\x0e\x32\x11.ClimateSwingMode:\x17\xe0@0\xe8@\x02\xf2@\x0bUSE_CLIMATE\x80\x41\x01*N\n\x10LegacyCoverState\x12\x1b\n\x17LEGACY_COVER_STATE_OPEN\x10\x00\x12\x1d\n\x19LEGACY_COVER_STATE_CLOSED\x10\x01*j\n\x0e\x43overOperation\x12\x18\n\x14\x43OVER_OPERATION_IDLE\x10\x00\x12\x1e\n\x1a\x43OVER_OPERATION_IS_OPENING\x10\x01\x12\x1e\n\x1a\x43OVER_OPERATION_IS_CLOSING\x10\x02*r\n\x12LegacyCoverCommand\x12\x1d\n\x19LEGACY_COVER_COMMAND_OPEN\x10\x00\x12\x1e\n\x1aLEGACY_COVER_COMMAND_CLOSE\x10\x01\x12\x1d\n\x19LEGACY_COVER_COMMAND_STOP\x10\x02*G\n\x08\x46\x61nSpeed\x12\x11\n\rFAN_SPEED_LOW\x10\x00\x12\x14\n\x10\x46\x41N_SPEED_MEDIUM\x10\x01\x12\x12\n\x0e\x46\x41N_SPEED_HIGH\x10\x02*D\n\x0c\x46\x61nDirection\x12\x19\n\x15\x46\x41N_DIRECTION_FORWARD\x10\x00\x12\x19\n\x15\x46\x41N_DIRECTION_REVERSE\x10\x01*E\n\x10SensorStateClass\x12\x14\n\x10STATE_CLASS_NONE\x10\x00\x12\x1b\n\x17STATE_CLASS_MEASUREMENT\x10\x01*\xa3\x01\n\x08LogLevel\x12\x12\n\x0eLOG_LEVEL_NONE\x10\x00\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x01\x12\x12\n\x0eLOG_LEVEL_WARN\x10\x02\x12\x12\n\x0eLOG_LEVEL_INFO\x10\x03\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x04\x12\x15\n\x11LOG_LEVEL_VERBOSE\x10\x05\x12\x1a\n\x16LOG_LEVEL_VERY_VERBOSE\x10\x06*\x84\x02\n\x0eServiceArgType\x12\x19\n\x15SERVICE_ARG_TYPE_BOOL\x10\x00\x12\x18\n\x14SERVICE_ARG_TYPE_INT\x10\x01\x12\x1a\n\x16SERVICE_ARG_TYPE_FLOAT\x10\x02\x12\x1b\n\x17SERVICE_ARG_TYPE_STRING\x10\x03\x12\x1f\n\x1bSERVICE_ARG_TYPE_BOOL_ARRAY\x10\x04\x12\x1e\n\x1aSERVICE_ARG_TYPE_INT_ARRAY\x10\x05\x12 \n\x1cSERVICE_ARG_TYPE_FLOAT_ARRAY\x10\x06\x12!\n\x1dSERVICE_ARG_TYPE_STRING_ARRAY\x10\x07*\x99\x01\n\x0b\x43limateMode\x12\x14\n\x10\x43LIMATE_MODE_OFF\x10\x00\x12\x15\n\x11\x43LIMATE_MODE_AUTO\x10\x01\x12\x15\n\x11\x43LIMATE_MODE_COOL\x10\x02\x12\x15\n\x11\x43LIMATE_MODE_HEAT\x10\x03\x12\x19\n\x15\x43LIMATE_MODE_FAN_ONLY\x10\x04\x12\x14\n\x10\x43LIMATE_MODE_DRY\x10\x05*\xda\x01\n\x0e\x43limateFanMode\x12\x12\n\x0e\x43LIMATE_FAN_ON\x10\x00\x12\x13\n\x0f\x43LIMATE_FAN_OFF\x10\x01\x12\x14\n\x10\x43LIMATE_FAN_AUTO\x10\x02\x12\x13\n\x0f\x43LIMATE_FAN_LOW\x10\x03\x12\x16\n\x12\x43LIMATE_FAN_MEDIUM\x10\x04\x12\x14\n\x10\x43LIMATE_FAN_HIGH\x10\x05\x12\x16\n\x12\x43LIMATE_FAN_MIDDLE\x10\x06\x12\x15\n\x11\x43LIMATE_FAN_FOCUS\x10\x07\x12\x17\n\x13\x43LIMATE_FAN_DIFFUSE\x10\x08*{\n\x10\x43limateSwingMode\x12\x15\n\x11\x43LIMATE_SWING_OFF\x10\x00\x12\x16\n\x12\x43LIMATE_SWING_BOTH\x10\x01\x12\x1a\n\x16\x43LIMATE_SWING_VERTICAL\x10\x02\x12\x1c\n\x18\x43LIMATE_SWING_HORIZONTAL\x10\x03*\xab\x01\n\rClimateAction\x12\x16\n\x12\x43LIMATE_ACTION_OFF\x10\x00\x12\x1a\n\x16\x43LIMATE_ACTION_COOLING\x10\x02\x12\x1a\n\x16\x43LIMATE_ACTION_HEATING\x10\x03\x12\x17\n\x13\x43LIMATE_ACTION_IDLE\x10\x04\x12\x19\n\x15\x43LIMATE_ACTION_DRYING\x10\x05\x12\x16\n\x12\x43LIMATE_ACTION_FAN\x10\x06\x32\xe5\x07\n\rAPIConnection\x12.\n\x05hello\x12\r.HelloRequest\x1a\x0e.HelloResponse\"\x06\xf0@\x00\xf8@\x00\x12\x34\n\x07\x63onnect\x12\x0f.ConnectRequest\x1a\x10.ConnectResponse\"\x06\xf0@\x00\xf8@\x00\x12=\n\ndisconnect\x12\x12.DisconnectRequest\x1a\x13.DisconnectResponse\"\x06\xf0@\x00\xf8@\x00\x12+\n\x04ping\x12\x0c.PingRequest\x1a\r.PingResponse\"\x06\xf0@\x00\xf8@\x00\x12;\n\x0b\x64\x65vice_info\x12\x12.DeviceInfoRequest\x1a\x13.DeviceInfoResponse\"\x03\xf8@\x00\x12.\n\rlist_entities\x12\x14.ListEntitiesRequest\x1a\x05.void\"\x00\x12\x34\n\x10subscribe_states\x12\x17.SubscribeStatesRequest\x1a\x05.void\"\x00\x12\x30\n\x0esubscribe_logs\x12\x15.SubscribeLogsRequest\x1a\x05.void\"\x00\x12S\n subscribe_homeassistant_services\x12&.SubscribeHomeassistantServicesRequest\x1a\x05.void\"\x00\x12P\n\x1fsubscribe_home_assistant_states\x12$.SubscribeHomeAssistantStatesRequest\x1a\x05.void\"\x00\x12\x32\n\x08get_time\x12\x0f.GetTimeRequest\x1a\x10.GetTimeResponse\"\x03\xf8@\x00\x12\x32\n\x0f\x65xecute_service\x12\x16.ExecuteServiceRequest\x1a\x05.void\"\x00\x12.\n\rcover_command\x12\x14.CoverCommandRequest\x1a\x05.void\"\x00\x12*\n\x0b\x66\x61n_command\x12\x12.FanCommandRequest\x1a\x05.void\"\x00\x12.\n\rlight_command\x12\x14.LightCommandRequest\x1a\x05.void\"\x00\x12\x30\n\x0eswitch_command\x12\x15.SwitchCommandRequest\x1a\x05.void\"\x00\x12,\n\x0c\x63\x61mera_image\x12\x13.CameraImageRequest\x1a\x05.void\"\x00\x12\x32\n\x0f\x63limate_command\x12\x16.ClimateCommandRequest\x1a\x05.void\"\x00\x62\x06proto3' , dependencies=[api__options__pb2.DESCRIPTOR,]) @@ -30,15 +31,18 @@ _LEGACYCOVERSTATE = _descriptor.EnumDescriptor( full_name='LegacyCoverState', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='LEGACY_COVER_STATE_OPEN', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LEGACY_COVER_STATE_CLOSED', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -53,19 +57,23 @@ _COVEROPERATION = _descriptor.EnumDescriptor( full_name='CoverOperation', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='COVER_OPERATION_IDLE', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='COVER_OPERATION_IS_OPENING', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='COVER_OPERATION_IS_CLOSING', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -80,19 +88,23 @@ _LEGACYCOVERCOMMAND = _descriptor.EnumDescriptor( full_name='LegacyCoverCommand', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='LEGACY_COVER_COMMAND_OPEN', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LEGACY_COVER_COMMAND_CLOSE', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LEGACY_COVER_COMMAND_STOP', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -107,19 +119,23 @@ _FANSPEED = _descriptor.EnumDescriptor( full_name='FanSpeed', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='FAN_SPEED_LOW', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='FAN_SPEED_MEDIUM', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='FAN_SPEED_HIGH', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -134,15 +150,18 @@ _FANDIRECTION = _descriptor.EnumDescriptor( full_name='FanDirection', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='FAN_DIRECTION_FORWARD', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='FAN_DIRECTION_REVERSE', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -157,15 +176,18 @@ _SENSORSTATECLASS = _descriptor.EnumDescriptor( full_name='SensorStateClass', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='STATE_CLASS_NONE', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='STATE_CLASS_MEASUREMENT', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -180,35 +202,43 @@ _LOGLEVEL = _descriptor.EnumDescriptor( full_name='LogLevel', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='LOG_LEVEL_NONE', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_ERROR', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_WARN', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_INFO', index=3, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_DEBUG', index=4, number=4, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_VERBOSE', index=5, number=5, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='LOG_LEVEL_VERY_VERBOSE', index=6, number=6, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -223,39 +253,48 @@ _SERVICEARGTYPE = _descriptor.EnumDescriptor( full_name='ServiceArgType', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_BOOL', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_INT', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_FLOAT', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_STRING', index=3, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_BOOL_ARRAY', index=4, number=4, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_INT_ARRAY', index=5, number=5, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_FLOAT_ARRAY', index=6, number=6, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='SERVICE_ARG_TYPE_STRING_ARRAY', index=7, number=7, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -270,31 +309,38 @@ _CLIMATEMODE = _descriptor.EnumDescriptor( full_name='ClimateMode', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_OFF', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_AUTO', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_COOL', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_HEAT', index=3, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_FAN_ONLY', index=4, number=4, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_MODE_DRY', index=5, number=5, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -309,43 +355,53 @@ _CLIMATEFANMODE = _descriptor.EnumDescriptor( full_name='ClimateFanMode', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_ON', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_OFF', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_AUTO', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_LOW', index=3, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_MEDIUM', index=4, number=4, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_HIGH', index=5, number=5, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_MIDDLE', index=6, number=6, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_FOCUS', index=7, number=7, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_FAN_DIFFUSE', index=8, number=8, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -360,23 +416,28 @@ _CLIMATESWINGMODE = _descriptor.EnumDescriptor( full_name='ClimateSwingMode', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='CLIMATE_SWING_OFF', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_SWING_BOTH', index=1, number=1, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_SWING_VERTICAL', index=2, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_SWING_HORIZONTAL', index=3, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -391,31 +452,38 @@ _CLIMATEACTION = _descriptor.EnumDescriptor( full_name='ClimateAction', filename=None, file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, values=[ _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_OFF', index=0, number=0, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_COOLING', index=1, number=2, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_HEATING', index=2, number=3, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_IDLE', index=3, number=4, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_DRYING', index=4, number=5, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor( name='CLIMATE_ACTION_FAN', index=5, number=6, serialized_options=None, - type=None), + type=None, + create_key=_descriptor._internal_create_key), ], containing_type=None, serialized_options=None, @@ -489,21 +557,22 @@ _HELLOREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\001\350@\002\200A\001'), + serialized_options=b'\340@\001\350@\002\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -520,6 +589,7 @@ _HELLORESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='api_version_major', full_name='HelloResponse.api_version_major', index=0, @@ -527,28 +597,28 @@ _HELLORESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\002\350@\001\200A\001'), + serialized_options=b'\340@\002\350@\001\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -565,21 +635,22 @@ _CONNECTREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\003\350@\002\200A\001'), + serialized_options=b'\340@\003\350@\002\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -596,6 +667,7 @@ _CONNECTRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='invalid_password', full_name='ConnectResponse.invalid_password', index=0, @@ -603,14 +675,14 @@ _CONNECTRESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\004\350@\001\200A\001'), + serialized_options=b'\340@\004\350@\001\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -627,6 +699,7 @@ _DISCONNECTREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -634,7 +707,7 @@ _DISCONNECTREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\005\350@\000\200A\001'), + serialized_options=b'\340@\005\350@\000\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -651,6 +724,7 @@ _DISCONNECTRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -658,7 +732,7 @@ _DISCONNECTRESPONSE = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\006\350@\000\200A\001'), + serialized_options=b'\340@\006\350@\000\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -675,6 +749,7 @@ _PINGREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -682,7 +757,7 @@ _PINGREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\007\350@\000'), + serialized_options=b'\340@\007\350@\000', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -699,6 +774,7 @@ _PINGRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -706,7 +782,7 @@ _PINGRESPONSE = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\010\350@\000'), + serialized_options=b'\340@\010\350@\000', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -723,6 +799,7 @@ _DEVICEINFOREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -730,7 +807,7 @@ _DEVICEINFOREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\t\350@\002'), + serialized_options=b'\340@\t\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -747,6 +824,7 @@ _DEVICEINFORESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='uses_password', full_name='DeviceInfoResponse.uses_password', index=0, @@ -754,56 +832,56 @@ _DEVICEINFORESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='esphome_version', full_name='DeviceInfoResponse.esphome_version', index=3, number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\n\350@\001'), + serialized_options=b'\340@\n\350@\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -820,6 +898,7 @@ _LISTENTITIESREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -827,7 +906,7 @@ _LISTENTITIESREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\013\350@\002'), + serialized_options=b'\340@\013\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -844,6 +923,7 @@ _LISTENTITIESDONERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -851,7 +931,7 @@ _LISTENTITIESDONERESPONSE = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\023\350@\001\200A\001'), + serialized_options=b'\340@\023\350@\001\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -868,6 +948,7 @@ _SUBSCRIBESTATESREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -875,7 +956,7 @@ _SUBSCRIBESTATESREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\024\350@\002'), + serialized_options=b'\340@\024\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -892,56 +973,57 @@ _LISTENTITIESBINARYSENSORRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\014\350@\001\362@\021USE_BINARY_SENSOR'), + serialized_options=b'\340@\014\350@\001\362@\021USE_BINARY_SENSOR', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -958,6 +1040,7 @@ _BINARYSENSORSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='BinarySensorStateResponse.key', index=0, @@ -965,28 +1048,28 @@ _BINARYSENSORSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='missing_state', full_name='BinarySensorStateResponse.missing_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\025\350@\001\362@\021USE_BINARY_SENSOR\200A\001'), + serialized_options=b'\340@\025\350@\001\362@\021USE_BINARY_SENSOR\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1003,70 +1086,71 @@ _LISTENTITIESCOVERRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='assumed_state', full_name='ListEntitiesCoverResponse.assumed_state', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_position', full_name='ListEntitiesCoverResponse.supports_position', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_tilt', full_name='ListEntitiesCoverResponse.supports_tilt', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='device_class', full_name='ListEntitiesCoverResponse.device_class', index=7, number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\r\350@\001\362@\tUSE_COVER'), + serialized_options=b'\340@\r\350@\001\362@\tUSE_COVER', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1083,6 +1167,7 @@ _COVERSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='CoverStateResponse.key', index=0, @@ -1090,42 +1175,42 @@ _COVERSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='legacy_state', full_name='CoverStateResponse.legacy_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='position', full_name='CoverStateResponse.position', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='tilt', full_name='CoverStateResponse.tilt', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='current_operation', full_name='CoverStateResponse.current_operation', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\026\350@\001\362@\tUSE_COVER\200A\001'), + serialized_options=b'\340@\026\350@\001\362@\tUSE_COVER\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1142,6 +1227,7 @@ _COVERCOMMANDREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='CoverCommandRequest.key', index=0, @@ -1149,63 +1235,63 @@ _COVERCOMMANDREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_legacy_command', full_name='CoverCommandRequest.has_legacy_command', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='legacy_command', full_name='CoverCommandRequest.legacy_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_position', full_name='CoverCommandRequest.has_position', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='position', full_name='CoverCommandRequest.position', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_tilt', full_name='CoverCommandRequest.has_tilt', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='tilt', full_name='CoverCommandRequest.tilt', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='stop', full_name='CoverCommandRequest.stop', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\036\350@\002\362@\tUSE_COVER\200A\001'), + serialized_options=b'\340@\036\350@\002\362@\tUSE_COVER\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1222,70 +1308,71 @@ _LISTENTITIESFANRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_direction', full_name='ListEntitiesFanResponse.supports_direction', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supported_speed_levels', full_name='ListEntitiesFanResponse.supported_speed_levels', index=7, number=8, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\016\350@\001\362@\007USE_FAN'), + serialized_options=b'\340@\016\350@\001\362@\007USE_FAN', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1302,6 +1389,7 @@ _FANSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='FanStateResponse.key', index=0, @@ -1309,49 +1397,49 @@ _FANSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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=_b('\030\001'), file=DESCRIPTOR), + serialized_options=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='direction', full_name='FanStateResponse.direction', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='speed_level', full_name='FanStateResponse.speed_level', index=5, number=6, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\027\350@\001\362@\007USE_FAN\200A\001'), + serialized_options=b'\340@\027\350@\001\362@\007USE_FAN\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1368,6 +1456,7 @@ _FANCOMMANDREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='FanCommandRequest.key', index=0, @@ -1375,84 +1464,84 @@ _FANCOMMANDREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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=_b('\030\001'), file=DESCRIPTOR), + serialized_options=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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=_b('\030\001'), file=DESCRIPTOR), + serialized_options=b'\030\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_direction', full_name='FanCommandRequest.has_direction', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='direction', full_name='FanCommandRequest.direction', index=8, number=9, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_speed_level', full_name='FanCommandRequest.has_speed_level', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='speed_level', full_name='FanCommandRequest.speed_level', index=10, number=11, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\037\350@\002\362@\007USE_FAN\200A\001'), + serialized_options=b'\340@\037\350@\002\362@\007USE_FAN\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1469,91 +1558,92 @@ _LISTENTITIESLIGHTRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\017\350@\001\362@\tUSE_LIGHT'), + serialized_options=b'\340@\017\350@\001\362@\tUSE_LIGHT', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1570,6 +1660,7 @@ _LIGHTSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='LightStateResponse.key', index=0, @@ -1577,70 +1668,70 @@ _LIGHTSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\030\350@\001\362@\tUSE_LIGHT\200A\001'), + serialized_options=b'\340@\030\350@\001\362@\tUSE_LIGHT\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1657,6 +1748,7 @@ _LIGHTCOMMANDREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='LightCommandRequest.key', index=0, @@ -1664,140 +1756,140 @@ _LIGHTCOMMANDREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@ \350@\002\362@\tUSE_LIGHT\200A\001'), + serialized_options=b'\340@ \350@\002\362@\tUSE_LIGHT\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1814,84 +1906,85 @@ _LISTENTITIESSENSORRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='force_update', full_name='ListEntitiesSensorResponse.force_update', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='device_class', full_name='ListEntitiesSensorResponse.device_class', index=8, number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='state_class', full_name='ListEntitiesSensorResponse.state_class', index=9, number=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\020\350@\001\362@\nUSE_SENSOR'), + serialized_options=b'\340@\020\350@\001\362@\nUSE_SENSOR', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1908,6 +2001,7 @@ _SENSORSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='SensorStateResponse.key', index=0, @@ -1915,28 +2009,28 @@ _SENSORSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='missing_state', full_name='SensorStateResponse.missing_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\031\350@\001\362@\nUSE_SENSOR\200A\001'), + serialized_options=b'\340@\031\350@\001\362@\nUSE_SENSOR\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1953,56 +2047,57 @@ _LISTENTITIESSWITCHRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='assumed_state', full_name='ListEntitiesSwitchResponse.assumed_state', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\021\350@\001\362@\nUSE_SWITCH'), + serialized_options=b'\340@\021\350@\001\362@\nUSE_SWITCH', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2019,6 +2114,7 @@ _SWITCHSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='SwitchStateResponse.key', index=0, @@ -2026,21 +2122,21 @@ _SWITCHSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\032\350@\001\362@\nUSE_SWITCH\200A\001'), + serialized_options=b'\340@\032\350@\001\362@\nUSE_SWITCH\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2057,6 +2153,7 @@ _SWITCHCOMMANDREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='SwitchCommandRequest.key', index=0, @@ -2064,21 +2161,21 @@ _SWITCHCOMMANDREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@!\350@\002\362@\nUSE_SWITCH\200A\001'), + serialized_options=b'\340@!\350@\002\362@\nUSE_SWITCH\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2095,49 +2192,50 @@ _LISTENTITIESTEXTSENSORRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, 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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\022\350@\001\362@\017USE_TEXT_SENSOR'), + serialized_options=b'\340@\022\350@\001\362@\017USE_TEXT_SENSOR', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2154,6 +2252,7 @@ _TEXTSENSORSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='TextSensorStateResponse.key', index=0, @@ -2161,28 +2260,28 @@ _TEXTSENSORSTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='missing_state', full_name='TextSensorStateResponse.missing_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\033\350@\001\362@\017USE_TEXT_SENSOR\200A\001'), + serialized_options=b'\340@\033\350@\001\362@\017USE_TEXT_SENSOR\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2199,6 +2298,7 @@ _SUBSCRIBELOGSREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='level', full_name='SubscribeLogsRequest.level', index=0, @@ -2206,21 +2306,21 @@ _SUBSCRIBELOGSREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='dump_config', full_name='SubscribeLogsRequest.dump_config', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\034\350@\002'), + serialized_options=b'\340@\034\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2237,6 +2337,7 @@ _SUBSCRIBELOGSRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='level', full_name='SubscribeLogsResponse.level', index=0, @@ -2244,35 +2345,35 @@ _SUBSCRIBELOGSRESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _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'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='send_failed', full_name='SubscribeLogsResponse.send_failed', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\035\350@\001\370@\000\200A\000'), + serialized_options=b'\340@\035\350@\001\370@\000\200A\000', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2289,6 +2390,7 @@ _SUBSCRIBEHOMEASSISTANTSERVICESREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -2296,7 +2398,7 @@ _SUBSCRIBEHOMEASSISTANTSERVICESREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\"\350@\002'), + serialized_options=b'\340@\"\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2313,21 +2415,22 @@ _HOMEASSISTANTSERVICEMAP = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='HomeassistantServiceMap.key', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='value', full_name='HomeassistantServiceMap.value', index=1, number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -2351,49 +2454,50 @@ _HOMEASSISTANTSERVICERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='service', full_name='HomeassistantServiceResponse.service', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='data', full_name='HomeassistantServiceResponse.data', index=1, number=2, type=11, cpp_type=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='data_template', full_name='HomeassistantServiceResponse.data_template', index=2, number=3, type=11, cpp_type=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='variables', full_name='HomeassistantServiceResponse.variables', index=3, number=4, type=11, cpp_type=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='is_event', full_name='HomeassistantServiceResponse.is_event', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@#\350@\001\200A\001'), + serialized_options=b'\340@#\350@\001\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2410,6 +2514,7 @@ _SUBSCRIBEHOMEASSISTANTSTATESREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -2417,7 +2522,7 @@ _SUBSCRIBEHOMEASSISTANTSTATESREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@&\350@\002'), + serialized_options=b'\340@&\350@\002', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2434,28 +2539,29 @@ _SUBSCRIBEHOMEASSISTANTSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='entity_id', full_name='SubscribeHomeAssistantStateResponse.entity_id', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='attribute', full_name='SubscribeHomeAssistantStateResponse.attribute', index=1, number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@\'\350@\001'), + serialized_options=b'\340@\'\350@\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2472,35 +2578,36 @@ _HOMEASSISTANTSTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='entity_id', full_name='HomeAssistantStateResponse.entity_id', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='state', full_name='HomeAssistantStateResponse.state', index=1, number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='attribute', full_name='HomeAssistantStateResponse.attribute', index=2, number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@(\350@\002\200A\001'), + serialized_options=b'\340@(\350@\002\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2517,6 +2624,7 @@ _GETTIMEREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ ], extensions=[ @@ -2524,7 +2632,7 @@ _GETTIMEREQUEST = _descriptor.Descriptor( nested_types=[], enum_types=[ ], - serialized_options=_b('\340@$\350@\000'), + serialized_options=b'\340@$\350@\000', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2541,6 +2649,7 @@ _GETTIMERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='epoch_seconds', full_name='GetTimeResponse.epoch_seconds', index=0, @@ -2548,14 +2657,14 @@ _GETTIMERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@%\350@\000\200A\001'), + serialized_options=b'\340@%\350@\000\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2572,21 +2681,22 @@ _LISTENTITIESSERVICESARGUMENT = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='name', full_name='ListEntitiesServicesArgument.name', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='type', full_name='ListEntitiesServicesArgument.type', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -2610,35 +2720,36 @@ _LISTENTITIESSERVICESRESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='name', full_name='ListEntitiesServicesResponse.name', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='key', full_name='ListEntitiesServicesResponse.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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='args', full_name='ListEntitiesServicesResponse.args', index=2, number=3, type=11, cpp_type=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@)\350@\001'), + serialized_options=b'\340@)\350@\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2655,6 +2766,7 @@ _EXECUTESERVICEARGUMENT = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='bool_', full_name='ExecuteServiceArgument.bool_', index=0, @@ -2662,63 +2774,63 @@ _EXECUTESERVICEARGUMENT = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='legacy_int', full_name='ExecuteServiceArgument.legacy_int', index=1, number=2, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='float_', full_name='ExecuteServiceArgument.float_', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='string_', full_name='ExecuteServiceArgument.string_', index=3, number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='int_', full_name='ExecuteServiceArgument.int_', index=4, number=5, type=17, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='bool_array', full_name='ExecuteServiceArgument.bool_array', index=5, number=6, type=8, cpp_type=7, 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=_b('\020\000'), file=DESCRIPTOR), + serialized_options=b'\020\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='int_array', full_name='ExecuteServiceArgument.int_array', index=6, number=7, type=17, cpp_type=1, 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=_b('\020\000'), file=DESCRIPTOR), + serialized_options=b'\020\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='float_array', full_name='ExecuteServiceArgument.float_array', index=7, number=8, type=2, cpp_type=6, 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=_b('\020\000'), file=DESCRIPTOR), + serialized_options=b'\020\000', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='string_array', full_name='ExecuteServiceArgument.string_array', index=8, number=9, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -2742,6 +2854,7 @@ _EXECUTESERVICEREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='ExecuteServiceRequest.key', index=0, @@ -2749,21 +2862,21 @@ _EXECUTESERVICEREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='args', full_name='ExecuteServiceRequest.args', index=1, number=2, type=11, cpp_type=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@*\350@\002\200A\001'), + serialized_options=b'\340@*\350@\002\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2780,42 +2893,43 @@ _LISTENTITIESCAMERARESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='object_id', full_name='ListEntitiesCameraResponse.object_id', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='key', full_name='ListEntitiesCameraResponse.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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='name', full_name='ListEntitiesCameraResponse.name', index=2, number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='unique_id', full_name='ListEntitiesCameraResponse.unique_id', index=3, number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@+\350@\001\362@\020USE_ESP32_CAMERA'), + serialized_options=b'\340@+\350@\001\362@\020USE_ESP32_CAMERA', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2832,6 +2946,7 @@ _CAMERAIMAGERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='CameraImageResponse.key', index=0, @@ -2839,28 +2954,28 @@ _CAMERAIMAGERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='data', full_name='CameraImageResponse.data', index=1, number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), + has_default_value=False, default_value=b"", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='done', full_name='CameraImageResponse.done', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@,\350@\001\362@\020USE_ESP32_CAMERA'), + serialized_options=b'\340@,\350@\001\362@\020USE_ESP32_CAMERA', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2877,6 +2992,7 @@ _CAMERAIMAGEREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='single', full_name='CameraImageRequest.single', index=0, @@ -2884,21 +3000,21 @@ _CAMERAIMAGEREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='stream', full_name='CameraImageRequest.stream', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@-\350@\002\362@\020USE_ESP32_CAMERA\200A\001'), + serialized_options=b'\340@-\350@\002\362@\020USE_ESP32_CAMERA\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2915,112 +3031,113 @@ _LISTENTITIESCLIMATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='object_id', full_name='ListEntitiesClimateResponse.object_id', index=0, number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='key', full_name='ListEntitiesClimateResponse.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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='name', full_name='ListEntitiesClimateResponse.name', index=2, number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='unique_id', full_name='ListEntitiesClimateResponse.unique_id', index=3, number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), + 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_current_temperature', full_name='ListEntitiesClimateResponse.supports_current_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_two_point_target_temperature', full_name='ListEntitiesClimateResponse.supports_two_point_target_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supported_modes', full_name='ListEntitiesClimateResponse.supported_modes', index=6, number=7, type=14, cpp_type=8, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='visual_min_temperature', full_name='ListEntitiesClimateResponse.visual_min_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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='visual_max_temperature', full_name='ListEntitiesClimateResponse.visual_max_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='visual_temperature_step', full_name='ListEntitiesClimateResponse.visual_temperature_step', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_away', full_name='ListEntitiesClimateResponse.supports_away', index=10, number=11, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supports_action', full_name='ListEntitiesClimateResponse.supports_action', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supported_fan_modes', full_name='ListEntitiesClimateResponse.supported_fan_modes', index=12, number=13, type=14, cpp_type=8, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='supported_swing_modes', full_name='ListEntitiesClimateResponse.supported_swing_modes', index=13, number=14, type=14, cpp_type=8, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@.\350@\001\362@\013USE_CLIMATE'), + serialized_options=b'\340@.\350@\001\362@\013USE_CLIMATE', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -3037,6 +3154,7 @@ _CLIMATESTATERESPONSE = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='ClimateStateResponse.key', index=0, @@ -3044,77 +3162,77 @@ _CLIMATESTATERESPONSE = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='mode', full_name='ClimateStateResponse.mode', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='current_temperature', full_name='ClimateStateResponse.current_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature', full_name='ClimateStateResponse.target_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature_low', full_name='ClimateStateResponse.target_temperature_low', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature_high', full_name='ClimateStateResponse.target_temperature_high', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='away', full_name='ClimateStateResponse.away', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='action', full_name='ClimateStateResponse.action', index=7, number=8, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='fan_mode', full_name='ClimateStateResponse.fan_mode', index=8, number=9, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='swing_mode', full_name='ClimateStateResponse.swing_mode', index=9, number=10, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@/\350@\001\362@\013USE_CLIMATE\200A\001'), + serialized_options=b'\340@/\350@\001\362@\013USE_CLIMATE\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -3131,6 +3249,7 @@ _CLIMATECOMMANDREQUEST = _descriptor.Descriptor( filename=None, file=DESCRIPTOR, containing_type=None, + create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( name='key', full_name='ClimateCommandRequest.key', index=0, @@ -3138,112 +3257,112 @@ _CLIMATECOMMANDREQUEST = _descriptor.Descriptor( 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_mode', full_name='ClimateCommandRequest.has_mode', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='mode', full_name='ClimateCommandRequest.mode', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_target_temperature', full_name='ClimateCommandRequest.has_target_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature', full_name='ClimateCommandRequest.target_temperature', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_target_temperature_low', full_name='ClimateCommandRequest.has_target_temperature_low', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature_low', full_name='ClimateCommandRequest.target_temperature_low', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_target_temperature_high', full_name='ClimateCommandRequest.has_target_temperature_high', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='target_temperature_high', full_name='ClimateCommandRequest.target_temperature_high', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_away', full_name='ClimateCommandRequest.has_away', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='away', full_name='ClimateCommandRequest.away', index=10, number=11, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_fan_mode', full_name='ClimateCommandRequest.has_fan_mode', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='fan_mode', full_name='ClimateCommandRequest.fan_mode', index=12, number=13, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='has_swing_mode', full_name='ClimateCommandRequest.has_swing_mode', 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='swing_mode', full_name='ClimateCommandRequest.swing_mode', index=14, number=15, 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), + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], nested_types=[], enum_types=[ ], - serialized_options=_b('\340@0\350@\002\362@\013USE_CLIMATE\200A\001'), + serialized_options=b'\340@0\350@\002\362@\013USE_CLIMATE\200A\001', is_extendable=False, syntax='proto3', extension_ranges=[], @@ -3344,361 +3463,361 @@ DESCRIPTOR.enum_types_by_name['ClimateSwingMode'] = _CLIMATESWINGMODE DESCRIPTOR.enum_types_by_name['ClimateAction'] = _CLIMATEACTION _sym_db.RegisterFileDescriptor(DESCRIPTOR) -HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( - DESCRIPTOR = _HELLOREQUEST, - __module__ = 'api_pb2' +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), { + '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' +HelloResponse = _reflection.GeneratedProtocolMessageType('HelloResponse', (_message.Message,), { + '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' +ConnectRequest = _reflection.GeneratedProtocolMessageType('ConnectRequest', (_message.Message,), { + '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' +ConnectResponse = _reflection.GeneratedProtocolMessageType('ConnectResponse', (_message.Message,), { + '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' +DisconnectRequest = _reflection.GeneratedProtocolMessageType('DisconnectRequest', (_message.Message,), { + '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' +DisconnectResponse = _reflection.GeneratedProtocolMessageType('DisconnectResponse', (_message.Message,), { + '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' +PingRequest = _reflection.GeneratedProtocolMessageType('PingRequest', (_message.Message,), { + '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' +PingResponse = _reflection.GeneratedProtocolMessageType('PingResponse', (_message.Message,), { + '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' +DeviceInfoRequest = _reflection.GeneratedProtocolMessageType('DeviceInfoRequest', (_message.Message,), { + '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' +DeviceInfoResponse = _reflection.GeneratedProtocolMessageType('DeviceInfoResponse', (_message.Message,), { + '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' +ListEntitiesRequest = _reflection.GeneratedProtocolMessageType('ListEntitiesRequest', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesRequest) - )) + }) _sym_db.RegisterMessage(ListEntitiesRequest) -ListEntitiesDoneResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesDoneResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESDONERESPONSE, - __module__ = 'api_pb2' +ListEntitiesDoneResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesDoneResponse', (_message.Message,), { + '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' +SubscribeStatesRequest = _reflection.GeneratedProtocolMessageType('SubscribeStatesRequest', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBESTATESREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SubscribeStatesRequest) - )) + }) _sym_db.RegisterMessage(SubscribeStatesRequest) -ListEntitiesBinarySensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesBinarySensorResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESBINARYSENSORRESPONSE, - __module__ = 'api_pb2' +ListEntitiesBinarySensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesBinarySensorResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESBINARYSENSORRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesBinarySensorResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesBinarySensorResponse) -BinarySensorStateResponse = _reflection.GeneratedProtocolMessageType('BinarySensorStateResponse', (_message.Message,), dict( - DESCRIPTOR = _BINARYSENSORSTATERESPONSE, - __module__ = 'api_pb2' +BinarySensorStateResponse = _reflection.GeneratedProtocolMessageType('BinarySensorStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _BINARYSENSORSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:BinarySensorStateResponse) - )) + }) _sym_db.RegisterMessage(BinarySensorStateResponse) -ListEntitiesCoverResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCoverResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESCOVERRESPONSE, - __module__ = 'api_pb2' +ListEntitiesCoverResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCoverResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESCOVERRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesCoverResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesCoverResponse) -CoverStateResponse = _reflection.GeneratedProtocolMessageType('CoverStateResponse', (_message.Message,), dict( - DESCRIPTOR = _COVERSTATERESPONSE, - __module__ = 'api_pb2' +CoverStateResponse = _reflection.GeneratedProtocolMessageType('CoverStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _COVERSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:CoverStateResponse) - )) + }) _sym_db.RegisterMessage(CoverStateResponse) -CoverCommandRequest = _reflection.GeneratedProtocolMessageType('CoverCommandRequest', (_message.Message,), dict( - DESCRIPTOR = _COVERCOMMANDREQUEST, - __module__ = 'api_pb2' +CoverCommandRequest = _reflection.GeneratedProtocolMessageType('CoverCommandRequest', (_message.Message,), { + 'DESCRIPTOR' : _COVERCOMMANDREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:CoverCommandRequest) - )) + }) _sym_db.RegisterMessage(CoverCommandRequest) -ListEntitiesFanResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesFanResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESFANRESPONSE, - __module__ = 'api_pb2' +ListEntitiesFanResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesFanResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESFANRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesFanResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesFanResponse) -FanStateResponse = _reflection.GeneratedProtocolMessageType('FanStateResponse', (_message.Message,), dict( - DESCRIPTOR = _FANSTATERESPONSE, - __module__ = 'api_pb2' +FanStateResponse = _reflection.GeneratedProtocolMessageType('FanStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _FANSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:FanStateResponse) - )) + }) _sym_db.RegisterMessage(FanStateResponse) -FanCommandRequest = _reflection.GeneratedProtocolMessageType('FanCommandRequest', (_message.Message,), dict( - DESCRIPTOR = _FANCOMMANDREQUEST, - __module__ = 'api_pb2' +FanCommandRequest = _reflection.GeneratedProtocolMessageType('FanCommandRequest', (_message.Message,), { + 'DESCRIPTOR' : _FANCOMMANDREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:FanCommandRequest) - )) + }) _sym_db.RegisterMessage(FanCommandRequest) -ListEntitiesLightResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesLightResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESLIGHTRESPONSE, - __module__ = 'api_pb2' +ListEntitiesLightResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesLightResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESLIGHTRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesLightResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesLightResponse) -LightStateResponse = _reflection.GeneratedProtocolMessageType('LightStateResponse', (_message.Message,), dict( - DESCRIPTOR = _LIGHTSTATERESPONSE, - __module__ = 'api_pb2' +LightStateResponse = _reflection.GeneratedProtocolMessageType('LightStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _LIGHTSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:LightStateResponse) - )) + }) _sym_db.RegisterMessage(LightStateResponse) -LightCommandRequest = _reflection.GeneratedProtocolMessageType('LightCommandRequest', (_message.Message,), dict( - DESCRIPTOR = _LIGHTCOMMANDREQUEST, - __module__ = 'api_pb2' +LightCommandRequest = _reflection.GeneratedProtocolMessageType('LightCommandRequest', (_message.Message,), { + 'DESCRIPTOR' : _LIGHTCOMMANDREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:LightCommandRequest) - )) + }) _sym_db.RegisterMessage(LightCommandRequest) -ListEntitiesSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSensorResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESSENSORRESPONSE, - __module__ = 'api_pb2' +ListEntitiesSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSensorResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESSENSORRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesSensorResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesSensorResponse) -SensorStateResponse = _reflection.GeneratedProtocolMessageType('SensorStateResponse', (_message.Message,), dict( - DESCRIPTOR = _SENSORSTATERESPONSE, - __module__ = 'api_pb2' +SensorStateResponse = _reflection.GeneratedProtocolMessageType('SensorStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _SENSORSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SensorStateResponse) - )) + }) _sym_db.RegisterMessage(SensorStateResponse) -ListEntitiesSwitchResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSwitchResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESSWITCHRESPONSE, - __module__ = 'api_pb2' +ListEntitiesSwitchResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesSwitchResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESSWITCHRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesSwitchResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesSwitchResponse) -SwitchStateResponse = _reflection.GeneratedProtocolMessageType('SwitchStateResponse', (_message.Message,), dict( - DESCRIPTOR = _SWITCHSTATERESPONSE, - __module__ = 'api_pb2' +SwitchStateResponse = _reflection.GeneratedProtocolMessageType('SwitchStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _SWITCHSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SwitchStateResponse) - )) + }) _sym_db.RegisterMessage(SwitchStateResponse) -SwitchCommandRequest = _reflection.GeneratedProtocolMessageType('SwitchCommandRequest', (_message.Message,), dict( - DESCRIPTOR = _SWITCHCOMMANDREQUEST, - __module__ = 'api_pb2' +SwitchCommandRequest = _reflection.GeneratedProtocolMessageType('SwitchCommandRequest', (_message.Message,), { + 'DESCRIPTOR' : _SWITCHCOMMANDREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SwitchCommandRequest) - )) + }) _sym_db.RegisterMessage(SwitchCommandRequest) -ListEntitiesTextSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesTextSensorResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESTEXTSENSORRESPONSE, - __module__ = 'api_pb2' +ListEntitiesTextSensorResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesTextSensorResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESTEXTSENSORRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesTextSensorResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesTextSensorResponse) -TextSensorStateResponse = _reflection.GeneratedProtocolMessageType('TextSensorStateResponse', (_message.Message,), dict( - DESCRIPTOR = _TEXTSENSORSTATERESPONSE, - __module__ = 'api_pb2' +TextSensorStateResponse = _reflection.GeneratedProtocolMessageType('TextSensorStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _TEXTSENSORSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:TextSensorStateResponse) - )) + }) _sym_db.RegisterMessage(TextSensorStateResponse) -SubscribeLogsRequest = _reflection.GeneratedProtocolMessageType('SubscribeLogsRequest', (_message.Message,), dict( - DESCRIPTOR = _SUBSCRIBELOGSREQUEST, - __module__ = 'api_pb2' +SubscribeLogsRequest = _reflection.GeneratedProtocolMessageType('SubscribeLogsRequest', (_message.Message,), { + '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' +SubscribeLogsResponse = _reflection.GeneratedProtocolMessageType('SubscribeLogsResponse', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBELOGSRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SubscribeLogsResponse) - )) + }) _sym_db.RegisterMessage(SubscribeLogsResponse) -SubscribeHomeassistantServicesRequest = _reflection.GeneratedProtocolMessageType('SubscribeHomeassistantServicesRequest', (_message.Message,), dict( - DESCRIPTOR = _SUBSCRIBEHOMEASSISTANTSERVICESREQUEST, - __module__ = 'api_pb2' +SubscribeHomeassistantServicesRequest = _reflection.GeneratedProtocolMessageType('SubscribeHomeassistantServicesRequest', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBEHOMEASSISTANTSERVICESREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SubscribeHomeassistantServicesRequest) - )) + }) _sym_db.RegisterMessage(SubscribeHomeassistantServicesRequest) -HomeassistantServiceMap = _reflection.GeneratedProtocolMessageType('HomeassistantServiceMap', (_message.Message,), dict( - DESCRIPTOR = _HOMEASSISTANTSERVICEMAP, - __module__ = 'api_pb2' +HomeassistantServiceMap = _reflection.GeneratedProtocolMessageType('HomeassistantServiceMap', (_message.Message,), { + 'DESCRIPTOR' : _HOMEASSISTANTSERVICEMAP, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:HomeassistantServiceMap) - )) + }) _sym_db.RegisterMessage(HomeassistantServiceMap) -HomeassistantServiceResponse = _reflection.GeneratedProtocolMessageType('HomeassistantServiceResponse', (_message.Message,), dict( - DESCRIPTOR = _HOMEASSISTANTSERVICERESPONSE, - __module__ = 'api_pb2' +HomeassistantServiceResponse = _reflection.GeneratedProtocolMessageType('HomeassistantServiceResponse', (_message.Message,), { + 'DESCRIPTOR' : _HOMEASSISTANTSERVICERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:HomeassistantServiceResponse) - )) + }) _sym_db.RegisterMessage(HomeassistantServiceResponse) -SubscribeHomeAssistantStatesRequest = _reflection.GeneratedProtocolMessageType('SubscribeHomeAssistantStatesRequest', (_message.Message,), dict( - DESCRIPTOR = _SUBSCRIBEHOMEASSISTANTSTATESREQUEST, - __module__ = 'api_pb2' +SubscribeHomeAssistantStatesRequest = _reflection.GeneratedProtocolMessageType('SubscribeHomeAssistantStatesRequest', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBEHOMEASSISTANTSTATESREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SubscribeHomeAssistantStatesRequest) - )) + }) _sym_db.RegisterMessage(SubscribeHomeAssistantStatesRequest) -SubscribeHomeAssistantStateResponse = _reflection.GeneratedProtocolMessageType('SubscribeHomeAssistantStateResponse', (_message.Message,), dict( - DESCRIPTOR = _SUBSCRIBEHOMEASSISTANTSTATERESPONSE, - __module__ = 'api_pb2' +SubscribeHomeAssistantStateResponse = _reflection.GeneratedProtocolMessageType('SubscribeHomeAssistantStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _SUBSCRIBEHOMEASSISTANTSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:SubscribeHomeAssistantStateResponse) - )) + }) _sym_db.RegisterMessage(SubscribeHomeAssistantStateResponse) -HomeAssistantStateResponse = _reflection.GeneratedProtocolMessageType('HomeAssistantStateResponse', (_message.Message,), dict( - DESCRIPTOR = _HOMEASSISTANTSTATERESPONSE, - __module__ = 'api_pb2' +HomeAssistantStateResponse = _reflection.GeneratedProtocolMessageType('HomeAssistantStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _HOMEASSISTANTSTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:HomeAssistantStateResponse) - )) + }) _sym_db.RegisterMessage(HomeAssistantStateResponse) -GetTimeRequest = _reflection.GeneratedProtocolMessageType('GetTimeRequest', (_message.Message,), dict( - DESCRIPTOR = _GETTIMEREQUEST, - __module__ = 'api_pb2' +GetTimeRequest = _reflection.GeneratedProtocolMessageType('GetTimeRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETTIMEREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:GetTimeRequest) - )) + }) _sym_db.RegisterMessage(GetTimeRequest) -GetTimeResponse = _reflection.GeneratedProtocolMessageType('GetTimeResponse', (_message.Message,), dict( - DESCRIPTOR = _GETTIMERESPONSE, - __module__ = 'api_pb2' +GetTimeResponse = _reflection.GeneratedProtocolMessageType('GetTimeResponse', (_message.Message,), { + 'DESCRIPTOR' : _GETTIMERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:GetTimeResponse) - )) + }) _sym_db.RegisterMessage(GetTimeResponse) -ListEntitiesServicesArgument = _reflection.GeneratedProtocolMessageType('ListEntitiesServicesArgument', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESSERVICESARGUMENT, - __module__ = 'api_pb2' +ListEntitiesServicesArgument = _reflection.GeneratedProtocolMessageType('ListEntitiesServicesArgument', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESSERVICESARGUMENT, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesServicesArgument) - )) + }) _sym_db.RegisterMessage(ListEntitiesServicesArgument) -ListEntitiesServicesResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesServicesResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESSERVICESRESPONSE, - __module__ = 'api_pb2' +ListEntitiesServicesResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesServicesResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESSERVICESRESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesServicesResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesServicesResponse) -ExecuteServiceArgument = _reflection.GeneratedProtocolMessageType('ExecuteServiceArgument', (_message.Message,), dict( - DESCRIPTOR = _EXECUTESERVICEARGUMENT, - __module__ = 'api_pb2' +ExecuteServiceArgument = _reflection.GeneratedProtocolMessageType('ExecuteServiceArgument', (_message.Message,), { + 'DESCRIPTOR' : _EXECUTESERVICEARGUMENT, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ExecuteServiceArgument) - )) + }) _sym_db.RegisterMessage(ExecuteServiceArgument) -ExecuteServiceRequest = _reflection.GeneratedProtocolMessageType('ExecuteServiceRequest', (_message.Message,), dict( - DESCRIPTOR = _EXECUTESERVICEREQUEST, - __module__ = 'api_pb2' +ExecuteServiceRequest = _reflection.GeneratedProtocolMessageType('ExecuteServiceRequest', (_message.Message,), { + 'DESCRIPTOR' : _EXECUTESERVICEREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ExecuteServiceRequest) - )) + }) _sym_db.RegisterMessage(ExecuteServiceRequest) -ListEntitiesCameraResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCameraResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESCAMERARESPONSE, - __module__ = 'api_pb2' +ListEntitiesCameraResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCameraResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESCAMERARESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesCameraResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesCameraResponse) -CameraImageResponse = _reflection.GeneratedProtocolMessageType('CameraImageResponse', (_message.Message,), dict( - DESCRIPTOR = _CAMERAIMAGERESPONSE, - __module__ = 'api_pb2' +CameraImageResponse = _reflection.GeneratedProtocolMessageType('CameraImageResponse', (_message.Message,), { + 'DESCRIPTOR' : _CAMERAIMAGERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:CameraImageResponse) - )) + }) _sym_db.RegisterMessage(CameraImageResponse) -CameraImageRequest = _reflection.GeneratedProtocolMessageType('CameraImageRequest', (_message.Message,), dict( - DESCRIPTOR = _CAMERAIMAGEREQUEST, - __module__ = 'api_pb2' +CameraImageRequest = _reflection.GeneratedProtocolMessageType('CameraImageRequest', (_message.Message,), { + 'DESCRIPTOR' : _CAMERAIMAGEREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:CameraImageRequest) - )) + }) _sym_db.RegisterMessage(CameraImageRequest) -ListEntitiesClimateResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesClimateResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESCLIMATERESPONSE, - __module__ = 'api_pb2' +ListEntitiesClimateResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesClimateResponse', (_message.Message,), { + 'DESCRIPTOR' : _LISTENTITIESCLIMATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ListEntitiesClimateResponse) - )) + }) _sym_db.RegisterMessage(ListEntitiesClimateResponse) -ClimateStateResponse = _reflection.GeneratedProtocolMessageType('ClimateStateResponse', (_message.Message,), dict( - DESCRIPTOR = _CLIMATESTATERESPONSE, - __module__ = 'api_pb2' +ClimateStateResponse = _reflection.GeneratedProtocolMessageType('ClimateStateResponse', (_message.Message,), { + 'DESCRIPTOR' : _CLIMATESTATERESPONSE, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ClimateStateResponse) - )) + }) _sym_db.RegisterMessage(ClimateStateResponse) -ClimateCommandRequest = _reflection.GeneratedProtocolMessageType('ClimateCommandRequest', (_message.Message,), dict( - DESCRIPTOR = _CLIMATECOMMANDREQUEST, - __module__ = 'api_pb2' +ClimateCommandRequest = _reflection.GeneratedProtocolMessageType('ClimateCommandRequest', (_message.Message,), { + 'DESCRIPTOR' : _CLIMATECOMMANDREQUEST, + '__module__' : 'api_pb2' # @@protoc_insertion_point(class_scope:ClimateCommandRequest) - )) + }) _sym_db.RegisterMessage(ClimateCommandRequest) @@ -3763,6 +3882,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( file=DESCRIPTOR, index=0, serialized_options=None, + create_key=_descriptor._internal_create_key, serialized_start=8634, serialized_end=9631, methods=[ @@ -3773,7 +3893,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_HELLOREQUEST, output_type=_HELLORESPONSE, - serialized_options=_b('\360@\000\370@\000'), + serialized_options=b'\360@\000\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='connect', @@ -3782,7 +3903,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_CONNECTREQUEST, output_type=_CONNECTRESPONSE, - serialized_options=_b('\360@\000\370@\000'), + serialized_options=b'\360@\000\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='disconnect', @@ -3791,7 +3913,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_DISCONNECTREQUEST, output_type=_DISCONNECTRESPONSE, - serialized_options=_b('\360@\000\370@\000'), + serialized_options=b'\360@\000\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='ping', @@ -3800,7 +3923,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_PINGREQUEST, output_type=_PINGRESPONSE, - serialized_options=_b('\360@\000\370@\000'), + serialized_options=b'\360@\000\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='device_info', @@ -3809,7 +3933,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_DEVICEINFOREQUEST, output_type=_DEVICEINFORESPONSE, - serialized_options=_b('\370@\000'), + serialized_options=b'\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='list_entities', @@ -3819,6 +3944,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_LISTENTITIESREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='subscribe_states', @@ -3828,6 +3954,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_SUBSCRIBESTATESREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='subscribe_logs', @@ -3837,6 +3964,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_SUBSCRIBELOGSREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='subscribe_homeassistant_services', @@ -3846,6 +3974,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_SUBSCRIBEHOMEASSISTANTSERVICESREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='subscribe_home_assistant_states', @@ -3855,6 +3984,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_SUBSCRIBEHOMEASSISTANTSTATESREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='get_time', @@ -3863,7 +3993,8 @@ _APICONNECTION = _descriptor.ServiceDescriptor( containing_service=None, input_type=_GETTIMEREQUEST, output_type=_GETTIMERESPONSE, - serialized_options=_b('\370@\000'), + serialized_options=b'\370@\000', + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='execute_service', @@ -3873,6 +4004,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_EXECUTESERVICEREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='cover_command', @@ -3882,6 +4014,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_COVERCOMMANDREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='fan_command', @@ -3891,6 +4024,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_FANCOMMANDREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='light_command', @@ -3900,6 +4034,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_LIGHTCOMMANDREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='switch_command', @@ -3909,6 +4044,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_SWITCHCOMMANDREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='camera_image', @@ -3918,6 +4054,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_CAMERAIMAGEREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), _descriptor.MethodDescriptor( name='climate_command', @@ -3927,6 +4064,7 @@ _APICONNECTION = _descriptor.ServiceDescriptor( input_type=_CLIMATECOMMANDREQUEST, output_type=api__options__pb2._VOID, serialized_options=None, + create_key=_descriptor._internal_create_key, ), ]) _sym_db.RegisterServiceDescriptor(_APICONNECTION) diff --git a/aioesphomeapi/client.py b/aioesphomeapi/client.py index 16a82ce..19ebc76 100644 --- a/aioesphomeapi/client.py +++ b/aioesphomeapi/client.py @@ -1,19 +1,108 @@ +import asyncio import logging -from typing import Any, Callable, Optional, Tuple -import zeroconf +from typing import Any, Awaitable, Callable, Dict, List, Optional, Tuple, Union, cast -import aioesphomeapi.api_pb2 as pb +import attr +import zeroconf +from google.protobuf import message + +from aioesphomeapi.api_pb2 import ( # type: ignore + BinarySensorStateResponse, + CameraImageRequest, + CameraImageResponse, + ClimateCommandRequest, + ClimateStateResponse, + CoverCommandRequest, + CoverStateResponse, + DeviceInfoRequest, + DeviceInfoResponse, + ExecuteServiceArgument, + ExecuteServiceRequest, + FanCommandRequest, + FanStateResponse, + HomeassistantServiceResponse, + HomeAssistantStateResponse, + LightCommandRequest, + LightStateResponse, + ListEntitiesBinarySensorResponse, + ListEntitiesCameraResponse, + ListEntitiesClimateResponse, + ListEntitiesCoverResponse, + ListEntitiesDoneResponse, + ListEntitiesFanResponse, + ListEntitiesLightResponse, + ListEntitiesRequest, + ListEntitiesSensorResponse, + ListEntitiesServicesResponse, + ListEntitiesSwitchResponse, + ListEntitiesTextSensorResponse, + LogLevel, + SensorStateResponse, + SubscribeHomeassistantServicesRequest, + SubscribeHomeAssistantStateResponse, + SubscribeHomeAssistantStatesRequest, + SubscribeLogsRequest, + SubscribeLogsResponse, + SubscribeStatesRequest, + SwitchCommandRequest, + SwitchStateResponse, + TextSensorStateResponse, +) from aioesphomeapi.connection import APIConnection, ConnectionParams from aioesphomeapi.core import APIConnectionError -from aioesphomeapi.model import * +from aioesphomeapi.model import ( + APIVersion, + BinarySensorInfo, + BinarySensorState, + CameraInfo, + CameraState, + ClimateFanMode, + ClimateInfo, + ClimateMode, + ClimateState, + ClimateSwingMode, + CoverInfo, + CoverState, + DeviceInfo, + EntityInfo, + FanDirection, + FanInfo, + FanSpeed, + FanState, + HomeassistantServiceCall, + LegacyCoverCommand, + LightInfo, + LightState, + SensorInfo, + SensorState, + SwitchInfo, + SwitchState, + TextSensorInfo, + TextSensorState, + UserService, + UserServiceArg, + UserServiceArgType, +) _LOGGER = logging.getLogger(__name__) +ExecuteServiceDataType = Dict[ + str, Union[bool, int, float, str, List[bool], List[int], List[float], List[str]] +] + class APIClient: - def __init__(self, eventloop, address: str, port: int, password: str, *, - client_info: str = 'aioesphomeapi', keepalive: float = 15.0, - zeroconf_instance: zeroconf.Zeroconf = None): + def __init__( + self, + eventloop: asyncio.AbstractEventLoop, + address: str, + port: int, + password: str, + *, + client_info: str = "aioesphomeapi", + keepalive: float = 15.0, + zeroconf_instance: Optional[zeroconf.Zeroconf] = None + ): self._params = ConnectionParams( eventloop=eventloop, address=address, @@ -21,18 +110,22 @@ class APIClient: password=password, client_info=client_info, keepalive=keepalive, - zeroconf_instance=zeroconf_instance + zeroconf_instance=zeroconf_instance, ) self._connection = None # type: Optional[APIConnection] - async def connect(self, on_stop=None, login=False): + async def connect( + self, + on_stop: Optional[Callable[[], Awaitable[None]]] = None, + login: bool = False, + ) -> None: if self._connection is not None: raise APIConnectionError("Already connected!") connected = False stopped = False - async def _on_stop(): + async def _on_stop() -> None: nonlocal stopped if stopped: @@ -53,31 +146,33 @@ class APIClient: raise except Exception as e: await _on_stop() - raise APIConnectionError( - "Unexpected error while connecting: {}".format(e)) + raise APIConnectionError("Unexpected error while connecting: {}".format(e)) connected = True - async def disconnect(self, force=False): + async def disconnect(self, force: bool = False) -> None: if self._connection is None: return await self._connection.stop(force=force) - def _check_connected(self): + def _check_connected(self) -> None: if self._connection is None: raise APIConnectionError("Not connected!") if not self._connection.is_connected: raise APIConnectionError("Connection not done!") - def _check_authenticated(self): + def _check_authenticated(self) -> None: self._check_connected() + assert self._connection is not None if not self._connection.is_authenticated: raise APIConnectionError("Not authenticated!") async def device_info(self) -> DeviceInfo: self._check_connected() + assert self._connection is not None resp = await self._connection.send_message_await_response( - pb.DeviceInfoRequest(), pb.DeviceInfoResponse) + DeviceInfoRequest(), DeviceInfoResponse + ) return DeviceInfo( uses_password=resp.uses_password, name=resp.name, @@ -88,49 +183,60 @@ class APIClient: has_deep_sleep=resp.has_deep_sleep, ) - async def list_entities_services(self) -> Tuple[List[Any], List[UserService]]: + async def list_entities_services( + self, + ) -> Tuple[List[EntityInfo], List[UserService]]: 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, - pb.ListEntitiesServicesResponse: None, - pb.ListEntitiesCameraResponse: CameraInfo, - pb.ListEntitiesClimateResponse: ClimateInfo, + ListEntitiesBinarySensorResponse: BinarySensorInfo, + ListEntitiesCoverResponse: CoverInfo, + ListEntitiesFanResponse: FanInfo, + ListEntitiesLightResponse: LightInfo, + ListEntitiesSensorResponse: SensorInfo, + ListEntitiesSwitchResponse: SwitchInfo, + ListEntitiesTextSensorResponse: TextSensorInfo, + ListEntitiesServicesResponse: None, + ListEntitiesCameraResponse: CameraInfo, + ListEntitiesClimateResponse: ClimateInfo, } - def do_append(msg): + def do_append(msg: message.Message) -> bool: return isinstance(msg, tuple(response_types.keys())) - def do_stop(msg): - return isinstance(msg, pb.ListEntitiesDoneResponse) + def do_stop(msg: message.Message) -> bool: + return isinstance(msg, ListEntitiesDoneResponse) + assert self._connection is not None resp = await self._connection.send_message_await_response_complex( - pb.ListEntitiesRequest(), do_append, do_stop, timeout=5) - entities = [] - services = [] + ListEntitiesRequest(), do_append, do_stop, timeout=5 + ) + entities: List[EntityInfo] = [] + services: List[UserService] = [] for msg in resp: - if isinstance(msg, pb.ListEntitiesServicesResponse): + if isinstance(msg, ListEntitiesServicesResponse): args = [] for arg in msg.args: - args.append(UserServiceArg( - name=arg.name, - type_=arg.type, - )) - services.append(UserService( - name=msg.name, - key=msg.key, - args=args, - )) + args.append( + UserServiceArg( + name=arg.name, + type_=arg.type, + ) + ) + services.append( + UserService( + name=msg.name, + key=msg.key, + args=args, # type: ignore + ) + ) continue cls = None for resp_type, cls in response_types.items(): if isinstance(msg, resp_type): break + else: + continue + cls = cast(type, cls) kwargs = {} for key, _ in attr.fields_dict(cls).items(): kwargs[key] = getattr(msg, key) @@ -141,20 +247,20 @@ class APIClient: 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, - pb.ClimateStateResponse: ClimateState, + BinarySensorStateResponse: BinarySensorState, + CoverStateResponse: CoverState, + FanStateResponse: FanState, + LightStateResponse: LightState, + SensorStateResponse: SensorState, + SwitchStateResponse: SwitchState, + TextSensorStateResponse: TextSensorState, + ClimateStateResponse: ClimateState, } - image_stream = {} + image_stream: Dict[int, bytes] = {} - def on_msg(msg): - if isinstance(msg, pb.CameraImageResponse): + def on_msg(msg: message.Message) -> None: + if isinstance(msg, CameraImageResponse): data = image_stream.pop(msg.key, bytes()) + msg.data if msg.done: on_state(CameraState(key=msg.key, image=data)) @@ -174,33 +280,43 @@ class APIClient: kwargs[key] = getattr(msg, key) on_state(cls(**kwargs)) - await self._connection.send_message_callback_response(pb.SubscribeStatesRequest(), on_msg) + assert self._connection is not None + await self._connection.send_message_callback_response( + SubscribeStatesRequest(), on_msg + ) - async def subscribe_logs(self, on_log: Callable[[pb.SubscribeLogsResponse], None], - log_level=None) -> None: + async def subscribe_logs( + self, + on_log: Callable[[SubscribeLogsResponse], None], + log_level: Optional[LogLevel] = None, + ) -> None: self._check_authenticated() - def on_msg(msg): - if isinstance(msg, pb.SubscribeLogsResponse): + def on_msg(msg: message.Message) -> None: + if isinstance(msg, SubscribeLogsResponse): on_log(msg) - req = pb.SubscribeLogsRequest() + req = SubscribeLogsRequest() if log_level is not None: req.level = log_level + assert self._connection is not None await self._connection.send_message_callback_response(req, on_msg) - async def subscribe_service_calls(self, on_service_call: Callable[[HomeassistantServiceCall], None]) -> None: + async def subscribe_service_calls( + self, on_service_call: Callable[[HomeassistantServiceCall], None] + ) -> None: self._check_authenticated() - def on_msg(msg): - if isinstance(msg, pb.HomeassistantServiceResponse): + def on_msg(msg: message.Message) -> None: + if isinstance(msg, HomeassistantServiceResponse): kwargs = {} for key, _ in attr.fields_dict(HomeassistantServiceCall).items(): kwargs[key] = getattr(msg, key) on_service_call(HomeassistantServiceCall(**kwargs)) + assert self._connection is not None await self._connection.send_message_callback_response( - pb.SubscribeHomeassistantServicesRequest(), on_msg + SubscribeHomeassistantServicesRequest(), on_msg ) async def subscribe_home_assistant_states( @@ -208,12 +324,13 @@ class APIClient: ) -> None: self._check_authenticated() - def on_msg(msg): - if isinstance(msg, pb.SubscribeHomeAssistantStateResponse): + def on_msg(msg: message.Message) -> None: + if isinstance(msg, SubscribeHomeAssistantStateResponse): on_state_sub(msg.entity_id, msg.attribute) + assert self._connection is not None await self._connection.send_message_callback_response( - pb.SubscribeHomeAssistantStatesRequest(), on_msg + SubscribeHomeAssistantStatesRequest(), on_msg ) async def send_home_assistant_state( @@ -221,25 +338,28 @@ class APIClient: ) -> None: self._check_authenticated() + assert self._connection is not None await self._connection.send_message( - pb.HomeAssistantStateResponse( + HomeAssistantStateResponse( entity_id=entity_id, state=state, attribute=attribute, ) ) - async def cover_command(self, - key: int, - position: Optional[float] = None, - tilt: Optional[float] = None, - stop: bool = False, - ) -> None: + async def cover_command( + self, + key: int, + position: Optional[float] = None, + tilt: Optional[float] = None, + stop: bool = False, + ) -> None: self._check_authenticated() - req = pb.CoverCommandRequest() + req = CoverCommandRequest() req.key = key - if self.api_version >= APIVersion(1, 1): + apiv = cast(APIVersion, self.api_version) + if apiv >= APIVersion(1, 1): if position is not None: req.has_position = True req.position = position @@ -256,19 +376,21 @@ class APIClient: req.legacy_command = LegacyCoverCommand.OPEN else: req.legacy_command = LegacyCoverCommand.CLOSE + assert self._connection is not None await self._connection.send_message(req) - async def fan_command(self, - key: int, - state: Optional[bool] = None, - speed: Optional[FanSpeed] = None, - speed_level: Optional[int] = None, - oscillating: Optional[bool] = None, - direction: Optional[FanDirection] = None - ) -> None: + async def fan_command( + self, + key: int, + state: Optional[bool] = None, + speed: Optional[FanSpeed] = None, + speed_level: Optional[int] = None, + oscillating: Optional[bool] = None, + direction: Optional[FanDirection] = None, + ) -> None: self._check_authenticated() - req = pb.FanCommandRequest() + req = FanCommandRequest() req.key = key if state is not None: req.has_state = True @@ -285,22 +407,24 @@ class APIClient: if direction is not None: req.has_direction = True req.direction = direction + assert self._connection is not None await self._connection.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, - ): + 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, + ) -> None: self._check_authenticated() - req = pb.LightCommandRequest() + req = LightCommandRequest() req.key = key if state is not None: req.has_state = True @@ -328,32 +452,32 @@ class APIClient: if effect is not None: req.has_effect = True req.effect = effect + assert self._connection is not None await self._connection.send_message(req) - async def switch_command(self, - key: int, - state: bool - ) -> None: + async def switch_command(self, key: int, state: bool) -> None: self._check_authenticated() - req = pb.SwitchCommandRequest() + req = SwitchCommandRequest() req.key = key req.state = state + assert self._connection is not None await self._connection.send_message(req) - async def climate_command(self, - key: int, - mode: Optional[ClimateMode] = None, - target_temperature: Optional[float] = None, - target_temperature_low: Optional[float] = None, - target_temperature_high: Optional[float] = None, - away: Optional[bool] = None, - fan_mode: Optional[ClimateFanMode] = None, - swing_mode: Optional[ClimateSwingMode] = None, - ) -> None: + async def climate_command( + self, + key: int, + mode: Optional[ClimateMode] = None, + target_temperature: Optional[float] = None, + target_temperature_low: Optional[float] = None, + target_temperature_high: Optional[float] = None, + away: Optional[bool] = None, + fan_mode: Optional[ClimateFanMode] = None, + swing_mode: Optional[ClimateSwingMode] = None, + ) -> None: self._check_authenticated() - req = pb.ClimateCommandRequest() + req = ClimateCommandRequest() req.key = key if mode is not None: req.has_mode = True @@ -376,30 +500,33 @@ class APIClient: if swing_mode is not None: req.has_swing_mode = True req.swing_mode = swing_mode + assert self._connection is not None await self._connection.send_message(req) - async def execute_service(self, service: UserService, data: dict): + async def execute_service( + self, service: UserService, data: ExecuteServiceDataType + ) -> None: self._check_authenticated() - req = pb.ExecuteServiceRequest() + req = ExecuteServiceRequest() req.key = service.key args = [] for arg_desc in service.args: - arg = pb.ExecuteServiceArgument() + arg = ExecuteServiceArgument() val = data[arg_desc.name] - int_type = 'int_' if self.api_version >= APIVersion( - 1, 3) else 'legacy_int' + apiv = cast(APIVersion, self.api_version) + int_type = "int_" if apiv >= APIVersion(1, 3) else "legacy_int" map_single = { - UserServiceArgType.BOOL: 'bool_', + UserServiceArgType.BOOL: "bool_", UserServiceArgType.INT: int_type, - UserServiceArgType.FLOAT: 'float_', - UserServiceArgType.STRING: 'string_', + UserServiceArgType.FLOAT: "float_", + UserServiceArgType.STRING: "string_", } map_array = { - UserServiceArgType.BOOL_ARRAY: 'bool_array', - UserServiceArgType.INT_ARRAY: 'int_array', - UserServiceArgType.FLOAT_ARRAY: 'float_array', - UserServiceArgType.STRING_ARRAY: 'string_array', + UserServiceArgType.BOOL_ARRAY: "bool_array", + UserServiceArgType.INT_ARRAY: "int_array", + UserServiceArgType.FLOAT_ARRAY: "float_array", + UserServiceArgType.STRING_ARRAY: "string_array", } # pylint: disable=redefined-outer-name if arg_desc.type_ in map_array: @@ -411,18 +538,22 @@ class APIClient: args.append(arg) # pylint: disable=no-member req.args.extend(args) + assert self._connection is not None await self._connection.send_message(req) - async def _request_image(self, *, single=False, stream=False): - req = pb.CameraImageRequest() + async def _request_image( + self, *, single: bool = False, stream: bool = False + ) -> None: + req = CameraImageRequest() req.single = single req.stream = stream + assert self._connection is not None await self._connection.send_message(req) - async def request_single_image(self): + async def request_single_image(self) -> None: await self._request_image(single=True) - async def request_image_stream(self): + async def request_image_stream(self) -> None: await self._request_image(stream=True) @property diff --git a/aioesphomeapi/connection.py b/aioesphomeapi/connection.py index 013b993..4763d27 100644 --- a/aioesphomeapi/connection.py +++ b/aioesphomeapi/connection.py @@ -2,14 +2,25 @@ import asyncio import logging import socket import time -from typing import Any, Callable, List, Optional, cast +from typing import Any, Awaitable, Callable, List, Optional, cast import attr import zeroconf from google.protobuf import message -import aioesphomeapi.api_pb2 as pb -from aioesphomeapi.core import APIConnectionError, MESSAGE_TYPE_TO_PROTO +from aioesphomeapi.api_pb2 import ( # type: ignore + ConnectRequest, + ConnectResponse, + DisconnectRequest, + DisconnectResponse, + GetTimeRequest, + GetTimeResponse, + HelloRequest, + HelloResponse, + PingRequest, + PingResponse, +) +from aioesphomeapi.core import MESSAGE_TYPE_TO_PROTO, APIConnectionError from aioesphomeapi.model import APIVersion from aioesphomeapi.util import _bytes_to_varuint, _varuint_to_bytes, resolve_ip_address @@ -24,26 +35,27 @@ class ConnectionParams: password = attr.ib(type=Optional[str]) client_info = attr.ib(type=str) keepalive = attr.ib(type=float) - zeroconf_instance = attr.ib(type=zeroconf.Zeroconf) + zeroconf_instance = attr.ib(type=Optional[zeroconf.Zeroconf]) + class APIConnection: - def __init__(self, params: ConnectionParams, on_stop): + def __init__( + self, params: ConnectionParams, on_stop: Callable[[], Awaitable[None]] + ): self._params = params self.on_stop = on_stop self._stopped = False - self._socket = None # type: Optional[socket.socket] - self._socket_reader = None # type: Optional[asyncio.StreamReader] - self._socket_writer = None # type: Optional[asyncio.StreamWriter] + self._socket: Optional[socket.socket] = None + self._socket_reader: Optional[asyncio.StreamReader] = None + self._socket_writer: Optional[asyncio.StreamWriter] = None self._write_lock = asyncio.Lock() self._connected = False self._authenticated = False self._socket_connected = False self._state_lock = asyncio.Lock() - self._api_version = None # type: Optional[APIVersion] + self._api_version: Optional[APIVersion] = None - self._message_handlers = [] # type: List[Callable[[message], None]] - - self._running_task = None # type: Optional[asyncio.Task] + self._message_handlers: List[Callable[[message.Message], None]] = [] def _start_ping(self) -> None: async def func() -> None: @@ -66,7 +78,8 @@ class APIConnection: if not self._socket_connected: return async with self._write_lock: - self._socket_writer.close() + if self._socket_writer is not None: + self._socket_writer.close() self._socket_writer = None self._socket_reader = None if self._socket is not None: @@ -85,8 +98,6 @@ class APIConnection: except APIConnectionError: pass self._stopped = True - if self._running_task is not None: - self._running_task.cancel() await self._close_socket() await self.on_stop() @@ -100,8 +111,12 @@ class APIConnection: raise APIConnectionError("Already connected!") try: - coro = resolve_ip_address(self._params.eventloop, self._params.address, - self._params.port, self._params.zeroconf_instance) + coro = resolve_ip_address( + self._params.eventloop, + self._params.address, + self._params.port, + self._params.zeroconf_instance, + ) sockaddr = await asyncio.wait_for(coro, 30.0) except APIConnectionError as err: await self._on_error() @@ -114,40 +129,51 @@ class APIConnection: self._socket.setblocking(False) self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - _LOGGER.debug("%s: Connecting to %s:%s (%s)", self._params.address, - self._params.address, self._params.port, sockaddr) + _LOGGER.debug( + "%s: Connecting to %s:%s (%s)", + self._params.address, + self._params.address, + self._params.port, + sockaddr, + ) try: - coro = self._params.eventloop.sock_connect(self._socket, sockaddr) - await asyncio.wait_for(coro, 30.0) + coro2 = self._params.eventloop.sock_connect(self._socket, sockaddr) + await asyncio.wait_for(coro2, 30.0) except OSError as err: await self._on_error() - raise APIConnectionError( - "Error connecting to {}: {}".format(sockaddr, err)) + raise APIConnectionError("Error connecting to {}: {}".format(sockaddr, err)) except asyncio.TimeoutError: await self._on_error() - raise APIConnectionError( - "Timeout while connecting to {}".format(sockaddr)) + raise APIConnectionError("Timeout while connecting to {}".format(sockaddr)) _LOGGER.debug("%s: Opened socket for", self._params.address) - self._socket_reader, self._socket_writer = await asyncio.open_connection(sock=self._socket) + self._socket_reader, self._socket_writer = await asyncio.open_connection( + sock=self._socket + ) self._socket_connected = True self._params.eventloop.create_task(self.run_forever()) - hello = pb.HelloRequest() + hello = HelloRequest() hello.client_info = self._params.client_info try: - resp = await self.send_message_await_response(hello, pb.HelloResponse) + resp = await self.send_message_await_response(hello, HelloResponse) except APIConnectionError as err: await self._on_error() raise err - _LOGGER.debug("%s: Successfully connected ('%s' API=%s.%s)", - self._params.address, resp.server_info, resp.api_version_major, - resp.api_version_minor) - self._api_version = APIVersion( - resp.api_version_major, resp.api_version_minor) + _LOGGER.debug( + "%s: Successfully connected ('%s' API=%s.%s)", + self._params.address, + resp.server_info, + resp.api_version_major, + resp.api_version_minor, + ) + self._api_version = APIVersion(resp.api_version_major, resp.api_version_minor) if self._api_version.major > 2: - _LOGGER.error("%s: Incompatible version %s! Closing connection", - self._params.address, self._api_version.major) + _LOGGER.error( + "%s: Incompatible version %s! Closing connection", + self._params.address, + self._api_version.major, + ) await self._on_error() raise APIConnectionError("Incompatible API version.") self._connected = True @@ -159,10 +185,10 @@ class APIConnection: if self._authenticated: raise APIConnectionError("Already logged in!") - connect = pb.ConnectRequest() + connect = ConnectRequest() if self._params.password is not None: connect.password = self._params.password - resp = await self.send_message_await_response(connect, pb.ConnectResponse) + resp = await self.send_message_await_response(connect, ConnectResponse) if resp.invalid_password: raise APIConnectionError("Invalid password!") @@ -187,12 +213,12 @@ class APIConnection: raise APIConnectionError("Socket is not connected") try: async with self._write_lock: - self._socket_writer.write(data) - await self._socket_writer.drain() + if self._socket_writer is not None: + self._socket_writer.write(data) + await self._socket_writer.drain() except OSError as err: await self._on_error() - raise APIConnectionError( - "Error while writing data: {}".format(err)) + 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(): @@ -202,8 +228,7 @@ class APIConnection: raise ValueError encoded = msg.SerializeToString() - _LOGGER.debug("%s: Sending %s: %s", - self._params.address, type(msg), str(msg)) + _LOGGER.debug("%s: Sending %s: %s", self._params.address, type(msg), str(msg)) req = bytes([0]) req += _varuint_to_bytes(len(encoded)) # pylint: disable=undefined-loop-variable @@ -211,19 +236,23 @@ class APIConnection: req += encoded await self._write(req) - async def send_message_callback_response(self, send_msg: message.Message, - on_message: Callable[[Any], None]) -> None: + async def send_message_callback_response( + self, send_msg: message.Message, on_message: Callable[[Any], None] + ) -> None: self._message_handlers.append(on_message) await self.send_message(send_msg) - async def send_message_await_response_complex(self, send_msg: message.Message, - do_append: Callable[[Any], bool], - do_stop: Callable[[Any], bool], - timeout: float = 5.0) -> List[Any]: + async def send_message_await_response_complex( + self, + send_msg: message.Message, + do_append: Callable[[Any], bool], + do_stop: Callable[[Any], bool], + timeout: float = 5.0, + ) -> List[Any]: fut = self._params.eventloop.create_future() responses = [] - def on_message(resp): + def on_message(resp: message.Message) -> None: if fut.done(): return if do_append(resp): @@ -238,8 +267,7 @@ class APIConnection: await asyncio.wait_for(fut, timeout) except asyncio.TimeoutError: if self._stopped: - raise APIConnectionError( - "Disconnected while waiting for API response!") + raise APIConnectionError("Disconnected while waiting for API response!") raise APIConnectionError("Timeout while waiting for API response!") try: @@ -249,17 +277,17 @@ class APIConnection: return responses - async def send_message_await_response(self, - send_msg: message.Message, - response_type: Any, timeout: float = 5.0) -> Any: - def is_response(msg): + async def send_message_await_response( + self, send_msg: message.Message, response_type: Any, timeout: float = 5.0 + ) -> Any: + def is_response(msg: message.Message) -> bool: return isinstance(msg, response_type) res = await self.send_message_await_response_complex( - send_msg, is_response, is_response, timeout=timeout) + send_msg, is_response, is_response, timeout=timeout + ) if len(res) != 1: - raise APIConnectionError( - "Expected one result, got {}".format(len(res))) + raise APIConnectionError("Expected one result, got {}".format(len(res))) return res[0] @@ -268,10 +296,10 @@ class APIConnection: return bytes() try: + assert self._socket_reader is not None ret = await self._socket_reader.readexactly(amount) except (asyncio.IncompleteReadError, OSError, TimeoutError) as err: - raise APIConnectionError( - "Error while receiving data: {}".format(err)) + raise APIConnectionError("Error while receiving data: {}".format(err)) return ret @@ -291,8 +319,9 @@ class APIConnection: raw_msg = await self._recv(length) if msg_type not in MESSAGE_TYPE_TO_PROTO: - _LOGGER.debug("%s: Skipping message type %s", - self._params.address, msg_type) + _LOGGER.debug( + "%s: Skipping message type %s", self._params.address, msg_type + ) return msg = MESSAGE_TYPE_TO_PROTO[msg_type]() @@ -300,8 +329,9 @@ class APIConnection: msg.ParseFromString(raw_msg) except Exception as e: raise APIConnectionError("Invalid protobuf message: {}".format(e)) - _LOGGER.debug("%s: Got message of type %s: %s", - self._params.address, type(msg), msg) + _LOGGER.debug( + "%s: Got message of type %s: %s", self._params.address, type(msg), msg + ) for msg_handler in self._message_handlers[:]: msg_handler(msg) await self._handle_internal_messages(msg) @@ -311,36 +341,44 @@ class APIConnection: try: await self._run_once() except APIConnectionError as err: - _LOGGER.info("%s: Error while reading incoming messages: %s", - self._params.address, err) + _LOGGER.info( + "%s: Error while reading incoming messages: %s", + self._params.address, + err, + ) await self._on_error() break except Exception as err: # pylint: disable=broad-except - _LOGGER.info("%s: Unexpected error while reading incoming messages: %s", - self._params.address, err) + _LOGGER.info( + "%s: Unexpected error while reading incoming messages: %s", + self._params.address, + err, + ) await self._on_error() break async def _handle_internal_messages(self, msg: Any) -> None: - if isinstance(msg, pb.DisconnectRequest): - await self.send_message(pb.DisconnectResponse()) + if isinstance(msg, DisconnectRequest): + await self.send_message(DisconnectResponse()) await self.stop(force=True) - elif isinstance(msg, pb.PingRequest): - await self.send_message(pb.PingResponse()) - elif isinstance(msg, pb.GetTimeRequest): - resp = pb.GetTimeResponse() + elif isinstance(msg, PingRequest): + await self.send_message(PingResponse()) + elif isinstance(msg, GetTimeRequest): + resp = GetTimeResponse() resp.epoch_seconds = int(time.time()) await self.send_message(resp) async def ping(self) -> None: self._check_connected() - await self.send_message_await_response(pb.PingRequest(), pb.PingResponse) + await self.send_message_await_response(PingRequest(), PingResponse) async def _disconnect(self) -> None: self._check_connected() try: - await self.send_message_await_response(pb.DisconnectRequest(), pb.DisconnectResponse) + await self.send_message_await_response( + DisconnectRequest(), DisconnectResponse + ) except APIConnectionError: pass diff --git a/aioesphomeapi/core.py b/aioesphomeapi/core.py index f9f999d..ec5c5c9 100644 --- a/aioesphomeapi/core.py +++ b/aioesphomeapi/core.py @@ -1,4 +1,53 @@ -import aioesphomeapi.api_pb2 as pb +from aioesphomeapi.api_pb2 import ( # type: ignore + BinarySensorStateResponse, + CameraImageRequest, + CameraImageResponse, + ClimateCommandRequest, + ClimateStateResponse, + ConnectRequest, + ConnectResponse, + CoverCommandRequest, + CoverStateResponse, + DeviceInfoRequest, + DeviceInfoResponse, + DisconnectRequest, + DisconnectResponse, + ExecuteServiceRequest, + FanCommandRequest, + FanStateResponse, + GetTimeRequest, + GetTimeResponse, + HelloRequest, + HelloResponse, + HomeassistantServiceResponse, + HomeAssistantStateResponse, + LightCommandRequest, + LightStateResponse, + ListEntitiesBinarySensorResponse, + ListEntitiesCameraResponse, + ListEntitiesClimateResponse, + ListEntitiesCoverResponse, + ListEntitiesDoneResponse, + ListEntitiesFanResponse, + ListEntitiesLightResponse, + ListEntitiesRequest, + ListEntitiesSensorResponse, + ListEntitiesServicesResponse, + ListEntitiesSwitchResponse, + ListEntitiesTextSensorResponse, + PingRequest, + PingResponse, + SensorStateResponse, + SubscribeHomeassistantServicesRequest, + SubscribeHomeAssistantStateResponse, + SubscribeHomeAssistantStatesRequest, + SubscribeLogsRequest, + SubscribeLogsResponse, + SubscribeStatesRequest, + SwitchCommandRequest, + SwitchStateResponse, + TextSensorStateResponse, +) class APIConnectionError(Exception): @@ -6,52 +55,52 @@ class APIConnectionError(Exception): 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, - 34: pb.SubscribeHomeassistantServicesRequest, - 35: pb.HomeassistantServiceResponse, - 36: pb.GetTimeRequest, - 37: pb.GetTimeResponse, - 38: pb.SubscribeHomeAssistantStatesRequest, - 39: pb.SubscribeHomeAssistantStateResponse, - 40: pb.HomeAssistantStateResponse, - 41: pb.ListEntitiesServicesResponse, - 42: pb.ExecuteServiceRequest, - 43: pb.ListEntitiesCameraResponse, - 44: pb.CameraImageResponse, - 45: pb.CameraImageRequest, - 46: pb.ListEntitiesClimateResponse, - 47: pb.ClimateStateResponse, - 48: pb.ClimateCommandRequest, + 1: HelloRequest, + 2: HelloResponse, + 3: ConnectRequest, + 4: ConnectResponse, + 5: DisconnectRequest, + 6: DisconnectResponse, + 7: PingRequest, + 8: PingResponse, + 9: DeviceInfoRequest, + 10: DeviceInfoResponse, + 11: ListEntitiesRequest, + 12: ListEntitiesBinarySensorResponse, + 13: ListEntitiesCoverResponse, + 14: ListEntitiesFanResponse, + 15: ListEntitiesLightResponse, + 16: ListEntitiesSensorResponse, + 17: ListEntitiesSwitchResponse, + 18: ListEntitiesTextSensorResponse, + 19: ListEntitiesDoneResponse, + 20: SubscribeStatesRequest, + 21: BinarySensorStateResponse, + 22: CoverStateResponse, + 23: FanStateResponse, + 24: LightStateResponse, + 25: SensorStateResponse, + 26: SwitchStateResponse, + 27: TextSensorStateResponse, + 28: SubscribeLogsRequest, + 29: SubscribeLogsResponse, + 30: CoverCommandRequest, + 31: FanCommandRequest, + 32: LightCommandRequest, + 33: SwitchCommandRequest, + 34: SubscribeHomeassistantServicesRequest, + 35: HomeassistantServiceResponse, + 36: GetTimeRequest, + 37: GetTimeResponse, + 38: SubscribeHomeAssistantStatesRequest, + 39: SubscribeHomeAssistantStateResponse, + 40: HomeAssistantStateResponse, + 41: ListEntitiesServicesResponse, + 42: ExecuteServiceRequest, + 43: ListEntitiesCameraResponse, + 44: CameraImageResponse, + 45: CameraImageRequest, + 46: ListEntitiesClimateResponse, + 47: ClimateStateResponse, + 48: ClimateCommandRequest, } diff --git a/aioesphomeapi/host_resolver.py b/aioesphomeapi/host_resolver.py index f37ba3d..28a9783 100644 --- a/aioesphomeapi/host_resolver.py +++ b/aioesphomeapi/host_resolver.py @@ -1,15 +1,18 @@ import socket import time +from typing import Optional import zeroconf class HostResolver(zeroconf.RecordUpdateListener): - def __init__(self, name): + def __init__(self, name: str): self.name = name - self.address = None + self.address: Optional[bytes] = None - def update_record(self, zc, now, record): + def update_record( + self, zc: zeroconf.Zeroconf, now: float, record: zeroconf.DNSRecord + ) -> None: if record is None: return if record.type == zeroconf._TYPE_A: @@ -17,15 +20,17 @@ class HostResolver(zeroconf.RecordUpdateListener): if record.name == self.name: self.address = record.address - def request(self, zc, timeout): + def request(self, zc: zeroconf.Zeroconf, timeout: float) -> bool: now = time.time() delay = 0.2 next_ = now + delay last = now + timeout try: - zc.add_listener(self, zeroconf.DNSQuestion(self.name, zeroconf._TYPE_ANY, - zeroconf._CLASS_IN)) + zc.add_listener( + self, + zeroconf.DNSQuestion(self.name, zeroconf._TYPE_ANY, zeroconf._CLASS_IN), + ) while self.address is None: if last <= now: # Timeout @@ -33,10 +38,16 @@ class HostResolver(zeroconf.RecordUpdateListener): if next_ <= now: out = zeroconf.DNSOutgoing(zeroconf._FLAGS_QR_QUERY) out.add_question( - zeroconf.DNSQuestion(self.name, zeroconf._TYPE_A, zeroconf._CLASS_IN)) + zeroconf.DNSQuestion( + self.name, zeroconf._TYPE_A, zeroconf._CLASS_IN + ) + ) out.add_answer_at_time( - zc.cache.get_by_details(self.name, zeroconf._TYPE_A, - zeroconf._CLASS_IN), now) + zc.cache.get_by_details( + self.name, zeroconf._TYPE_A, zeroconf._CLASS_IN + ), + now, + ) zc.send(out) next_ = now + delay delay *= 2 @@ -49,27 +60,38 @@ class HostResolver(zeroconf.RecordUpdateListener): return True -def resolve_host(host, timeout=3.0, zeroconf_instance: zeroconf.Zeroconf = None): - from aioesphomeapi import APIConnectionError +def resolve_host( + host: str, + timeout: float = 3.0, + zeroconf_instance: Optional[zeroconf.Zeroconf] = None, +) -> str: + from aioesphomeapi.core import APIConnectionError try: zc = zeroconf_instance or zeroconf.Zeroconf() except Exception: - raise APIConnectionError("Cannot start mDNS sockets, is this a docker container without " - "host network mode?") + raise APIConnectionError( + "Cannot start mDNS sockets, is this a docker container without " + "host network mode?" + ) try: - info = HostResolver(host + '.') + info = HostResolver(host + ".") + assert info.address is not None address = None if info.request(zc, timeout): address = socket.inet_ntoa(info.address) except Exception as err: - raise APIConnectionError("Error resolving mDNS hostname: {}".format(err)) + raise APIConnectionError( + "Error resolving mDNS hostname: {}".format(err) + ) from err finally: if not zeroconf_instance: zc.close() if address is None: - raise APIConnectionError("Error resolving address with mDNS: Did not respond. " - "Maybe the device is offline.") + raise APIConnectionError( + "Error resolving address with mDNS: Did not respond. " + "Maybe the device is offline." + ) return address diff --git a/aioesphomeapi/model.py b/aioesphomeapi/model.py index 38dbac7..74d2137 100644 --- a/aioesphomeapi/model.py +++ b/aioesphomeapi/model.py @@ -1,19 +1,23 @@ import enum -from typing import List, Dict, TypeVar, Optional, Type +from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Type, TypeVar import attr +if TYPE_CHECKING: + from .api_pb2 import HomeassistantServiceMap # type: ignore + # All fields in here should have defaults set # Home Assistant depends on these fields being constructible # with args from a previous version of Home Assistant. # The default value should *always* be the Protobuf default value # for a field (False, 0, empty string, enum with value 0, ...) +_T = TypeVar("_T", bound="APIIntEnum") -_T = TypeVar('_T') class APIIntEnum(enum.IntEnum): """Base class for int enum values in API model.""" + @classmethod def convert(cls: Type[_T], value: int) -> Optional[_T]: try: @@ -41,20 +45,20 @@ class APIVersion: @attr.s class DeviceInfo: uses_password = attr.ib(type=bool, default=False) - name = attr.ib(type=str, default='') - mac_address = attr.ib(type=str, default='') - compilation_time = attr.ib(type=str, default='') - model = attr.ib(type=str, default='') + name = attr.ib(type=str, default="") + mac_address = attr.ib(type=str, default="") + compilation_time = attr.ib(type=str, default="") + model = attr.ib(type=str, default="") has_deep_sleep = attr.ib(type=bool, default=False) - esphome_version = attr.ib(type=str, default='') + esphome_version = attr.ib(type=str, default="") @attr.s class EntityInfo: - object_id = attr.ib(type=str, default='') + object_id = attr.ib(type=str, default="") key = attr.ib(type=int, default=0) - name = attr.ib(type=str, default='') - unique_id = attr.ib(type=str, default='') + name = attr.ib(type=str, default="") + unique_id = attr.ib(type=str, default="") @attr.s @@ -65,7 +69,7 @@ class EntityState: # ==================== BINARY SENSOR ==================== @attr.s class BinarySensorInfo(EntityInfo): - device_class = attr.ib(type=str, default='') + device_class = attr.ib(type=str, default="") is_status_binary_sensor = attr.ib(type=bool, default=False) @@ -81,7 +85,7 @@ class CoverInfo(EntityInfo): assumed_state = attr.ib(type=bool, default=False) supports_position = attr.ib(type=bool, default=False) supports_tilt = attr.ib(type=bool, default=False) - device_class = attr.ib(type=str, default='') + device_class = attr.ib(type=str, default="") class LegacyCoverState(APIIntEnum): @@ -103,14 +107,20 @@ class CoverOperation(APIIntEnum): @attr.s class CoverState(EntityState): - legacy_state = attr.ib(type=Optional[LegacyCoverState], converter=LegacyCoverState.convert, - default=LegacyCoverState.OPEN) + legacy_state = attr.ib( + type=LegacyCoverState, + converter=LegacyCoverState.convert, # type: ignore + default=LegacyCoverState.OPEN, + ) position = attr.ib(type=float, default=0.0) tilt = attr.ib(type=float, default=0.0) - current_operation = attr.ib(type=Optional[CoverOperation], converter=CoverOperation.convert, - default=CoverOperation.IDLE) + current_operation = attr.ib( + type=CoverOperation, + converter=CoverOperation.convert, # type: ignore + default=CoverOperation.IDLE, + ) - def is_closed(self, api_version: APIVersion): + def is_closed(self, api_version: APIVersion) -> bool: if api_version >= APIVersion(1, 1): return self.position == 0.0 return self.legacy_state == LegacyCoverState.CLOSED @@ -140,9 +150,17 @@ class FanDirection(APIIntEnum): class FanState(EntityState): state = attr.ib(type=bool, default=False) oscillating = attr.ib(type=bool, default=False) - speed = attr.ib(type=Optional[FanSpeed], converter=FanSpeed.convert, default=FanSpeed.LOW) + speed = attr.ib( + type=Optional[FanSpeed], + converter=FanSpeed.convert, # type: ignore + default=FanSpeed.LOW, + ) speed_level = attr.ib(type=int, default=0) - direction = attr.ib(type=Optional[FanDirection], converter=FanDirection.convert, default=FanDirection.FORWARD) + direction = attr.ib( + type=FanDirection, + converter=FanDirection.convert, # type: ignore + default=FanDirection.FORWARD, + ) # ==================== LIGHT ==================== @@ -166,7 +184,7 @@ class LightState(EntityState): blue = attr.ib(type=float, default=0.0) white = attr.ib(type=float, default=0.0) color_temperature = attr.ib(type=float, default=0.0) - effect = attr.ib(type=str, default='') + effect = attr.ib(type=str, default="") # ==================== SENSOR ==================== @@ -174,14 +192,19 @@ class SensorStateClass(APIIntEnum): NONE = 0 MEASUREMENT = 1 + @attr.s class SensorInfo(EntityInfo): - icon = attr.ib(type=str, default='') - device_class = attr.ib(type=str, default='') - unit_of_measurement = attr.ib(type=str, default='') + icon = attr.ib(type=str, default="") + device_class = attr.ib(type=str, default="") + unit_of_measurement = attr.ib(type=str, default="") accuracy_decimals = attr.ib(type=int, default=0) force_update = attr.ib(type=bool, default=False) - state_class = attr.ib(type=Optional[SensorStateClass], converter=SensorStateClass.convert, default=SensorStateClass.NONE) + state_class = attr.ib( + type=SensorStateClass, + converter=SensorStateClass.convert, # type: ignore + default=SensorStateClass.NONE, + ) @attr.s @@ -193,7 +216,7 @@ class SensorState(EntityState): # ==================== SWITCH ==================== @attr.s class SwitchInfo(EntityInfo): - icon = attr.ib(type=str, default='') + icon = attr.ib(type=str, default="") assumed_state = attr.ib(type=bool, default=False) @@ -205,12 +228,12 @@ class SwitchState(EntityState): # ==================== TEXT SENSOR ==================== @attr.s class TextSensorInfo(EntityInfo): - icon = attr.ib(type=str, default='') + icon = attr.ib(type=str, default="") @attr.s class TextSensorState(EntityState): - state = attr.ib(type=str, default='') + state = attr.ib(type=str, default="") missing_state = attr.ib(type=bool, default=False) @@ -267,68 +290,90 @@ class ClimateAction(APIIntEnum): class ClimateInfo(EntityInfo): supports_current_temperature = attr.ib(type=bool, default=False) supports_two_point_target_temperature = attr.ib(type=bool, default=False) - supported_modes = attr.ib(type=List[ClimateMode], converter=ClimateMode.convert_list, - factory=list) + supported_modes = attr.ib( + type=List[ClimateMode], + converter=ClimateMode.convert_list, # type: ignore + factory=list, + ) visual_min_temperature = attr.ib(type=float, default=0.0) visual_max_temperature = attr.ib(type=float, default=0.0) visual_temperature_step = attr.ib(type=float, default=0.0) supports_away = attr.ib(type=bool, default=False) supports_action = attr.ib(type=bool, default=False) supported_fan_modes = attr.ib( - type=List[ClimateFanMode], converter=ClimateFanMode.convert_list, factory=list + type=List[ClimateFanMode], + converter=ClimateFanMode.convert_list, # type: ignore + factory=list, ) supported_swing_modes = attr.ib( - type=List[ClimateSwingMode], converter=ClimateSwingMode.convert_list, factory=list + type=List[ClimateSwingMode], + converter=ClimateSwingMode.convert_list, # type: ignore + factory=list, ) @attr.s class ClimateState(EntityState): - mode = attr.ib(type=Optional[ClimateMode], converter=ClimateMode.convert, - default=ClimateMode.OFF) - action = attr.ib(type=Optional[ClimateAction], converter=ClimateAction.convert, - default=ClimateAction.OFF) + mode = attr.ib( + type=ClimateMode, + converter=ClimateMode.convert, # type: ignore + default=ClimateMode.OFF, + ) + action = attr.ib( + type=ClimateAction, + converter=ClimateAction.convert, # type: ignore + default=ClimateAction.OFF, + ) current_temperature = attr.ib(type=float, default=0.0) target_temperature = attr.ib(type=float, default=0.0) target_temperature_low = attr.ib(type=float, default=0.0) target_temperature_high = attr.ib(type=float, default=0.0) away = attr.ib(type=bool, default=False) fan_mode = attr.ib( - type=Optional[ClimateFanMode], converter=ClimateFanMode.convert, default=ClimateFanMode.ON + type=Optional[ClimateFanMode], + converter=ClimateFanMode.convert, # type: ignore + default=ClimateFanMode.ON, ) swing_mode = attr.ib( - type=Optional[ClimateSwingMode], converter=ClimateSwingMode.convert, default=ClimateSwingMode.OFF + type=Optional[ClimateSwingMode], + converter=ClimateSwingMode.convert, # type: ignore + default=ClimateSwingMode.OFF, ) COMPONENT_TYPE_TO_INFO = { - 'binary_sensor': BinarySensorInfo, - 'cover': CoverInfo, - 'fan': FanInfo, - 'light': LightInfo, - 'sensor': SensorInfo, - 'switch': SwitchInfo, - 'text_sensor': TextSensorInfo, - 'camera': CameraInfo, - 'climate': ClimateInfo, + "binary_sensor": BinarySensorInfo, + "cover": CoverInfo, + "fan": FanInfo, + "light": LightInfo, + "sensor": SensorInfo, + "switch": SwitchInfo, + "text_sensor": TextSensorInfo, + "camera": CameraInfo, + "climate": ClimateInfo, } # ==================== USER-DEFINED SERVICES ==================== -def _convert_homeassistant_service_map(value): +def _convert_homeassistant_service_map( + value: Iterable["HomeassistantServiceMap"], +) -> Dict[str, str]: return {v.key: v.value for v in value} @attr.s class HomeassistantServiceCall: - service = attr.ib(type=str, default='') + service = attr.ib(type=str, default="") is_event = attr.ib(type=bool, default=False) - data = attr.ib(type=Dict[str, str], converter=_convert_homeassistant_service_map, - factory=dict) - data_template = attr.ib(type=Dict[str, str], converter=_convert_homeassistant_service_map, - factory=dict) - variables = attr.ib(type=Dict[str, str], converter=_convert_homeassistant_service_map, - factory=dict) + data = attr.ib( + type=Dict[str, str], converter=_convert_homeassistant_service_map, factory=dict + ) + data_template = attr.ib( + type=Dict[str, str], converter=_convert_homeassistant_service_map, factory=dict + ) + variables = attr.ib( + type=Dict[str, str], converter=_convert_homeassistant_service_map, factory=dict + ) class UserServiceArgType(APIIntEnum): @@ -342,37 +387,43 @@ class UserServiceArgType(APIIntEnum): STRING_ARRAY = 7 -def _attr_obj_from_dict(cls, **kwargs): - return cls(**{key: kwargs[key] for key in attr.fields_dict(cls)}) +_K = TypeVar("_K") + + +def _attr_obj_from_dict(cls: Type[_K], **kwargs: Any) -> _K: + return cls(**{key: kwargs[key] for key in attr.fields_dict(cls)}) # type: ignore @attr.s class UserServiceArg: - name = attr.ib(type=str, default='') - type_ = attr.ib(type=Optional[UserServiceArgType], converter=UserServiceArgType.convert, - default=UserServiceArgType.BOOL) + name = attr.ib(type=str, default="") + type_ = attr.ib( + type=UserServiceArgType, + converter=UserServiceArgType.convert, # type: ignore + default=UserServiceArgType.BOOL, + ) @attr.s class UserService: - name = attr.ib(type=str, default='') + name = attr.ib(type=str, default="") key = attr.ib(type=int, default=0) args = attr.ib(type=List[UserServiceArg], converter=list, factory=list) - @staticmethod - def from_dict(dict_): + @classmethod + def from_dict(cls, dict_: Dict[str, Any]) -> "UserService": args = [] - for arg in dict_.get('args', []): + for arg in dict_.get("args", []): args.append(_attr_obj_from_dict(UserServiceArg, **arg)) - return UserService( - name=dict_.get('name', ''), - key=dict_.get('key', 0), - args=args + return cls( + name=dict_.get("name", ""), + key=dict_.get("key", 0), + args=args, # type: ignore ) - def to_dict(self): + def to_dict(self) -> Dict[str, Any]: return { - 'name': self.name, - 'key': self.key, - 'args': [attr.asdict(arg) for arg in self.args], + "name": self.name, + "key": self.key, + "args": [attr.asdict(arg) for arg in self.args], } diff --git a/aioesphomeapi/util.py b/aioesphomeapi/util.py index abcbad4..93c2a57 100644 --- a/aioesphomeapi/util.py +++ b/aioesphomeapi/util.py @@ -1,7 +1,8 @@ import asyncio import functools import socket -from typing import Optional, Tuple, Any +from typing import Any, Optional, Tuple + import zeroconf # pylint: disable=cyclic-import @@ -35,8 +36,9 @@ def _bytes_to_varuint(value: bytes) -> Optional[int]: return None -async def resolve_ip_address_getaddrinfo(eventloop: asyncio.events.AbstractEventLoop, - host: str, port: int) -> Tuple[Any, ...]: +async def resolve_ip_address_getaddrinfo( + eventloop: asyncio.events.AbstractEventLoop, host: str, port: int +) -> Tuple[Any, ...]: try: socket.inet_aton(host) @@ -46,8 +48,9 @@ async def resolve_ip_address_getaddrinfo(eventloop: asyncio.events.AbstractEvent return (host, port) try: - res = await eventloop.getaddrinfo(host, port, family=socket.AF_INET, - proto=socket.IPPROTO_TCP) + 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)) @@ -59,21 +62,25 @@ async def resolve_ip_address_getaddrinfo(eventloop: asyncio.events.AbstractEvent return sockaddr -async def resolve_ip_address(eventloop: asyncio.events.AbstractEventLoop, - host: str, port: int, - zeroconf_instance: zeroconf.Zeroconf = None) -> Tuple[Any, ...]: - if host.endswith('.local'): +async def resolve_ip_address( + eventloop: asyncio.events.AbstractEventLoop, + host: str, + port: int, + zeroconf_instance: Optional[zeroconf.Zeroconf] = None, +) -> Tuple[Any, ...]: + if host.endswith(".local"): from aioesphomeapi.host_resolver import resolve_host try: - return await eventloop.run_in_executor( - None, - functools.partial( - resolve_host, - host, - zeroconf_instance=zeroconf_instance - ) - ), port + return ( + await eventloop.run_in_executor( + None, + functools.partial( + resolve_host, host, zeroconf_instance=zeroconf_instance + ), + ), + port, + ) except APIConnectionError: pass return await resolve_ip_address_getaddrinfo(eventloop, host, port) diff --git a/gen-protoc.sh b/gen-protoc.sh deleted file mode 100755 index 100b2a3..0000000 --- a/gen-protoc.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -# Generate protobuf compiled files -protoc --python_out=aioesphomeapi -I aioesphomeapi aioesphomeapi/*.proto - -# https://github.com/protocolbuffers/protobuf/issues/1491 -sed -i 's/import api_options_pb2 as api__options__pb2/from . import api_options_pb2 as api__options__pb2/' aioesphomeapi/api_pb2.py diff --git a/pylintrc b/pylintrc index 6527274..c4035a0 100644 --- a/pylintrc +++ b/pylintrc @@ -14,3 +14,4 @@ disable= unused-wildcard-import, import-outside-toplevel, raise-missing-from, + duplicate-code, diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..59441a4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[tool.isort] +profile = "black" +multi_line_output = 3 +extend_skip = ["api_pb2.py", "api_options_pb2.py"] diff --git a/requirements_test.txt b/requirements_test.txt index fd8a623..2a09997 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1 +1,6 @@ pylint==2.8.3 +black==21.6b0 +flake8==3.9.2 +isort==5.8.0 +mypy==0.902 +types-protobuf==0.1.13 diff --git a/script/gen-protoc b/script/gen-protoc new file mode 100755 index 0000000..53ed718 --- /dev/null +++ b/script/gen-protoc @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +from subprocess import check_call +from pathlib import Path +import os + +root_dir = Path(__file__).absolute().parent.parent +os.chdir(root_dir) + +check_call([ + "protoc", "--python_out=aioesphomeapi", "-I", "aioesphomeapi", + "aioesphomeapi/api.proto", "aioesphomeapi/api_options.proto" +]) + +# https://github.com/protocolbuffers/protobuf/issues/1491 +api_file = root_dir / 'aioesphomeapi' / 'api_pb2.py' +content = api_file.read_text().replace( + "import api_options_pb2 as api__options__pb2", + "from . import api_options_pb2 as api__options__pb2" +) +api_file.write_text(content) + +for fname in ['api_pb2.py', 'api_options_pb2.py']: + file = root_dir / 'aioesphomeapi' / fname + content = '# type: ignore\n' + file.read_text() + file.write_text(content) diff --git a/script/lint b/script/lint new file mode 100755 index 0000000..75db083 --- /dev/null +++ b/script/lint @@ -0,0 +1,10 @@ +#!/bin/bash + +cd "$(dirname "$0")/.." +set -euxo pipefail + +black --safe --exclude 'api_pb2.py|api_options_pb2.py' aioesphomeapi +pylint aioesphomeapi +flake8 aioesphomeapi +isort aioesphomeapi +mypy --strict aioesphomeapi diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..bca7482 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,18 @@ +[flake8] +max-line-length = 120 +# Following 4 for black compatibility +# E501: line too long +# W503: Line break occurred before a binary operator +# E203: Whitespace before ':' +# D202 No blank lines allowed after function docstring + +ignore = + E501, + W503, + E203, + D202, + +exclude = api_pb2.py, api_options_pb2.py + +[bdist_wheel] +universal = 1