diff --git a/aioesphomeapi/api.proto b/aioesphomeapi/api.proto index ceb6459..e326574 100644 --- a/aioesphomeapi/api.proto +++ b/aioesphomeapi/api.proto @@ -92,7 +92,7 @@ message DeviceInfoResponse { // A string describing the date of compilation, this is generated by the compiler // and therefore may not be in the same format all the time. - // If the user isn't using esphomeyaml, this will also not be set. + // If the user isn't using ESPHome, this will also not be set. string compilation_time = 5; // The model of the board. For example NodeMCU @@ -339,3 +339,32 @@ message GetTimeResponse { fixed32 epoch_seconds = 1; } + + +message ListEntitiesServicesArgument { + string name = 1; + enum Type { + BOOL = 0; + INT = 1; + FLOAT = 2; + STRING = 3; + } + Type type = 2; +} +message ListEntitiesServicesResponse { + string name = 1; + fixed32 key = 2; + repeated ListEntitiesServicesArgument args = 3; +} + +message ExecuteServiceArgument { + bool bool_ = 1; + int32 int_ = 2; + float float_ = 3; + string string_ = 4; +} + +message ExecuteServiceRequest { + fixed32 key = 1; + repeated ExecuteServiceArgument args = 2; +} diff --git a/aioesphomeapi/api_pb2.py b/aioesphomeapi/api_pb2.py index 66debfb..6a06de4 100644 --- a/aioesphomeapi/api_pb2.py +++ b/aioesphomeapi/api_pb2.py @@ -20,7 +20,7 @@ DESCRIPTOR = _descriptor.FileDescriptor( package='', syntax='proto3', serialized_options=None, - serialized_pb=_b('\n\tapi.proto\"#\n\x0cHelloRequest\x12\x13\n\x0b\x63lient_info\x18\x01 \x01(\t\"Z\n\rHelloResponse\x12\x19\n\x11\x61pi_version_major\x18\x01 \x01(\r\x12\x19\n\x11\x61pi_version_minor\x18\x02 \x01(\r\x12\x13\n\x0bserver_info\x18\x03 \x01(\t\"\"\n\x0e\x43onnectRequest\x12\x10\n\x08password\x18\x01 \x01(\t\"+\n\x0f\x43onnectResponse\x12\x18\n\x10invalid_password\x18\x01 \x01(\x08\"\x13\n\x11\x44isconnectRequest\"\x14\n\x12\x44isconnectResponse\"\r\n\x0bPingRequest\"\x0e\n\x0cPingResponse\"\x13\n\x11\x44\x65viceInfoRequest\"\xad\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\x1c\n\x14\x65sphome_core_version\x18\x04 \x01(\t\x12\x18\n\x10\x63ompilation_time\x18\x05 \x01(\t\x12\r\n\x05model\x18\x06 \x01(\t\x12\x16\n\x0ehas_deep_sleep\x18\x07 \x01(\x08\"\x15\n\x13ListEntitiesRequest\"\x9a\x01\n ListEntitiesBinarySensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x14\n\x0c\x64\x65vice_class\x18\x05 \x01(\t\x12\x1f\n\x17is_status_binary_sensor\x18\x06 \x01(\x08\"s\n\x19ListEntitiesCoverResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x15\n\ris_optimistic\x18\x05 \x01(\x08\"\x90\x01\n\x17ListEntitiesFanResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1c\n\x14supports_oscillation\x18\x05 \x01(\x08\x12\x16\n\x0esupports_speed\x18\x06 \x01(\x08\"\x8a\x02\n\x19ListEntitiesLightResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1b\n\x13supports_brightness\x18\x05 \x01(\x08\x12\x14\n\x0csupports_rgb\x18\x06 \x01(\x08\x12\x1c\n\x14supports_white_value\x18\x07 \x01(\x08\x12\"\n\x1asupports_color_temperature\x18\x08 \x01(\x08\x12\x12\n\nmin_mireds\x18\t \x01(\x02\x12\x12\n\nmax_mireds\x18\n \x01(\x02\x12\x0f\n\x07\x65\x66\x66\x65\x63ts\x18\x0b \x03(\t\"\xa3\x01\n\x1aListEntitiesSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\x12\x1b\n\x13unit_of_measurement\x18\x06 \x01(\t\x12\x19\n\x11\x61\x63\x63uracy_decimals\x18\x07 \x01(\x05\"\x7f\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\x12\n\noptimistic\x18\x06 \x01(\x08\"o\n\x1eListEntitiesTextSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\"]\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\"\x1a\n\x18ListEntitiesDoneResponse\"\x18\n\x16SubscribeStatesRequest\"7\n\x19\x42inarySensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"t\n\x12\x43overStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12-\n\x05state\x18\x02 \x01(\x0e\x32\x1e.CoverStateResponse.CoverState\"\"\n\nCoverState\x12\x08\n\x04OPEN\x10\x00\x12\n\n\x06\x43LOSED\x10\x01\"]\n\x10\x46\x61nStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x13\n\x0boscillating\x18\x03 \x01(\x08\x12\x18\n\x05speed\x18\x04 \x01(\x0e\x32\t.FanSpeed\"\xa8\x01\n\x12LightStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x12\n\nbrightness\x18\x03 \x01(\x02\x12\x0b\n\x03red\x18\x04 \x01(\x02\x12\r\n\x05green\x18\x05 \x01(\x02\x12\x0c\n\x04\x62lue\x18\x06 \x01(\x02\x12\r\n\x05white\x18\x07 \x01(\x02\x12\x19\n\x11\x63olor_temperature\x18\x08 \x01(\x02\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\t \x01(\t\"1\n\x13SensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x02\"1\n\x13SwitchStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"5\n\x17TextSensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\t\">\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\"\x98\x01\n\x13\x43overCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\x32\n\x07\x63ommand\x18\x03 \x01(\x0e\x32!.CoverCommandRequest.CoverCommand\"-\n\x0c\x43overCommand\x12\x08\n\x04OPEN\x10\x00\x12\t\n\x05\x43LOSE\x10\x01\x12\x08\n\x04STOP\x10\x02\"\x9d\x01\n\x11\x46\x61nCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x11\n\thas_speed\x18\x04 \x01(\x08\x12\x18\n\x05speed\x18\x05 \x01(\x0e\x32\t.FanSpeed\x12\x17\n\x0fhas_oscillating\x18\x06 \x01(\x08\x12\x13\n\x0boscillating\x18\x07 \x01(\x08\"\x95\x03\n\x13LightCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x16\n\x0ehas_brightness\x18\x04 \x01(\x08\x12\x12\n\nbrightness\x18\x05 \x01(\x02\x12\x0f\n\x07has_rgb\x18\x06 \x01(\x08\x12\x0b\n\x03red\x18\x07 \x01(\x02\x12\r\n\x05green\x18\x08 \x01(\x02\x12\x0c\n\x04\x62lue\x18\t \x01(\x02\x12\x11\n\thas_white\x18\n \x01(\x08\x12\r\n\x05white\x18\x0b \x01(\x02\x12\x1d\n\x15has_color_temperature\x18\x0c \x01(\x08\x12\x19\n\x11\x63olor_temperature\x18\r \x01(\x02\x12\x1d\n\x15has_transition_length\x18\x0e \x01(\x08\x12\x19\n\x11transition_length\x18\x0f \x01(\r\x12\x18\n\x10has_flash_length\x18\x10 \x01(\x08\x12\x14\n\x0c\x66lash_length\x18\x11 \x01(\r\x12\x12\n\nhas_effect\x18\x12 \x01(\x08\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x13 \x01(\t\"2\n\x14SwitchCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"E\n\x14SubscribeLogsRequest\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12\x13\n\x0b\x64ump_config\x18\x02 \x01(\x08\"d\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\"\x1e\n\x1cSubscribeServiceCallsRequest\"\xdf\x02\n\x13ServiceCallResponse\x12\x0f\n\x07service\x18\x01 \x01(\t\x12,\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1e.ServiceCallResponse.DataEntry\x12=\n\rdata_template\x18\x03 \x03(\x0b\x32&.ServiceCallResponse.DataTemplateEntry\x12\x36\n\tvariables\x18\x04 \x03(\x0b\x32#.ServiceCallResponse.VariablesEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x33\n\x11\x44\x61taTemplateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x30\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"%\n#SubscribeHomeAssistantStatesRequest\"8\n#SubscribeHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\">\n\x1aHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\"\x10\n\x0eGetTimeRequest\"(\n\x0fGetTimeResponse\x12\x15\n\repoch_seconds\x18\x01 \x01(\x07*)\n\x08\x46\x61nSpeed\x12\x07\n\x03LOW\x10\x00\x12\n\n\x06MEDIUM\x10\x01\x12\x08\n\x04HIGH\x10\x02*]\n\x08LogLevel\x12\x08\n\x04NONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x08\n\x04WARN\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\x0b\n\x07VERBOSE\x10\x05\x12\x10\n\x0cVERY_VERBOSE\x10\x06\x62\x06proto3') + serialized_pb=_b('\n\tapi.proto\"#\n\x0cHelloRequest\x12\x13\n\x0b\x63lient_info\x18\x01 \x01(\t\"Z\n\rHelloResponse\x12\x19\n\x11\x61pi_version_major\x18\x01 \x01(\r\x12\x19\n\x11\x61pi_version_minor\x18\x02 \x01(\r\x12\x13\n\x0bserver_info\x18\x03 \x01(\t\"\"\n\x0e\x43onnectRequest\x12\x10\n\x08password\x18\x01 \x01(\t\"+\n\x0f\x43onnectResponse\x12\x18\n\x10invalid_password\x18\x01 \x01(\x08\"\x13\n\x11\x44isconnectRequest\"\x14\n\x12\x44isconnectResponse\"\r\n\x0bPingRequest\"\x0e\n\x0cPingResponse\"\x13\n\x11\x44\x65viceInfoRequest\"\xad\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\x1c\n\x14\x65sphome_core_version\x18\x04 \x01(\t\x12\x18\n\x10\x63ompilation_time\x18\x05 \x01(\t\x12\r\n\x05model\x18\x06 \x01(\t\x12\x16\n\x0ehas_deep_sleep\x18\x07 \x01(\x08\"\x15\n\x13ListEntitiesRequest\"\x9a\x01\n ListEntitiesBinarySensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x14\n\x0c\x64\x65vice_class\x18\x05 \x01(\t\x12\x1f\n\x17is_status_binary_sensor\x18\x06 \x01(\x08\"s\n\x19ListEntitiesCoverResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x15\n\ris_optimistic\x18\x05 \x01(\x08\"\x90\x01\n\x17ListEntitiesFanResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1c\n\x14supports_oscillation\x18\x05 \x01(\x08\x12\x16\n\x0esupports_speed\x18\x06 \x01(\x08\"\x8a\x02\n\x19ListEntitiesLightResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x1b\n\x13supports_brightness\x18\x05 \x01(\x08\x12\x14\n\x0csupports_rgb\x18\x06 \x01(\x08\x12\x1c\n\x14supports_white_value\x18\x07 \x01(\x08\x12\"\n\x1asupports_color_temperature\x18\x08 \x01(\x08\x12\x12\n\nmin_mireds\x18\t \x01(\x02\x12\x12\n\nmax_mireds\x18\n \x01(\x02\x12\x0f\n\x07\x65\x66\x66\x65\x63ts\x18\x0b \x03(\t\"\xa3\x01\n\x1aListEntitiesSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\x12\x1b\n\x13unit_of_measurement\x18\x06 \x01(\t\x12\x19\n\x11\x61\x63\x63uracy_decimals\x18\x07 \x01(\x05\"\x7f\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\x12\n\noptimistic\x18\x06 \x01(\x08\"o\n\x1eListEntitiesTextSensorResponse\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\x07\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\tunique_id\x18\x04 \x01(\t\x12\x0c\n\x04icon\x18\x05 \x01(\t\"\x1a\n\x18ListEntitiesDoneResponse\"\x18\n\x16SubscribeStatesRequest\"7\n\x19\x42inarySensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"t\n\x12\x43overStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12-\n\x05state\x18\x02 \x01(\x0e\x32\x1e.CoverStateResponse.CoverState\"\"\n\nCoverState\x12\x08\n\x04OPEN\x10\x00\x12\n\n\x06\x43LOSED\x10\x01\"]\n\x10\x46\x61nStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x13\n\x0boscillating\x18\x03 \x01(\x08\x12\x18\n\x05speed\x18\x04 \x01(\x0e\x32\t.FanSpeed\"\xa8\x01\n\x12LightStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\x12\x12\n\nbrightness\x18\x03 \x01(\x02\x12\x0b\n\x03red\x18\x04 \x01(\x02\x12\r\n\x05green\x18\x05 \x01(\x02\x12\x0c\n\x04\x62lue\x18\x06 \x01(\x02\x12\r\n\x05white\x18\x07 \x01(\x02\x12\x19\n\x11\x63olor_temperature\x18\x08 \x01(\x02\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\t \x01(\t\"1\n\x13SensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x02\"1\n\x13SwitchStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"5\n\x17TextSensorStateResponse\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\t\"\x98\x01\n\x13\x43overCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\x32\n\x07\x63ommand\x18\x03 \x01(\x0e\x32!.CoverCommandRequest.CoverCommand\"-\n\x0c\x43overCommand\x12\x08\n\x04OPEN\x10\x00\x12\t\n\x05\x43LOSE\x10\x01\x12\x08\n\x04STOP\x10\x02\"\x9d\x01\n\x11\x46\x61nCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x11\n\thas_speed\x18\x04 \x01(\x08\x12\x18\n\x05speed\x18\x05 \x01(\x0e\x32\t.FanSpeed\x12\x17\n\x0fhas_oscillating\x18\x06 \x01(\x08\x12\x13\n\x0boscillating\x18\x07 \x01(\x08\"\x95\x03\n\x13LightCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\x11\n\thas_state\x18\x02 \x01(\x08\x12\r\n\x05state\x18\x03 \x01(\x08\x12\x16\n\x0ehas_brightness\x18\x04 \x01(\x08\x12\x12\n\nbrightness\x18\x05 \x01(\x02\x12\x0f\n\x07has_rgb\x18\x06 \x01(\x08\x12\x0b\n\x03red\x18\x07 \x01(\x02\x12\r\n\x05green\x18\x08 \x01(\x02\x12\x0c\n\x04\x62lue\x18\t \x01(\x02\x12\x11\n\thas_white\x18\n \x01(\x08\x12\r\n\x05white\x18\x0b \x01(\x02\x12\x1d\n\x15has_color_temperature\x18\x0c \x01(\x08\x12\x19\n\x11\x63olor_temperature\x18\r \x01(\x02\x12\x1d\n\x15has_transition_length\x18\x0e \x01(\x08\x12\x19\n\x11transition_length\x18\x0f \x01(\r\x12\x18\n\x10has_flash_length\x18\x10 \x01(\x08\x12\x14\n\x0c\x66lash_length\x18\x11 \x01(\r\x12\x12\n\nhas_effect\x18\x12 \x01(\x08\x12\x0e\n\x06\x65\x66\x66\x65\x63t\x18\x13 \x01(\t\"2\n\x14SwitchCommandRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12\r\n\x05state\x18\x02 \x01(\x08\"E\n\x14SubscribeLogsRequest\x12\x18\n\x05level\x18\x01 \x01(\x0e\x32\t.LogLevel\x12\x13\n\x0b\x64ump_config\x18\x02 \x01(\x08\"d\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\"\x1e\n\x1cSubscribeServiceCallsRequest\"\xdf\x02\n\x13ServiceCallResponse\x12\x0f\n\x07service\x18\x01 \x01(\t\x12,\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x1e.ServiceCallResponse.DataEntry\x12=\n\rdata_template\x18\x03 \x03(\x0b\x32&.ServiceCallResponse.DataTemplateEntry\x12\x36\n\tvariables\x18\x04 \x03(\x0b\x32#.ServiceCallResponse.VariablesEntry\x1a+\n\tDataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x33\n\x11\x44\x61taTemplateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x30\n\x0eVariablesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"%\n#SubscribeHomeAssistantStatesRequest\"8\n#SubscribeHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\">\n\x1aHomeAssistantStateResponse\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\"\x10\n\x0eGetTimeRequest\"(\n\x0fGetTimeResponse\x12\x15\n\repoch_seconds\x18\x01 \x01(\x07\"\x90\x01\n\x1cListEntitiesServicesArgument\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x30\n\x04type\x18\x02 \x01(\x0e\x32\".ListEntitiesServicesArgument.Type\"0\n\x04Type\x12\x08\n\x04\x42OOL\x10\x00\x12\x07\n\x03INT\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\n\n\x06STRING\x10\x03\"f\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\"V\n\x16\x45xecuteServiceArgument\x12\r\n\x05\x62ool_\x18\x01 \x01(\x08\x12\x0c\n\x04int_\x18\x02 \x01(\x05\x12\x0e\n\x06\x66loat_\x18\x03 \x01(\x02\x12\x0f\n\x07string_\x18\x04 \x01(\t\"K\n\x15\x45xecuteServiceRequest\x12\x0b\n\x03key\x18\x01 \x01(\x07\x12%\n\x04\x61rgs\x18\x02 \x03(\x0b\x32\x17.ExecuteServiceArgument*)\n\x08\x46\x61nSpeed\x12\x07\n\x03LOW\x10\x00\x12\n\n\x06MEDIUM\x10\x01\x12\x08\n\x04HIGH\x10\x02*]\n\x08LogLevel\x12\x08\n\x04NONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x08\n\x04WARN\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\t\n\x05\x44\x45\x42UG\x10\x04\x12\x0b\n\x07VERBOSE\x10\x05\x12\x10\n\x0cVERY_VERBOSE\x10\x06\x62\x06proto3') ) _FANSPEED = _descriptor.EnumDescriptor( @@ -44,8 +44,8 @@ _FANSPEED = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=3981, - serialized_end=4022, + serialized_start=4238, + serialized_end=4279, ) _sym_db.RegisterEnumDescriptor(_FANSPEED) @@ -87,8 +87,8 @@ _LOGLEVEL = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=4024, - serialized_end=4117, + serialized_start=4281, + serialized_end=4374, ) _sym_db.RegisterEnumDescriptor(_LOGLEVEL) @@ -122,8 +122,8 @@ _COVERSTATERESPONSE_COVERSTATE = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=1903, - serialized_end=1937, + serialized_start=1808, + serialized_end=1842, ) _sym_db.RegisterEnumDescriptor(_COVERSTATERESPONSE_COVERSTATE) @@ -148,11 +148,41 @@ _COVERCOMMANDREQUEST_COVERCOMMAND = _descriptor.EnumDescriptor( ], containing_type=None, serialized_options=None, - serialized_start=2534, - serialized_end=2579, + serialized_start=2375, + serialized_end=2420, ) _sym_db.RegisterEnumDescriptor(_COVERCOMMANDREQUEST_COVERCOMMAND) +_LISTENTITIESSERVICESARGUMENT_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='ListEntitiesServicesArgument.Type', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='BOOL', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INT', index=1, number=1, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FLOAT', index=2, number=2, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STRING', index=3, number=3, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=3919, + serialized_end=3967, +) +_sym_db.RegisterEnumDescriptor(_LISTENTITIESSERVICESARGUMENT_TYPE) + _HELLOREQUEST = _descriptor.Descriptor( name='HelloRequest', @@ -999,58 +1029,6 @@ _LISTENTITIESTEXTSENSORRESPONSE = _descriptor.Descriptor( ) -_LISTENTITIESCAMERARESPONSE = _descriptor.Descriptor( - name='ListEntitiesCameraResponse', - full_name='ListEntitiesCameraResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - 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'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='key', full_name='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), - _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'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='unique_id', full_name='ListEntitiesCameraResponse.unique_id', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1615, - serialized_end=1708, -) - - _LISTENTITIESDONERESPONSE = _descriptor.Descriptor( name='ListEntitiesDoneResponse', full_name='ListEntitiesDoneResponse', @@ -1070,8 +1048,8 @@ _LISTENTITIESDONERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1710, - serialized_end=1736, + serialized_start=1615, + serialized_end=1641, ) @@ -1094,8 +1072,8 @@ _SUBSCRIBESTATESREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1738, - serialized_end=1762, + serialized_start=1643, + serialized_end=1667, ) @@ -1132,8 +1110,8 @@ _BINARYSENSORSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1764, - serialized_end=1819, + serialized_start=1669, + serialized_end=1724, ) @@ -1171,8 +1149,8 @@ _COVERSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1821, - serialized_end=1937, + serialized_start=1726, + serialized_end=1842, ) @@ -1223,8 +1201,8 @@ _FANSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=1939, - serialized_end=2032, + serialized_start=1844, + serialized_end=1937, ) @@ -1310,8 +1288,8 @@ _LIGHTSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2035, - serialized_end=2203, + serialized_start=1940, + serialized_end=2108, ) @@ -1348,8 +1326,8 @@ _SENSORSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2205, - serialized_end=2254, + serialized_start=2110, + serialized_end=2159, ) @@ -1386,8 +1364,8 @@ _SWITCHSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2256, - serialized_end=2305, + serialized_start=2161, + serialized_end=2210, ) @@ -1424,53 +1402,8 @@ _TEXTSENSORSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2307, - serialized_end=2360, -) - - -_CAMERAIMAGERESPONSE = _descriptor.Descriptor( - name='CameraImageResponse', - full_name='CameraImageResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='CameraImageResponse.key', index=0, - number=1, type=7, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='data', full_name='CameraImageResponse.data', index=1, - number=2, type=12, cpp_type=9, label=1, - 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), - _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), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2362, - serialized_end=2424, + serialized_start=2212, + serialized_end=2265, ) @@ -1515,8 +1448,8 @@ _COVERCOMMANDREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2427, - serialized_end=2579, + serialized_start=2268, + serialized_end=2420, ) @@ -1588,8 +1521,8 @@ _FANCOMMANDREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2582, - serialized_end=2739, + serialized_start=2423, + serialized_end=2580, ) @@ -1745,8 +1678,8 @@ _LIGHTCOMMANDREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=2742, - serialized_end=3147, + serialized_start=2583, + serialized_end=2988, ) @@ -1783,8 +1716,8 @@ _SWITCHCOMMANDREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3149, - serialized_end=3199, + serialized_start=2990, + serialized_end=3040, ) @@ -1821,8 +1754,8 @@ _SUBSCRIBELOGSREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3201, - serialized_end=3270, + serialized_start=3042, + serialized_end=3111, ) @@ -1873,8 +1806,8 @@ _SUBSCRIBELOGSRESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3272, - serialized_end=3372, + serialized_start=3113, + serialized_end=3213, ) @@ -1897,8 +1830,8 @@ _SUBSCRIBESERVICECALLSREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3374, - serialized_end=3404, + serialized_start=3215, + serialized_end=3245, ) @@ -1935,8 +1868,8 @@ _SERVICECALLRESPONSE_DATAENTRY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3612, - serialized_end=3655, + serialized_start=3453, + serialized_end=3496, ) _SERVICECALLRESPONSE_DATATEMPLATEENTRY = _descriptor.Descriptor( @@ -1972,8 +1905,8 @@ _SERVICECALLRESPONSE_DATATEMPLATEENTRY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3657, - serialized_end=3708, + serialized_start=3498, + serialized_end=3549, ) _SERVICECALLRESPONSE_VARIABLESENTRY = _descriptor.Descriptor( @@ -2009,8 +1942,8 @@ _SERVICECALLRESPONSE_VARIABLESENTRY = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3710, - serialized_end=3758, + serialized_start=3551, + serialized_end=3599, ) _SERVICECALLRESPONSE = _descriptor.Descriptor( @@ -2060,8 +1993,8 @@ _SERVICECALLRESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3407, - serialized_end=3758, + serialized_start=3248, + serialized_end=3599, ) @@ -2084,8 +2017,8 @@ _SUBSCRIBEHOMEASSISTANTSTATESREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3760, - serialized_end=3797, + serialized_start=3601, + serialized_end=3638, ) @@ -2115,8 +2048,8 @@ _SUBSCRIBEHOMEASSISTANTSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3799, - serialized_end=3855, + serialized_start=3640, + serialized_end=3696, ) @@ -2153,8 +2086,8 @@ _HOMEASSISTANTSTATERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3857, - serialized_end=3919, + serialized_start=3698, + serialized_end=3760, ) @@ -2177,8 +2110,8 @@ _GETTIMEREQUEST = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3921, - serialized_end=3937, + serialized_start=3762, + serialized_end=3778, ) @@ -2208,8 +2141,182 @@ _GETTIMERESPONSE = _descriptor.Descriptor( extension_ranges=[], oneofs=[ ], - serialized_start=3939, - serialized_end=3979, + serialized_start=3780, + serialized_end=3820, +) + + +_LISTENTITIESSERVICESARGUMENT = _descriptor.Descriptor( + name='ListEntitiesServicesArgument', + full_name='ListEntitiesServicesArgument', + filename=None, + file=DESCRIPTOR, + containing_type=None, + 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'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LISTENTITIESSERVICESARGUMENT_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3823, + serialized_end=3967, +) + + +_LISTENTITIESSERVICESRESPONSE = _descriptor.Descriptor( + name='ListEntitiesServicesResponse', + full_name='ListEntitiesServicesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + 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'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='key', full_name='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), + _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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3969, + serialized_end=4071, +) + + +_EXECUTESERVICEARGUMENT = _descriptor.Descriptor( + name='ExecuteServiceArgument', + full_name='ExecuteServiceArgument', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='bool_', full_name='ExecuteServiceArgument.bool_', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='int_', full_name='ExecuteServiceArgument.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), + _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), + _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'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4073, + serialized_end=4159, +) + + +_EXECUTESERVICEREQUEST = _descriptor.Descriptor( + name='ExecuteServiceRequest', + full_name='ExecuteServiceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='ExecuteServiceRequest.key', index=0, + number=1, type=7, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4161, + serialized_end=4236, ) _COVERSTATERESPONSE.fields_by_name['state'].enum_type = _COVERSTATERESPONSE_COVERSTATE @@ -2226,6 +2333,10 @@ _SERVICECALLRESPONSE_VARIABLESENTRY.containing_type = _SERVICECALLRESPONSE _SERVICECALLRESPONSE.fields_by_name['data'].message_type = _SERVICECALLRESPONSE_DATAENTRY _SERVICECALLRESPONSE.fields_by_name['data_template'].message_type = _SERVICECALLRESPONSE_DATATEMPLATEENTRY _SERVICECALLRESPONSE.fields_by_name['variables'].message_type = _SERVICECALLRESPONSE_VARIABLESENTRY +_LISTENTITIESSERVICESARGUMENT.fields_by_name['type'].enum_type = _LISTENTITIESSERVICESARGUMENT_TYPE +_LISTENTITIESSERVICESARGUMENT_TYPE.containing_type = _LISTENTITIESSERVICESARGUMENT +_LISTENTITIESSERVICESRESPONSE.fields_by_name['args'].message_type = _LISTENTITIESSERVICESARGUMENT +_EXECUTESERVICEREQUEST.fields_by_name['args'].message_type = _EXECUTESERVICEARGUMENT DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST DESCRIPTOR.message_types_by_name['HelloResponse'] = _HELLORESPONSE DESCRIPTOR.message_types_by_name['ConnectRequest'] = _CONNECTREQUEST @@ -2244,7 +2355,6 @@ DESCRIPTOR.message_types_by_name['ListEntitiesLightResponse'] = _LISTENTITIESLIG DESCRIPTOR.message_types_by_name['ListEntitiesSensorResponse'] = _LISTENTITIESSENSORRESPONSE DESCRIPTOR.message_types_by_name['ListEntitiesSwitchResponse'] = _LISTENTITIESSWITCHRESPONSE DESCRIPTOR.message_types_by_name['ListEntitiesTextSensorResponse'] = _LISTENTITIESTEXTSENSORRESPONSE -DESCRIPTOR.message_types_by_name['ListEntitiesCameraResponse'] = _LISTENTITIESCAMERARESPONSE DESCRIPTOR.message_types_by_name['ListEntitiesDoneResponse'] = _LISTENTITIESDONERESPONSE DESCRIPTOR.message_types_by_name['SubscribeStatesRequest'] = _SUBSCRIBESTATESREQUEST DESCRIPTOR.message_types_by_name['BinarySensorStateResponse'] = _BINARYSENSORSTATERESPONSE @@ -2254,7 +2364,6 @@ DESCRIPTOR.message_types_by_name['LightStateResponse'] = _LIGHTSTATERESPONSE DESCRIPTOR.message_types_by_name['SensorStateResponse'] = _SENSORSTATERESPONSE DESCRIPTOR.message_types_by_name['SwitchStateResponse'] = _SWITCHSTATERESPONSE DESCRIPTOR.message_types_by_name['TextSensorStateResponse'] = _TEXTSENSORSTATERESPONSE -DESCRIPTOR.message_types_by_name['CameraImageResponse'] = _CAMERAIMAGERESPONSE DESCRIPTOR.message_types_by_name['CoverCommandRequest'] = _COVERCOMMANDREQUEST DESCRIPTOR.message_types_by_name['FanCommandRequest'] = _FANCOMMANDREQUEST DESCRIPTOR.message_types_by_name['LightCommandRequest'] = _LIGHTCOMMANDREQUEST @@ -2268,6 +2377,10 @@ DESCRIPTOR.message_types_by_name['SubscribeHomeAssistantStateResponse'] = _SUBSC DESCRIPTOR.message_types_by_name['HomeAssistantStateResponse'] = _HOMEASSISTANTSTATERESPONSE DESCRIPTOR.message_types_by_name['GetTimeRequest'] = _GETTIMEREQUEST DESCRIPTOR.message_types_by_name['GetTimeResponse'] = _GETTIMERESPONSE +DESCRIPTOR.message_types_by_name['ListEntitiesServicesArgument'] = _LISTENTITIESSERVICESARGUMENT +DESCRIPTOR.message_types_by_name['ListEntitiesServicesResponse'] = _LISTENTITIESSERVICESRESPONSE +DESCRIPTOR.message_types_by_name['ExecuteServiceArgument'] = _EXECUTESERVICEARGUMENT +DESCRIPTOR.message_types_by_name['ExecuteServiceRequest'] = _EXECUTESERVICEREQUEST DESCRIPTOR.enum_types_by_name['FanSpeed'] = _FANSPEED DESCRIPTOR.enum_types_by_name['LogLevel'] = _LOGLEVEL _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -2398,13 +2511,6 @@ ListEntitiesTextSensorResponse = _reflection.GeneratedProtocolMessageType('ListE )) _sym_db.RegisterMessage(ListEntitiesTextSensorResponse) -ListEntitiesCameraResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesCameraResponse', (_message.Message,), dict( - DESCRIPTOR = _LISTENTITIESCAMERARESPONSE, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:ListEntitiesCameraResponse) - )) -_sym_db.RegisterMessage(ListEntitiesCameraResponse) - ListEntitiesDoneResponse = _reflection.GeneratedProtocolMessageType('ListEntitiesDoneResponse', (_message.Message,), dict( DESCRIPTOR = _LISTENTITIESDONERESPONSE, __module__ = 'api_pb2' @@ -2468,13 +2574,6 @@ TextSensorStateResponse = _reflection.GeneratedProtocolMessageType('TextSensorSt )) _sym_db.RegisterMessage(TextSensorStateResponse) -CameraImageResponse = _reflection.GeneratedProtocolMessageType('CameraImageResponse', (_message.Message,), dict( - DESCRIPTOR = _CAMERAIMAGERESPONSE, - __module__ = 'api_pb2' - # @@protoc_insertion_point(class_scope:CameraImageResponse) - )) -_sym_db.RegisterMessage(CameraImageResponse) - CoverCommandRequest = _reflection.GeneratedProtocolMessageType('CoverCommandRequest', (_message.Message,), dict( DESCRIPTOR = _COVERCOMMANDREQUEST, __module__ = 'api_pb2' @@ -2590,6 +2689,34 @@ GetTimeResponse = _reflection.GeneratedProtocolMessageType('GetTimeResponse', (_ )) _sym_db.RegisterMessage(GetTimeResponse) +ListEntitiesServicesArgument = _reflection.GeneratedProtocolMessageType('ListEntitiesServicesArgument', (_message.Message,), dict( + 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' + # @@protoc_insertion_point(class_scope:ListEntitiesServicesResponse) + )) +_sym_db.RegisterMessage(ListEntitiesServicesResponse) + +ExecuteServiceArgument = _reflection.GeneratedProtocolMessageType('ExecuteServiceArgument', (_message.Message,), dict( + 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' + # @@protoc_insertion_point(class_scope:ExecuteServiceRequest) + )) +_sym_db.RegisterMessage(ExecuteServiceRequest) + _SERVICECALLRESPONSE_DATAENTRY._options = None _SERVICECALLRESPONSE_DATATEMPLATEENTRY._options = None diff --git a/aioesphomeapi/client.py b/aioesphomeapi/client.py index 6e45040..3939f22 100644 --- a/aioesphomeapi/client.py +++ b/aioesphomeapi/client.py @@ -57,8 +57,10 @@ MESSAGE_TYPE_TO_PROTO = { 38: pb.SubscribeHomeAssistantStatesRequest, 39: pb.SubscribeHomeAssistantStateResponse, 40: pb.HomeAssistantStateResponse, - 41: pb.ListEntitiesCameraResponse, - 42: pb.CameraImageResponse, + 41: pb.ListEntitiesServicesResponse, + 42: pb.ExecuteServiceRequest, + 43: pb.ListEntitiesCameraResponse, + 44: pb.CameraImageResponse, } @@ -89,8 +91,8 @@ def _bytes_to_varuint(value: bytes) -> Optional[int]: return None -async def resolve_ip_address(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: res = await eventloop.getaddrinfo(host, port, family=socket.AF_INET, proto=socket.IPPROTO_TCP) @@ -105,6 +107,18 @@ async def resolve_ip_address(eventloop: asyncio.events.AbstractEventLoop, return sockaddr +async def resolve_ip_address(eventloop: asyncio.events.AbstractEventLoop, + host: str, port: int) -> Tuple[Any, ...]: + try: + return await resolve_ip_address_getaddrinfo(eventloop, host, port) + except APIConnectionError as err: + if host.endswith('.local'): + from aioesphomeapi.host_resolver import resolve_host + + return await eventloop.run_in_executor(None, resolve_host, host), port + raise err + + # Wrap some types in attr classes to make them serializable @attr.s class DeviceInfo: @@ -268,16 +282,49 @@ class ServiceCall: variables = attr.ib(type=Dict[str, str], converter=dict) +USER_SERVICE_ARG_BOOL = 0 +USER_SERVICE_ARG_INT = 1 +USER_SERVICE_ARG_FLOAT = 2 +USER_SERVICE_ARG_STRING = 3 +USER_SERVICE_ARG_TYPES = [ + USER_SERVICE_ARG_BOOL, USER_SERVICE_ARG_INT, USER_SERVICE_ARG_FLOAT, USER_SERVICE_ARG_STRING +] + + +def _attr_obj_from_dict(cls, **kwargs): + return cls(**{key: kwargs[key] for key in attr.fields_dict(cls)}) + + @attr.s -class State: - running = attr.ib(type=bool) - stopped = attr.ib(type=bool) - socket = attr.ib(type=Optional[socket.socket]) - socket_reader = attr.ib(type=Optional[asyncio.StreamReader]) - socket_writer = attr.ib(type=Optional[asyncio.StreamWriter]) - socket_open = attr.ib(type=bool) - connected = attr.ib(type=bool) - authenticated = attr.ib(type=bool) +class UserServiceArg: + name = attr.ib(type=str) + type_ = attr.ib(type=int, converter=int, + validator=attr.validators.in_(USER_SERVICE_ARG_TYPES)) + + +@attr.s +class UserService: + name = attr.ib(type=str) + key = attr.ib(type=int) + args = attr.ib(type=List[UserServiceArg], converter=list) + + @staticmethod + def from_dict(dict_): + 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 + ) + + def to_dict(self): + return { + 'name': self.name, + 'key': self.key, + 'args': [attr.asdict(arg) for arg in self.args], + } @attr.s @@ -365,7 +412,7 @@ class APIConnection: try: coro = resolve_ip_address(self._params.eventloop, self._params.address, self._params.port) - sockaddr = await asyncio.wait_for(coro, 15.0) + sockaddr = await asyncio.wait_for(coro, 30.0) except APIConnectionError as err: await self._on_error() raise err @@ -381,7 +428,7 @@ class APIConnection: self._params.address, self._params.port, sockaddr) try: coro = self._params.eventloop.sock_connect(self._socket, sockaddr) - await asyncio.wait_for(coro, 15.0) + await asyncio.wait_for(coro, 30.0) except OSError as err: await self._on_error() raise APIConnectionError("Error connecting to {}: {}".format(sockaddr, err)) @@ -470,7 +517,7 @@ class APIConnection: async def send_message_await_response_complex(self, send_msg: message.Message, do_append: Callable[[Any], bool], do_stop: Callable[[Any], bool], - timeout: float = 1.0) -> List[Any]: + timeout: float = 5.0) -> List[Any]: fut = self._params.eventloop.create_future() responses = [] @@ -501,7 +548,7 @@ class APIConnection: async def send_message_await_response(self, send_msg: message.Message, - response_type: Any, timeout: float = 1.0) -> Any: + response_type: Any, timeout: float = 5.0) -> Any: def is_response(msg): return isinstance(msg, response_type) @@ -543,7 +590,10 @@ class APIConnection: return msg = MESSAGE_TYPE_TO_PROTO[msg_type]() - msg.ParseFromString(raw_msg) + try: + 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) for msg_handler in self._message_handlers[:]: msg_handler(msg) @@ -558,6 +608,11 @@ class APIConnection: self._params.address, err) await self._on_error() break + except Exception as 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): @@ -605,10 +660,14 @@ class APIClient: raise APIConnectionError("Already connected!") connected = False + stopped = False async def _on_stop(): - if self._connection is None: + nonlocal stopped + + if stopped: return + stopped = True self._connection = None if connected and on_stop is not None: await on_stop() @@ -658,7 +717,7 @@ class APIClient: has_deep_sleep=resp.has_deep_sleep, ) - async def list_entities(self) -> List[Any]: + async def list_entities_services(self) -> Tuple[List[Any], List[UserService]]: self._check_authenticated() response_types = { pb.ListEntitiesBinarySensorResponse: BinarySensorInfo, @@ -668,6 +727,7 @@ class APIClient: pb.ListEntitiesSensorResponse: SensorInfo, pb.ListEntitiesSwitchResponse: SwitchInfo, pb.ListEntitiesTextSensorResponse: TextSensorInfo, + pb.ListEntitiesServicesResponse: None, pb.ListEntitiesCameraResponse: CameraInfo, } @@ -680,7 +740,21 @@ class APIClient: resp = await self._connection.send_message_await_response_complex( pb.ListEntitiesRequest(), do_append, do_stop, timeout=5) entities = [] + services = [] for msg in resp: + if isinstance(msg, pb.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, + )) + continue cls = None for resp_type, cls in response_types.items(): if isinstance(msg, resp_type): @@ -689,7 +763,7 @@ class APIClient: for key, _ in attr.fields_dict(cls).items(): kwargs[key] = getattr(msg, key) entities.append(cls(**kwargs)) - return entities + return entities, services async def subscribe_states(self, on_state: Callable[[Any], None]) -> None: self._check_authenticated() @@ -711,10 +785,7 @@ class APIClient: data = image_stream.pop(msg.key, bytes()) + msg.data if msg.done: on_state(CameraState(key=msg.key, image=data)) - hash_ = 0 - for x in data: - hash_ ^= x - _LOGGER.warning("Got image hash=%s len=%s", hex(hash_), len(data)) + _LOGGER.warning("Got image len=%s", len(data)) else: image_stream[msg.key] = data return @@ -847,10 +918,10 @@ class APIClient: req.color_temperature = color_temperature if transition_length is not None: req.has_transition_length = True - req.transition_length = int(round(transition_length / 1000)) + req.transition_length = int(round(transition_length * 1000)) if flash_length is not None: req.has_flash_length = True - req.flash_length = int(round(flash_length / 1000)) + req.flash_length = int(round(flash_length * 1000)) if effect is not None: req.has_effect = True req.effect = effect @@ -866,3 +937,23 @@ class APIClient: req.key = key req.state = state await self._connection.send_message(req) + + async def execute_service(self, service: UserService, data: dict): + self._check_authenticated() + + req = pb.ExecuteServiceRequest() + req.key = service.key + args = [] + for arg_desc in service.args: + arg = pb.ExecuteServiceArgument() + val = data[arg_desc.name] + attr_ = { + USER_SERVICE_ARG_BOOL: 'bool_', + USER_SERVICE_ARG_INT: 'int_', + USER_SERVICE_ARG_FLOAT: 'float_', + USER_SERVICE_ARG_STRING: 'string_', + }[arg_desc.type_] + setattr(arg, attr_, val) + args.append(arg) + req.args.extend(args) + await self._connection.send_message(req) diff --git a/aioesphomeapi/host_resolver.py b/aioesphomeapi/host_resolver.py new file mode 100644 index 0000000..ca5eb67 --- /dev/null +++ b/aioesphomeapi/host_resolver.py @@ -0,0 +1,74 @@ +import socket +import time + +import zeroconf + + +class HostResolver(zeroconf.RecordUpdateListener): + def __init__(self, name): + self.name = name + self.address = None + + def update_record(self, zc, now, record): + if record is None: + return + if record.type == zeroconf._TYPE_A: + assert isinstance(record, zeroconf.DNSAddress) + if record.name == self.name: + self.address = record.address + + def request(self, zc, timeout): + 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)) + while self.address is None: + if last <= now: + # Timeout + return False + if next_ <= now: + out = zeroconf.DNSOutgoing(zeroconf._FLAGS_QR_QUERY) + out.add_question( + 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.send(out) + next_ = now + delay + delay *= 2 + + zc.wait(min(next_, last) - now) + now = time.time() + finally: + zc.remove_listener(self) + + return True + + +def resolve_host(host, timeout=3.0): + from aioesphomeapi import APIConnectionError + + try: + zc = zeroconf.Zeroconf() + except Exception: + raise APIConnectionError("Cannot start mDNS sockets, is this a docker container without " + "host network mode?") + + try: + info = HostResolver(host + '.') + 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)) + finally: + zc.close() + + if address is None: + raise APIConnectionError("Error resolving address with mDNS: Did not respond. " + "Maybe the device is offline.") + return address diff --git a/requirements.txt b/requirements.txt index 637c747..453ef8d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ protobuf attrs +zeroconf>=0.21.3 diff --git a/setup.py b/setup.py index d080af5..d268f84 100644 --- a/setup.py +++ b/setup.py @@ -2,16 +2,16 @@ """aioesphomeapi setup script.""" from setuptools import find_packages, setup -VERSION = '1.4.1' +VERSION = '1.6.0' PROJECT_NAME = 'aioesphomeapi' PROJECT_PACKAGE_NAME = 'aioesphomeapi' PROJECT_LICENSE = 'MIT' PROJECT_AUTHOR = 'Otto Winter' -PROJECT_COPYRIGHT = ' 2018, Otto Winter' -PROJECT_URL = 'https://esphomelib.com/esphomeyaml/' +PROJECT_COPYRIGHT = ' 2019, Otto Winter' +PROJECT_URL = 'https://esphome.io/' PROJECT_EMAIL = 'contact@otto-winter.com' -PROJECT_GITHUB_USERNAME = 'OttoWinter' +PROJECT_GITHUB_USERNAME = 'esphome' PROJECT_GITHUB_REPOSITORY = 'aioesphomeapi' PYPI_URL = 'https://pypi.python.org/pypi/{}'.format(PROJECT_PACKAGE_NAME) @@ -22,7 +22,8 @@ DOWNLOAD_URL = '{}/archive/{}.zip'.format(GITHUB_URL, VERSION) REQUIRES = [ 'attrs', - 'protobuf', + 'protobuf>=3.6', + 'zeroconf>=0.21.3', ] setup(