@@ -29,6 +29,9 @@ async def async_setup_entry(
2929 MitsubishiErrorSensor (coordinator , config_entry ),
3030 MitsubishiDehumidifierLevelSensor (coordinator , config_entry ),
3131 MitsubishiUnitInfoSensor (coordinator , config_entry ),
32+ MitsubishiFirmwareVersionSensor (coordinator , config_entry ),
33+ MitsubishiUnitTypeSensor (coordinator , config_entry ),
34+ MitsubishiWifiInfoSensor (coordinator , config_entry ),
3235 ]
3336 )
3437
@@ -211,3 +214,140 @@ def extra_state_attributes(self) -> dict[str, Any]:
211214 # Remove None values
212215 return {k : v for k , v in attributes .items () if v is not None }
213216
217+
218+ class MitsubishiFirmwareVersionSensor (MitsubishiEntity , SensorEntity ):
219+ """Firmware version diagnostic sensor for Mitsubishi AC."""
220+
221+ _attr_name = "Firmware Version"
222+ _attr_icon = "mdi:chip"
223+ _attr_entity_category = "diagnostic"
224+
225+ def __init__ (
226+ self ,
227+ coordinator : MitsubishiDataUpdateCoordinator ,
228+ config_entry : ConfigEntry ,
229+ ) -> None :
230+ """Initialize the firmware version sensor."""
231+ super ().__init__ (coordinator , config_entry , "firmware_version" )
232+
233+ @property
234+ def native_value (self ) -> str | None :
235+ """Return the app version as the main state."""
236+ if self .coordinator .unit_info :
237+ adaptor_info = self .coordinator .unit_info .get ("adaptor_info" , {})
238+ return adaptor_info .get ("app_version" , "Unknown" )
239+ return "Unknown"
240+
241+ @property
242+ def extra_state_attributes (self ) -> dict [str , Any ]:
243+ """Return detailed version information as attributes."""
244+ if not self .coordinator .unit_info :
245+ return {"status" : "Unit info not available" }
246+
247+ adaptor_info = self .coordinator .unit_info .get ("adaptor_info" , {})
248+ unit_info = self .coordinator .unit_info .get ("unit_info" , {})
249+
250+ attributes = {
251+ "release_version" : adaptor_info .get ("release_version" ),
252+ "flash_version" : adaptor_info .get ("flash_version" ),
253+ "boot_version" : adaptor_info .get ("boot_version" ),
254+ "platform_version" : adaptor_info .get ("platform_version" ),
255+ "test_version" : adaptor_info .get ("test_version" ),
256+ "protocol_version" : unit_info .get ("it_protocol_version" ),
257+ }
258+
259+ # Remove None values
260+ return {k : v for k , v in attributes .items () if v is not None }
261+
262+
263+ class MitsubishiUnitTypeSensor (MitsubishiEntity , SensorEntity ):
264+ """Unit type diagnostic sensor for Mitsubishi AC."""
265+
266+ _attr_name = "Unit Type"
267+ _attr_icon = "mdi:air-conditioner"
268+ _attr_entity_category = "diagnostic"
269+
270+ def __init__ (
271+ self ,
272+ coordinator : MitsubishiDataUpdateCoordinator ,
273+ config_entry : ConfigEntry ,
274+ ) -> None :
275+ """Initialize the unit type sensor."""
276+ super ().__init__ (coordinator , config_entry , "unit_type" )
277+
278+ @property
279+ def native_value (self ) -> str | None :
280+ """Return the unit type."""
281+ if self .coordinator .unit_info :
282+ unit_info = self .coordinator .unit_info .get ("unit_info" , {})
283+ return unit_info .get ("type" , "Unknown" )
284+ return "Unknown"
285+
286+ @property
287+ def extra_state_attributes (self ) -> dict [str , Any ]:
288+ """Return unit-related information as attributes."""
289+ if not self .coordinator .unit_info :
290+ return {"status" : "Unit info not available" }
291+
292+ adaptor_info = self .coordinator .unit_info .get ("adaptor_info" , {})
293+ unit_info = self .coordinator .unit_info .get ("unit_info" , {})
294+
295+ attributes = {
296+ "model" : adaptor_info .get ("model" ),
297+ "device_id" : adaptor_info .get ("device_id" ),
298+ "manufacturing_date" : adaptor_info .get ("manufacturing_date" ),
299+ "protocol_version" : unit_info .get ("it_protocol_version" ),
300+ "unit_error_code" : unit_info .get ("error_code" ),
301+ }
302+
303+ # Remove None values
304+ return {k : v for k , v in attributes .items () if v is not None }
305+
306+
307+ class MitsubishiWifiInfoSensor (MitsubishiEntity , SensorEntity ):
308+ """WiFi information diagnostic sensor for Mitsubishi AC."""
309+
310+ _attr_name = "WiFi Information"
311+ _attr_icon = "mdi:wifi"
312+ _attr_entity_category = "diagnostic"
313+
314+ def __init__ (
315+ self ,
316+ coordinator : MitsubishiDataUpdateCoordinator ,
317+ config_entry : ConfigEntry ,
318+ ) -> None :
319+ """Initialize the WiFi info sensor."""
320+ super ().__init__ (coordinator , config_entry , "wifi_info" )
321+
322+ @property
323+ def native_value (self ) -> str | None :
324+ """Return the WiFi signal strength as the main state."""
325+ if self .coordinator .unit_info :
326+ adaptor_info = self .coordinator .unit_info .get ("adaptor_info" , {})
327+ rssi = adaptor_info .get ("rssi_dbm" )
328+ if rssi is not None :
329+ return f"{ rssi } dBm"
330+ return "Unknown"
331+
332+ @property
333+ def extra_state_attributes (self ) -> dict [str , Any ]:
334+ """Return WiFi and communication status as attributes."""
335+ if not self .coordinator .unit_info :
336+ return {"status" : "Unit info not available" }
337+
338+ adaptor_info = self .coordinator .unit_info .get ("adaptor_info" , {})
339+
340+ attributes = {
341+ "mac_address" : adaptor_info .get ("mac_address" ),
342+ "wifi_channel" : adaptor_info .get ("wifi_channel" ),
343+ "rssi_dbm" : adaptor_info .get ("rssi_dbm" ),
344+ "it_comm_status" : adaptor_info .get ("it_comm_status" ),
345+ "server_operation" : adaptor_info .get ("server_operation" ),
346+ "server_comm_status" : adaptor_info .get ("server_comm_status" ),
347+ "hems_comm_status" : adaptor_info .get ("hems_comm_status" ),
348+ "soi_comm_status" : adaptor_info .get ("soi_comm_status" ),
349+ }
350+
351+ # Remove None values
352+ return {k : v for k , v in attributes .items () if v is not None }
353+
0 commit comments