|
8 | 8 | import logging |
9 | 9 | import copy |
10 | 10 | import asyncio |
| 11 | +from contextlib import suppress |
| 12 | + |
11 | 13 | import aiohttp |
12 | 14 | import re |
13 | 15 |
|
14 | 16 | import voluptuous as vol |
15 | 17 |
|
16 | | -from homeassistant.core import callback |
| 18 | +from homeassistant.core import callback, Context |
17 | 19 | import homeassistant.components.websocket_api.auth as api |
18 | 20 | from homeassistant.core import EventOrigin, split_entity_id |
19 | 21 | from homeassistant.helpers.typing import HomeAssistantType, ConfigType |
@@ -377,15 +379,26 @@ def fire_event(message): |
377 | 379 | return |
378 | 380 |
|
379 | 381 | if message['event']['event_type'] == 'state_changed': |
380 | | - entity_id = message['event']['data']['entity_id'] |
381 | | - state = message['event']['data']['new_state']['state'] |
382 | | - attr = message['event']['data']['new_state']['attributes'] |
| 382 | + data = message['event']['data'] |
| 383 | + entity_id = data['entity_id'] |
| 384 | + if not data['new_state']: |
| 385 | + # entity was removed in the remote instance |
| 386 | + with suppress(ValueError, AttributeError): |
| 387 | + self._entities.remove(entity_id) |
| 388 | + self._hass.states.async_remove(entity_id) |
| 389 | + return |
| 390 | + |
| 391 | + state = data['new_state']['state'] |
| 392 | + attr = data['new_state']['attributes'] |
383 | 393 | state_changed(entity_id, state, attr) |
384 | 394 | else: |
385 | 395 | event = message['event'] |
386 | 396 | self._hass.bus.async_fire( |
387 | 397 | event_type=event['event_type'], |
388 | 398 | event_data=event['data'], |
| 399 | + context=Context(id=event['context'].get('id'), |
| 400 | + user_id=event['context'].get('user_id'), |
| 401 | + parent_id=event['context'].get('parent_id')), |
389 | 402 | origin=EventOrigin.remote |
390 | 403 | ) |
391 | 404 |
|
|
0 commit comments