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 |
-
"
|
| 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
|
| 172 |
-
|
| 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
|
| 1233 |
-
def
|
| 1234 |
-
"""Get camera
|
| 1235 |
if self.camera_server:
|
| 1236 |
-
|
| 1237 |
-
|
| 1238 |
-
|
| 1239 |
-
return b""
|
| 1240 |
|
| 1241 |
-
|
| 1242 |
server=self,
|
| 1243 |
-
key=self._get_entity_key("
|
| 1244 |
-
name="Camera",
|
| 1245 |
-
object_id="
|
| 1246 |
icon="mdi:camera",
|
| 1247 |
-
|
| 1248 |
)
|
| 1249 |
-
self.state.entities.append(
|
| 1250 |
|
| 1251 |
-
_LOGGER.info("Phase 10 entities registered:
|
| 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)
|