diff --git a/proto/cleaned/quilt_hds.proto b/proto/cleaned/quilt_hds.proto index d4c5cb7..6e9bddc 100644 --- a/proto/cleaned/quilt_hds.proto +++ b/proto/cleaned/quilt_hds.proto @@ -57,16 +57,34 @@ enum LocalCommsHealthStatus { LOCAL_COMMS_HEALTH_STATUS_STARTING_UP = 4; } -// Local communications health status for a QSM or Controller mesh node. +// Diagnostic reason accompanying LocalCommsHealthStatus. +// APK-confirmed (com.quilt.android 1.0.29, enum class m62). The local mesh is +// Eclipse Zenoh-based (see ZENOH_SESSION_DOWN), not NATS. +enum LocalCommsHealthReason { + LOCAL_COMMS_HEALTH_REASON_UNSPECIFIED = 0; + LOCAL_COMMS_HEALTH_REASON_HEALTHY = 1; + LOCAL_COMMS_HEALTH_REASON_BOOT_OR_WARMUP = 2; + LOCAL_COMMS_HEALTH_REASON_ZENOH_SESSION_DOWN = 3; + LOCAL_COMMS_HEALTH_REASON_NO_PEERS_VISIBLE = 4; + LOCAL_COMMS_HEALTH_REASON_PARTIAL_VISIBILITY = 5; + LOCAL_COMMS_HEALTH_REASON_NO_MESSAGES_RECEIVED = 6; + LOCAL_COMMS_HEALTH_REASON_SESSION_INSTABILITY = 7; + LOCAL_COMMS_HEALTH_REASON_NO_ALIVE_PEERS = 8; + LOCAL_COMMS_HEALTH_REASON_NO_PEERS_EXPECTED = 9; + LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_NOT_READY = 10; + LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_EXPIRED = 11; +} + +// Local communications status for a QSM or Controller mesh node. // Carried as field 8 on QuiltSmartModule and field 9 on Controller. -// The `health` subfield (2) is the primary value; subfields 3, 4, 6 semantics TBD. +// Field numbers/semantics APK-confirmed (1.0.29, message class l62). message LocalCommsStatus { - google.protobuf.Timestamp updated_ts = 1; // most-recent server update timestamp - LocalCommsHealthStatus health = 2; // current health - int32 link_state = 3; // observed: HEALTHY=9, DEGRADED=8; enum TBD - int32 version = 4; // observed: always 9 - google.protobuf.Timestamp health_changed_ts = 5; // when health last changed - int32 connection_state = 6; // observed: HEALTHY=1, DEGRADED=5; enum TBD + google.protobuf.Timestamp updated_ts = 1; // most-recent server update timestamp + LocalCommsHealthStatus status = 2; // current health status + int32 visible_devices_count = 3; // mesh peers currently visible + int32 expected_devices_count = 4; // mesh peers expected on this system + google.protobuf.Timestamp last_session_change_ts = 5; // when the mesh session last changed + LocalCommsHealthReason reason = 6; // diagnostic reason for current status } enum OccupancyMode { @@ -77,7 +95,7 @@ enum OccupancyMode { // Freeze-protection setting on SpaceSettings (field 9). // UNSPECIFIED is treated as ENABLED by the app (freeze protection on by default). -// Field number unconfirmed (assumed f9; added post-initial release). +// APK-confirmed field 9 (com.quilt.android 1.0.29, message class ea2). enum SafetyHeatingMode { SAFETY_HEATING_MODE_UNSPECIFIED = 0; SAFETY_HEATING_MODE_DISABLED = 1; @@ -243,7 +261,7 @@ message SpaceRelationships { // f1=name, f2=description, f3=updated_ts, f4=timezone, f5=OccupancyMode, // f6=HvacControllerType, f7=occupied_timeout_s(180.0), f8=unoccupied_timeout_s(1200.0) // Wire-confirmed: fields 1–8. -// f9=SafetyHeatingMode (freeze protection): field number unconfirmed (assumed f9). +// f9=SafetyHeatingMode (freeze protection): APK-confirmed field 9 (1.0.29, class ea2). message SpaceSettings { string name = 1; // wire-confirmed: f1 string description = 2; // wire-confirmed: f2 @@ -253,7 +271,7 @@ message SpaceSettings { HvacControllerType hvac_controller_type = 6; // wire-confirmed: f6 float occupied_timeout_s = 7; // seconds of presence before "returned"; default 180s (3 min) float unoccupied_timeout_s = 8; // seconds of no-presence before "away"; default 1200s (20 min) - SafetyHeatingMode safety_heating = 9; // freeze protection; UNSPECIFIED treated as ENABLED; field# unconfirmed + SafetyHeatingMode safety_heating = 9; // freeze protection; UNSPECIFIED treated as ENABLED; APK-confirmed f9 } // Wire-confirmed from UpdateSpace binary (hex decode): @@ -389,6 +407,7 @@ message IndoorUnitConditions { ConditionState coil_preheat = 10; ConditionState mode_conflict_avoidance = 11; ConditionState outdoor_unit_communication_error = 12; + ConditionState compressor_minimum_run_time = 13; // APK-confirmed 1.0.29 (enum class l02) } message IndoorUnitPresenceState { diff --git a/src/quilt_hp/_proto/quilt_hds_pb2.py b/src/quilt_hp/_proto/quilt_hds_pb2.py index faa7ed0..502dc60 100644 --- a/src/quilt_hp/_proto/quilt_hds_pb2.py +++ b/src/quilt_hp/_proto/quilt_hds_pb2.py @@ -27,7 +27,7 @@ from google.protobuf import field_mask_pb2 as google_dot_protobuf_dot_field__mask__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fquilt_hds.proto\x12\x1a\x63ore.protos.home_datastore\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\"\xfc\x01\n\x10LocalCommsStatus\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x06health\x18\x02 \x01(\x0e\x32\x32.core.protos.home_datastore.LocalCommsHealthStatus\x12\x12\n\nlink_state\x18\x03 \x01(\x05\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\x35\n\x11health_changed_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x63onnection_state\x18\x06 \x01(\x05\"\x96\x01\n\x0e\x45ntityMetadata\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12.\n\ncreated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tsystem_id\x18\x04 \x01(\t\"i\n\x12LocationAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rtz_identifier\x18\x03 \x01(\t\"\x8d\x01\n\x10LocationControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12I\n\x12schedule_execution\x18\x02 \x01(\x0e\x32-.core.protos.home_datastore.ScheduleExecution\"\xca\x01\n\x08Location\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x42\n\nattributes\x18\x02 \x01(\x0b\x32..core.protos.home_datastore.LocationAttributes\x12>\n\x08\x63ontrols\x18\x03 \x01(\x0b\x32,.core.protos.home_datastore.LocationControls\"z\n\x12SpaceRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x17\n\x0fparent_space_id\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x81\x03\n\rSpaceSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08timezone\x18\x04 \x01(\t\x12<\n\toccupancy\x18\x05 \x01(\x0e\x32).core.protos.home_datastore.OccupancyMode\x12L\n\x14hvac_controller_type\x18\x06 \x01(\x0e\x32..core.protos.home_datastore.HvacControllerType\x12\x1a\n\x12occupied_timeout_s\x18\x07 \x01(\x02\x12\x1c\n\x14unoccupied_timeout_s\x18\x08 \x01(\x02\x12\x45\n\x0esafety_heating\x18\t \x01(\x0e\x32-.core.protos.home_datastore.SafetyHeatingMode\"\xb8\x03\n\rSpaceControls\x12\x37\n\thvac_mode\x18\x01 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x1e\n\x16temperature_setpoint_c\x18\x02 \x01(\x02\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\x04 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x05 \x01(\x02\x12\x1a\n\x12\x63omfort_setting_id\x18\x06 \x01(\t\x12\x39\n\nboost_mode\x18\x07 \x01(\x0e\x32%.core.protos.home_datastore.BoostMode\x12T\n\x18\x63omfort_setting_override\x18\x08 \x01(\x0e\x32\x32.core.protos.home_datastore.ComfortSettingOverride\x12!\n\x19\x63omfort_setting_id_string\x18\t \x01(\t\"\xd2\x01\n\nSpaceState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16setpoint_temperature_c\x18\x02 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x03 \x01(\x02\x12\x39\n\nhvac_state\x18\x04 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x1a\n\x12\x63omfort_setting_id\x18\x05 \x01(\t\"\xbb\x02\n\x05Space\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x45\n\rrelationships\x18\x02 \x01(\x0b\x32..core.protos.home_datastore.SpaceRelationships\x12;\n\x08settings\x18\x03 \x01(\x0b\x32).core.protos.home_datastore.SpaceSettings\x12;\n\x08\x63ontrols\x18\x04 \x01(\x0b\x32).core.protos.home_datastore.SpaceControls\x12\x35\n\x05state\x18\x05 \x01(\x0b\x32&.core.protos.home_datastore.SpaceState\"\xe6\x01\n\x17IndoorUnitRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x17\n\x0foutdoor_unit_id\x18\x03 \x01(\t\x12\x13\n\x0bhardware_id\x18\x04 \x01(\t\x12\x1d\n\x15quilt_smart_module_id\x18\x05 \x01(\t\x12.\n\nupdated_ts\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17\x66irmware_update_info_id\x18\x07 \x01(\t\"\x9e\x02\n\x12IndoorUnitSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12(\n light_brightness_default_percent\x18\x03 \x01(\x02\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15presence_fence_left_m\x18\x05 \x01(\x02\x12\x1e\n\x16presence_fence_right_m\x18\x06 \x01(\x02\x12 \n\x18presence_fence_forward_m\x18\x07 \x01(\x02\x12*\n\"radar_sensor_distance_from_floor_m\x18\x08 \x01(\x02\"\xc3\x03\n\x12IndoorUnitControls\x12\x16\n\x0eled_color_code\x18\x03 \x01(\r\x12$\n\x1cled_color_brightness_percent\x18\x04 \x01(\x02\x12@\n\x0e\x66\x61n_speed_mode\x18\x05 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x06 \x01(\x02\x12.\n\nupdated_ts\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x0blouver_mode\x18\n \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\x0b \x01(\x02\x12\x41\n\rled_animation\x18\x0c \x01(\x0e\x32*.core.protos.home_datastore.LightAnimation\x12\x39\n\tled_state\x18\r \x01(\x0e\x32&.core.protos.home_datastore.LightState\"\x9c\x04\n\x0fIndoorUnitState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16temperature_setpoint_c\x18\x02 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x03 \x01(\x02\x12\x39\n\nhvac_state\x18\x04 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x1e\n\x16\x66\x61n_speed_setpoint_rpm\x18\x05 \x01(\x02\x12\x15\n\rfan_speed_rpm\x18\x06 \x01(\x02\x12 \n\x18light_brightness_percent\x18\x07 \x01(\x02\x12 \n\x18presence_detection_level\x18\x08 \x01(\x02\x12\x1b\n\x13inlet_temperature_c\x18\t \x01(\x02\x12\x1c\n\x14outlet_temperature_c\x18\n \x01(\x02\x12 \n\x18\x61mbient_humidity_percent\x18\x0b \x01(\x02\x12\x37\n\thvac_mode\x18\x0c \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12(\n calculated_ambient_temperature_c\x18\r \x01(\x02\x12$\n\x1clouver_angle_up_down_degrees\x18\x0e \x01(\x02\"\xee\x06\n\x14IndoorUnitConditions\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\rmode_conflict\x18\x02 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x42\n\x0e\x61nti_cold_wind\x18\x03 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12T\n abnormal_outdoor_air_temperature\x18\x04 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12M\n\x19hvac_mode_switching_delay\x18\x05 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x41\n\rdefrost_cycle\x18\x06 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x42\n\x0esafety_heating\x18\x07 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12>\n\noil_return\x18\x08 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12N\n\x1amodbus_communication_error\x18\t \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12@\n\x0c\x63oil_preheat\x18\n \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12K\n\x17mode_conflict_avoidance\x18\x0b \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12T\n outdoor_unit_communication_error\x18\x0c \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\"\xc9\x01\n\x17IndoorUnitPresenceState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x10sensor0_presence\x18\x02 \x01(\x0e\x32$.core.protos.home_datastore.Presence\x12>\n\x10sensor1_presence\x18\x03 \x01(\x0e\x32$.core.protos.home_datastore.Presence\"\x9a\x01\n\x12IndoorUnitCommands\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12T\n\x18\x66\x61llback_control_command\x18\x02 \x01(\x0e\x32\x32.core.protos.home_datastore.FallbackControlCommand\"\xad\x02\n\x1cIndoorUnitHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12\x19\n\x11\x66\x61n_speed_max_rpm\x18\x05 \x01(\x02\x12.\n\nupdated_ts\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12!\n\x19indoor_unit_serial_number\x18\x07 \x01(\t\x12(\n quilt_smart_module_serial_number\x18\x08 \x01(\t\"\x9e\x01\n\x12IndoorUnitHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.IndoorUnitHardwareAttributes\"\xf4\x02\n\x14IndoorUnitHvacInputs\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x1e\x65xternal_ambient_temperature_c\x18\x02 \x01(\x02\x12\"\n\x1a\x61mbient_temperature_source\x18\x03 \x01(\x05\x12\x1e\n\x16temperature_setpoint_c\x18\x04 \x01(\x02\x12\x37\n\thvac_mode\x18\x05 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12L\n\x14hvac_controller_type\x18\x06 \x01(\x0e\x32..core.protos.home_datastore.HvacControllerType\x12\x39\n\nhvac_state\x18\x07 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\xd1\x03\n\x19IndoorUnitPerformanceData\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_interval_s\x18\x02 \x01(\x02\x12\x1c\n\x14\x65nergy_measurement_j\x18\x03 \x01(\x02\x12\x37\n\thvac_mode\x18\x04 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x1c\n\x14\x61\x63tual_fan_speed_rpm\x18\x05 \x01(\x02\x12\x1c\n\x14outlet_temperature_c\x18\x06 \x01(\x02\x12\x1a\n\x12inlet_humidity_pct\x18\x07 \x01(\x02\x12\x1b\n\x13inlet_temperature_c\x18\x08 \x01(\x02\x12\x1a\n\x12\x63oil_temperature_c\x18\t \x01(\x02\x12\x1e\n\x16gas_pipe_temperature_c\x18\n \x01(\x02\x12!\n\x19liquid_pipe_temperature_c\x18\x0b \x01(\x02\x12\x39\n\nhvac_state\x18\x0c \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\x8a\x03\n\x1cIndoorUnitPerformanceMetrics\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_duration_s\x18\x0b \x01(\x02\x12\x16\n\x0e\x65nergy_total_j\x18\x04 \x01(\x02\x12\x12\n\ncapacity_w\x18\x05 \x01(\x02\x12\"\n\x1a\x63oefficient_of_performance\x18\x06 \x01(\x02\x12\x37\n\thvac_mode\x18\x07 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x14\n\x0chvac_power_w\x18\x08 \x01(\x02\x12\x13\n\x0bled_power_w\x18\t \x01(\x02\x12\x39\n\nhvac_state\x18\n \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x15\n\rhvac_energy_j\x18\x0c \x01(\x02\x12\x14\n\x0cled_energy_j\x18\r \x01(\x02\"\x8a\x01\n\x13IndoorUnitOccupancy\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x0foccupancy_state\x18\x02 \x01(\x0e\x32*.core.protos.home_datastore.OccupancyState\"\xd6\x06\n\nIndoorUnit\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12J\n\rrelationships\x18\x02 \x01(\x0b\x32\x33.core.protos.home_datastore.IndoorUnitRelationships\x12@\n\x08settings\x18\x03 \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitSettings\x12@\n\x08\x63ontrols\x18\x04 \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitControls\x12:\n\x05state\x18\x05 \x01(\x0b\x32+.core.protos.home_datastore.IndoorUnitState\x12\x45\n\x0bhvac_inputs\x18\x06 \x01(\x0b\x32\x30.core.protos.home_datastore.IndoorUnitHvacInputs\x12\x45\n\x08presence\x18\x07 \x01(\x0b\x32\x33.core.protos.home_datastore.IndoorUnitPresenceState\x12\x44\n\nconditions\x18\x08 \x01(\x0b\x32\x30.core.protos.home_datastore.IndoorUnitConditions\x12@\n\x08\x63ommands\x18\t \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitCommands\x12O\n\x10performance_data\x18\n \x01(\x0b\x32\x35.core.protos.home_datastore.IndoorUnitPerformanceData\x12U\n\x13performance_metrics\x18\x0b \x01(\x0b\x32\x38.core.protos.home_datastore.IndoorUnitPerformanceMetrics\x12\x42\n\toccupancy\x18\x0c \x01(\x0b\x32/.core.protos.home_datastore.IndoorUnitOccupancy\"\xaf\x01\n\x18OutdoorUnitRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0bhardware_id\x18\x03 \x01(\t\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17\x66irmware_update_info_id\x18\x05 \x01(\t\"h\n\x13OutdoorUnitSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"}\n\x10OutdoorUnitState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x39\n\nhvac_state\x18\x02 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\xba\x02\n\x1aOutdoorUnitPerformanceData\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_interval_s\x18\x02 \x01(\x02\x12\x1c\n\x14\x65nergy_measurement_j\x18\x03 \x01(\x02\x12\x1f\n\x17\x63ompressor_frequency_hz\x18\x04 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x05 \x01(\x02\x12\x1a\n\x12\x63oil_temperature_c\x18\x06 \x01(\x02\x12\x1d\n\x15\x65xhaust_temperature_c\x18\x07 \x01(\x02\x12\x19\n\x11high_pressure_kpa\x18\x08 \x01(\x02\x12\x18\n\x10low_pressure_kpa\x18\t \x01(\x02\"\xc6\x01\n\x1dOutdoorUnitHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12.\n\nupdated_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xa0\x01\n\x13OutdoorUnitHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12M\n\nattributes\x18\x02 \x01(\x0b\x32\x39.core.protos.home_datastore.OutdoorUnitHardwareAttributes\"\xe8\x02\n\x0bOutdoorUnit\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12K\n\rrelationships\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.OutdoorUnitRelationships\x12\x41\n\x08settings\x18\x03 \x01(\x0b\x32/.core.protos.home_datastore.OutdoorUnitSettings\x12;\n\x05state\x18\x04 \x01(\x0b\x32,.core.protos.home_datastore.OutdoorUnitState\x12P\n\x10performance_data\x18\x05 \x01(\x0b\x32\x36.core.protos.home_datastore.OutdoorUnitPerformanceData\"\xcf\x01\n\x17\x43ontrollerRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0bhardware_id\x18\x03 \x01(\t\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17software_update_info_id\x18\x05 \x01(\t\x12\x1f\n\x17\x66irmware_update_info_id\x18\x06 \x01(\t\"g\n\x12\x43ontrollerSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xa8\x01\n\x0f\x43ontrollerState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15\x61mbient_temperature_c\x18\x02 \x01(\x02\x12\x16\n\x0etemperature_f3\x18\x03 \x01(\x02\x12\x16\n\x0etemperature_f4\x18\x04 \x01(\x02\x12\x16\n\x0etemperature_f5\x18\x05 \x01(\x02\"\x9d\x01\n\x12\x43ontrollerControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12W\n\x1aremote_sensor_control_mode\x18\x02 \x01(\x0e\x32\x33.core.protos.home_datastore.RemoteSensorControlMode\"\xde\x02\n\tWifiState\x12\x43\n\nwifi_state\x18\x01 \x01(\x0e\x32/.core.protos.home_datastore.WifiConnectionState\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\r\n\x05\x62ssid\x18\x03 \x01(\t\x12\x15\n\rfrequency_mhz\x18\x04 \x01(\x05\x12\x12\n\npassphrase\x18\x05 \x01(\t\x12\x18\n\x10signal_level_dbm\x18\x06 \x01(\x05\x12\x17\n\x0fnoise_level_dbm\x18\x07 \x01(\x05\x12\x17\n\x0frx_invalid_frag\x18\x08 \x01(\x05\x12\x1c\n\x14tx_excessive_retries\x18\t \x01(\x05\x12\x14\n\x0cipv4_address\x18\n \x01(\t\x12\x14\n\x0cipv6_address\x18\x0b \x01(\t\x12.\n\nupdated_ts\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xc5\x01\n\x1c\x43ontrollerHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12.\n\nupdated_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x9e\x01\n\x12\x43ontrollerHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.ControllerHardwareAttributes\"\xdd\x04\n\nController\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12J\n\rrelationships\x18\x02 \x01(\x0b\x32\x33.core.protos.home_datastore.ControllerRelationships\x12@\n\x08settings\x18\x03 \x01(\x0b\x32..core.protos.home_datastore.ControllerSettings\x12:\n\x05state\x18\x04 \x01(\x0b\x32+.core.protos.home_datastore.ControllerState\x12@\n\x11hosted_wifi_state\x18\x05 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12<\n\rap_wifi_state\x18\x06 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12=\n\x0ep2p_wifi_state\x18\x07 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12@\n\x08\x63ontrols\x18\x08 \x01(\x0b\x32..core.protos.home_datastore.ControllerControls\x12H\n\x12local_comms_status\x18\t \x01(\x0b\x32,.core.protos.home_datastore.LocalCommsStatus\"U\n\x16RemoteSensorAttributes\x12\x0b\n\x03mac\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb5\x01\n\x11RemoteSensorState\x12\x1d\n\x15\x61mbient_temperature_c\x18\x01 \x01(\x02\x12\x18\n\x10humidity_percent\x18\x02 \x01(\x02\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15\x62\x61ttery_level_percent\x18\x04 \x01(\x02\x12\x18\n\x10signal_level_dbm\x18\x05 \x01(\x05\"c\n\x19RemoteSensorRelationships\x12\x16\n\x0eindoor_unit_id\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"l\n#ControllerRemoteSensorRelationships\x12\x15\n\rcontroller_id\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x91\x01\n\x14RemoteSensorControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12I\n\x0c\x63ontrol_mode\x18\x02 \x01(\x0e\x32\x33.core.protos.home_datastore.RemoteSensorControlMode\"\xe2\x02\n\x0cRemoteSensor\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\nattributes\x18\x02 \x01(\x0b\x32\x32.core.protos.home_datastore.RemoteSensorAttributes\x12<\n\x05state\x18\x03 \x01(\x0b\x32-.core.protos.home_datastore.RemoteSensorState\x12L\n\rrelationships\x18\x04 \x01(\x0b\x32\x35.core.protos.home_datastore.RemoteSensorRelationships\x12\x42\n\x08\x63ontrols\x18\x05 \x01(\x0b\x32\x30.core.protos.home_datastore.RemoteSensorControls\"\xf6\x02\n\x16\x43ontrollerRemoteSensor\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\nattributes\x18\x02 \x01(\x0b\x32\x32.core.protos.home_datastore.RemoteSensorAttributes\x12<\n\x05state\x18\x03 \x01(\x0b\x32-.core.protos.home_datastore.RemoteSensorState\x12V\n\rrelationships\x18\x04 \x01(\x0b\x32?.core.protos.home_datastore.ControllerRemoteSensorRelationships\x12\x42\n\x08\x63ontrols\x18\x05 \x01(\x0b\x32\x30.core.protos.home_datastore.RemoteSensorControls\"\xe2\x03\n\x18\x43omfortSettingAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\x12@\n\x0e\x66\x61n_speed_mode\x18\x03 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x04 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x05 \x01(\x02\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\x06 \x01(\x02\x12<\n\x04type\x18\x07 \x01(\x0e\x32..core.protos.home_datastore.ComfortSettingType\x12\x37\n\thvac_mode\x18\x08 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x45\n\x0blouver_mode\x18\t \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\n \x01(\x02\"_\n\x1b\x43omfortSettingRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xe6\x01\n\x0e\x43omfortSetting\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12H\n\nattributes\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.ComfortSettingAttributes\x12N\n\rrelationships\x18\x03 \x01(\x0b\x32\x37.core.protos.home_datastore.ComfortSettingRelationships\"\xd0\x01\n\x10LedScheduleEvent\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07start_s\x18\x02 \x01(\x05\x12\x16\n\x0eled_color_code\x18\x03 \x01(\r\x12$\n\x1cled_color_brightness_percent\x18\x04 \x01(\x02\x12=\n\tanimation\x18\x05 \x01(\x0e\x32*.core.protos.home_datastore.LightAnimation\"\x99\x04\n\rScheduleEvent\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1a\n\x12\x63omfort_setting_id\x18\x02 \x01(\t\x12\x0f\n\x07start_s\x18\x03 \x01(\x05\x12\x14\n\x0cprecondition\x18\x04 \x01(\x08\x12I\n\x12schedule_execution\x18\x05 \x01(\x0e\x32-.core.protos.home_datastore.ScheduleExecution\x12@\n\x0e\x66\x61n_speed_mode\x18\x06 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x07 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x08 \x01(\x02\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\t \x01(\x02\x12\x37\n\thvac_mode\x18\n \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x45\n\x0blouver_mode\x18\x0b \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\x0c \x01(\x02\"U\n\x15ScheduleDayAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\"\\\n\x18ScheduleDayRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xda\x02\n\x0bScheduleDay\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x45\n\nattributes\x18\x02 \x01(\x0b\x32\x31.core.protos.home_datastore.ScheduleDayAttributes\x12\x39\n\x06\x65vents\x18\x03 \x03(\x0b\x32).core.protos.home_datastore.ScheduleEvent\x12K\n\rrelationships\x18\x04 \x01(\x0b\x32\x34.core.protos.home_datastore.ScheduleDayRelationships\x12@\n\nled_events\x18\x05 \x03(\x0b\x32,.core.protos.home_datastore.LedScheduleEvent\"\x87\x01\n\x0fScheduleWeekDay\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x64\x61y_id\x18\x02 \x01(\t\x12\x34\n\x07weekday\x18\x03 \x01(\x0e\x32#.core.protos.home_datastore.Weekday\"]\n\x19ScheduleWeekRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xd3\x01\n\x0cScheduleWeek\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x39\n\x04\x64\x61ys\x18\x02 \x03(\x0b\x32+.core.protos.home_datastore.ScheduleWeekDay\x12L\n\rrelationships\x18\x03 \x01(\x0b\x32\x35.core.protos.home_datastore.ScheduleWeekRelationships\"\x91\x01\n\x1dQuiltSmartModuleRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17software_update_info_id\x18\x02 \x01(\t\x12\x1f\n\x17\x66irmware_update_info_id\x18\x03 \x01(\t\"b\n\x18QuiltSmartModuleControls\x12\x16\n\x0eled_color_code\x18\x01 \x01(\x05\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x86\x02\n\x15QuiltSmartModuleState\x12\x1a\n\x12phase_detected_raw\x18\x01 \x01(\x02\x12\x1b\n\x13target_detected_raw\x18\x02 \x01(\x02\x12\x1b\n\x13\x61ls_illuminance_raw\x18\x03 \x01(\x05\x12\x12\n\nals_ir_raw\x18\x04 \x01(\x05\x12\x14\n\x0c\x61ls_both_raw\x18\x05 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_x_raw\x18\x06 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_y_raw\x18\x07 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_z_raw\x18\x08 \x01(\x05\x12.\n\nupdated_ts\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb3\x04\n\x10QuiltSmartModule\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\x08\x63ontrols\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.QuiltSmartModuleControls\x12@\n\x05state\x18\x03 \x01(\x0b\x32\x31.core.protos.home_datastore.QuiltSmartModuleState\x12@\n\x11hosted_wifi_state\x18\x04 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12<\n\rap_wifi_state\x18\x05 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12=\n\x0ep2p_wifi_state\x18\x06 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12P\n\rrelationships\x18\x07 \x01(\x0b\x32\x39.core.protos.home_datastore.QuiltSmartModuleRelationships\x12H\n\x12local_comms_status\x18\x08 \x01(\x0b\x32,.core.protos.home_datastore.LocalCommsStatus\"\xe7\x01\n\x1cSoftwareUpdateInfoAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05state\x18\x02 \x01(\x05\x12\x0e\n\x06status\x18\x03 \x01(\x05\x12\x17\n\x0f\x63urrent_version\x18\x04 \x01(\t\x12\x16\n\x0etarget_version\x18\x05 \x01(\t\x12\x18\n\x10\x63urrent_progress\x18\x06 \x01(\x02\x12\x16\n\x0etotal_progress\x18\x07 \x01(\x02\x12\x15\n\rprogress_unit\x18\x08 \x01(\x05\"\x9e\x01\n\x12SoftwareUpdateInfo\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.SoftwareUpdateInfoAttributes\"\xa2\x08\n\x13HomeDatastoreSystem\x12\x31\n\x06spaces\x18\x03 \x03(\x0b\x32!.core.protos.home_datastore.Space\x12N\n\x15outdoor_unit_hardware\x18\x05 \x03(\x0b\x32/.core.protos.home_datastore.OutdoorUnitHardware\x12>\n\routdoor_units\x18\x06 \x03(\x0b\x32\'.core.protos.home_datastore.OutdoorUnit\x12I\n\x13quilt_smart_modules\x18\x07 \x03(\x0b\x32,.core.protos.home_datastore.QuiltSmartModule\x12L\n\x14indoor_unit_hardware\x18\x08 \x03(\x0b\x32..core.protos.home_datastore.IndoorUnitHardware\x12<\n\x0cindoor_units\x18\t \x03(\x0b\x32&.core.protos.home_datastore.IndoorUnit\x12K\n\x13\x63ontroller_hardware\x18\n \x03(\x0b\x32..core.protos.home_datastore.ControllerHardware\x12;\n\x0b\x63ontrollers\x18\x0b \x03(\x0b\x32&.core.protos.home_datastore.Controller\x12@\n\x0eremote_sensors\x18\x0c \x03(\x0b\x32(.core.protos.home_datastore.RemoteSensor\x12\x44\n\x10\x63omfort_settings\x18\r \x03(\x0b\x32*.core.protos.home_datastore.ComfortSetting\x12>\n\rschedule_days\x18\x0e \x03(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\x12@\n\x0eschedule_weeks\x18\x0f \x03(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\x12U\n\x19\x63ontroller_remote_sensors\x18\x10 \x03(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\x12\x37\n\tlocations\x18\x11 \x03(\x0b\x32$.core.protos.home_datastore.Location\x12M\n\x15software_update_infos\x18\x12 \x03(\x0b\x32..core.protos.home_datastore.SoftwareUpdateInfo\"b\n\x1dGetHomeDatastoreSystemRequest\x12\x11\n\tsystem_id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"\x1d\n\x0fGetSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"F\n\x12\x43reateSpaceRequest\x12\x30\n\x05space\x18\x01 \x01(\x0b\x32!.core.protos.home_datastore.Space\"E\n\x12UpdateSpaceRequest\x12/\n\x04\x64iff\x18\x01 \x01(\x0b\x32!.core.protos.home_datastore.Space\" \n\x12\x44\x65leteSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"O\n\x17UpdateIndoorUnitRequest\x12\x34\n\x04\x64iff\x18\x01 \x01(\x0b\x32&.core.protos.home_datastore.IndoorUnit\"%\n\x17\x44\x65leteIndoorUnitRequest\x12\n\n\x02id\x18\x01 \x01(\t\"Z\n\x1cGetIndoorUnitHardwareRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"U\n\x17UpdateControllerRequest\x12:\n\ncontroller\x18\x01 \x01(\x0b\x32&.core.protos.home_datastore.Controller\"%\n\x17\x44\x65leteControllerRequest\x12\n\n\x02id\x18\x01 \x01(\t\"Z\n\x1cGetControllerHardwareRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"&\n\x18\x44\x65leteOutdoorUnitRequest\x12\n\n\x02id\x18\x01 \x01(\t\"X\n\x1aGetQuiltSmartModuleRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"\\\n\x19\x43reateRemoteSensorRequest\x12?\n\rremote_sensor\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.RemoteSensor\"\\\n\x19UpdateRemoteSensorRequest\x12?\n\rremote_sensor\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.RemoteSensor\"5\n\x19\x44\x65leteRemoteSensorRequest\x12\x18\n\x10remote_sensor_id\x18\x01 \x01(\t\"p\n#CreateControllerRemoteSensorRequest\x12I\n\rremote_sensor\x18\x01 \x01(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\"p\n#UpdateControllerRemoteSensorRequest\x12I\n\rremote_sensor\x18\x01 \x01(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\"?\n#DeleteControllerRemoteSensorRequest\x12\x18\n\x10remote_sensor_id\x18\x01 \x01(\t\"Y\n\x18\x43reateScheduleDayRequest\x12=\n\x0cschedule_day\x18\x01 \x01(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"0\n\x15GetScheduleDayRequest\x12\x17\n\x0fschedule_day_id\x18\x01 \x01(\t\"Y\n\x18UpdateScheduleDayRequest\x12=\n\x0cschedule_day\x18\x01 \x01(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"3\n\x18\x44\x65leteScheduleDayRequest\x12\x17\n\x0fschedule_day_id\x18\x01 \x01(\t\")\n\x17ListScheduleDaysRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"Z\n\x18ListScheduleDaysResponse\x12>\n\rschedule_days\x18\x01 \x03(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"\\\n\x19\x43reateScheduleWeekRequest\x12?\n\rschedule_week\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"2\n\x16GetScheduleWeekRequest\x12\x18\n\x10schedule_week_id\x18\x01 \x01(\t\"\\\n\x19UpdateScheduleWeekRequest\x12?\n\rschedule_week\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"5\n\x19\x44\x65leteScheduleWeekRequest\x12\x18\n\x10schedule_week_id\x18\x01 \x01(\t\"*\n\x18ListScheduleWeeksRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"]\n\x19ListScheduleWeeksResponse\x12@\n\x0eschedule_weeks\x18\x01 \x03(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"b\n\x1b\x43reateComfortSettingRequest\x12\x43\n\x0f\x63omfort_setting\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"6\n\x18GetComfortSettingRequest\x12\x1a\n\x12\x63omfort_setting_id\x18\x01 \x01(\t\"b\n\x1bUpdateComfortSettingRequest\x12\x43\n\x0f\x63omfort_setting\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"9\n\x1b\x44\x65leteComfortSettingRequest\x12\x1a\n\x12\x63omfort_setting_id\x18\x01 \x01(\t\",\n\x1aListComfortSettingsRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"c\n\x1bListComfortSettingsResponse\x12\x44\n\x10\x63omfort_settings\x18\x01 \x03(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"O\n\x15\x43reateLocationRequest\x12\x36\n\x08location\x18\x01 \x01(\x0b\x32$.core.protos.home_datastore.Location\")\n\x12GetLocationRequest\x12\x13\n\x0blocation_id\x18\x01 \x01(\t\"O\n\x15UpdateLocationRequest\x12\x36\n\x08location\x18\x01 \x01(\x0b\x32$.core.protos.home_datastore.Location\",\n\x15\x44\x65leteLocationRequest\x12\x13\n\x0blocation_id\x18\x01 \x01(\t\")\n\x14ListLocationsRequest\x12\x11\n\tsystem_id\x18\x01 \x01(\t\"P\n\x15ListLocationsResponse\x12\x37\n\tlocations\x18\x01 \x03(\x0b\x32$.core.protos.home_datastore.Location*\xd7\x01\n\x08HVACMode\x12\x19\n\x15HVAC_MODE_UNSPECIFIED\x10\x00\x12\x15\n\x11HVAC_MODE_STANDBY\x10\x01\x12\x12\n\x0eHVAC_MODE_COOL\x10\x02\x12\x12\n\x0eHVAC_MODE_HEAT\x10\x03\x12\x12\n\x0eHVAC_MODE_AUTO\x10\x04\x12\x11\n\rHVAC_MODE_FAN\x10\x05\x12\x1b\n\x17HVAC_MODE_FALLBACK_AUTO\x10\x06\x12\x1a\n\x16HVAC_MODE_FALLBACK_OFF\x10\x07\x12\x11\n\rHVAC_MODE_DRY\x10\x08*\xf9\x02\n\tHVACState\x12\x1a\n\x16HVAC_STATE_UNSPECIFIED\x10\x00\x12\x16\n\x12HVAC_STATE_STANDBY\x10\x01\x12\x13\n\x0fHVAC_STATE_COOL\x10\x02\x12\x13\n\x0fHVAC_STATE_HEAT\x10\x03\x12\x14\n\x10HVAC_STATE_DRIFT\x10\x04\x12\x12\n\x0eHVAC_STATE_FAN\x10\x05\x12\x1c\n\x18HVAC_STATE_COOL_DEFERRED\x10\x06\x12\x1c\n\x18HVAC_STATE_HEAT_DEFERRED\x10\x07\x12\x1b\n\x17HVAC_STATE_FAN_DEFERRED\x10\x08\x12\x1d\n\x19HVAC_STATE_COOL_PREPARING\x10\t\x12\x1d\n\x19HVAC_STATE_HEAT_PREPARING\x10\n\x12\x12\n\x0eHVAC_STATE_DRY\x10\x0b\x12\x1b\n\x17HVAC_STATE_DRY_DEFERRED\x10\x0c\x12\x1c\n\x18HVAC_STATE_DRY_PREPARING\x10\r*\xe4\x01\n\x16LocalCommsHealthStatus\x12)\n%LOCAL_COMMS_HEALTH_STATUS_UNSPECIFIED\x10\x00\x12%\n!LOCAL_COMMS_HEALTH_STATUS_HEALTHY\x10\x01\x12&\n\"LOCAL_COMMS_HEALTH_STATUS_DEGRADED\x10\x02\x12%\n!LOCAL_COMMS_HEALTH_STATUS_OFFLINE\x10\x03\x12)\n%LOCAL_COMMS_HEALTH_STATUS_STARTING_UP\x10\x04*h\n\rOccupancyMode\x12\x1e\n\x1aOCCUPANCY_MODE_UNSPECIFIED\x10\x00\x12\x1b\n\x17OCCUPANCY_MODE_DISABLED\x10\x01\x12\x1a\n\x16OCCUPANCY_MODE_ENABLED\x10\x02*{\n\x11SafetyHeatingMode\x12#\n\x1fSAFETY_HEATING_MODE_UNSPECIFIED\x10\x00\x12 \n\x1cSAFETY_HEATING_MODE_DISABLED\x10\x01\x12\x1f\n\x1bSAFETY_HEATING_MODE_ENABLED\x10\x02*\xd1\x01\n\x12HvacControllerType\x12$\n HVAC_CONTROLLER_TYPE_UNSPECIFIED\x10\x00\x12\x31\n-HVAC_CONTROLLER_TYPE_PASS_THROUGH_TEMPERATURE\x10\x01\x12\x30\n,HVAC_CONTROLLER_TYPE_INTEGRAL_TEMPERATURE_V1\x10\x02\x12\x30\n,HVAC_CONTROLLER_TYPE_INTEGRAL_TEMPERATURE_V2\x10\x03*\xb7\x02\n\x16\x43omfortSettingOverride\x12(\n$COMFORT_SETTING_OVERRIDE_UNSPECIFIED\x10\x00\x12!\n\x1d\x43OMFORT_SETTING_OVERRIDE_NONE\x10\x01\x12\x30\n,COMFORT_SETTING_OVERRIDE_UNTIL_NEXT_SCHEDULE\x10\x02\x12\'\n#COMFORT_SETTING_OVERRIDE_INDEFINITE\x10\x03\x12%\n!COMFORT_SETTING_OVERRIDE_SCHEDULE\x10\x04\x12\'\n#COMFORT_SETTING_OVERRIDE_UNOCCUPIED\x10\x05\x12%\n!COMFORT_SETTING_OVERRIDE_OCCUPIED\x10\x06*\xdd\x01\n\x12\x43omfortSettingType\x12$\n COMFORT_SETTING_TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMFORT_SETTING_TYPE_ACTIVE\x10\x01\x12\x1e\n\x1a\x43OMFORT_SETTING_TYPE_SLEEP\x10\x02\x12\x1d\n\x19\x43OMFORT_SETTING_TYPE_AWAY\x10\x03\x12 \n\x1c\x43OMFORT_SETTING_TYPE_STANDBY\x10\x04\x12\x1f\n\x1b\x43OMFORT_SETTING_TYPE_CUSTOM\x10\x05*\x8f\x01\n\x14IndoorUnitLouverMode\x12\x1b\n\x17LOUVER_MODE_UNSPECIFIED\x10\x00\x12\x16\n\x12LOUVER_MODE_CLOSED\x10\x01\x12\x15\n\x11LOUVER_MODE_SWEEP\x10\x02\x12\x15\n\x11LOUVER_MODE_FIXED\x10\x03\x12\x14\n\x10LOUVER_MODE_AUTO\x10\x04*d\n\x0c\x46\x61nSpeedMode\x12\x1e\n\x1a\x46\x41N_SPEED_MODE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x46\x41N_SPEED_MODE_AUTO\x10\x01\x12\x1b\n\x17\x46\x41N_SPEED_MODE_SETPOINT\x10\x02*N\n\tBoostMode\x12\x1a\n\x16\x42OOST_MODE_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x42OOST_MODE_OFF\x10\x01\x12\x11\n\rBOOST_MODE_ON\x10\x02*\xc5\x01\n\x0eLightAnimation\x12\x1f\n\x1bLIGHT_ANIMATION_UNSPECIFIED\x10\x00\x12\x18\n\x14LIGHT_ANIMATION_NONE\x10\x01\x12 \n\x1cLIGHT_ANIMATION_SPARKLE_FADE\x10\x02\x12 \n\x1cLIGHT_ANIMATION_TWINKLE_FADE\x10\x03\x12\x19\n\x15LIGHT_ANIMATION_DANCE\x10\x04\x12\x19\n\x15LIGHT_ANIMATION_CHASE\x10\x05*R\n\nLightState\x12\x1b\n\x17LIGHT_STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0eLIGHT_STATE_ON\x10\x01\x12\x13\n\x0fLIGHT_STATE_OFF\x10\x02*k\n\x0e\x43onditionState\x12\x1f\n\x1b\x43ONDITION_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43ONDITION_STATE_INACTIVE\x10\x01\x12\x1a\n\x16\x43ONDITION_STATE_ACTIVE\x10\x02*T\n\x08Presence\x12\x18\n\x14PRESENCE_UNSPECIFIED\x10\x00\x12\x17\n\x13PRESENCE_UNDETECTED\x10\x01\x12\x15\n\x11PRESENCE_DETECTED\x10\x02*\x96\x01\n\x17RemoteSensorControlMode\x12*\n&REMOTE_SENSOR_CONTROL_MODE_UNSPECIFIED\x10\x00\x12\'\n#REMOTE_SENSOR_CONTROL_MODE_DISABLED\x10\x01\x12&\n\"REMOTE_SENSOR_CONTROL_MODE_ENABLED\x10\x02*\xb6\x01\n\x07Weekday\x12\x17\n\x13WEEKDAY_UNSPECIFIED\x10\x00\x12\x12\n\x0eWEEKDAY_MONDAY\x10\x01\x12\x13\n\x0fWEEKDAY_TUESDAY\x10\x02\x12\x15\n\x11WEEKDAY_WEDNESDAY\x10\x03\x12\x14\n\x10WEEKDAY_THURSDAY\x10\x04\x12\x12\n\x0eWEEKDAY_FRIDAY\x10\x05\x12\x14\n\x10WEEKDAY_SATURDAY\x10\x06\x12\x12\n\x0eWEEKDAY_SUNDAY\x10\x07*v\n\x11ScheduleExecution\x12\"\n\x1eSCHEDULE_EXECUTION_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSCHEDULE_EXECUTION_RUNNING\x10\x01\x12\x1d\n\x19SCHEDULE_EXECUTION_PAUSED\x10\x02*\x8c\x01\n\x16\x46\x61llbackControlCommand\x12(\n$FALLBACK_CONTROL_COMMAND_UNSPECIFIED\x10\x00\x12%\n!FALLBACK_CONTROL_COMMAND_COMPLETE\x10\x01\x12!\n\x1d\x46\x41LLBACK_CONTROL_COMMAND_EXIT\x10\x02*o\n\x0eOccupancyState\x12\x1f\n\x1bOCCUPANCY_STATE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aOCCUPANCY_STATE_UNDETECTED\x10\x01\x12\x1c\n\x18OCCUPANCY_STATE_DETECTED\x10\x02*\xd6\x02\n\x13WifiConnectionState\x12\x1a\n\x16WIFI_STATE_UNSPECIFIED\x10\x00\x12\x1b\n\x17WIFI_STATE_DISCONNECTED\x10\x01\x12!\n\x1dWIFI_STATE_INTERFACE_DISABLED\x10\x02\x12\x17\n\x13WIFI_STATE_INACTIVE\x10\x03\x12\x17\n\x13WIFI_STATE_SCANNING\x10\x04\x12\x1d\n\x19WIFI_STATE_AUTHENTICATING\x10\x05\x12\x1a\n\x16WIFI_STATE_ASSOCIATING\x10\x06\x12\x19\n\x15WIFI_STATE_ASSOCIATED\x10\x07\x12\x1d\n\x19WIFI_STATE_4WAY_HANDSHAKE\x10\x08\x12\x1e\n\x1aWIFI_STATE_GROUP_HANDSHAKE\x10\t\x12\x1c\n\x18WIFI_STATE_WPA_COMPLETED\x10\n2\x88#\n\x14HomeDatastoreService\x12\x84\x01\n\x16GetHomeDatastoreSystem\x12\x39.core.protos.home_datastore.GetHomeDatastoreSystemRequest\x1a/.core.protos.home_datastore.HomeDatastoreSystem\x12Z\n\x08GetSpace\x12+.core.protos.home_datastore.GetSpaceRequest\x1a!.core.protos.home_datastore.Space\x12`\n\x0b\x43reateSpace\x12..core.protos.home_datastore.CreateSpaceRequest\x1a!.core.protos.home_datastore.Space\x12`\n\x0bUpdateSpace\x12..core.protos.home_datastore.UpdateSpaceRequest\x1a!.core.protos.home_datastore.Space\x12U\n\x0b\x44\x65leteSpace\x12..core.protos.home_datastore.DeleteSpaceRequest\x1a\x16.google.protobuf.Empty\x12o\n\x10UpdateIndoorUnit\x12\x33.core.protos.home_datastore.UpdateIndoorUnitRequest\x1a&.core.protos.home_datastore.IndoorUnit\x12_\n\x10\x44\x65leteIndoorUnit\x12\x33.core.protos.home_datastore.DeleteIndoorUnitRequest\x1a\x16.google.protobuf.Empty\x12\x81\x01\n\x15GetIndoorUnitHardware\x12\x38.core.protos.home_datastore.GetIndoorUnitHardwareRequest\x1a..core.protos.home_datastore.IndoorUnitHardware\x12{\n\x13GetQuiltSmartModule\x12\x36.core.protos.home_datastore.GetQuiltSmartModuleRequest\x1a,.core.protos.home_datastore.QuiltSmartModule\x12o\n\x10UpdateController\x12\x33.core.protos.home_datastore.UpdateControllerRequest\x1a&.core.protos.home_datastore.Controller\x12_\n\x10\x44\x65leteController\x12\x33.core.protos.home_datastore.DeleteControllerRequest\x1a\x16.google.protobuf.Empty\x12\x81\x01\n\x15GetControllerHardware\x12\x38.core.protos.home_datastore.GetControllerHardwareRequest\x1a..core.protos.home_datastore.ControllerHardware\x12\x61\n\x11\x44\x65leteOutdoorUnit\x12\x34.core.protos.home_datastore.DeleteOutdoorUnitRequest\x1a\x16.google.protobuf.Empty\x12u\n\x12\x43reateRemoteSensor\x12\x35.core.protos.home_datastore.CreateRemoteSensorRequest\x1a(.core.protos.home_datastore.RemoteSensor\x12u\n\x12UpdateRemoteSensor\x12\x35.core.protos.home_datastore.UpdateRemoteSensorRequest\x1a(.core.protos.home_datastore.RemoteSensor\x12\x63\n\x12\x44\x65leteRemoteSensor\x12\x35.core.protos.home_datastore.DeleteRemoteSensorRequest\x1a\x16.google.protobuf.Empty\x12\x93\x01\n\x1c\x43reateControllerRemoteSensor\x12?.core.protos.home_datastore.CreateControllerRemoteSensorRequest\x1a\x32.core.protos.home_datastore.ControllerRemoteSensor\x12\x93\x01\n\x1cUpdateControllerRemoteSensor\x12?.core.protos.home_datastore.UpdateControllerRemoteSensorRequest\x1a\x32.core.protos.home_datastore.ControllerRemoteSensor\x12w\n\x1c\x44\x65leteControllerRemoteSensor\x12?.core.protos.home_datastore.DeleteControllerRemoteSensorRequest\x1a\x16.google.protobuf.Empty\x12r\n\x11\x43reateScheduleDay\x12\x34.core.protos.home_datastore.CreateScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12l\n\x0eGetScheduleDay\x12\x31.core.protos.home_datastore.GetScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12r\n\x11UpdateScheduleDay\x12\x34.core.protos.home_datastore.UpdateScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12\x61\n\x11\x44\x65leteScheduleDay\x12\x34.core.protos.home_datastore.DeleteScheduleDayRequest\x1a\x16.google.protobuf.Empty\x12}\n\x10ListScheduleDays\x12\x33.core.protos.home_datastore.ListScheduleDaysRequest\x1a\x34.core.protos.home_datastore.ListScheduleDaysResponse\x12u\n\x12\x43reateScheduleWeek\x12\x35.core.protos.home_datastore.CreateScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12o\n\x0fGetScheduleWeek\x12\x32.core.protos.home_datastore.GetScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12u\n\x12UpdateScheduleWeek\x12\x35.core.protos.home_datastore.UpdateScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12\x63\n\x12\x44\x65leteScheduleWeek\x12\x35.core.protos.home_datastore.DeleteScheduleWeekRequest\x1a\x16.google.protobuf.Empty\x12\x80\x01\n\x11ListScheduleWeeks\x12\x34.core.protos.home_datastore.ListScheduleWeeksRequest\x1a\x35.core.protos.home_datastore.ListScheduleWeeksResponse\x12{\n\x14\x43reateComfortSetting\x12\x37.core.protos.home_datastore.CreateComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12u\n\x11GetComfortSetting\x12\x34.core.protos.home_datastore.GetComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12{\n\x14UpdateComfortSetting\x12\x37.core.protos.home_datastore.UpdateComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12g\n\x14\x44\x65leteComfortSetting\x12\x37.core.protos.home_datastore.DeleteComfortSettingRequest\x1a\x16.google.protobuf.Empty\x12\x86\x01\n\x13ListComfortSettings\x12\x36.core.protos.home_datastore.ListComfortSettingsRequest\x1a\x37.core.protos.home_datastore.ListComfortSettingsResponse\x12i\n\x0e\x43reateLocation\x12\x31.core.protos.home_datastore.CreateLocationRequest\x1a$.core.protos.home_datastore.Location\x12\x63\n\x0bGetLocation\x12..core.protos.home_datastore.GetLocationRequest\x1a$.core.protos.home_datastore.Location\x12i\n\x0eUpdateLocation\x12\x31.core.protos.home_datastore.UpdateLocationRequest\x1a$.core.protos.home_datastore.Location\x12[\n\x0e\x44\x65leteLocation\x12\x31.core.protos.home_datastore.DeleteLocationRequest\x1a\x16.google.protobuf.Empty\x12t\n\rListLocations\x12\x30.core.protos.home_datastore.ListLocationsRequest\x1a\x31.core.protos.home_datastore.ListLocationsResponseB$\n\x13\x63om.quilt.proto.hdsB\rQuiltHdsProtob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fquilt_hds.proto\x12\x1a\x63ore.protos.home_datastore\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\"\xc5\x02\n\x10LocalCommsStatus\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x06status\x18\x02 \x01(\x0e\x32\x32.core.protos.home_datastore.LocalCommsHealthStatus\x12\x1d\n\x15visible_devices_count\x18\x03 \x01(\x05\x12\x1e\n\x16\x65xpected_devices_count\x18\x04 \x01(\x05\x12:\n\x16last_session_change_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x42\n\x06reason\x18\x06 \x01(\x0e\x32\x32.core.protos.home_datastore.LocalCommsHealthReason\"\x96\x01\n\x0e\x45ntityMetadata\x12\x11\n\tobject_id\x18\x01 \x01(\t\x12.\n\ncreated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tsystem_id\x18\x04 \x01(\t\"i\n\x12LocationAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rtz_identifier\x18\x03 \x01(\t\"\x8d\x01\n\x10LocationControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12I\n\x12schedule_execution\x18\x02 \x01(\x0e\x32-.core.protos.home_datastore.ScheduleExecution\"\xca\x01\n\x08Location\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x42\n\nattributes\x18\x02 \x01(\x0b\x32..core.protos.home_datastore.LocationAttributes\x12>\n\x08\x63ontrols\x18\x03 \x01(\x0b\x32,.core.protos.home_datastore.LocationControls\"z\n\x12SpaceRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x17\n\x0fparent_space_id\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x81\x03\n\rSpaceSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08timezone\x18\x04 \x01(\t\x12<\n\toccupancy\x18\x05 \x01(\x0e\x32).core.protos.home_datastore.OccupancyMode\x12L\n\x14hvac_controller_type\x18\x06 \x01(\x0e\x32..core.protos.home_datastore.HvacControllerType\x12\x1a\n\x12occupied_timeout_s\x18\x07 \x01(\x02\x12\x1c\n\x14unoccupied_timeout_s\x18\x08 \x01(\x02\x12\x45\n\x0esafety_heating\x18\t \x01(\x0e\x32-.core.protos.home_datastore.SafetyHeatingMode\"\xb8\x03\n\rSpaceControls\x12\x37\n\thvac_mode\x18\x01 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x1e\n\x16temperature_setpoint_c\x18\x02 \x01(\x02\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\x04 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x05 \x01(\x02\x12\x1a\n\x12\x63omfort_setting_id\x18\x06 \x01(\t\x12\x39\n\nboost_mode\x18\x07 \x01(\x0e\x32%.core.protos.home_datastore.BoostMode\x12T\n\x18\x63omfort_setting_override\x18\x08 \x01(\x0e\x32\x32.core.protos.home_datastore.ComfortSettingOverride\x12!\n\x19\x63omfort_setting_id_string\x18\t \x01(\t\"\xd2\x01\n\nSpaceState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16setpoint_temperature_c\x18\x02 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x03 \x01(\x02\x12\x39\n\nhvac_state\x18\x04 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x1a\n\x12\x63omfort_setting_id\x18\x05 \x01(\t\"\xbb\x02\n\x05Space\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x45\n\rrelationships\x18\x02 \x01(\x0b\x32..core.protos.home_datastore.SpaceRelationships\x12;\n\x08settings\x18\x03 \x01(\x0b\x32).core.protos.home_datastore.SpaceSettings\x12;\n\x08\x63ontrols\x18\x04 \x01(\x0b\x32).core.protos.home_datastore.SpaceControls\x12\x35\n\x05state\x18\x05 \x01(\x0b\x32&.core.protos.home_datastore.SpaceState\"\xe6\x01\n\x17IndoorUnitRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x17\n\x0foutdoor_unit_id\x18\x03 \x01(\t\x12\x13\n\x0bhardware_id\x18\x04 \x01(\t\x12\x1d\n\x15quilt_smart_module_id\x18\x05 \x01(\t\x12.\n\nupdated_ts\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17\x66irmware_update_info_id\x18\x07 \x01(\t\"\x9e\x02\n\x12IndoorUnitSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12(\n light_brightness_default_percent\x18\x03 \x01(\x02\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15presence_fence_left_m\x18\x05 \x01(\x02\x12\x1e\n\x16presence_fence_right_m\x18\x06 \x01(\x02\x12 \n\x18presence_fence_forward_m\x18\x07 \x01(\x02\x12*\n\"radar_sensor_distance_from_floor_m\x18\x08 \x01(\x02\"\xc3\x03\n\x12IndoorUnitControls\x12\x16\n\x0eled_color_code\x18\x03 \x01(\r\x12$\n\x1cled_color_brightness_percent\x18\x04 \x01(\x02\x12@\n\x0e\x66\x61n_speed_mode\x18\x05 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x06 \x01(\x02\x12.\n\nupdated_ts\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n\x0blouver_mode\x18\n \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\x0b \x01(\x02\x12\x41\n\rled_animation\x18\x0c \x01(\x0e\x32*.core.protos.home_datastore.LightAnimation\x12\x39\n\tled_state\x18\r \x01(\x0e\x32&.core.protos.home_datastore.LightState\"\x9c\x04\n\x0fIndoorUnitState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16temperature_setpoint_c\x18\x02 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x03 \x01(\x02\x12\x39\n\nhvac_state\x18\x04 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x1e\n\x16\x66\x61n_speed_setpoint_rpm\x18\x05 \x01(\x02\x12\x15\n\rfan_speed_rpm\x18\x06 \x01(\x02\x12 \n\x18light_brightness_percent\x18\x07 \x01(\x02\x12 \n\x18presence_detection_level\x18\x08 \x01(\x02\x12\x1b\n\x13inlet_temperature_c\x18\t \x01(\x02\x12\x1c\n\x14outlet_temperature_c\x18\n \x01(\x02\x12 \n\x18\x61mbient_humidity_percent\x18\x0b \x01(\x02\x12\x37\n\thvac_mode\x18\x0c \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12(\n calculated_ambient_temperature_c\x18\r \x01(\x02\x12$\n\x1clouver_angle_up_down_degrees\x18\x0e \x01(\x02\"\xbf\x07\n\x14IndoorUnitConditions\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\rmode_conflict\x18\x02 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x42\n\x0e\x61nti_cold_wind\x18\x03 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12T\n abnormal_outdoor_air_temperature\x18\x04 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12M\n\x19hvac_mode_switching_delay\x18\x05 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x41\n\rdefrost_cycle\x18\x06 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12\x42\n\x0esafety_heating\x18\x07 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12>\n\noil_return\x18\x08 \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12N\n\x1amodbus_communication_error\x18\t \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12@\n\x0c\x63oil_preheat\x18\n \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12K\n\x17mode_conflict_avoidance\x18\x0b \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12T\n outdoor_unit_communication_error\x18\x0c \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\x12O\n\x1b\x63ompressor_minimum_run_time\x18\r \x01(\x0e\x32*.core.protos.home_datastore.ConditionState\"\xc9\x01\n\x17IndoorUnitPresenceState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x10sensor0_presence\x18\x02 \x01(\x0e\x32$.core.protos.home_datastore.Presence\x12>\n\x10sensor1_presence\x18\x03 \x01(\x0e\x32$.core.protos.home_datastore.Presence\"\x9a\x01\n\x12IndoorUnitCommands\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12T\n\x18\x66\x61llback_control_command\x18\x02 \x01(\x0e\x32\x32.core.protos.home_datastore.FallbackControlCommand\"\xad\x02\n\x1cIndoorUnitHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12\x19\n\x11\x66\x61n_speed_max_rpm\x18\x05 \x01(\x02\x12.\n\nupdated_ts\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12!\n\x19indoor_unit_serial_number\x18\x07 \x01(\t\x12(\n quilt_smart_module_serial_number\x18\x08 \x01(\t\"\x9e\x01\n\x12IndoorUnitHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.IndoorUnitHardwareAttributes\"\xf4\x02\n\x14IndoorUnitHvacInputs\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12&\n\x1e\x65xternal_ambient_temperature_c\x18\x02 \x01(\x02\x12\"\n\x1a\x61mbient_temperature_source\x18\x03 \x01(\x05\x12\x1e\n\x16temperature_setpoint_c\x18\x04 \x01(\x02\x12\x37\n\thvac_mode\x18\x05 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12L\n\x14hvac_controller_type\x18\x06 \x01(\x0e\x32..core.protos.home_datastore.HvacControllerType\x12\x39\n\nhvac_state\x18\x07 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\xd1\x03\n\x19IndoorUnitPerformanceData\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_interval_s\x18\x02 \x01(\x02\x12\x1c\n\x14\x65nergy_measurement_j\x18\x03 \x01(\x02\x12\x37\n\thvac_mode\x18\x04 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x1c\n\x14\x61\x63tual_fan_speed_rpm\x18\x05 \x01(\x02\x12\x1c\n\x14outlet_temperature_c\x18\x06 \x01(\x02\x12\x1a\n\x12inlet_humidity_pct\x18\x07 \x01(\x02\x12\x1b\n\x13inlet_temperature_c\x18\x08 \x01(\x02\x12\x1a\n\x12\x63oil_temperature_c\x18\t \x01(\x02\x12\x1e\n\x16gas_pipe_temperature_c\x18\n \x01(\x02\x12!\n\x19liquid_pipe_temperature_c\x18\x0b \x01(\x02\x12\x39\n\nhvac_state\x18\x0c \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\x8a\x03\n\x1cIndoorUnitPerformanceMetrics\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_duration_s\x18\x0b \x01(\x02\x12\x16\n\x0e\x65nergy_total_j\x18\x04 \x01(\x02\x12\x12\n\ncapacity_w\x18\x05 \x01(\x02\x12\"\n\x1a\x63oefficient_of_performance\x18\x06 \x01(\x02\x12\x37\n\thvac_mode\x18\x07 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x14\n\x0chvac_power_w\x18\x08 \x01(\x02\x12\x13\n\x0bled_power_w\x18\t \x01(\x02\x12\x39\n\nhvac_state\x18\n \x01(\x0e\x32%.core.protos.home_datastore.HVACState\x12\x15\n\rhvac_energy_j\x18\x0c \x01(\x02\x12\x14\n\x0cled_energy_j\x18\r \x01(\x02\"\x8a\x01\n\x13IndoorUnitOccupancy\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x0foccupancy_state\x18\x02 \x01(\x0e\x32*.core.protos.home_datastore.OccupancyState\"\xd6\x06\n\nIndoorUnit\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12J\n\rrelationships\x18\x02 \x01(\x0b\x32\x33.core.protos.home_datastore.IndoorUnitRelationships\x12@\n\x08settings\x18\x03 \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitSettings\x12@\n\x08\x63ontrols\x18\x04 \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitControls\x12:\n\x05state\x18\x05 \x01(\x0b\x32+.core.protos.home_datastore.IndoorUnitState\x12\x45\n\x0bhvac_inputs\x18\x06 \x01(\x0b\x32\x30.core.protos.home_datastore.IndoorUnitHvacInputs\x12\x45\n\x08presence\x18\x07 \x01(\x0b\x32\x33.core.protos.home_datastore.IndoorUnitPresenceState\x12\x44\n\nconditions\x18\x08 \x01(\x0b\x32\x30.core.protos.home_datastore.IndoorUnitConditions\x12@\n\x08\x63ommands\x18\t \x01(\x0b\x32..core.protos.home_datastore.IndoorUnitCommands\x12O\n\x10performance_data\x18\n \x01(\x0b\x32\x35.core.protos.home_datastore.IndoorUnitPerformanceData\x12U\n\x13performance_metrics\x18\x0b \x01(\x0b\x32\x38.core.protos.home_datastore.IndoorUnitPerformanceMetrics\x12\x42\n\toccupancy\x18\x0c \x01(\x0b\x32/.core.protos.home_datastore.IndoorUnitOccupancy\"\xaf\x01\n\x18OutdoorUnitRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0bhardware_id\x18\x03 \x01(\t\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17\x66irmware_update_info_id\x18\x05 \x01(\t\"h\n\x13OutdoorUnitSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"}\n\x10OutdoorUnitState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x39\n\nhvac_state\x18\x02 \x01(\x0e\x32%.core.protos.home_datastore.HVACState\"\xba\x02\n\x1aOutdoorUnitPerformanceData\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1e\n\x16measurement_interval_s\x18\x02 \x01(\x02\x12\x1c\n\x14\x65nergy_measurement_j\x18\x03 \x01(\x02\x12\x1f\n\x17\x63ompressor_frequency_hz\x18\x04 \x01(\x02\x12\x1d\n\x15\x61mbient_temperature_c\x18\x05 \x01(\x02\x12\x1a\n\x12\x63oil_temperature_c\x18\x06 \x01(\x02\x12\x1d\n\x15\x65xhaust_temperature_c\x18\x07 \x01(\x02\x12\x19\n\x11high_pressure_kpa\x18\x08 \x01(\x02\x12\x18\n\x10low_pressure_kpa\x18\t \x01(\x02\"\xc6\x01\n\x1dOutdoorUnitHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12.\n\nupdated_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xa0\x01\n\x13OutdoorUnitHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12M\n\nattributes\x18\x02 \x01(\x0b\x32\x39.core.protos.home_datastore.OutdoorUnitHardwareAttributes\"\xe8\x02\n\x0bOutdoorUnit\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12K\n\rrelationships\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.OutdoorUnitRelationships\x12\x41\n\x08settings\x18\x03 \x01(\x0b\x32/.core.protos.home_datastore.OutdoorUnitSettings\x12;\n\x05state\x18\x04 \x01(\x0b\x32,.core.protos.home_datastore.OutdoorUnitState\x12P\n\x10performance_data\x18\x05 \x01(\x0b\x32\x36.core.protos.home_datastore.OutdoorUnitPerformanceData\"\xcf\x01\n\x17\x43ontrollerRelationships\x12\x1b\n\x13\x63ustomer_account_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0bhardware_id\x18\x03 \x01(\t\x12.\n\nupdated_ts\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17software_update_info_id\x18\x05 \x01(\t\x12\x1f\n\x17\x66irmware_update_info_id\x18\x06 \x01(\t\"g\n\x12\x43ontrollerSettings\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xa8\x01\n\x0f\x43ontrollerState\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15\x61mbient_temperature_c\x18\x02 \x01(\x02\x12\x16\n\x0etemperature_f3\x18\x03 \x01(\x02\x12\x16\n\x0etemperature_f4\x18\x04 \x01(\x02\x12\x16\n\x0etemperature_f5\x18\x05 \x01(\x02\"\x9d\x01\n\x12\x43ontrollerControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12W\n\x1aremote_sensor_control_mode\x18\x02 \x01(\x0e\x32\x33.core.protos.home_datastore.RemoteSensorControlMode\"\xde\x02\n\tWifiState\x12\x43\n\nwifi_state\x18\x01 \x01(\x0e\x32/.core.protos.home_datastore.WifiConnectionState\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\r\n\x05\x62ssid\x18\x03 \x01(\t\x12\x15\n\rfrequency_mhz\x18\x04 \x01(\x05\x12\x12\n\npassphrase\x18\x05 \x01(\t\x12\x18\n\x10signal_level_dbm\x18\x06 \x01(\x05\x12\x17\n\x0fnoise_level_dbm\x18\x07 \x01(\x05\x12\x17\n\x0frx_invalid_frag\x18\x08 \x01(\x05\x12\x1c\n\x14tx_excessive_retries\x18\t \x01(\x05\x12\x14\n\x0cipv4_address\x18\n \x01(\t\x12\x14\n\x0cipv6_address\x18\x0b \x01(\t\x12.\n\nupdated_ts\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xc5\x01\n\x1c\x43ontrollerHardwareAttributes\x12\x11\n\tmodel_sku\x18\x01 \x01(\t\x12\x15\n\rserial_number\x18\x02 \x01(\t\x12\x31\n\rproduction_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x18\n\x10\x66irmware_version\x18\x04 \x01(\t\x12.\n\nupdated_ts\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x9e\x01\n\x12\x43ontrollerHardware\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.ControllerHardwareAttributes\"\xdd\x04\n\nController\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12J\n\rrelationships\x18\x02 \x01(\x0b\x32\x33.core.protos.home_datastore.ControllerRelationships\x12@\n\x08settings\x18\x03 \x01(\x0b\x32..core.protos.home_datastore.ControllerSettings\x12:\n\x05state\x18\x04 \x01(\x0b\x32+.core.protos.home_datastore.ControllerState\x12@\n\x11hosted_wifi_state\x18\x05 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12<\n\rap_wifi_state\x18\x06 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12=\n\x0ep2p_wifi_state\x18\x07 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12@\n\x08\x63ontrols\x18\x08 \x01(\x0b\x32..core.protos.home_datastore.ControllerControls\x12H\n\x12local_comms_status\x18\t \x01(\x0b\x32,.core.protos.home_datastore.LocalCommsStatus\"U\n\x16RemoteSensorAttributes\x12\x0b\n\x03mac\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb5\x01\n\x11RemoteSensorState\x12\x1d\n\x15\x61mbient_temperature_c\x18\x01 \x01(\x02\x12\x18\n\x10humidity_percent\x18\x02 \x01(\x02\x12.\n\nupdated_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1d\n\x15\x62\x61ttery_level_percent\x18\x04 \x01(\x02\x12\x18\n\x10signal_level_dbm\x18\x05 \x01(\x05\"c\n\x19RemoteSensorRelationships\x12\x16\n\x0eindoor_unit_id\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"l\n#ControllerRemoteSensorRelationships\x12\x15\n\rcontroller_id\x18\x01 \x01(\t\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x91\x01\n\x14RemoteSensorControls\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12I\n\x0c\x63ontrol_mode\x18\x02 \x01(\x0e\x32\x33.core.protos.home_datastore.RemoteSensorControlMode\"\xe2\x02\n\x0cRemoteSensor\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\nattributes\x18\x02 \x01(\x0b\x32\x32.core.protos.home_datastore.RemoteSensorAttributes\x12<\n\x05state\x18\x03 \x01(\x0b\x32-.core.protos.home_datastore.RemoteSensorState\x12L\n\rrelationships\x18\x04 \x01(\x0b\x32\x35.core.protos.home_datastore.RemoteSensorRelationships\x12\x42\n\x08\x63ontrols\x18\x05 \x01(\x0b\x32\x30.core.protos.home_datastore.RemoteSensorControls\"\xf6\x02\n\x16\x43ontrollerRemoteSensor\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\nattributes\x18\x02 \x01(\x0b\x32\x32.core.protos.home_datastore.RemoteSensorAttributes\x12<\n\x05state\x18\x03 \x01(\x0b\x32-.core.protos.home_datastore.RemoteSensorState\x12V\n\rrelationships\x18\x04 \x01(\x0b\x32?.core.protos.home_datastore.ControllerRemoteSensorRelationships\x12\x42\n\x08\x63ontrols\x18\x05 \x01(\x0b\x32\x30.core.protos.home_datastore.RemoteSensorControls\"\xe2\x03\n\x18\x43omfortSettingAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\x12@\n\x0e\x66\x61n_speed_mode\x18\x03 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x04 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x05 \x01(\x02\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\x06 \x01(\x02\x12<\n\x04type\x18\x07 \x01(\x0e\x32..core.protos.home_datastore.ComfortSettingType\x12\x37\n\thvac_mode\x18\x08 \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x45\n\x0blouver_mode\x18\t \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\n \x01(\x02\"_\n\x1b\x43omfortSettingRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xe6\x01\n\x0e\x43omfortSetting\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12H\n\nattributes\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.ComfortSettingAttributes\x12N\n\rrelationships\x18\x03 \x01(\x0b\x32\x37.core.protos.home_datastore.ComfortSettingRelationships\"\xd0\x01\n\x10LedScheduleEvent\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07start_s\x18\x02 \x01(\x05\x12\x16\n\x0eled_color_code\x18\x03 \x01(\r\x12$\n\x1cled_color_brightness_percent\x18\x04 \x01(\x02\x12=\n\tanimation\x18\x05 \x01(\x0e\x32*.core.protos.home_datastore.LightAnimation\"\x99\x04\n\rScheduleEvent\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1a\n\x12\x63omfort_setting_id\x18\x02 \x01(\t\x12\x0f\n\x07start_s\x18\x03 \x01(\x05\x12\x14\n\x0cprecondition\x18\x04 \x01(\x08\x12I\n\x12schedule_execution\x18\x05 \x01(\x0e\x32-.core.protos.home_datastore.ScheduleExecution\x12@\n\x0e\x66\x61n_speed_mode\x18\x06 \x01(\x0e\x32(.core.protos.home_datastore.FanSpeedMode\x12\x19\n\x11\x66\x61n_speed_percent\x18\x07 \x01(\x02\x12&\n\x1eheating_temperature_setpoint_c\x18\x08 \x01(\x02\x12&\n\x1e\x63ooling_temperature_setpoint_c\x18\t \x01(\x02\x12\x37\n\thvac_mode\x18\n \x01(\x0e\x32$.core.protos.home_datastore.HVACMode\x12\x45\n\x0blouver_mode\x18\x0b \x01(\x0e\x32\x30.core.protos.home_datastore.IndoorUnitLouverMode\x12\x1d\n\x15louver_fixed_position\x18\x0c \x01(\x02\"U\n\x15ScheduleDayAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04name\x18\x02 \x01(\t\"\\\n\x18ScheduleDayRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xda\x02\n\x0bScheduleDay\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x45\n\nattributes\x18\x02 \x01(\x0b\x32\x31.core.protos.home_datastore.ScheduleDayAttributes\x12\x39\n\x06\x65vents\x18\x03 \x03(\x0b\x32).core.protos.home_datastore.ScheduleEvent\x12K\n\rrelationships\x18\x04 \x01(\x0b\x32\x34.core.protos.home_datastore.ScheduleDayRelationships\x12@\n\nled_events\x18\x05 \x03(\x0b\x32,.core.protos.home_datastore.LedScheduleEvent\"\x87\x01\n\x0fScheduleWeekDay\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x64\x61y_id\x18\x02 \x01(\t\x12\x34\n\x07weekday\x18\x03 \x01(\x0e\x32#.core.protos.home_datastore.Weekday\"]\n\x19ScheduleWeekRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\xd3\x01\n\x0cScheduleWeek\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x39\n\x04\x64\x61ys\x18\x02 \x03(\x0b\x32+.core.protos.home_datastore.ScheduleWeekDay\x12L\n\rrelationships\x18\x03 \x01(\x0b\x32\x35.core.protos.home_datastore.ScheduleWeekRelationships\"\x91\x01\n\x1dQuiltSmartModuleRelationships\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x17software_update_info_id\x18\x02 \x01(\t\x12\x1f\n\x17\x66irmware_update_info_id\x18\x03 \x01(\t\"b\n\x18QuiltSmartModuleControls\x12\x16\n\x0eled_color_code\x18\x01 \x01(\x05\x12.\n\nupdated_ts\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x86\x02\n\x15QuiltSmartModuleState\x12\x1a\n\x12phase_detected_raw\x18\x01 \x01(\x02\x12\x1b\n\x13target_detected_raw\x18\x02 \x01(\x02\x12\x1b\n\x13\x61ls_illuminance_raw\x18\x03 \x01(\x05\x12\x12\n\nals_ir_raw\x18\x04 \x01(\x05\x12\x14\n\x0c\x61ls_both_raw\x18\x05 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_x_raw\x18\x06 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_y_raw\x18\x07 \x01(\x05\x12\x13\n\x0b\x61\x63\x63\x65l_z_raw\x18\x08 \x01(\x05\x12.\n\nupdated_ts\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xb3\x04\n\x10QuiltSmartModule\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12\x46\n\x08\x63ontrols\x18\x02 \x01(\x0b\x32\x34.core.protos.home_datastore.QuiltSmartModuleControls\x12@\n\x05state\x18\x03 \x01(\x0b\x32\x31.core.protos.home_datastore.QuiltSmartModuleState\x12@\n\x11hosted_wifi_state\x18\x04 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12<\n\rap_wifi_state\x18\x05 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12=\n\x0ep2p_wifi_state\x18\x06 \x01(\x0b\x32%.core.protos.home_datastore.WifiState\x12P\n\rrelationships\x18\x07 \x01(\x0b\x32\x39.core.protos.home_datastore.QuiltSmartModuleRelationships\x12H\n\x12local_comms_status\x18\x08 \x01(\x0b\x32,.core.protos.home_datastore.LocalCommsStatus\"\xe7\x01\n\x1cSoftwareUpdateInfoAttributes\x12.\n\nupdated_ts\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\r\n\x05state\x18\x02 \x01(\x05\x12\x0e\n\x06status\x18\x03 \x01(\x05\x12\x17\n\x0f\x63urrent_version\x18\x04 \x01(\t\x12\x16\n\x0etarget_version\x18\x05 \x01(\t\x12\x18\n\x10\x63urrent_progress\x18\x06 \x01(\x02\x12\x16\n\x0etotal_progress\x18\x07 \x01(\x02\x12\x15\n\rprogress_unit\x18\x08 \x01(\x05\"\x9e\x01\n\x12SoftwareUpdateInfo\x12:\n\x06header\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.EntityMetadata\x12L\n\nattributes\x18\x02 \x01(\x0b\x32\x38.core.protos.home_datastore.SoftwareUpdateInfoAttributes\"\xa2\x08\n\x13HomeDatastoreSystem\x12\x31\n\x06spaces\x18\x03 \x03(\x0b\x32!.core.protos.home_datastore.Space\x12N\n\x15outdoor_unit_hardware\x18\x05 \x03(\x0b\x32/.core.protos.home_datastore.OutdoorUnitHardware\x12>\n\routdoor_units\x18\x06 \x03(\x0b\x32\'.core.protos.home_datastore.OutdoorUnit\x12I\n\x13quilt_smart_modules\x18\x07 \x03(\x0b\x32,.core.protos.home_datastore.QuiltSmartModule\x12L\n\x14indoor_unit_hardware\x18\x08 \x03(\x0b\x32..core.protos.home_datastore.IndoorUnitHardware\x12<\n\x0cindoor_units\x18\t \x03(\x0b\x32&.core.protos.home_datastore.IndoorUnit\x12K\n\x13\x63ontroller_hardware\x18\n \x03(\x0b\x32..core.protos.home_datastore.ControllerHardware\x12;\n\x0b\x63ontrollers\x18\x0b \x03(\x0b\x32&.core.protos.home_datastore.Controller\x12@\n\x0eremote_sensors\x18\x0c \x03(\x0b\x32(.core.protos.home_datastore.RemoteSensor\x12\x44\n\x10\x63omfort_settings\x18\r \x03(\x0b\x32*.core.protos.home_datastore.ComfortSetting\x12>\n\rschedule_days\x18\x0e \x03(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\x12@\n\x0eschedule_weeks\x18\x0f \x03(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\x12U\n\x19\x63ontroller_remote_sensors\x18\x10 \x03(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\x12\x37\n\tlocations\x18\x11 \x03(\x0b\x32$.core.protos.home_datastore.Location\x12M\n\x15software_update_infos\x18\x12 \x03(\x0b\x32..core.protos.home_datastore.SoftwareUpdateInfo\"b\n\x1dGetHomeDatastoreSystemRequest\x12\x11\n\tsystem_id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"\x1d\n\x0fGetSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"F\n\x12\x43reateSpaceRequest\x12\x30\n\x05space\x18\x01 \x01(\x0b\x32!.core.protos.home_datastore.Space\"E\n\x12UpdateSpaceRequest\x12/\n\x04\x64iff\x18\x01 \x01(\x0b\x32!.core.protos.home_datastore.Space\" \n\x12\x44\x65leteSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"O\n\x17UpdateIndoorUnitRequest\x12\x34\n\x04\x64iff\x18\x01 \x01(\x0b\x32&.core.protos.home_datastore.IndoorUnit\"%\n\x17\x44\x65leteIndoorUnitRequest\x12\n\n\x02id\x18\x01 \x01(\t\"Z\n\x1cGetIndoorUnitHardwareRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"U\n\x17UpdateControllerRequest\x12:\n\ncontroller\x18\x01 \x01(\x0b\x32&.core.protos.home_datastore.Controller\"%\n\x17\x44\x65leteControllerRequest\x12\n\n\x02id\x18\x01 \x01(\t\"Z\n\x1cGetControllerHardwareRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"&\n\x18\x44\x65leteOutdoorUnitRequest\x12\n\n\x02id\x18\x01 \x01(\t\"X\n\x1aGetQuiltSmartModuleRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12.\n\nfield_mask\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"\\\n\x19\x43reateRemoteSensorRequest\x12?\n\rremote_sensor\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.RemoteSensor\"\\\n\x19UpdateRemoteSensorRequest\x12?\n\rremote_sensor\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.RemoteSensor\"5\n\x19\x44\x65leteRemoteSensorRequest\x12\x18\n\x10remote_sensor_id\x18\x01 \x01(\t\"p\n#CreateControllerRemoteSensorRequest\x12I\n\rremote_sensor\x18\x01 \x01(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\"p\n#UpdateControllerRemoteSensorRequest\x12I\n\rremote_sensor\x18\x01 \x01(\x0b\x32\x32.core.protos.home_datastore.ControllerRemoteSensor\"?\n#DeleteControllerRemoteSensorRequest\x12\x18\n\x10remote_sensor_id\x18\x01 \x01(\t\"Y\n\x18\x43reateScheduleDayRequest\x12=\n\x0cschedule_day\x18\x01 \x01(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"0\n\x15GetScheduleDayRequest\x12\x17\n\x0fschedule_day_id\x18\x01 \x01(\t\"Y\n\x18UpdateScheduleDayRequest\x12=\n\x0cschedule_day\x18\x01 \x01(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"3\n\x18\x44\x65leteScheduleDayRequest\x12\x17\n\x0fschedule_day_id\x18\x01 \x01(\t\")\n\x17ListScheduleDaysRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"Z\n\x18ListScheduleDaysResponse\x12>\n\rschedule_days\x18\x01 \x03(\x0b\x32\'.core.protos.home_datastore.ScheduleDay\"\\\n\x19\x43reateScheduleWeekRequest\x12?\n\rschedule_week\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"2\n\x16GetScheduleWeekRequest\x12\x18\n\x10schedule_week_id\x18\x01 \x01(\t\"\\\n\x19UpdateScheduleWeekRequest\x12?\n\rschedule_week\x18\x01 \x01(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"5\n\x19\x44\x65leteScheduleWeekRequest\x12\x18\n\x10schedule_week_id\x18\x01 \x01(\t\"*\n\x18ListScheduleWeeksRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"]\n\x19ListScheduleWeeksResponse\x12@\n\x0eschedule_weeks\x18\x01 \x03(\x0b\x32(.core.protos.home_datastore.ScheduleWeek\"b\n\x1b\x43reateComfortSettingRequest\x12\x43\n\x0f\x63omfort_setting\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"6\n\x18GetComfortSettingRequest\x12\x1a\n\x12\x63omfort_setting_id\x18\x01 \x01(\t\"b\n\x1bUpdateComfortSettingRequest\x12\x43\n\x0f\x63omfort_setting\x18\x01 \x01(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"9\n\x1b\x44\x65leteComfortSettingRequest\x12\x1a\n\x12\x63omfort_setting_id\x18\x01 \x01(\t\",\n\x1aListComfortSettingsRequest\x12\x0e\n\x06\x66ilter\x18\x01 \x01(\t\"c\n\x1bListComfortSettingsResponse\x12\x44\n\x10\x63omfort_settings\x18\x01 \x03(\x0b\x32*.core.protos.home_datastore.ComfortSetting\"O\n\x15\x43reateLocationRequest\x12\x36\n\x08location\x18\x01 \x01(\x0b\x32$.core.protos.home_datastore.Location\")\n\x12GetLocationRequest\x12\x13\n\x0blocation_id\x18\x01 \x01(\t\"O\n\x15UpdateLocationRequest\x12\x36\n\x08location\x18\x01 \x01(\x0b\x32$.core.protos.home_datastore.Location\",\n\x15\x44\x65leteLocationRequest\x12\x13\n\x0blocation_id\x18\x01 \x01(\t\")\n\x14ListLocationsRequest\x12\x11\n\tsystem_id\x18\x01 \x01(\t\"P\n\x15ListLocationsResponse\x12\x37\n\tlocations\x18\x01 \x03(\x0b\x32$.core.protos.home_datastore.Location*\xd7\x01\n\x08HVACMode\x12\x19\n\x15HVAC_MODE_UNSPECIFIED\x10\x00\x12\x15\n\x11HVAC_MODE_STANDBY\x10\x01\x12\x12\n\x0eHVAC_MODE_COOL\x10\x02\x12\x12\n\x0eHVAC_MODE_HEAT\x10\x03\x12\x12\n\x0eHVAC_MODE_AUTO\x10\x04\x12\x11\n\rHVAC_MODE_FAN\x10\x05\x12\x1b\n\x17HVAC_MODE_FALLBACK_AUTO\x10\x06\x12\x1a\n\x16HVAC_MODE_FALLBACK_OFF\x10\x07\x12\x11\n\rHVAC_MODE_DRY\x10\x08*\xf9\x02\n\tHVACState\x12\x1a\n\x16HVAC_STATE_UNSPECIFIED\x10\x00\x12\x16\n\x12HVAC_STATE_STANDBY\x10\x01\x12\x13\n\x0fHVAC_STATE_COOL\x10\x02\x12\x13\n\x0fHVAC_STATE_HEAT\x10\x03\x12\x14\n\x10HVAC_STATE_DRIFT\x10\x04\x12\x12\n\x0eHVAC_STATE_FAN\x10\x05\x12\x1c\n\x18HVAC_STATE_COOL_DEFERRED\x10\x06\x12\x1c\n\x18HVAC_STATE_HEAT_DEFERRED\x10\x07\x12\x1b\n\x17HVAC_STATE_FAN_DEFERRED\x10\x08\x12\x1d\n\x19HVAC_STATE_COOL_PREPARING\x10\t\x12\x1d\n\x19HVAC_STATE_HEAT_PREPARING\x10\n\x12\x12\n\x0eHVAC_STATE_DRY\x10\x0b\x12\x1b\n\x17HVAC_STATE_DRY_DEFERRED\x10\x0c\x12\x1c\n\x18HVAC_STATE_DRY_PREPARING\x10\r*\xe4\x01\n\x16LocalCommsHealthStatus\x12)\n%LOCAL_COMMS_HEALTH_STATUS_UNSPECIFIED\x10\x00\x12%\n!LOCAL_COMMS_HEALTH_STATUS_HEALTHY\x10\x01\x12&\n\"LOCAL_COMMS_HEALTH_STATUS_DEGRADED\x10\x02\x12%\n!LOCAL_COMMS_HEALTH_STATUS_OFFLINE\x10\x03\x12)\n%LOCAL_COMMS_HEALTH_STATUS_STARTING_UP\x10\x04*\xda\x04\n\x16LocalCommsHealthReason\x12)\n%LOCAL_COMMS_HEALTH_REASON_UNSPECIFIED\x10\x00\x12%\n!LOCAL_COMMS_HEALTH_REASON_HEALTHY\x10\x01\x12,\n(LOCAL_COMMS_HEALTH_REASON_BOOT_OR_WARMUP\x10\x02\x12\x30\n,LOCAL_COMMS_HEALTH_REASON_ZENOH_SESSION_DOWN\x10\x03\x12.\n*LOCAL_COMMS_HEALTH_REASON_NO_PEERS_VISIBLE\x10\x04\x12\x30\n,LOCAL_COMMS_HEALTH_REASON_PARTIAL_VISIBILITY\x10\x05\x12\x32\n.LOCAL_COMMS_HEALTH_REASON_NO_MESSAGES_RECEIVED\x10\x06\x12\x31\n-LOCAL_COMMS_HEALTH_REASON_SESSION_INSTABILITY\x10\x07\x12,\n(LOCAL_COMMS_HEALTH_REASON_NO_ALIVE_PEERS\x10\x08\x12/\n+LOCAL_COMMS_HEALTH_REASON_NO_PEERS_EXPECTED\x10\t\x12\x33\n/LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_NOT_READY\x10\n\x12\x31\n-LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_EXPIRED\x10\x0b*h\n\rOccupancyMode\x12\x1e\n\x1aOCCUPANCY_MODE_UNSPECIFIED\x10\x00\x12\x1b\n\x17OCCUPANCY_MODE_DISABLED\x10\x01\x12\x1a\n\x16OCCUPANCY_MODE_ENABLED\x10\x02*{\n\x11SafetyHeatingMode\x12#\n\x1fSAFETY_HEATING_MODE_UNSPECIFIED\x10\x00\x12 \n\x1cSAFETY_HEATING_MODE_DISABLED\x10\x01\x12\x1f\n\x1bSAFETY_HEATING_MODE_ENABLED\x10\x02*\xd1\x01\n\x12HvacControllerType\x12$\n HVAC_CONTROLLER_TYPE_UNSPECIFIED\x10\x00\x12\x31\n-HVAC_CONTROLLER_TYPE_PASS_THROUGH_TEMPERATURE\x10\x01\x12\x30\n,HVAC_CONTROLLER_TYPE_INTEGRAL_TEMPERATURE_V1\x10\x02\x12\x30\n,HVAC_CONTROLLER_TYPE_INTEGRAL_TEMPERATURE_V2\x10\x03*\xb7\x02\n\x16\x43omfortSettingOverride\x12(\n$COMFORT_SETTING_OVERRIDE_UNSPECIFIED\x10\x00\x12!\n\x1d\x43OMFORT_SETTING_OVERRIDE_NONE\x10\x01\x12\x30\n,COMFORT_SETTING_OVERRIDE_UNTIL_NEXT_SCHEDULE\x10\x02\x12\'\n#COMFORT_SETTING_OVERRIDE_INDEFINITE\x10\x03\x12%\n!COMFORT_SETTING_OVERRIDE_SCHEDULE\x10\x04\x12\'\n#COMFORT_SETTING_OVERRIDE_UNOCCUPIED\x10\x05\x12%\n!COMFORT_SETTING_OVERRIDE_OCCUPIED\x10\x06*\xdd\x01\n\x12\x43omfortSettingType\x12$\n COMFORT_SETTING_TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMFORT_SETTING_TYPE_ACTIVE\x10\x01\x12\x1e\n\x1a\x43OMFORT_SETTING_TYPE_SLEEP\x10\x02\x12\x1d\n\x19\x43OMFORT_SETTING_TYPE_AWAY\x10\x03\x12 \n\x1c\x43OMFORT_SETTING_TYPE_STANDBY\x10\x04\x12\x1f\n\x1b\x43OMFORT_SETTING_TYPE_CUSTOM\x10\x05*\x8f\x01\n\x14IndoorUnitLouverMode\x12\x1b\n\x17LOUVER_MODE_UNSPECIFIED\x10\x00\x12\x16\n\x12LOUVER_MODE_CLOSED\x10\x01\x12\x15\n\x11LOUVER_MODE_SWEEP\x10\x02\x12\x15\n\x11LOUVER_MODE_FIXED\x10\x03\x12\x14\n\x10LOUVER_MODE_AUTO\x10\x04*d\n\x0c\x46\x61nSpeedMode\x12\x1e\n\x1a\x46\x41N_SPEED_MODE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x46\x41N_SPEED_MODE_AUTO\x10\x01\x12\x1b\n\x17\x46\x41N_SPEED_MODE_SETPOINT\x10\x02*N\n\tBoostMode\x12\x1a\n\x16\x42OOST_MODE_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x42OOST_MODE_OFF\x10\x01\x12\x11\n\rBOOST_MODE_ON\x10\x02*\xc5\x01\n\x0eLightAnimation\x12\x1f\n\x1bLIGHT_ANIMATION_UNSPECIFIED\x10\x00\x12\x18\n\x14LIGHT_ANIMATION_NONE\x10\x01\x12 \n\x1cLIGHT_ANIMATION_SPARKLE_FADE\x10\x02\x12 \n\x1cLIGHT_ANIMATION_TWINKLE_FADE\x10\x03\x12\x19\n\x15LIGHT_ANIMATION_DANCE\x10\x04\x12\x19\n\x15LIGHT_ANIMATION_CHASE\x10\x05*R\n\nLightState\x12\x1b\n\x17LIGHT_STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0eLIGHT_STATE_ON\x10\x01\x12\x13\n\x0fLIGHT_STATE_OFF\x10\x02*k\n\x0e\x43onditionState\x12\x1f\n\x1b\x43ONDITION_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x18\x43ONDITION_STATE_INACTIVE\x10\x01\x12\x1a\n\x16\x43ONDITION_STATE_ACTIVE\x10\x02*T\n\x08Presence\x12\x18\n\x14PRESENCE_UNSPECIFIED\x10\x00\x12\x17\n\x13PRESENCE_UNDETECTED\x10\x01\x12\x15\n\x11PRESENCE_DETECTED\x10\x02*\x96\x01\n\x17RemoteSensorControlMode\x12*\n&REMOTE_SENSOR_CONTROL_MODE_UNSPECIFIED\x10\x00\x12\'\n#REMOTE_SENSOR_CONTROL_MODE_DISABLED\x10\x01\x12&\n\"REMOTE_SENSOR_CONTROL_MODE_ENABLED\x10\x02*\xb6\x01\n\x07Weekday\x12\x17\n\x13WEEKDAY_UNSPECIFIED\x10\x00\x12\x12\n\x0eWEEKDAY_MONDAY\x10\x01\x12\x13\n\x0fWEEKDAY_TUESDAY\x10\x02\x12\x15\n\x11WEEKDAY_WEDNESDAY\x10\x03\x12\x14\n\x10WEEKDAY_THURSDAY\x10\x04\x12\x12\n\x0eWEEKDAY_FRIDAY\x10\x05\x12\x14\n\x10WEEKDAY_SATURDAY\x10\x06\x12\x12\n\x0eWEEKDAY_SUNDAY\x10\x07*v\n\x11ScheduleExecution\x12\"\n\x1eSCHEDULE_EXECUTION_UNSPECIFIED\x10\x00\x12\x1e\n\x1aSCHEDULE_EXECUTION_RUNNING\x10\x01\x12\x1d\n\x19SCHEDULE_EXECUTION_PAUSED\x10\x02*\x8c\x01\n\x16\x46\x61llbackControlCommand\x12(\n$FALLBACK_CONTROL_COMMAND_UNSPECIFIED\x10\x00\x12%\n!FALLBACK_CONTROL_COMMAND_COMPLETE\x10\x01\x12!\n\x1d\x46\x41LLBACK_CONTROL_COMMAND_EXIT\x10\x02*o\n\x0eOccupancyState\x12\x1f\n\x1bOCCUPANCY_STATE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aOCCUPANCY_STATE_UNDETECTED\x10\x01\x12\x1c\n\x18OCCUPANCY_STATE_DETECTED\x10\x02*\xd6\x02\n\x13WifiConnectionState\x12\x1a\n\x16WIFI_STATE_UNSPECIFIED\x10\x00\x12\x1b\n\x17WIFI_STATE_DISCONNECTED\x10\x01\x12!\n\x1dWIFI_STATE_INTERFACE_DISABLED\x10\x02\x12\x17\n\x13WIFI_STATE_INACTIVE\x10\x03\x12\x17\n\x13WIFI_STATE_SCANNING\x10\x04\x12\x1d\n\x19WIFI_STATE_AUTHENTICATING\x10\x05\x12\x1a\n\x16WIFI_STATE_ASSOCIATING\x10\x06\x12\x19\n\x15WIFI_STATE_ASSOCIATED\x10\x07\x12\x1d\n\x19WIFI_STATE_4WAY_HANDSHAKE\x10\x08\x12\x1e\n\x1aWIFI_STATE_GROUP_HANDSHAKE\x10\t\x12\x1c\n\x18WIFI_STATE_WPA_COMPLETED\x10\n2\x88#\n\x14HomeDatastoreService\x12\x84\x01\n\x16GetHomeDatastoreSystem\x12\x39.core.protos.home_datastore.GetHomeDatastoreSystemRequest\x1a/.core.protos.home_datastore.HomeDatastoreSystem\x12Z\n\x08GetSpace\x12+.core.protos.home_datastore.GetSpaceRequest\x1a!.core.protos.home_datastore.Space\x12`\n\x0b\x43reateSpace\x12..core.protos.home_datastore.CreateSpaceRequest\x1a!.core.protos.home_datastore.Space\x12`\n\x0bUpdateSpace\x12..core.protos.home_datastore.UpdateSpaceRequest\x1a!.core.protos.home_datastore.Space\x12U\n\x0b\x44\x65leteSpace\x12..core.protos.home_datastore.DeleteSpaceRequest\x1a\x16.google.protobuf.Empty\x12o\n\x10UpdateIndoorUnit\x12\x33.core.protos.home_datastore.UpdateIndoorUnitRequest\x1a&.core.protos.home_datastore.IndoorUnit\x12_\n\x10\x44\x65leteIndoorUnit\x12\x33.core.protos.home_datastore.DeleteIndoorUnitRequest\x1a\x16.google.protobuf.Empty\x12\x81\x01\n\x15GetIndoorUnitHardware\x12\x38.core.protos.home_datastore.GetIndoorUnitHardwareRequest\x1a..core.protos.home_datastore.IndoorUnitHardware\x12{\n\x13GetQuiltSmartModule\x12\x36.core.protos.home_datastore.GetQuiltSmartModuleRequest\x1a,.core.protos.home_datastore.QuiltSmartModule\x12o\n\x10UpdateController\x12\x33.core.protos.home_datastore.UpdateControllerRequest\x1a&.core.protos.home_datastore.Controller\x12_\n\x10\x44\x65leteController\x12\x33.core.protos.home_datastore.DeleteControllerRequest\x1a\x16.google.protobuf.Empty\x12\x81\x01\n\x15GetControllerHardware\x12\x38.core.protos.home_datastore.GetControllerHardwareRequest\x1a..core.protos.home_datastore.ControllerHardware\x12\x61\n\x11\x44\x65leteOutdoorUnit\x12\x34.core.protos.home_datastore.DeleteOutdoorUnitRequest\x1a\x16.google.protobuf.Empty\x12u\n\x12\x43reateRemoteSensor\x12\x35.core.protos.home_datastore.CreateRemoteSensorRequest\x1a(.core.protos.home_datastore.RemoteSensor\x12u\n\x12UpdateRemoteSensor\x12\x35.core.protos.home_datastore.UpdateRemoteSensorRequest\x1a(.core.protos.home_datastore.RemoteSensor\x12\x63\n\x12\x44\x65leteRemoteSensor\x12\x35.core.protos.home_datastore.DeleteRemoteSensorRequest\x1a\x16.google.protobuf.Empty\x12\x93\x01\n\x1c\x43reateControllerRemoteSensor\x12?.core.protos.home_datastore.CreateControllerRemoteSensorRequest\x1a\x32.core.protos.home_datastore.ControllerRemoteSensor\x12\x93\x01\n\x1cUpdateControllerRemoteSensor\x12?.core.protos.home_datastore.UpdateControllerRemoteSensorRequest\x1a\x32.core.protos.home_datastore.ControllerRemoteSensor\x12w\n\x1c\x44\x65leteControllerRemoteSensor\x12?.core.protos.home_datastore.DeleteControllerRemoteSensorRequest\x1a\x16.google.protobuf.Empty\x12r\n\x11\x43reateScheduleDay\x12\x34.core.protos.home_datastore.CreateScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12l\n\x0eGetScheduleDay\x12\x31.core.protos.home_datastore.GetScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12r\n\x11UpdateScheduleDay\x12\x34.core.protos.home_datastore.UpdateScheduleDayRequest\x1a\'.core.protos.home_datastore.ScheduleDay\x12\x61\n\x11\x44\x65leteScheduleDay\x12\x34.core.protos.home_datastore.DeleteScheduleDayRequest\x1a\x16.google.protobuf.Empty\x12}\n\x10ListScheduleDays\x12\x33.core.protos.home_datastore.ListScheduleDaysRequest\x1a\x34.core.protos.home_datastore.ListScheduleDaysResponse\x12u\n\x12\x43reateScheduleWeek\x12\x35.core.protos.home_datastore.CreateScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12o\n\x0fGetScheduleWeek\x12\x32.core.protos.home_datastore.GetScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12u\n\x12UpdateScheduleWeek\x12\x35.core.protos.home_datastore.UpdateScheduleWeekRequest\x1a(.core.protos.home_datastore.ScheduleWeek\x12\x63\n\x12\x44\x65leteScheduleWeek\x12\x35.core.protos.home_datastore.DeleteScheduleWeekRequest\x1a\x16.google.protobuf.Empty\x12\x80\x01\n\x11ListScheduleWeeks\x12\x34.core.protos.home_datastore.ListScheduleWeeksRequest\x1a\x35.core.protos.home_datastore.ListScheduleWeeksResponse\x12{\n\x14\x43reateComfortSetting\x12\x37.core.protos.home_datastore.CreateComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12u\n\x11GetComfortSetting\x12\x34.core.protos.home_datastore.GetComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12{\n\x14UpdateComfortSetting\x12\x37.core.protos.home_datastore.UpdateComfortSettingRequest\x1a*.core.protos.home_datastore.ComfortSetting\x12g\n\x14\x44\x65leteComfortSetting\x12\x37.core.protos.home_datastore.DeleteComfortSettingRequest\x1a\x16.google.protobuf.Empty\x12\x86\x01\n\x13ListComfortSettings\x12\x36.core.protos.home_datastore.ListComfortSettingsRequest\x1a\x37.core.protos.home_datastore.ListComfortSettingsResponse\x12i\n\x0e\x43reateLocation\x12\x31.core.protos.home_datastore.CreateLocationRequest\x1a$.core.protos.home_datastore.Location\x12\x63\n\x0bGetLocation\x12..core.protos.home_datastore.GetLocationRequest\x1a$.core.protos.home_datastore.Location\x12i\n\x0eUpdateLocation\x12\x31.core.protos.home_datastore.UpdateLocationRequest\x1a$.core.protos.home_datastore.Location\x12[\n\x0e\x44\x65leteLocation\x12\x31.core.protos.home_datastore.DeleteLocationRequest\x1a\x16.google.protobuf.Empty\x12t\n\rListLocations\x12\x30.core.protos.home_datastore.ListLocationsRequest\x1a\x31.core.protos.home_datastore.ListLocationsResponseB$\n\x13\x63om.quilt.proto.hdsB\rQuiltHdsProtob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -35,262 +35,264 @@ if not _descriptor._USE_C_DESCRIPTORS: _globals['DESCRIPTOR']._loaded_options = None _globals['DESCRIPTOR']._serialized_options = b'\n\023com.quilt.proto.hdsB\rQuiltHdsProto' - _globals['_HVACMODE']._serialized_start=20919 - _globals['_HVACMODE']._serialized_end=21134 - _globals['_HVACSTATE']._serialized_start=21137 - _globals['_HVACSTATE']._serialized_end=21514 - _globals['_LOCALCOMMSHEALTHSTATUS']._serialized_start=21517 - _globals['_LOCALCOMMSHEALTHSTATUS']._serialized_end=21745 - _globals['_OCCUPANCYMODE']._serialized_start=21747 - _globals['_OCCUPANCYMODE']._serialized_end=21851 - _globals['_SAFETYHEATINGMODE']._serialized_start=21853 - _globals['_SAFETYHEATINGMODE']._serialized_end=21976 - _globals['_HVACCONTROLLERTYPE']._serialized_start=21979 - _globals['_HVACCONTROLLERTYPE']._serialized_end=22188 - _globals['_COMFORTSETTINGOVERRIDE']._serialized_start=22191 - _globals['_COMFORTSETTINGOVERRIDE']._serialized_end=22502 - _globals['_COMFORTSETTINGTYPE']._serialized_start=22505 - _globals['_COMFORTSETTINGTYPE']._serialized_end=22726 - _globals['_INDOORUNITLOUVERMODE']._serialized_start=22729 - _globals['_INDOORUNITLOUVERMODE']._serialized_end=22872 - _globals['_FANSPEEDMODE']._serialized_start=22874 - _globals['_FANSPEEDMODE']._serialized_end=22974 - _globals['_BOOSTMODE']._serialized_start=22976 - _globals['_BOOSTMODE']._serialized_end=23054 - _globals['_LIGHTANIMATION']._serialized_start=23057 - _globals['_LIGHTANIMATION']._serialized_end=23254 - _globals['_LIGHTSTATE']._serialized_start=23256 - _globals['_LIGHTSTATE']._serialized_end=23338 - _globals['_CONDITIONSTATE']._serialized_start=23340 - _globals['_CONDITIONSTATE']._serialized_end=23447 - _globals['_PRESENCE']._serialized_start=23449 - _globals['_PRESENCE']._serialized_end=23533 - _globals['_REMOTESENSORCONTROLMODE']._serialized_start=23536 - _globals['_REMOTESENSORCONTROLMODE']._serialized_end=23686 - _globals['_WEEKDAY']._serialized_start=23689 - _globals['_WEEKDAY']._serialized_end=23871 - _globals['_SCHEDULEEXECUTION']._serialized_start=23873 - _globals['_SCHEDULEEXECUTION']._serialized_end=23991 - _globals['_FALLBACKCONTROLCOMMAND']._serialized_start=23994 - _globals['_FALLBACKCONTROLCOMMAND']._serialized_end=24134 - _globals['_OCCUPANCYSTATE']._serialized_start=24136 - _globals['_OCCUPANCYSTATE']._serialized_end=24247 - _globals['_WIFICONNECTIONSTATE']._serialized_start=24250 - _globals['_WIFICONNECTIONSTATE']._serialized_end=24592 + _globals['_HVACMODE']._serialized_start=21073 + _globals['_HVACMODE']._serialized_end=21288 + _globals['_HVACSTATE']._serialized_start=21291 + _globals['_HVACSTATE']._serialized_end=21668 + _globals['_LOCALCOMMSHEALTHSTATUS']._serialized_start=21671 + _globals['_LOCALCOMMSHEALTHSTATUS']._serialized_end=21899 + _globals['_LOCALCOMMSHEALTHREASON']._serialized_start=21902 + _globals['_LOCALCOMMSHEALTHREASON']._serialized_end=22504 + _globals['_OCCUPANCYMODE']._serialized_start=22506 + _globals['_OCCUPANCYMODE']._serialized_end=22610 + _globals['_SAFETYHEATINGMODE']._serialized_start=22612 + _globals['_SAFETYHEATINGMODE']._serialized_end=22735 + _globals['_HVACCONTROLLERTYPE']._serialized_start=22738 + _globals['_HVACCONTROLLERTYPE']._serialized_end=22947 + _globals['_COMFORTSETTINGOVERRIDE']._serialized_start=22950 + _globals['_COMFORTSETTINGOVERRIDE']._serialized_end=23261 + _globals['_COMFORTSETTINGTYPE']._serialized_start=23264 + _globals['_COMFORTSETTINGTYPE']._serialized_end=23485 + _globals['_INDOORUNITLOUVERMODE']._serialized_start=23488 + _globals['_INDOORUNITLOUVERMODE']._serialized_end=23631 + _globals['_FANSPEEDMODE']._serialized_start=23633 + _globals['_FANSPEEDMODE']._serialized_end=23733 + _globals['_BOOSTMODE']._serialized_start=23735 + _globals['_BOOSTMODE']._serialized_end=23813 + _globals['_LIGHTANIMATION']._serialized_start=23816 + _globals['_LIGHTANIMATION']._serialized_end=24013 + _globals['_LIGHTSTATE']._serialized_start=24015 + _globals['_LIGHTSTATE']._serialized_end=24097 + _globals['_CONDITIONSTATE']._serialized_start=24099 + _globals['_CONDITIONSTATE']._serialized_end=24206 + _globals['_PRESENCE']._serialized_start=24208 + _globals['_PRESENCE']._serialized_end=24292 + _globals['_REMOTESENSORCONTROLMODE']._serialized_start=24295 + _globals['_REMOTESENSORCONTROLMODE']._serialized_end=24445 + _globals['_WEEKDAY']._serialized_start=24448 + _globals['_WEEKDAY']._serialized_end=24630 + _globals['_SCHEDULEEXECUTION']._serialized_start=24632 + _globals['_SCHEDULEEXECUTION']._serialized_end=24750 + _globals['_FALLBACKCONTROLCOMMAND']._serialized_start=24753 + _globals['_FALLBACKCONTROLCOMMAND']._serialized_end=24893 + _globals['_OCCUPANCYSTATE']._serialized_start=24895 + _globals['_OCCUPANCYSTATE']._serialized_end=25006 + _globals['_WIFICONNECTIONSTATE']._serialized_start=25009 + _globals['_WIFICONNECTIONSTATE']._serialized_end=25351 _globals['_LOCALCOMMSSTATUS']._serialized_start=144 - _globals['_LOCALCOMMSSTATUS']._serialized_end=396 - _globals['_ENTITYMETADATA']._serialized_start=399 - _globals['_ENTITYMETADATA']._serialized_end=549 - _globals['_LOCATIONATTRIBUTES']._serialized_start=551 - _globals['_LOCATIONATTRIBUTES']._serialized_end=656 - _globals['_LOCATIONCONTROLS']._serialized_start=659 - _globals['_LOCATIONCONTROLS']._serialized_end=800 - _globals['_LOCATION']._serialized_start=803 - _globals['_LOCATION']._serialized_end=1005 - _globals['_SPACERELATIONSHIPS']._serialized_start=1007 - _globals['_SPACERELATIONSHIPS']._serialized_end=1129 - _globals['_SPACESETTINGS']._serialized_start=1132 - _globals['_SPACESETTINGS']._serialized_end=1517 - _globals['_SPACECONTROLS']._serialized_start=1520 - _globals['_SPACECONTROLS']._serialized_end=1960 - _globals['_SPACESTATE']._serialized_start=1963 - _globals['_SPACESTATE']._serialized_end=2173 - _globals['_SPACE']._serialized_start=2176 - _globals['_SPACE']._serialized_end=2491 - _globals['_INDOORUNITRELATIONSHIPS']._serialized_start=2494 - _globals['_INDOORUNITRELATIONSHIPS']._serialized_end=2724 - _globals['_INDOORUNITSETTINGS']._serialized_start=2727 - _globals['_INDOORUNITSETTINGS']._serialized_end=3013 - _globals['_INDOORUNITCONTROLS']._serialized_start=3016 - _globals['_INDOORUNITCONTROLS']._serialized_end=3467 - _globals['_INDOORUNITSTATE']._serialized_start=3470 - _globals['_INDOORUNITSTATE']._serialized_end=4010 - _globals['_INDOORUNITCONDITIONS']._serialized_start=4013 - _globals['_INDOORUNITCONDITIONS']._serialized_end=4891 - _globals['_INDOORUNITPRESENCESTATE']._serialized_start=4894 - _globals['_INDOORUNITPRESENCESTATE']._serialized_end=5095 - _globals['_INDOORUNITCOMMANDS']._serialized_start=5098 - _globals['_INDOORUNITCOMMANDS']._serialized_end=5252 - _globals['_INDOORUNITHARDWAREATTRIBUTES']._serialized_start=5255 - _globals['_INDOORUNITHARDWAREATTRIBUTES']._serialized_end=5556 - _globals['_INDOORUNITHARDWARE']._serialized_start=5559 - _globals['_INDOORUNITHARDWARE']._serialized_end=5717 - _globals['_INDOORUNITHVACINPUTS']._serialized_start=5720 - _globals['_INDOORUNITHVACINPUTS']._serialized_end=6092 - _globals['_INDOORUNITPERFORMANCEDATA']._serialized_start=6095 - _globals['_INDOORUNITPERFORMANCEDATA']._serialized_end=6560 - _globals['_INDOORUNITPERFORMANCEMETRICS']._serialized_start=6563 - _globals['_INDOORUNITPERFORMANCEMETRICS']._serialized_end=6957 - _globals['_INDOORUNITOCCUPANCY']._serialized_start=6960 - _globals['_INDOORUNITOCCUPANCY']._serialized_end=7098 - _globals['_INDOORUNIT']._serialized_start=7101 - _globals['_INDOORUNIT']._serialized_end=7955 - _globals['_OUTDOORUNITRELATIONSHIPS']._serialized_start=7958 - _globals['_OUTDOORUNITRELATIONSHIPS']._serialized_end=8133 - _globals['_OUTDOORUNITSETTINGS']._serialized_start=8135 - _globals['_OUTDOORUNITSETTINGS']._serialized_end=8239 - _globals['_OUTDOORUNITSTATE']._serialized_start=8241 - _globals['_OUTDOORUNITSTATE']._serialized_end=8366 - _globals['_OUTDOORUNITPERFORMANCEDATA']._serialized_start=8369 - _globals['_OUTDOORUNITPERFORMANCEDATA']._serialized_end=8683 - _globals['_OUTDOORUNITHARDWAREATTRIBUTES']._serialized_start=8686 - _globals['_OUTDOORUNITHARDWAREATTRIBUTES']._serialized_end=8884 - _globals['_OUTDOORUNITHARDWARE']._serialized_start=8887 - _globals['_OUTDOORUNITHARDWARE']._serialized_end=9047 - _globals['_OUTDOORUNIT']._serialized_start=9050 - _globals['_OUTDOORUNIT']._serialized_end=9410 - _globals['_CONTROLLERRELATIONSHIPS']._serialized_start=9413 - _globals['_CONTROLLERRELATIONSHIPS']._serialized_end=9620 - _globals['_CONTROLLERSETTINGS']._serialized_start=9622 - _globals['_CONTROLLERSETTINGS']._serialized_end=9725 - _globals['_CONTROLLERSTATE']._serialized_start=9728 - _globals['_CONTROLLERSTATE']._serialized_end=9896 - _globals['_CONTROLLERCONTROLS']._serialized_start=9899 - _globals['_CONTROLLERCONTROLS']._serialized_end=10056 - _globals['_WIFISTATE']._serialized_start=10059 - _globals['_WIFISTATE']._serialized_end=10409 - _globals['_CONTROLLERHARDWAREATTRIBUTES']._serialized_start=10412 - _globals['_CONTROLLERHARDWAREATTRIBUTES']._serialized_end=10609 - _globals['_CONTROLLERHARDWARE']._serialized_start=10612 - _globals['_CONTROLLERHARDWARE']._serialized_end=10770 - _globals['_CONTROLLER']._serialized_start=10773 - _globals['_CONTROLLER']._serialized_end=11378 - _globals['_REMOTESENSORATTRIBUTES']._serialized_start=11380 - _globals['_REMOTESENSORATTRIBUTES']._serialized_end=11465 - _globals['_REMOTESENSORSTATE']._serialized_start=11468 - _globals['_REMOTESENSORSTATE']._serialized_end=11649 - _globals['_REMOTESENSORRELATIONSHIPS']._serialized_start=11651 - _globals['_REMOTESENSORRELATIONSHIPS']._serialized_end=11750 - _globals['_CONTROLLERREMOTESENSORRELATIONSHIPS']._serialized_start=11752 - _globals['_CONTROLLERREMOTESENSORRELATIONSHIPS']._serialized_end=11860 - _globals['_REMOTESENSORCONTROLS']._serialized_start=11863 - _globals['_REMOTESENSORCONTROLS']._serialized_end=12008 - _globals['_REMOTESENSOR']._serialized_start=12011 - _globals['_REMOTESENSOR']._serialized_end=12365 - _globals['_CONTROLLERREMOTESENSOR']._serialized_start=12368 - _globals['_CONTROLLERREMOTESENSOR']._serialized_end=12742 - _globals['_COMFORTSETTINGATTRIBUTES']._serialized_start=12745 - _globals['_COMFORTSETTINGATTRIBUTES']._serialized_end=13227 - _globals['_COMFORTSETTINGRELATIONSHIPS']._serialized_start=13229 - _globals['_COMFORTSETTINGRELATIONSHIPS']._serialized_end=13324 - _globals['_COMFORTSETTING']._serialized_start=13327 - _globals['_COMFORTSETTING']._serialized_end=13557 - _globals['_LEDSCHEDULEEVENT']._serialized_start=13560 - _globals['_LEDSCHEDULEEVENT']._serialized_end=13768 - _globals['_SCHEDULEEVENT']._serialized_start=13771 - _globals['_SCHEDULEEVENT']._serialized_end=14308 - _globals['_SCHEDULEDAYATTRIBUTES']._serialized_start=14310 - _globals['_SCHEDULEDAYATTRIBUTES']._serialized_end=14395 - _globals['_SCHEDULEDAYRELATIONSHIPS']._serialized_start=14397 - _globals['_SCHEDULEDAYRELATIONSHIPS']._serialized_end=14489 - _globals['_SCHEDULEDAY']._serialized_start=14492 - _globals['_SCHEDULEDAY']._serialized_end=14838 - _globals['_SCHEDULEWEEKDAY']._serialized_start=14841 - _globals['_SCHEDULEWEEKDAY']._serialized_end=14976 - _globals['_SCHEDULEWEEKRELATIONSHIPS']._serialized_start=14978 - _globals['_SCHEDULEWEEKRELATIONSHIPS']._serialized_end=15071 - _globals['_SCHEDULEWEEK']._serialized_start=15074 - _globals['_SCHEDULEWEEK']._serialized_end=15285 - _globals['_QUILTSMARTMODULERELATIONSHIPS']._serialized_start=15288 - _globals['_QUILTSMARTMODULERELATIONSHIPS']._serialized_end=15433 - _globals['_QUILTSMARTMODULECONTROLS']._serialized_start=15435 - _globals['_QUILTSMARTMODULECONTROLS']._serialized_end=15533 - _globals['_QUILTSMARTMODULESTATE']._serialized_start=15536 - _globals['_QUILTSMARTMODULESTATE']._serialized_end=15798 - _globals['_QUILTSMARTMODULE']._serialized_start=15801 - _globals['_QUILTSMARTMODULE']._serialized_end=16364 - _globals['_SOFTWAREUPDATEINFOATTRIBUTES']._serialized_start=16367 - _globals['_SOFTWAREUPDATEINFOATTRIBUTES']._serialized_end=16598 - _globals['_SOFTWAREUPDATEINFO']._serialized_start=16601 - _globals['_SOFTWAREUPDATEINFO']._serialized_end=16759 - _globals['_HOMEDATASTORESYSTEM']._serialized_start=16762 - _globals['_HOMEDATASTORESYSTEM']._serialized_end=17820 - _globals['_GETHOMEDATASTORESYSTEMREQUEST']._serialized_start=17822 - _globals['_GETHOMEDATASTORESYSTEMREQUEST']._serialized_end=17920 - _globals['_GETSPACEREQUEST']._serialized_start=17922 - _globals['_GETSPACEREQUEST']._serialized_end=17951 - _globals['_CREATESPACEREQUEST']._serialized_start=17953 - _globals['_CREATESPACEREQUEST']._serialized_end=18023 - _globals['_UPDATESPACEREQUEST']._serialized_start=18025 - _globals['_UPDATESPACEREQUEST']._serialized_end=18094 - _globals['_DELETESPACEREQUEST']._serialized_start=18096 - _globals['_DELETESPACEREQUEST']._serialized_end=18128 - _globals['_UPDATEINDOORUNITREQUEST']._serialized_start=18130 - _globals['_UPDATEINDOORUNITREQUEST']._serialized_end=18209 - _globals['_DELETEINDOORUNITREQUEST']._serialized_start=18211 - _globals['_DELETEINDOORUNITREQUEST']._serialized_end=18248 - _globals['_GETINDOORUNITHARDWAREREQUEST']._serialized_start=18250 - _globals['_GETINDOORUNITHARDWAREREQUEST']._serialized_end=18340 - _globals['_UPDATECONTROLLERREQUEST']._serialized_start=18342 - _globals['_UPDATECONTROLLERREQUEST']._serialized_end=18427 - _globals['_DELETECONTROLLERREQUEST']._serialized_start=18429 - _globals['_DELETECONTROLLERREQUEST']._serialized_end=18466 - _globals['_GETCONTROLLERHARDWAREREQUEST']._serialized_start=18468 - _globals['_GETCONTROLLERHARDWAREREQUEST']._serialized_end=18558 - _globals['_DELETEOUTDOORUNITREQUEST']._serialized_start=18560 - _globals['_DELETEOUTDOORUNITREQUEST']._serialized_end=18598 - _globals['_GETQUILTSMARTMODULEREQUEST']._serialized_start=18600 - _globals['_GETQUILTSMARTMODULEREQUEST']._serialized_end=18688 - _globals['_CREATEREMOTESENSORREQUEST']._serialized_start=18690 - _globals['_CREATEREMOTESENSORREQUEST']._serialized_end=18782 - _globals['_UPDATEREMOTESENSORREQUEST']._serialized_start=18784 - _globals['_UPDATEREMOTESENSORREQUEST']._serialized_end=18876 - _globals['_DELETEREMOTESENSORREQUEST']._serialized_start=18878 - _globals['_DELETEREMOTESENSORREQUEST']._serialized_end=18931 - _globals['_CREATECONTROLLERREMOTESENSORREQUEST']._serialized_start=18933 - _globals['_CREATECONTROLLERREMOTESENSORREQUEST']._serialized_end=19045 - _globals['_UPDATECONTROLLERREMOTESENSORREQUEST']._serialized_start=19047 - _globals['_UPDATECONTROLLERREMOTESENSORREQUEST']._serialized_end=19159 - _globals['_DELETECONTROLLERREMOTESENSORREQUEST']._serialized_start=19161 - _globals['_DELETECONTROLLERREMOTESENSORREQUEST']._serialized_end=19224 - _globals['_CREATESCHEDULEDAYREQUEST']._serialized_start=19226 - _globals['_CREATESCHEDULEDAYREQUEST']._serialized_end=19315 - _globals['_GETSCHEDULEDAYREQUEST']._serialized_start=19317 - _globals['_GETSCHEDULEDAYREQUEST']._serialized_end=19365 - _globals['_UPDATESCHEDULEDAYREQUEST']._serialized_start=19367 - _globals['_UPDATESCHEDULEDAYREQUEST']._serialized_end=19456 - _globals['_DELETESCHEDULEDAYREQUEST']._serialized_start=19458 - _globals['_DELETESCHEDULEDAYREQUEST']._serialized_end=19509 - _globals['_LISTSCHEDULEDAYSREQUEST']._serialized_start=19511 - _globals['_LISTSCHEDULEDAYSREQUEST']._serialized_end=19552 - _globals['_LISTSCHEDULEDAYSRESPONSE']._serialized_start=19554 - _globals['_LISTSCHEDULEDAYSRESPONSE']._serialized_end=19644 - _globals['_CREATESCHEDULEWEEKREQUEST']._serialized_start=19646 - _globals['_CREATESCHEDULEWEEKREQUEST']._serialized_end=19738 - _globals['_GETSCHEDULEWEEKREQUEST']._serialized_start=19740 - _globals['_GETSCHEDULEWEEKREQUEST']._serialized_end=19790 - _globals['_UPDATESCHEDULEWEEKREQUEST']._serialized_start=19792 - _globals['_UPDATESCHEDULEWEEKREQUEST']._serialized_end=19884 - _globals['_DELETESCHEDULEWEEKREQUEST']._serialized_start=19886 - _globals['_DELETESCHEDULEWEEKREQUEST']._serialized_end=19939 - _globals['_LISTSCHEDULEWEEKSREQUEST']._serialized_start=19941 - _globals['_LISTSCHEDULEWEEKSREQUEST']._serialized_end=19983 - _globals['_LISTSCHEDULEWEEKSRESPONSE']._serialized_start=19985 - _globals['_LISTSCHEDULEWEEKSRESPONSE']._serialized_end=20078 - _globals['_CREATECOMFORTSETTINGREQUEST']._serialized_start=20080 - _globals['_CREATECOMFORTSETTINGREQUEST']._serialized_end=20178 - _globals['_GETCOMFORTSETTINGREQUEST']._serialized_start=20180 - _globals['_GETCOMFORTSETTINGREQUEST']._serialized_end=20234 - _globals['_UPDATECOMFORTSETTINGREQUEST']._serialized_start=20236 - _globals['_UPDATECOMFORTSETTINGREQUEST']._serialized_end=20334 - _globals['_DELETECOMFORTSETTINGREQUEST']._serialized_start=20336 - _globals['_DELETECOMFORTSETTINGREQUEST']._serialized_end=20393 - _globals['_LISTCOMFORTSETTINGSREQUEST']._serialized_start=20395 - _globals['_LISTCOMFORTSETTINGSREQUEST']._serialized_end=20439 - _globals['_LISTCOMFORTSETTINGSRESPONSE']._serialized_start=20441 - _globals['_LISTCOMFORTSETTINGSRESPONSE']._serialized_end=20540 - _globals['_CREATELOCATIONREQUEST']._serialized_start=20542 - _globals['_CREATELOCATIONREQUEST']._serialized_end=20621 - _globals['_GETLOCATIONREQUEST']._serialized_start=20623 - _globals['_GETLOCATIONREQUEST']._serialized_end=20664 - _globals['_UPDATELOCATIONREQUEST']._serialized_start=20666 - _globals['_UPDATELOCATIONREQUEST']._serialized_end=20745 - _globals['_DELETELOCATIONREQUEST']._serialized_start=20747 - _globals['_DELETELOCATIONREQUEST']._serialized_end=20791 - _globals['_LISTLOCATIONSREQUEST']._serialized_start=20793 - _globals['_LISTLOCATIONSREQUEST']._serialized_end=20834 - _globals['_LISTLOCATIONSRESPONSE']._serialized_start=20836 - _globals['_LISTLOCATIONSRESPONSE']._serialized_end=20916 - _globals['_HOMEDATASTORESERVICE']._serialized_start=24595 - _globals['_HOMEDATASTORESERVICE']._serialized_end=29083 + _globals['_LOCALCOMMSSTATUS']._serialized_end=469 + _globals['_ENTITYMETADATA']._serialized_start=472 + _globals['_ENTITYMETADATA']._serialized_end=622 + _globals['_LOCATIONATTRIBUTES']._serialized_start=624 + _globals['_LOCATIONATTRIBUTES']._serialized_end=729 + _globals['_LOCATIONCONTROLS']._serialized_start=732 + _globals['_LOCATIONCONTROLS']._serialized_end=873 + _globals['_LOCATION']._serialized_start=876 + _globals['_LOCATION']._serialized_end=1078 + _globals['_SPACERELATIONSHIPS']._serialized_start=1080 + _globals['_SPACERELATIONSHIPS']._serialized_end=1202 + _globals['_SPACESETTINGS']._serialized_start=1205 + _globals['_SPACESETTINGS']._serialized_end=1590 + _globals['_SPACECONTROLS']._serialized_start=1593 + _globals['_SPACECONTROLS']._serialized_end=2033 + _globals['_SPACESTATE']._serialized_start=2036 + _globals['_SPACESTATE']._serialized_end=2246 + _globals['_SPACE']._serialized_start=2249 + _globals['_SPACE']._serialized_end=2564 + _globals['_INDOORUNITRELATIONSHIPS']._serialized_start=2567 + _globals['_INDOORUNITRELATIONSHIPS']._serialized_end=2797 + _globals['_INDOORUNITSETTINGS']._serialized_start=2800 + _globals['_INDOORUNITSETTINGS']._serialized_end=3086 + _globals['_INDOORUNITCONTROLS']._serialized_start=3089 + _globals['_INDOORUNITCONTROLS']._serialized_end=3540 + _globals['_INDOORUNITSTATE']._serialized_start=3543 + _globals['_INDOORUNITSTATE']._serialized_end=4083 + _globals['_INDOORUNITCONDITIONS']._serialized_start=4086 + _globals['_INDOORUNITCONDITIONS']._serialized_end=5045 + _globals['_INDOORUNITPRESENCESTATE']._serialized_start=5048 + _globals['_INDOORUNITPRESENCESTATE']._serialized_end=5249 + _globals['_INDOORUNITCOMMANDS']._serialized_start=5252 + _globals['_INDOORUNITCOMMANDS']._serialized_end=5406 + _globals['_INDOORUNITHARDWAREATTRIBUTES']._serialized_start=5409 + _globals['_INDOORUNITHARDWAREATTRIBUTES']._serialized_end=5710 + _globals['_INDOORUNITHARDWARE']._serialized_start=5713 + _globals['_INDOORUNITHARDWARE']._serialized_end=5871 + _globals['_INDOORUNITHVACINPUTS']._serialized_start=5874 + _globals['_INDOORUNITHVACINPUTS']._serialized_end=6246 + _globals['_INDOORUNITPERFORMANCEDATA']._serialized_start=6249 + _globals['_INDOORUNITPERFORMANCEDATA']._serialized_end=6714 + _globals['_INDOORUNITPERFORMANCEMETRICS']._serialized_start=6717 + _globals['_INDOORUNITPERFORMANCEMETRICS']._serialized_end=7111 + _globals['_INDOORUNITOCCUPANCY']._serialized_start=7114 + _globals['_INDOORUNITOCCUPANCY']._serialized_end=7252 + _globals['_INDOORUNIT']._serialized_start=7255 + _globals['_INDOORUNIT']._serialized_end=8109 + _globals['_OUTDOORUNITRELATIONSHIPS']._serialized_start=8112 + _globals['_OUTDOORUNITRELATIONSHIPS']._serialized_end=8287 + _globals['_OUTDOORUNITSETTINGS']._serialized_start=8289 + _globals['_OUTDOORUNITSETTINGS']._serialized_end=8393 + _globals['_OUTDOORUNITSTATE']._serialized_start=8395 + _globals['_OUTDOORUNITSTATE']._serialized_end=8520 + _globals['_OUTDOORUNITPERFORMANCEDATA']._serialized_start=8523 + _globals['_OUTDOORUNITPERFORMANCEDATA']._serialized_end=8837 + _globals['_OUTDOORUNITHARDWAREATTRIBUTES']._serialized_start=8840 + _globals['_OUTDOORUNITHARDWAREATTRIBUTES']._serialized_end=9038 + _globals['_OUTDOORUNITHARDWARE']._serialized_start=9041 + _globals['_OUTDOORUNITHARDWARE']._serialized_end=9201 + _globals['_OUTDOORUNIT']._serialized_start=9204 + _globals['_OUTDOORUNIT']._serialized_end=9564 + _globals['_CONTROLLERRELATIONSHIPS']._serialized_start=9567 + _globals['_CONTROLLERRELATIONSHIPS']._serialized_end=9774 + _globals['_CONTROLLERSETTINGS']._serialized_start=9776 + _globals['_CONTROLLERSETTINGS']._serialized_end=9879 + _globals['_CONTROLLERSTATE']._serialized_start=9882 + _globals['_CONTROLLERSTATE']._serialized_end=10050 + _globals['_CONTROLLERCONTROLS']._serialized_start=10053 + _globals['_CONTROLLERCONTROLS']._serialized_end=10210 + _globals['_WIFISTATE']._serialized_start=10213 + _globals['_WIFISTATE']._serialized_end=10563 + _globals['_CONTROLLERHARDWAREATTRIBUTES']._serialized_start=10566 + _globals['_CONTROLLERHARDWAREATTRIBUTES']._serialized_end=10763 + _globals['_CONTROLLERHARDWARE']._serialized_start=10766 + _globals['_CONTROLLERHARDWARE']._serialized_end=10924 + _globals['_CONTROLLER']._serialized_start=10927 + _globals['_CONTROLLER']._serialized_end=11532 + _globals['_REMOTESENSORATTRIBUTES']._serialized_start=11534 + _globals['_REMOTESENSORATTRIBUTES']._serialized_end=11619 + _globals['_REMOTESENSORSTATE']._serialized_start=11622 + _globals['_REMOTESENSORSTATE']._serialized_end=11803 + _globals['_REMOTESENSORRELATIONSHIPS']._serialized_start=11805 + _globals['_REMOTESENSORRELATIONSHIPS']._serialized_end=11904 + _globals['_CONTROLLERREMOTESENSORRELATIONSHIPS']._serialized_start=11906 + _globals['_CONTROLLERREMOTESENSORRELATIONSHIPS']._serialized_end=12014 + _globals['_REMOTESENSORCONTROLS']._serialized_start=12017 + _globals['_REMOTESENSORCONTROLS']._serialized_end=12162 + _globals['_REMOTESENSOR']._serialized_start=12165 + _globals['_REMOTESENSOR']._serialized_end=12519 + _globals['_CONTROLLERREMOTESENSOR']._serialized_start=12522 + _globals['_CONTROLLERREMOTESENSOR']._serialized_end=12896 + _globals['_COMFORTSETTINGATTRIBUTES']._serialized_start=12899 + _globals['_COMFORTSETTINGATTRIBUTES']._serialized_end=13381 + _globals['_COMFORTSETTINGRELATIONSHIPS']._serialized_start=13383 + _globals['_COMFORTSETTINGRELATIONSHIPS']._serialized_end=13478 + _globals['_COMFORTSETTING']._serialized_start=13481 + _globals['_COMFORTSETTING']._serialized_end=13711 + _globals['_LEDSCHEDULEEVENT']._serialized_start=13714 + _globals['_LEDSCHEDULEEVENT']._serialized_end=13922 + _globals['_SCHEDULEEVENT']._serialized_start=13925 + _globals['_SCHEDULEEVENT']._serialized_end=14462 + _globals['_SCHEDULEDAYATTRIBUTES']._serialized_start=14464 + _globals['_SCHEDULEDAYATTRIBUTES']._serialized_end=14549 + _globals['_SCHEDULEDAYRELATIONSHIPS']._serialized_start=14551 + _globals['_SCHEDULEDAYRELATIONSHIPS']._serialized_end=14643 + _globals['_SCHEDULEDAY']._serialized_start=14646 + _globals['_SCHEDULEDAY']._serialized_end=14992 + _globals['_SCHEDULEWEEKDAY']._serialized_start=14995 + _globals['_SCHEDULEWEEKDAY']._serialized_end=15130 + _globals['_SCHEDULEWEEKRELATIONSHIPS']._serialized_start=15132 + _globals['_SCHEDULEWEEKRELATIONSHIPS']._serialized_end=15225 + _globals['_SCHEDULEWEEK']._serialized_start=15228 + _globals['_SCHEDULEWEEK']._serialized_end=15439 + _globals['_QUILTSMARTMODULERELATIONSHIPS']._serialized_start=15442 + _globals['_QUILTSMARTMODULERELATIONSHIPS']._serialized_end=15587 + _globals['_QUILTSMARTMODULECONTROLS']._serialized_start=15589 + _globals['_QUILTSMARTMODULECONTROLS']._serialized_end=15687 + _globals['_QUILTSMARTMODULESTATE']._serialized_start=15690 + _globals['_QUILTSMARTMODULESTATE']._serialized_end=15952 + _globals['_QUILTSMARTMODULE']._serialized_start=15955 + _globals['_QUILTSMARTMODULE']._serialized_end=16518 + _globals['_SOFTWAREUPDATEINFOATTRIBUTES']._serialized_start=16521 + _globals['_SOFTWAREUPDATEINFOATTRIBUTES']._serialized_end=16752 + _globals['_SOFTWAREUPDATEINFO']._serialized_start=16755 + _globals['_SOFTWAREUPDATEINFO']._serialized_end=16913 + _globals['_HOMEDATASTORESYSTEM']._serialized_start=16916 + _globals['_HOMEDATASTORESYSTEM']._serialized_end=17974 + _globals['_GETHOMEDATASTORESYSTEMREQUEST']._serialized_start=17976 + _globals['_GETHOMEDATASTORESYSTEMREQUEST']._serialized_end=18074 + _globals['_GETSPACEREQUEST']._serialized_start=18076 + _globals['_GETSPACEREQUEST']._serialized_end=18105 + _globals['_CREATESPACEREQUEST']._serialized_start=18107 + _globals['_CREATESPACEREQUEST']._serialized_end=18177 + _globals['_UPDATESPACEREQUEST']._serialized_start=18179 + _globals['_UPDATESPACEREQUEST']._serialized_end=18248 + _globals['_DELETESPACEREQUEST']._serialized_start=18250 + _globals['_DELETESPACEREQUEST']._serialized_end=18282 + _globals['_UPDATEINDOORUNITREQUEST']._serialized_start=18284 + _globals['_UPDATEINDOORUNITREQUEST']._serialized_end=18363 + _globals['_DELETEINDOORUNITREQUEST']._serialized_start=18365 + _globals['_DELETEINDOORUNITREQUEST']._serialized_end=18402 + _globals['_GETINDOORUNITHARDWAREREQUEST']._serialized_start=18404 + _globals['_GETINDOORUNITHARDWAREREQUEST']._serialized_end=18494 + _globals['_UPDATECONTROLLERREQUEST']._serialized_start=18496 + _globals['_UPDATECONTROLLERREQUEST']._serialized_end=18581 + _globals['_DELETECONTROLLERREQUEST']._serialized_start=18583 + _globals['_DELETECONTROLLERREQUEST']._serialized_end=18620 + _globals['_GETCONTROLLERHARDWAREREQUEST']._serialized_start=18622 + _globals['_GETCONTROLLERHARDWAREREQUEST']._serialized_end=18712 + _globals['_DELETEOUTDOORUNITREQUEST']._serialized_start=18714 + _globals['_DELETEOUTDOORUNITREQUEST']._serialized_end=18752 + _globals['_GETQUILTSMARTMODULEREQUEST']._serialized_start=18754 + _globals['_GETQUILTSMARTMODULEREQUEST']._serialized_end=18842 + _globals['_CREATEREMOTESENSORREQUEST']._serialized_start=18844 + _globals['_CREATEREMOTESENSORREQUEST']._serialized_end=18936 + _globals['_UPDATEREMOTESENSORREQUEST']._serialized_start=18938 + _globals['_UPDATEREMOTESENSORREQUEST']._serialized_end=19030 + _globals['_DELETEREMOTESENSORREQUEST']._serialized_start=19032 + _globals['_DELETEREMOTESENSORREQUEST']._serialized_end=19085 + _globals['_CREATECONTROLLERREMOTESENSORREQUEST']._serialized_start=19087 + _globals['_CREATECONTROLLERREMOTESENSORREQUEST']._serialized_end=19199 + _globals['_UPDATECONTROLLERREMOTESENSORREQUEST']._serialized_start=19201 + _globals['_UPDATECONTROLLERREMOTESENSORREQUEST']._serialized_end=19313 + _globals['_DELETECONTROLLERREMOTESENSORREQUEST']._serialized_start=19315 + _globals['_DELETECONTROLLERREMOTESENSORREQUEST']._serialized_end=19378 + _globals['_CREATESCHEDULEDAYREQUEST']._serialized_start=19380 + _globals['_CREATESCHEDULEDAYREQUEST']._serialized_end=19469 + _globals['_GETSCHEDULEDAYREQUEST']._serialized_start=19471 + _globals['_GETSCHEDULEDAYREQUEST']._serialized_end=19519 + _globals['_UPDATESCHEDULEDAYREQUEST']._serialized_start=19521 + _globals['_UPDATESCHEDULEDAYREQUEST']._serialized_end=19610 + _globals['_DELETESCHEDULEDAYREQUEST']._serialized_start=19612 + _globals['_DELETESCHEDULEDAYREQUEST']._serialized_end=19663 + _globals['_LISTSCHEDULEDAYSREQUEST']._serialized_start=19665 + _globals['_LISTSCHEDULEDAYSREQUEST']._serialized_end=19706 + _globals['_LISTSCHEDULEDAYSRESPONSE']._serialized_start=19708 + _globals['_LISTSCHEDULEDAYSRESPONSE']._serialized_end=19798 + _globals['_CREATESCHEDULEWEEKREQUEST']._serialized_start=19800 + _globals['_CREATESCHEDULEWEEKREQUEST']._serialized_end=19892 + _globals['_GETSCHEDULEWEEKREQUEST']._serialized_start=19894 + _globals['_GETSCHEDULEWEEKREQUEST']._serialized_end=19944 + _globals['_UPDATESCHEDULEWEEKREQUEST']._serialized_start=19946 + _globals['_UPDATESCHEDULEWEEKREQUEST']._serialized_end=20038 + _globals['_DELETESCHEDULEWEEKREQUEST']._serialized_start=20040 + _globals['_DELETESCHEDULEWEEKREQUEST']._serialized_end=20093 + _globals['_LISTSCHEDULEWEEKSREQUEST']._serialized_start=20095 + _globals['_LISTSCHEDULEWEEKSREQUEST']._serialized_end=20137 + _globals['_LISTSCHEDULEWEEKSRESPONSE']._serialized_start=20139 + _globals['_LISTSCHEDULEWEEKSRESPONSE']._serialized_end=20232 + _globals['_CREATECOMFORTSETTINGREQUEST']._serialized_start=20234 + _globals['_CREATECOMFORTSETTINGREQUEST']._serialized_end=20332 + _globals['_GETCOMFORTSETTINGREQUEST']._serialized_start=20334 + _globals['_GETCOMFORTSETTINGREQUEST']._serialized_end=20388 + _globals['_UPDATECOMFORTSETTINGREQUEST']._serialized_start=20390 + _globals['_UPDATECOMFORTSETTINGREQUEST']._serialized_end=20488 + _globals['_DELETECOMFORTSETTINGREQUEST']._serialized_start=20490 + _globals['_DELETECOMFORTSETTINGREQUEST']._serialized_end=20547 + _globals['_LISTCOMFORTSETTINGSREQUEST']._serialized_start=20549 + _globals['_LISTCOMFORTSETTINGSREQUEST']._serialized_end=20593 + _globals['_LISTCOMFORTSETTINGSRESPONSE']._serialized_start=20595 + _globals['_LISTCOMFORTSETTINGSRESPONSE']._serialized_end=20694 + _globals['_CREATELOCATIONREQUEST']._serialized_start=20696 + _globals['_CREATELOCATIONREQUEST']._serialized_end=20775 + _globals['_GETLOCATIONREQUEST']._serialized_start=20777 + _globals['_GETLOCATIONREQUEST']._serialized_end=20818 + _globals['_UPDATELOCATIONREQUEST']._serialized_start=20820 + _globals['_UPDATELOCATIONREQUEST']._serialized_end=20899 + _globals['_DELETELOCATIONREQUEST']._serialized_start=20901 + _globals['_DELETELOCATIONREQUEST']._serialized_end=20945 + _globals['_LISTLOCATIONSREQUEST']._serialized_start=20947 + _globals['_LISTLOCATIONSREQUEST']._serialized_end=20988 + _globals['_LISTLOCATIONSRESPONSE']._serialized_start=20990 + _globals['_LISTLOCATIONSRESPONSE']._serialized_end=21070 + _globals['_HOMEDATASTORESERVICE']._serialized_start=25354 + _globals['_HOMEDATASTORESERVICE']._serialized_end=29842 # @@protoc_insertion_point(module_scope) diff --git a/src/quilt_hp/_proto/quilt_hds_pb2.pyi b/src/quilt_hp/_proto/quilt_hds_pb2.pyi index f840617..8317011 100644 --- a/src/quilt_hp/_proto/quilt_hds_pb2.pyi +++ b/src/quilt_hp/_proto/quilt_hds_pb2.pyi @@ -129,6 +129,45 @@ LOCAL_COMMS_HEALTH_STATUS_OFFLINE: LocalCommsHealthStatus.ValueType # 3 LOCAL_COMMS_HEALTH_STATUS_STARTING_UP: LocalCommsHealthStatus.ValueType # 4 Global___LocalCommsHealthStatus: _TypeAlias = LocalCommsHealthStatus # noqa: Y015 +class _LocalCommsHealthReason: + ValueType = _typing.NewType("ValueType", _builtins.int) + V: _TypeAlias = ValueType # noqa: Y015 + +class _LocalCommsHealthReasonEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_LocalCommsHealthReason.ValueType], _builtins.type): + DESCRIPTOR: _descriptor.EnumDescriptor + LOCAL_COMMS_HEALTH_REASON_UNSPECIFIED: _LocalCommsHealthReason.ValueType # 0 + LOCAL_COMMS_HEALTH_REASON_HEALTHY: _LocalCommsHealthReason.ValueType # 1 + LOCAL_COMMS_HEALTH_REASON_BOOT_OR_WARMUP: _LocalCommsHealthReason.ValueType # 2 + LOCAL_COMMS_HEALTH_REASON_ZENOH_SESSION_DOWN: _LocalCommsHealthReason.ValueType # 3 + LOCAL_COMMS_HEALTH_REASON_NO_PEERS_VISIBLE: _LocalCommsHealthReason.ValueType # 4 + LOCAL_COMMS_HEALTH_REASON_PARTIAL_VISIBILITY: _LocalCommsHealthReason.ValueType # 5 + LOCAL_COMMS_HEALTH_REASON_NO_MESSAGES_RECEIVED: _LocalCommsHealthReason.ValueType # 6 + LOCAL_COMMS_HEALTH_REASON_SESSION_INSTABILITY: _LocalCommsHealthReason.ValueType # 7 + LOCAL_COMMS_HEALTH_REASON_NO_ALIVE_PEERS: _LocalCommsHealthReason.ValueType # 8 + LOCAL_COMMS_HEALTH_REASON_NO_PEERS_EXPECTED: _LocalCommsHealthReason.ValueType # 9 + LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_NOT_READY: _LocalCommsHealthReason.ValueType # 10 + LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_EXPIRED: _LocalCommsHealthReason.ValueType # 11 + +class LocalCommsHealthReason(_LocalCommsHealthReason, metaclass=_LocalCommsHealthReasonEnumTypeWrapper): + """Diagnostic reason accompanying LocalCommsHealthStatus. + APK-confirmed (com.quilt.android 1.0.29, enum class m62). The local mesh is + Eclipse Zenoh-based (see ZENOH_SESSION_DOWN), not NATS. + """ + +LOCAL_COMMS_HEALTH_REASON_UNSPECIFIED: LocalCommsHealthReason.ValueType # 0 +LOCAL_COMMS_HEALTH_REASON_HEALTHY: LocalCommsHealthReason.ValueType # 1 +LOCAL_COMMS_HEALTH_REASON_BOOT_OR_WARMUP: LocalCommsHealthReason.ValueType # 2 +LOCAL_COMMS_HEALTH_REASON_ZENOH_SESSION_DOWN: LocalCommsHealthReason.ValueType # 3 +LOCAL_COMMS_HEALTH_REASON_NO_PEERS_VISIBLE: LocalCommsHealthReason.ValueType # 4 +LOCAL_COMMS_HEALTH_REASON_PARTIAL_VISIBILITY: LocalCommsHealthReason.ValueType # 5 +LOCAL_COMMS_HEALTH_REASON_NO_MESSAGES_RECEIVED: LocalCommsHealthReason.ValueType # 6 +LOCAL_COMMS_HEALTH_REASON_SESSION_INSTABILITY: LocalCommsHealthReason.ValueType # 7 +LOCAL_COMMS_HEALTH_REASON_NO_ALIVE_PEERS: LocalCommsHealthReason.ValueType # 8 +LOCAL_COMMS_HEALTH_REASON_NO_PEERS_EXPECTED: LocalCommsHealthReason.ValueType # 9 +LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_NOT_READY: LocalCommsHealthReason.ValueType # 10 +LOCAL_COMMS_HEALTH_REASON_CREDENTIALS_EXPIRED: LocalCommsHealthReason.ValueType # 11 +Global___LocalCommsHealthReason: _TypeAlias = LocalCommsHealthReason # noqa: Y015 + class _OccupancyMode: ValueType = _typing.NewType("ValueType", _builtins.int) V: _TypeAlias = ValueType # noqa: Y015 @@ -159,7 +198,7 @@ class _SafetyHeatingModeEnumTypeWrapper(_enum_type_wrapper._EnumTypeWrapper[_Saf class SafetyHeatingMode(_SafetyHeatingMode, metaclass=_SafetyHeatingModeEnumTypeWrapper): """Freeze-protection setting on SpaceSettings (field 9). UNSPECIFIED is treated as ENABLED by the app (freeze protection on by default). - Field number unconfirmed (assumed f9; added post-initial release). + APK-confirmed field 9 (com.quilt.android 1.0.29, message class ea2). """ SAFETY_HEATING_MODE_UNSPECIFIED: SafetyHeatingMode.ValueType # 0 @@ -507,48 +546,48 @@ Global___WifiConnectionState: _TypeAlias = WifiConnectionState # noqa: Y015 @_typing.final class LocalCommsStatus(_message.Message): - """Local communications health status for a QSM or Controller mesh node. + """Local communications status for a QSM or Controller mesh node. Carried as field 8 on QuiltSmartModule and field 9 on Controller. - The `health` subfield (2) is the primary value; subfields 3, 4, 6 semantics TBD. + Field numbers/semantics APK-confirmed (1.0.29, message class l62). """ DESCRIPTOR: _descriptor.Descriptor UPDATED_TS_FIELD_NUMBER: _builtins.int - HEALTH_FIELD_NUMBER: _builtins.int - LINK_STATE_FIELD_NUMBER: _builtins.int - VERSION_FIELD_NUMBER: _builtins.int - HEALTH_CHANGED_TS_FIELD_NUMBER: _builtins.int - CONNECTION_STATE_FIELD_NUMBER: _builtins.int - health: Global___LocalCommsHealthStatus.ValueType - """current health""" - link_state: _builtins.int - """observed: HEALTHY=9, DEGRADED=8; enum TBD""" - version: _builtins.int - """observed: always 9""" - connection_state: _builtins.int - """observed: HEALTHY=1, DEGRADED=5; enum TBD""" + STATUS_FIELD_NUMBER: _builtins.int + VISIBLE_DEVICES_COUNT_FIELD_NUMBER: _builtins.int + EXPECTED_DEVICES_COUNT_FIELD_NUMBER: _builtins.int + LAST_SESSION_CHANGE_TS_FIELD_NUMBER: _builtins.int + REASON_FIELD_NUMBER: _builtins.int + status: Global___LocalCommsHealthStatus.ValueType + """current health status""" + visible_devices_count: _builtins.int + """mesh peers currently visible""" + expected_devices_count: _builtins.int + """mesh peers expected on this system""" + reason: Global___LocalCommsHealthReason.ValueType + """diagnostic reason for current status""" @_builtins.property def updated_ts(self) -> _timestamp_pb2.Timestamp: """most-recent server update timestamp""" @_builtins.property - def health_changed_ts(self) -> _timestamp_pb2.Timestamp: - """when health last changed""" + def last_session_change_ts(self) -> _timestamp_pb2.Timestamp: + """when the mesh session last changed""" def __init__( self, *, updated_ts: _timestamp_pb2.Timestamp | None = ..., - health: Global___LocalCommsHealthStatus.ValueType = ..., - link_state: _builtins.int = ..., - version: _builtins.int = ..., - health_changed_ts: _timestamp_pb2.Timestamp | None = ..., - connection_state: _builtins.int = ..., + status: Global___LocalCommsHealthStatus.ValueType = ..., + visible_devices_count: _builtins.int = ..., + expected_devices_count: _builtins.int = ..., + last_session_change_ts: _timestamp_pb2.Timestamp | None = ..., + reason: Global___LocalCommsHealthReason.ValueType = ..., ) -> None: ... - _HasFieldArgType: _TypeAlias = _typing.Literal["health_changed_ts", b"health_changed_ts", "updated_ts", b"updated_ts"] # noqa: Y015 + _HasFieldArgType: _TypeAlias = _typing.Literal["last_session_change_ts", b"last_session_change_ts", "updated_ts", b"updated_ts"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["connection_state", b"connection_state", "health", b"health", "health_changed_ts", b"health_changed_ts", "link_state", b"link_state", "updated_ts", b"updated_ts", "version", b"version"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["expected_devices_count", b"expected_devices_count", "last_session_change_ts", b"last_session_change_ts", "reason", b"reason", "status", b"status", "updated_ts", b"updated_ts", "visible_devices_count", b"visible_devices_count"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... @@ -725,7 +764,7 @@ class SpaceSettings(_message.Message): f1=name, f2=description, f3=updated_ts, f4=timezone, f5=OccupancyMode, f6=HvacControllerType, f7=occupied_timeout_s(180.0), f8=unoccupied_timeout_s(1200.0) Wire-confirmed: fields 1–8. - f9=SafetyHeatingMode (freeze protection): field number unconfirmed (assumed f9). + f9=SafetyHeatingMode (freeze protection): APK-confirmed field 9 (1.0.29, class ea2). """ DESCRIPTOR: _descriptor.Descriptor @@ -754,7 +793,7 @@ class SpaceSettings(_message.Message): unoccupied_timeout_s: _builtins.float """seconds of no-presence before "away"; default 1200s (20 min)""" safety_heating: Global___SafetyHeatingMode.ValueType - """freeze protection; UNSPECIFIED treated as ENABLED; field# unconfirmed""" + """freeze protection; UNSPECIFIED treated as ENABLED; APK-confirmed f9""" @_builtins.property def updated_ts(self) -> _timestamp_pb2.Timestamp: """wire-confirmed: f3""" @@ -1180,6 +1219,7 @@ class IndoorUnitConditions(_message.Message): COIL_PREHEAT_FIELD_NUMBER: _builtins.int MODE_CONFLICT_AVOIDANCE_FIELD_NUMBER: _builtins.int OUTDOOR_UNIT_COMMUNICATION_ERROR_FIELD_NUMBER: _builtins.int + COMPRESSOR_MINIMUM_RUN_TIME_FIELD_NUMBER: _builtins.int mode_conflict: Global___ConditionState.ValueType anti_cold_wind: Global___ConditionState.ValueType abnormal_outdoor_air_temperature: Global___ConditionState.ValueType @@ -1191,6 +1231,8 @@ class IndoorUnitConditions(_message.Message): coil_preheat: Global___ConditionState.ValueType mode_conflict_avoidance: Global___ConditionState.ValueType outdoor_unit_communication_error: Global___ConditionState.ValueType + compressor_minimum_run_time: Global___ConditionState.ValueType + """APK-confirmed 1.0.29 (enum class l02)""" @_builtins.property def updated_ts(self) -> _timestamp_pb2.Timestamp: ... def __init__( @@ -1208,10 +1250,11 @@ class IndoorUnitConditions(_message.Message): coil_preheat: Global___ConditionState.ValueType = ..., mode_conflict_avoidance: Global___ConditionState.ValueType = ..., outdoor_unit_communication_error: Global___ConditionState.ValueType = ..., + compressor_minimum_run_time: Global___ConditionState.ValueType = ..., ) -> None: ... _HasFieldArgType: _TypeAlias = _typing.Literal["updated_ts", b"updated_ts"] # noqa: Y015 def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool: ... - _ClearFieldArgType: _TypeAlias = _typing.Literal["abnormal_outdoor_air_temperature", b"abnormal_outdoor_air_temperature", "anti_cold_wind", b"anti_cold_wind", "coil_preheat", b"coil_preheat", "defrost_cycle", b"defrost_cycle", "hvac_mode_switching_delay", b"hvac_mode_switching_delay", "modbus_communication_error", b"modbus_communication_error", "mode_conflict", b"mode_conflict", "mode_conflict_avoidance", b"mode_conflict_avoidance", "oil_return", b"oil_return", "outdoor_unit_communication_error", b"outdoor_unit_communication_error", "safety_heating", b"safety_heating", "updated_ts", b"updated_ts"] # noqa: Y015 + _ClearFieldArgType: _TypeAlias = _typing.Literal["abnormal_outdoor_air_temperature", b"abnormal_outdoor_air_temperature", "anti_cold_wind", b"anti_cold_wind", "coil_preheat", b"coil_preheat", "compressor_minimum_run_time", b"compressor_minimum_run_time", "defrost_cycle", b"defrost_cycle", "hvac_mode_switching_delay", b"hvac_mode_switching_delay", "modbus_communication_error", b"modbus_communication_error", "mode_conflict", b"mode_conflict", "mode_conflict_avoidance", b"mode_conflict_avoidance", "oil_return", b"oil_return", "outdoor_unit_communication_error", b"outdoor_unit_communication_error", "safety_heating", b"safety_heating", "updated_ts", b"updated_ts"] # noqa: Y015 def ClearField(self, field_name: _ClearFieldArgType) -> None: ... def WhichOneof(self, oneof_group: _Never) -> None: ... diff --git a/src/quilt_hp/models/__init__.py b/src/quilt_hp/models/__init__.py index 1ecf5c4..03af586 100644 --- a/src/quilt_hp/models/__init__.py +++ b/src/quilt_hp/models/__init__.py @@ -15,6 +15,7 @@ HVACState, LedAnimation, LightPreset, + LocalCommsHealthReason, LocalCommsHealthStatus, LouverAngle, LouverMode, @@ -64,6 +65,7 @@ "IndoorUnitState", "LedAnimation", "LightPreset", + "LocalCommsHealthReason", "LocalCommsHealthStatus", "Location", "LouverAngle", diff --git a/src/quilt_hp/models/_helpers.py b/src/quilt_hp/models/_helpers.py index 02ba2b3..f82899a 100644 --- a/src/quilt_hp/models/_helpers.py +++ b/src/quilt_hp/models/_helpers.py @@ -5,6 +5,18 @@ from quilt_hp.const import PROTO_TIMESTAMP_UNSET_SECONDS +def local_comms_last_session_change(local_comms_status: object) -> datetime | None: + """Return ``LocalCommsStatus.last_session_change_ts`` as an aware datetime. + + Returns ``None`` when the status message or timestamp is absent. + """ + ts = getattr(local_comms_status, "last_session_change_ts", None) + seconds = getattr(ts, "seconds", 0) if ts is not None else 0 + if not seconds: + return None + return datetime.fromtimestamp(seconds, tz=UTC) + + def proto_has_field(proto: object, name: str) -> bool: """Return True when a message-typed field is present on the wire. @@ -84,9 +96,20 @@ def lookup_hardware(hw_map: dict[str, object], hardware_id: str | None) -> objec return None -def parse_wifi_state(proto: object) -> tuple[str | None, str | None, int | None]: - """Extract WiFi fields while preserving explicit zero signal values.""" +def parse_wifi_state( + proto: object, +) -> tuple[str | None, str | None, int | None, str | None, int | None]: + """Extract WiFi fields while preserving explicit zero signal values. + + Returns ``(ssid, ip, signal_dbm, bssid, frequency_mhz)``. ``bssid`` and + ``frequency_mhz`` are wire-present on the shared ``WifiState`` message + used by both QSM and Controller hosted-wifi state (confirmed via raw + proto capture 2026-07-03) and identify which physical AP radio/band a + device is associated with. + """ ssid = getattr(proto, "ssid", "") or None ip = getattr(proto, "ipv4_address", None) or None signal = getattr(proto, "signal_level_dbm", None) - return ssid, ip, signal if signal is not None else None + bssid = getattr(proto, "bssid", "") or None + frequency_mhz = getattr(proto, "frequency_mhz", None) or None + return ssid, ip, (signal if signal is not None else None), bssid, frequency_mhz diff --git a/src/quilt_hp/models/controller.py b/src/quilt_hp/models/controller.py index 6210cd1..ca63073 100644 --- a/src/quilt_hp/models/controller.py +++ b/src/quilt_hp/models/controller.py @@ -7,12 +7,17 @@ from typing import Any, cast from quilt_hp.models._helpers import ( + local_comms_last_session_change, lookup_hardware, parse_wifi_state, present_submsg, timestamp_or_none, ) -from quilt_hp.models.enums import LocalCommsHealthStatus, RemoteSensorControlMode +from quilt_hp.models.enums import ( + LocalCommsHealthReason, + LocalCommsHealthStatus, + RemoteSensorControlMode, +) from quilt_hp.models.qsm import WifiInfo _ONLINE_THRESHOLD_S = 5 * 60 # 5-minute online detection window @@ -36,6 +41,7 @@ class Controller: wifi_ip: str | None wifi_signal_dbm: int | None wifi_freq_mhz: int | None = None # e.g. 5745 → 5 GHz; 2437 → 2.4 GHz + wifi_bssid: str | None = None # AP MAC address the Dial is associated with wifi_last_seen: datetime | None = ( None # WifiState.updated_ts — when the dial last checked in over WiFi ) @@ -55,6 +61,23 @@ class Controller: server has not yet reported a health value (pre-1.0.26 firmware or the gate is off). """ + local_comms_visible_devices: int | None = None + """``LocalCommsStatus.visible_devices_count`` (proto field 3) — the number + of mesh peers this node currently sees. APK-confirmed (1.0.29). + """ + local_comms_expected_devices: int | None = None + """``LocalCommsStatus.expected_devices_count`` (proto field 4) — the number + of mesh peers expected on this system. APK-confirmed (1.0.29). + """ + local_comms_reason: LocalCommsHealthReason = LocalCommsHealthReason.UNSPECIFIED + """``LocalCommsStatus.reason`` (proto field 6) — diagnostic reason for the + current ``local_comms_health`` status (e.g. ``PARTIAL_VISIBILITY`` when + some but not all expected peers are visible). APK-confirmed (1.0.29). + """ + local_comms_last_session_change: datetime | None = None + """``LocalCommsStatus.last_session_change_ts`` (proto field 5) — when the + local mesh session last changed. + """ @property def ambient_temperature_c(self) -> float | None: @@ -114,11 +137,10 @@ def _wifi(wstate: object | None) -> WifiInfo | None: return info if info.connected else None if w is not None: - wifi_ssid, wifi_ip, wifi_signal_dbm = parse_wifi_state(w) - wifi_freq_mhz = w.frequency_mhz or None + wifi_ssid, wifi_ip, wifi_signal_dbm, wifi_bssid, wifi_freq_mhz = parse_wifi_state(w) else: wifi_ssid, wifi_ip, wifi_signal_dbm = None, None, None - wifi_freq_mhz = None + wifi_bssid, wifi_freq_mhz = None, None rel = cast("Any", present_submsg(proto, "relationships")) controls = cast("Any", present_submsg(proto, "controls")) @@ -148,6 +170,7 @@ def _wifi(wstate: object | None) -> WifiInfo | None: wifi_ip=wifi_ip, wifi_signal_dbm=wifi_signal_dbm, wifi_freq_mhz=wifi_freq_mhz, + wifi_bssid=wifi_bssid, wifi_last_seen=wifi_last_seen, ap_wifi=_wifi(present_submsg(proto, "ap_wifi_state")), p2p_wifi=_wifi(present_submsg(proto, "p2p_wifi_state")), @@ -167,6 +190,18 @@ def _wifi(wstate: object | None) -> WifiInfo | None: firmware_version=fw_ver, state_updated_at=updated_at, local_comms_health=LocalCommsHealthStatus( - getattr(getattr(p, "local_comms_status", None), "health", 0) + getattr(getattr(p, "local_comms_status", None), "status", 0) + ), + local_comms_visible_devices=getattr( + getattr(p, "local_comms_status", None), "visible_devices_count", None + ), + local_comms_expected_devices=getattr( + getattr(p, "local_comms_status", None), "expected_devices_count", None + ), + local_comms_reason=LocalCommsHealthReason( + getattr(getattr(p, "local_comms_status", None), "reason", 0) + ), + local_comms_last_session_change=local_comms_last_session_change( + getattr(p, "local_comms_status", None) ), ) diff --git a/src/quilt_hp/models/enums.py b/src/quilt_hp/models/enums.py index fdc60ea..1910e3f 100644 --- a/src/quilt_hp/models/enums.py +++ b/src/quilt_hp/models/enums.py @@ -360,3 +360,32 @@ class LocalCommsHealthStatus(IntEnum): def __str__(self) -> str: return self.name + + +class LocalCommsHealthReason(IntEnum): + """Diagnostic reason accompanying a node's ``LocalCommsHealthStatus``. + + Reported on ``LocalCommsStatus.reason`` (proto field 6) for a QSM or + Controller mesh node. APK-confirmed (com.quilt.android 1.0.29). + + The local mesh is Eclipse Zenoh-based — note ``ZENOH_SESSION_DOWN`` — not + NATS. ``HEALTHY`` accompanies a HEALTHY status; the remaining values + explain a DEGRADED/OFFLINE/STARTING_UP status (e.g. ``PARTIAL_VISIBILITY`` + when some but not all expected mesh peers are visible). + """ + + UNSPECIFIED = 0 + HEALTHY = 1 + BOOT_OR_WARMUP = 2 + ZENOH_SESSION_DOWN = 3 + NO_PEERS_VISIBLE = 4 + PARTIAL_VISIBILITY = 5 + NO_MESSAGES_RECEIVED = 6 + SESSION_INSTABILITY = 7 + NO_ALIVE_PEERS = 8 + NO_PEERS_EXPECTED = 9 + CREDENTIALS_NOT_READY = 10 + CREDENTIALS_EXPIRED = 11 + + def __str__(self) -> str: + return self.name diff --git a/src/quilt_hp/models/indoor_unit.py b/src/quilt_hp/models/indoor_unit.py index 918d30c..b7c5c31 100644 --- a/src/quilt_hp/models/indoor_unit.py +++ b/src/quilt_hp/models/indoor_unit.py @@ -182,6 +182,7 @@ class IndoorUnitConditions: coil_preheat: int mode_conflict_avoidance: int outdoor_unit_communication_error: int + compressor_minimum_run_time: int = 0 @property def any_active(self) -> bool: @@ -200,6 +201,7 @@ def any_active(self) -> bool: "coil_preheat", "mode_conflict_avoidance", "outdoor_unit_communication_error", + "compressor_minimum_run_time", ) ) @@ -362,6 +364,7 @@ def _idu_from_proto(proto: object) -> IndoorUnit: coil_preheat=co.coil_preheat, mode_conflict_avoidance=co.mode_conflict_avoidance, outdoor_unit_communication_error=co.outdoor_unit_communication_error, + compressor_minimum_run_time=co.compressor_minimum_run_time, ) presence_state = None diff --git a/src/quilt_hp/models/qsm.py b/src/quilt_hp/models/qsm.py index 97829de..c76f9ce 100644 --- a/src/quilt_hp/models/qsm.py +++ b/src/quilt_hp/models/qsm.py @@ -1,7 +1,8 @@ """QuiltSmartModule (QSM) model — the WiFi compute module embedded in each IDU. Each indoor unit contains one QSM that handles: -- Cloud/local NATS connectivity (three WiFi interfaces: hosted, AP, P2P) +- Cloud connectivity + local Zenoh mesh connectivity (three WiFi interfaces: + hosted, AP, P2P) - Presence detection (phase + target radar channels) - Ambient light sensing (ALS: illuminance, IR, combined) - Accelerometer (X/Y/Z — detects unit tilt/movement) @@ -10,10 +11,15 @@ from __future__ import annotations from dataclasses import dataclass, field +from datetime import datetime from typing import Any, cast -from quilt_hp.models._helpers import parse_wifi_state, present_submsg -from quilt_hp.models.enums import LocalCommsHealthStatus +from quilt_hp.models._helpers import ( + local_comms_last_session_change, + parse_wifi_state, + present_submsg, +) +from quilt_hp.models.enums import LocalCommsHealthReason, LocalCommsHealthStatus @dataclass(slots=True) @@ -23,15 +29,30 @@ class WifiInfo: ssid: str | None ip: str | None signal_dbm: int | None + bssid: str | None = None + frequency_mhz: int | None = None @property def connected(self) -> bool: return bool(self.ssid) + @property + def band(self) -> str | None: + """'5 GHz' or '2.4 GHz' based on frequency, or None if unknown.""" + if self.frequency_mhz is None: + return None + return "5 GHz" if self.frequency_mhz > 5000 else "2.4 GHz" + @classmethod def from_proto(cls, proto: object) -> WifiInfo: - ssid, ip, signal_dbm = parse_wifi_state(proto) - return cls(ssid=ssid, ip=ip, signal_dbm=signal_dbm) + ssid, ip, signal_dbm, bssid, frequency_mhz = parse_wifi_state(proto) + return cls( + ssid=ssid, + ip=ip, + signal_dbm=signal_dbm, + bssid=bssid, + frequency_mhz=frequency_mhz, + ) @dataclass(slots=True) @@ -73,6 +94,23 @@ class QuiltSmartModule: server has not yet reported a health value (pre-1.0.26 firmware or the gate is off). """ + local_comms_visible_devices: int | None = None + """``LocalCommsStatus.visible_devices_count`` (proto field 3) — the number + of mesh peers this node currently sees. APK-confirmed (1.0.29). + """ + local_comms_expected_devices: int | None = None + """``LocalCommsStatus.expected_devices_count`` (proto field 4) — the number + of mesh peers expected on this system. APK-confirmed (1.0.29). + """ + local_comms_reason: LocalCommsHealthReason = LocalCommsHealthReason.UNSPECIFIED + """``LocalCommsStatus.reason`` (proto field 6) — diagnostic reason for the + current ``local_comms_health`` status (e.g. ``PARTIAL_VISIBILITY`` when + some but not all expected peers are visible). APK-confirmed (1.0.29). + """ + local_comms_last_session_change: datetime | None = None + """``LocalCommsStatus.last_session_change_ts`` (proto field 5) — when the + local mesh session last changed. + """ @classmethod def from_proto(cls, proto: object) -> QuiltSmartModule: @@ -121,6 +159,18 @@ def _wifi(w: object | None) -> WifiInfo | None: (rel.firmware_update_info_id or None) if rel is not None else None ), local_comms_health=LocalCommsHealthStatus( - getattr(getattr(proto, "local_comms_status", None), "health", 0) + getattr(getattr(proto, "local_comms_status", None), "status", 0) + ), + local_comms_visible_devices=getattr( + getattr(proto, "local_comms_status", None), "visible_devices_count", None + ), + local_comms_expected_devices=getattr( + getattr(proto, "local_comms_status", None), "expected_devices_count", None + ), + local_comms_reason=LocalCommsHealthReason( + getattr(getattr(proto, "local_comms_status", None), "reason", 0) + ), + local_comms_last_session_change=local_comms_last_session_change( + getattr(proto, "local_comms_status", None) ), ) diff --git a/tests/test_models_from_proto.py b/tests/test_models_from_proto.py index 99f2e95..f4da10a 100644 --- a/tests/test_models_from_proto.py +++ b/tests/test_models_from_proto.py @@ -21,6 +21,7 @@ FanSpeed, HVACMode, HVACState, + LocalCommsHealthReason, LocalCommsHealthStatus, LouverMode, OccupancyMode, @@ -377,6 +378,7 @@ def _make_idu_proto( coil_preheat=0, mode_conflict_avoidance=0, outdoor_unit_communication_error=0, + compressor_minimum_run_time=0, ), performance_data=_ns( updated_ts=None, # no timestamp → perf data absent @@ -854,10 +856,20 @@ def test_qsm_local_comms_health_populated() -> None: hosted_wifi_state=_ns(ssid="", ipv4_address="", signal_level_dbm=0), ap_wifi_state=_ns(ssid="", ipv4_address="", signal_level_dbm=0), p2p_wifi_state=_ns(ssid="", ipv4_address="", signal_level_dbm=0), - local_comms_status=_ns(health=1), # health subfield 2 = HEALTHY + local_comms_status=_ns( + status=1, # status subfield 2 = HEALTHY + visible_devices_count=9, + expected_devices_count=9, + reason=1, # LocalCommsHealthReason.HEALTHY + last_session_change_ts=_ns(seconds=1_700_000_000), + ), ) qsm = QuiltSmartModule.from_proto(proto) assert qsm.local_comms_health == LocalCommsHealthStatus.HEALTHY + assert qsm.local_comms_visible_devices == 9 + assert qsm.local_comms_expected_devices == 9 + assert qsm.local_comms_reason == LocalCommsHealthReason.HEALTHY + assert qsm.local_comms_last_session_change is not None def test_qsm_local_comms_health_defaults_to_unspecified() -> None: @@ -913,10 +925,20 @@ def test_controller_local_comms_health_populated() -> None: ap_wifi_state=_ns(ssid="", ipv4_address="", signal_level_dbm=0), p2p_wifi_state=_ns(ssid="", ipv4_address="", signal_level_dbm=0), controls=_ns(remote_sensor_control_mode=0), - local_comms_status=_ns(health=3), # health subfield 2 = OFFLINE + local_comms_status=_ns( + status=3, # status subfield 2 = OFFLINE + visible_devices_count=0, + expected_devices_count=9, + reason=8, # LocalCommsHealthReason.NO_ALIVE_PEERS + last_session_change_ts=_ns(seconds=1_700_000_000), + ), ) ctrl = Controller.from_proto(proto) assert ctrl.local_comms_health == LocalCommsHealthStatus.OFFLINE + assert ctrl.local_comms_visible_devices == 0 + assert ctrl.local_comms_expected_devices == 9 + assert ctrl.local_comms_reason == LocalCommsHealthReason.NO_ALIVE_PEERS + assert ctrl.local_comms_last_session_change is not None def test_controller_local_comms_health_defaults_to_unspecified() -> None: