Desmond-Dong commited on
Commit
bbebe3c
·
1 Parent(s): f2e56b3

"refactor-camera-to-url-remove-led-add-diagnostic-category"

Browse files
reachy_mini_ha_voice/entity.py CHANGED
@@ -226,6 +226,7 @@ class BinarySensorEntity(ESPHomeEntity):
226
  object_id: str,
227
  icon: str = "",
228
  device_class: str = "",
 
229
  value_getter: Optional[Callable[[], bool]] = None,
230
  ) -> None:
231
  ESPHomeEntity.__init__(self, server)
@@ -234,6 +235,7 @@ class BinarySensorEntity(ESPHomeEntity):
234
  self.object_id = object_id
235
  self.icon = icon
236
  self.device_class = device_class
 
237
  self._value_getter = value_getter
238
  self._value = False
239
 
@@ -255,6 +257,7 @@ class BinarySensorEntity(ESPHomeEntity):
255
  name=self.name,
256
  icon=self.icon,
257
  device_class=self.device_class,
 
258
  )
259
  elif isinstance(msg, (SubscribeHomeAssistantStatesRequest, SubscribeStatesRequest)):
260
  yield self._get_state_message()
 
226
  object_id: str,
227
  icon: str = "",
228
  device_class: str = "",
229
+ entity_category: int = 0, # 0 = none, 1 = config, 2 = diagnostic
230
  value_getter: Optional[Callable[[], bool]] = None,
231
  ) -> None:
232
  ESPHomeEntity.__init__(self, server)
 
235
  self.object_id = object_id
236
  self.icon = icon
237
  self.device_class = device_class
238
+ self.entity_category = entity_category
239
  self._value_getter = value_getter
240
  self._value = False
241
 
 
257
  name=self.name,
258
  icon=self.icon,
259
  device_class=self.device_class,
260
+ entity_category=self.entity_category,
261
  )
262
  elif isinstance(msg, (SubscribeHomeAssistantStatesRequest, SubscribeStatesRequest)):
263
  yield self._get_state_message()
reachy_mini_ha_voice/satellite.py CHANGED
@@ -111,14 +111,14 @@ class VoiceSatelliteProtocol(APIServer):
111
  "emotion": 800,
112
  # Phase 9: Audio controls
113
  "microphone_volume": 900,
114
- # Phase 10: Camera
115
- "camera": 1000,
116
- # Phase 11: LED control
117
- "led_brightness": 1100,
118
- "led_effect": 1101,
119
- "led_color_r": 1102,
120
- "led_color_g": 1103,
121
- "led_color_b": 1104,
122
  # Phase 12: Audio processing
123
  "agc_enabled": 1200,
124
  "agc_max_gain": 1201,
@@ -168,8 +168,8 @@ class VoiceSatelliteProtocol(APIServer):
168
  self._setup_phase7_entities()
169
  self._setup_phase8_entities()
170
  self._setup_phase9_entities()
171
- self._setup_phase10_entities() # Camera status
172
- self._setup_phase11_entities() # LED control
173
  self._setup_phase12_entities() # Audio processing
174
 
175
  self._is_streaming_audio = False
@@ -1227,28 +1227,27 @@ class VoiceSatelliteProtocol(APIServer):
1227
  _LOGGER.info("Phase 9 entities registered: microphone_volume")
1228
 
1229
  def _setup_phase10_entities(self) -> None:
1230
- """Setup Phase 10 entities: Camera."""
1231
 
1232
- # Camera entity - provides actual camera image in Home Assistant
1233
- def get_camera_image() -> bytes:
1234
- """Get camera snapshot from camera server."""
1235
  if self.camera_server:
1236
- image = self.camera_server.get_snapshot()
1237
- if image:
1238
- return image
1239
- return b""
1240
 
1241
- camera = CameraEntity(
1242
  server=self,
1243
- key=self._get_entity_key("camera"),
1244
- name="Camera",
1245
- object_id="camera",
1246
  icon="mdi:camera",
1247
- image_getter=get_camera_image,
1248
  )
