55import logging
66from datetime import timedelta
77
8+ from homeassistant .config_entries import ConfigEntry
9+ from homeassistant .const import STATE_UNAVAILABLE , STATE_UNKNOWN
810from homeassistant .core import HomeAssistant
911from homeassistant .helpers .update_coordinator import DataUpdateCoordinator
1012from pymitsubishi import MitsubishiController , ParsedDeviceState
1113
12- from .const import DEFAULT_SCAN_INTERVAL , DOMAIN
14+ from .const import CONF_EXTERNAL_TEMP_ENTITY , CONF_REMOTE_TEMP_MODE , DEFAULT_SCAN_INTERVAL , DOMAIN
1315
1416_LOGGER = logging .getLogger (__name__ )
1517
@@ -21,11 +23,16 @@ def __init__(
2123 self ,
2224 hass : HomeAssistant ,
2325 controller : MitsubishiController ,
26+ config_entry : ConfigEntry ,
2427 scan_interval : int = DEFAULT_SCAN_INTERVAL ,
2528 ) -> None :
2629 """Initialize."""
2730 self .controller = controller
31+ self .config_entry = config_entry
2832 self .unit_info = None # Will be populated on first update or by config flow
33+ # Load persisted remote temperature mode (AC doesn't report it, so we track it)
34+ self ._remote_temp_mode = config_entry .options .get (CONF_REMOTE_TEMP_MODE , False )
35+ self ._startup_mode_applied = False
2936
3037 super ().__init__ (
3138 hass ,
@@ -34,16 +41,109 @@ def __init__(
3441 update_interval = timedelta (seconds = scan_interval ),
3542 )
3643
44+ def set_remote_temp_mode (self , enabled : bool ) -> None :
45+ """Set whether remote temperature mode is enabled and persist to storage."""
46+ self ._remote_temp_mode = enabled
47+ _LOGGER .info ("Remote temperature mode set to: %s" , enabled )
48+
49+ # Persist to config entry options
50+ new_options = dict (self .config_entry .options )
51+ new_options [CONF_REMOTE_TEMP_MODE ] = enabled
52+ self .hass .config_entries .async_update_entry (
53+ self .config_entry ,
54+ options = new_options ,
55+ )
56+
57+ @property
58+ def remote_temp_mode (self ) -> bool :
59+ """Return whether remote temperature mode is enabled."""
60+ return self ._remote_temp_mode
61+
3762 async def get_unit_info (self ) -> dict :
3863 """Fetch unit information once for device info."""
3964 unit_info = await self .hass .async_add_executor_job (self .controller .get_unit_info )
4065 return unit_info
4166
4267 async def _async_update_data (self ) -> ParsedDeviceState :
4368 """Update data via library."""
44- _LOGGER .info ("Coordinator fetching device status" )
45- # This invokes a network call, run in executor to avoid blocking
69+ _LOGGER .debug ("Coordinator fetching device status" )
70+
71+ # On first update after startup, restore the persisted mode to the AC
72+ if not self ._startup_mode_applied :
73+ self ._startup_mode_applied = True
74+ if self ._remote_temp_mode :
75+ _LOGGER .info ("Restoring remote temperature mode from persisted state" )
76+ await self ._send_remote_temperature ()
77+ else :
78+ _LOGGER .debug ("Starting with internal temperature mode" )
79+ elif self ._remote_temp_mode :
80+ # Regular update - send remote temperature if enabled
81+ await self ._send_remote_temperature ()
82+
83+ # Fetch status from device
4684 state = await self .hass .async_add_executor_job (
4785 self .controller .fetch_status ,
4886 )
4987 return state
88+
89+ async def _send_remote_temperature (self ) -> None :
90+ """Send remote temperature to AC if configured and available."""
91+ external_entity_id = self .config_entry .options .get (CONF_EXTERNAL_TEMP_ENTITY )
92+
93+ if not external_entity_id :
94+ _LOGGER .warning (
95+ "Remote temperature mode enabled but no external entity configured, "
96+ "falling back to internal sensor"
97+ )
98+ await self .hass .async_add_executor_job (
99+ self .controller .set_current_temperature , None
100+ )
101+ self ._remote_temp_mode = False
102+ return
103+
104+ state = self .hass .states .get (external_entity_id )
105+
106+ if state is None :
107+ _LOGGER .warning (
108+ "External temperature entity %s not found, falling back to internal sensor" ,
109+ external_entity_id ,
110+ )
111+ await self .hass .async_add_executor_job (
112+ self .controller .set_current_temperature , None
113+ )
114+ self ._remote_temp_mode = False
115+ return
116+
117+ if state .state in (STATE_UNAVAILABLE , STATE_UNKNOWN ):
118+ _LOGGER .warning (
119+ "External temperature entity %s is %s, falling back to internal sensor" ,
120+ external_entity_id ,
121+ state .state ,
122+ )
123+ await self .hass .async_add_executor_job (
124+ self .controller .set_current_temperature , None
125+ )
126+ self ._remote_temp_mode = False
127+ return
128+
129+ try :
130+ temperature = float (state .state )
131+ _LOGGER .debug (
132+ "Sending remote temperature %.1f from %s to AC" ,
133+ temperature ,
134+ external_entity_id ,
135+ )
136+ await self .hass .async_add_executor_job (
137+ self .controller .set_current_temperature , temperature
138+ )
139+ except (ValueError , TypeError ) as e :
140+ _LOGGER .error (
141+ "Invalid temperature value '%s' from %s: %s, falling back to internal sensor" ,
142+ state .state ,
143+ external_entity_id ,
144+ e ,
145+ )
146+ await self .hass .async_add_executor_job (
147+ self .controller .set_current_temperature , None
148+ )
149+ self ._remote_temp_mode = False
0 commit comments