1249
- self.state.entities.append(camera)
1250
 
1251
- _LOGGER.info("Phase 10 entities registered: camera")
1252
 
1253
  def _setup_phase11_entities(self) -> None:
1254
  """Setup Phase 11 entities: LED control (via local SDK)."""
@@ -1386,7 +1385,7 @@ class VoiceSatelliteProtocol(APIServer):
1386
  )
1387
  self.state.entities.append(noise_suppression)
1388
 
1389
- # Echo Cancellation Converged
1390
  echo_cancellation_converged = BinarySensorEntity(
1391
  server=self,
1392
  key=self._get_entity_key("echo_cancellation_converged"),
@@ -1394,6 +1393,7 @@ class VoiceSatelliteProtocol(APIServer):
1394
  object_id="echo_cancellation_converged",
1395
  icon="mdi:waveform",
1396
  device_class="running",
 
1397
  value_getter=self.reachy_controller.get_echo_cancellation_converged,
1398
  )
1399
  self.state.entities.append(echo_cancellation_converged)
 
111
  "emotion": 800,
112
  # Phase 9: Audio controls
113
  "microphone_volume": 900,
114
+ # Phase 10: Camera URL
115
+ "camera_url": 1000,
116
+ # Phase 11: LED control (disabled - not visible)
117
+ # "led_brightness": 1100,
118
+ # "led_effect": 1101,
119
+ # "led_color_r": 1102,
120
+ # "led_color_g": 1103,
121
+ # "led_color_b": 1104,
122
  # Phase 12: Audio processing
123
  "agc_enabled": 1200,
124
  "agc_max_gain": 1201,
 
168
  self._setup_phase7_entities()
169
  self._setup_phase8_entities()
170
  self._setup_phase9_entities()
171
+ self._setup_phase10_entities() # Camera
172
+ # Phase 11 (LED control) disabled - LEDs are inside the robot and not visible
173
  self._setup_phase12_entities() # Audio processing
174
 
175
  self._is_streaming_audio = False
 
1227
  _LOGGER.info("Phase 9 entities registered: microphone_volume")
1228
 
1229
  def _setup_phase10_entities(self) -> None:
1230
+ """Setup Phase 10 entities: Camera URL for Generic Camera integration."""
1231
 
1232
+ # Camera stream URL - users can use this with Generic Camera in HA
1233
+ def get_camera_url() -> str:
1234
+ """Get camera stream URL."""
1235
  if self.camera_server:
1236
+ # Return the MJPEG stream URL
1237
+ return f"http://{{host}}:{self.camera_server.port}/stream"
1238
+ return "N/A"
 
1239
 
1240
+ camera_url = TextSensorEntity(
1241
  server=self,
1242
+ key=self._get_entity_key("camera_url"),
1243
+ name="Camera Stream URL",
1244
+ object_id="camera_url",
1245
  icon="mdi:camera",
1246
+ value_getter=get_camera_url,
1247
  )
1248
+ self.state.entities.append(camera_url)
1249
 
1250
+ _LOGGER.info("Phase 10 entities registered: camera_url (use with Generic Camera in HA)")
1251
 
1252
  def _setup_phase11_entities(self) -> None:
1253
  """Setup Phase 11 entities: LED control (via local SDK)."""
 
1385
  )
1386
  self.state.entities.append(noise_suppression)
1387
 
1388
+ # Echo Cancellation Converged (read-only diagnostic status)
1389
  echo_cancellation_converged = BinarySensorEntity(
1390
  server=self,
1391
  key=self._get_entity_key("echo_cancellation_converged"),
 
1393
  object_id="echo_cancellation_converged",
1394
  icon="mdi:waveform",
1395
  device_class="running",
1396
+ entity_category=2, # diagnostic
1397
  value_getter=self.reachy_controller.get_echo_cancellation_converged,
1398
  )
1399
  self.state.entities.append(echo_cancellation_converged)