18 Commits

Author SHA1 Message Date
Li Shuzhen
d5c5e387c2 docs: update changelog and version to v0.4.5 (#1521)
Some checks failed
Tests / check-rule-format (push) Failing after 1s
Validate / validate-hassfest (push) Failing after 1s
Validate / validate-hacs (push) Failing after 9s
Validate / validate-lint (push) Failing after 0s
Validate / validate-setup (push) Failing after 1s
2025-11-25 10:04:22 +08:00
Li Shuzhen
e6750bb746 feat: format value, then evaluate by expression, and set precision at last (#1516) 2025-11-25 09:31:40 +08:00
Li Shuzhen
1b87381f43 Fix specs (#1517)
Some checks failed
Tests / check-rule-format (push) Failing after 7s
Validate / validate-hassfest (push) Failing after 2s
Validate / validate-hacs (push) Failing after 13s
Validate / validate-lint (push) Failing after 1s
Validate / validate-setup (push) Failing after 6s
* fix: xiaomi.waterpuri.s1200g filter property unit (#1489)

* fix: xiaomi.aircondition.c24 power consumption device class (#1243)

* fix: cuco.plug.cp7pd power consumption and power value precision (#1502)

* fix: lxzn.valve.02 electricity property unit (#1514)
2025-11-24 17:11:38 +08:00
Li Shuzhen
33ee65cf75 fix: ignore mdns REMOVED package (#1296)
Some checks failed
Tests / check-rule-format (push) Failing after 0s
Validate / validate-hassfest (push) Failing after -1s
Validate / validate-hacs (push) Failing after 6s
Validate / validate-lint (push) Failing after -2s
Validate / validate-setup (push) Failing after 0s
2025-11-17 11:15:10 +08:00
Quint Stoffers
f95c71c2ad fix: xiaomi.derh.lite temperature precision (#1505)
* fix: xiaomi.derh.lite temperature precision

Add value-range step of 0.1 for dehumidifier temperature property to preserve decimal precision.

The xiaomi.derh.lite dehumidifier was reporting temperature as integer instead of float due to the default value-range step of 1. This fix changes the step to 0.1 to allow one decimal place precision (e.g., 22.5°C instead of 23°C).

Similar to the fix for cgllc.airm.cgd1st air monitor in commit 580ff87.

* chore: sort dehumidifier entry
2025-11-17 10:48:53 +08:00
Li Shuzhen
7abc20dcb5 docs: update changelog and version to v0.4.4 (#1497)
Some checks failed
Tests / check-rule-format (push) Failing after 1s
Validate / validate-hassfest (push) Failing after 1s
Validate / validate-hacs (push) Failing after 9s
Validate / validate-lint (push) Failing after 0s
Validate / validate-setup (push) Failing after 2s
2025-11-11 09:12:55 +08:00
Li Shuzhen
3e33804477 Fix specs (#1496)
* fix: roidmi.vacuum.v60 duplicated service name for vacuum entity

* fix: cykj.hood.jyj22 spec urn version 4 (#1477)

* fix: lumi.motion.bmgl01 siid=2 piid=2 value-list (#1444)

* fix: ykcn.valve.cbcs power property value unit (#1488)

* fix: ainice.sensor_occupy.3b siid=2 piid=5,11,14,17 device_class (#1495)

* fix: qdhkl.airc.a42 hvac mode (#1483)
2025-11-11 08:56:33 +08:00
Mümin Köykıran
551b5cc938 feat: add Turkish language support (#1468)
Some checks failed
Tests / check-rule-format (push) Failing after 2s
Validate / validate-hassfest (push) Failing after 2s
Validate / validate-hacs (push) Failing after 7s
Validate / validate-lint (push) Failing after -1s
Validate / validate-setup (push) Failing after 1s
* feat: add Turkish language support

Added comprehensive Turkish (tr) language translations for Xiaomi Home Integration.

Changes:
- Added custom_components/xiaomi_home/translations/tr.json with complete UI translations
- Added custom_components/xiaomi_home/miot/i18n/tr.json with MIoT-specific translations
- All placeholders, markdown formatting, and special characters preserved
- Validated against English source files for structural integrity

Technical details:
- Followed Home Assistant language code standards (ISO 639-1: tr)
- Maintained formal Turkish (siz form) for professional user experience
- Preserved all technical terms (OAuth2, MIoT-Spec-V2, MQTT, etc.)
- JSON structure validated and all keys match English version

* feat: add Turkish translations to bool_trans.yaml

Added Turkish boolean value translations for:
- default: true/false values
- contact_state: contact/no contact states
- motion_state: motion detected states
- open_close: open/close states
- yes_no: yes/no values

* docs: update README to reflect Turkish language support

Updated multiple language support section:
- Changed from 8 to 13 supported languages
- Added Turkish (tr) to the language code list
- Updated language list to include all currently supported languages:
  Italian, Dutch, Portuguese, Brazilian Portuguese, and Turkish

* fix: correct language dictionary sorting and update documentation

- Sort INTEGRATION_LANGUAGES dictionary alphabetically (tr after ru)
- Update CLAUDE.md to reflect 13 supported languages instead of 8
- Fixes test_miot_data_sort() test requirement
- No functional changes, documentation and code style improvements only

* docs: update Chinese README to reflect 13 supported languages

- Changed from 8 to 13 languages in Chinese documentation
- Added Turkish, Italian, Dutch, Portuguese, Brazilian Portuguese
- Updated language code list to include: it, nl, pt, pt-BR, tr
- Changed translation source note from "machine translation"
  to "machine translation or community contributions"
- Maintains consistency with English README.md
2025-11-10 09:50:02 +08:00
Li Shuzhen
f49e76937c fix: climate entity swing mode setting (#1486)
Some checks failed
Tests / check-rule-format (push) Failing after 1s
Validate / validate-hassfest (push) Failing after 0s
Validate / validate-hacs (push) Failing after 6s
Validate / validate-lint (push) Failing after -1s
Validate / validate-setup (push) Failing after 0s
2025-11-07 10:19:31 +08:00
Li Shuzhen
a1a216aea6 fix: float value precision (#1485) 2025-11-07 10:19:01 +08:00
vshijiav
1ec325c9c7 fix: stop MQTT internal loop immediately when main loop is closed (#1484) 2025-11-07 10:18:25 +08:00
Li Shuzhen
c04fa542a3 docs: update changelog and version to v0.4.3 (#1453)
Some checks failed
Tests / check-rule-format (push) Failing after 1s
Validate / validate-hassfest (push) Failing after 2s
Validate / validate-hacs (push) Failing after 8s
Validate / validate-lint (push) Failing after -1s
Validate / validate-setup (push) Failing after 2s
2025-10-14 08:33:36 +08:00
Li Shuzhen
fbddaf80a7 fix: pylint 4.0.0 (#1455)
Some checks failed
Tests / check-rule-format (push) Failing after 0s
Validate / validate-hassfest (push) Failing after 0s
Validate / validate-hacs (push) Failing after 10s
Validate / validate-lint (push) Failing after 2s
Validate / validate-setup (push) Failing after 4s
2025-10-13 17:11:30 +08:00
Li Shuzhen
a11c3e2fda Fix specs (#1394)
Some checks failed
Tests / check-rule-format (push) Failing after 2s
Validate / validate-hassfest (push) Failing after 1s
Validate / validate-hacs (push) Failing after 8s
Validate / validate-lint (push) Failing after 0s
Validate / validate-setup (push) Failing after 2s
* fix: xiaomi.airc.rr0r00 swing mode (#1386)

* fix: hyd.airer.lyjpro current-position (#1376)

* feat: add an alongside button entity for xiaomi.wifispeaker.l05b play action (#1372)

* fix: ignore the unsupported property 2.3 of 759413.aircondition.iez (#1391)

* fix: ignore unsupported properties of xiaomi.wifispeaker.l15a

* feat: zhimi.fan.za1 fan mode description in zh_Hans (#1424)

* fix: roidmi.vacuum.v60 siid=2 aiid=3 out field format (#1437)
2025-10-11 11:33:07 +08:00
Li Shuzhen
739998211e feat: remove VacuumEntityFeature.BATTERY from the vacuum entity (#1433)
Some checks failed
Tests / check-rule-format (push) Failing after 6s
Validate / validate-hassfest (push) Failing after 2s
Validate / validate-hacs (push) Failing after 15s
Validate / validate-lint (push) Failing after 1s
Validate / validate-setup (push) Failing after 4s
2025-10-10 16:31:02 +08:00
Li Shuzhen
ec833b6539 feat: subscribe the proxy gateway child device up messages even though the device is offline (#1393)
Some checks failed
Tests / check-rule-format (push) Failing after 2s
Validate / validate-hassfest (push) Failing after 3s
Validate / validate-hacs (push) Failing after 10s
Validate / validate-lint (push) Failing after 2s
Validate / validate-setup (push) Failing after 5s
* feat: subscribe the proxy gateway child device up messages even though the device is offline (#1313)

* feat: do not subscribe proxy gateway child device online/offline state message
2025-09-02 17:22:40 +08:00
Li Shuzhen
f2200ba003 fix: contact-state value format (#1387)
Some checks failed
Tests / check-rule-format (push) Failing after 4s
Validate / validate-hassfest (push) Failing after 3s
Validate / validate-hacs (push) Failing after 9s
Validate / validate-lint (push) Failing after 2s
Validate / validate-setup (push) Failing after 3s
2025-08-29 17:36:25 +08:00
Li Shuzhen
073cdf2dcb fix: integer value step (#1388) 2025-08-29 17:35:46 +08:00
24 changed files with 966 additions and 64 deletions

View File

@@ -1,10 +1,41 @@
# CHANGELOG
## v0.4.5
### Changed
- Ignore mdns REMOVED package. [#1296](https://github.com/XiaoMi/ha_xiaomi_home/pull/1296)
- Format value type first, then evaluate by expression, and set precision at last. [#1516](https://github.com/XiaoMi/ha_xiaomi_home/pull/1516)
### Fixed
- Fix xiaomi.derh.lite temperature precision. [#1505](https://github.com/XiaoMi/ha_xiaomi_home/pull/1505)
- Fix xiaomi.waterpuri.s1200g filter property unit, lxzn.valve.02 electricity property unit, xiaomi.aircondition.c24 power consumption device class, and cuco.plug.cp7pd power consumption and power value precision. [#1517](https://github.com/XiaoMi/ha_xiaomi_home/pull/1517)
## v0.4.4
### Added
- Add Turkish language support. [#1468](https://github.com/XiaoMi/ha_xiaomi_home/pull/1468)
### Fixed
- Stop MQTT internal loop immediately when main loop is closed. [#1465](https://github.com/XiaoMi/ha_xiaomi_home/pull/1465)
- Fix the float value precision. [#1485](https://github.com/XiaoMi/ha_xiaomi_home/pull/1485)
- Fix the climate entity swing mode setting. [#1486](https://github.com/XiaoMi/ha_xiaomi_home/pull/1486)
- Fix the MIoT-Spec-V2 of cykj.hood.jyj22 urn version 4, lumi.motion.bmgl01 siid=2 piid=2 value-list, ykcn.valve.cbcs power property value unit, ainice.sensor_occupy.3b people-number property and qdhkl.airc.a42 hvac mode. [#1496](https://github.com/XiaoMi/ha_xiaomi_home/pull/1496)
## v0.4.3
### Changed
- Remove `VacuumEntityFeature.BATTERY` from the vacuum entity. [#1433](https://github.com/XiaoMi/ha_xiaomi_home/pull/1433)
- Subscribe the proxy gateway child device up messages even though the device is offline. [#1393](https://github.com/XiaoMi/ha_xiaomi_home/pull/1393)
### Fixed
- Fix the integer value step. [#1388](https://github.com/XiaoMi/ha_xiaomi_home/pull/1388)
- Fix the contact-state property value format. [#1387](https://github.com/XiaoMi/ha_xiaomi_home/pull/1387)
- Fix the MIoT-Spec-V2 of xiaomi.airc.rr0r00 swing mode and hyd.airer.lyjpro current-position. [#1394](https://github.com/XiaoMi/ha_xiaomi_home/pull/1394)
- Fix roidmi.vacuum.v60 siid=2 aiid=3 out field format.
- Ignore unsupported properties of xiaomi.wifispeaker.l15a and 759413.aircondition.iez.
- Add an alongside button entity for xiaomi.wifispeaker.l05b play action.
- Add zhimi.fan.za1 fan mode description in zh_Hans.
- Fix the error reported by pylint-4.0.0. [#1455](https://github.com/XiaoMi/ha_xiaomi_home/pull/1455)
## v0.4.2
### Changed
- Set the battery service's start-charge action as the fallback action to support RETURN_HOME feature of the vacuum entity. [#1344](https://github.com/XiaoMi/ha_xiaomi_home/pull/1344)
### Fixed
- Correct the property value format after expression calculation. [#1366](https://github.com/XiaoMi/ha_xiaomi_home/pull/1366)
- Fix the MIoT-Spec-V2 of fix: xiaomi.fan.p70 and fix: xiaomi.fan.p76 fan level, xiaomi.airc.rr0r00 and xiaomi.airc.h43h00 humidity-range, and zhimi.humidifier.ca4 water level. [#1367](https://github.com/XiaoMi/ha_xiaomi_home/pull/1367)
- Fix the MIoT-Spec-V2 of xiaomi.fan.p70 and xiaomi.fan.p76 fan level, xiaomi.airc.rr0r00 and xiaomi.airc.h43h00 humidity-range, and zhimi.humidifier.ca4 water level. [#1367](https://github.com/XiaoMi/ha_xiaomi_home/pull/1367)
- Ignore the unsupported model hmpace.motion.v6nfc.
- Delete all unsupported MIoT-Spec-V2 instances of narwa.vacuum.001 and narwa.vacuum.ax11. [#1355](https://github.com/XiaoMi/ha_xiaomi_home/pull/1355)

192
CLAUDE.md Normal file
View File

@@ -0,0 +1,192 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Xiaomi Home Integration is an official Home Assistant integration for controlling Xiaomi IoT smart devices. It connects to devices via Xiaomi Cloud (MQTT) or locally through Xiaomi Central Hub Gateway. The integration converts MIoT-Spec-V2 device specifications into Home Assistant entities.
## Development Commands
### Installation & Setup
```bash
# Install to Home Assistant config directory
./install.sh /path/to/config
# Install test dependencies
pip install pytest pytest-asyncio pytest-dependency zeroconf paho.mqtt psutil cryptography slugify
```
### Testing
```bash
# Run all tests
pytest -v -s -m github ./test/
# Run specific test files
pytest -v -s ./test/test_spec.py
pytest -v -s ./test/test_cloud.py
pytest -v -s ./test/test_lan.py
# Check rule format
pytest -v -s -m github ./test/check_rule_format.py
```
### Code Quality
```bash
# Run pylint (follows Google Python Style Guide)
pylint $(git ls-files '*.py')
# Lint specific files
pylint custom_components/xiaomi_home/*.py
```
### Validation
```bash
# HACS validation (run by GitHub Actions)
# Uses: hacs/action@main
# Hassfest validation (run by GitHub Actions)
# Uses: home-assistant/actions/hassfest@master
```
## Architecture Overview
### Core Components (miot/)
The integration is built around the `miot/` core package:
**miot_client.py**: Top-level client instance representing a logged-in Xiaomi user. Each user login creates one MIoTClient. Manages authentication, device list, and message routing.
**miot_cloud.py**: OAuth 2.0 authentication and HTTP API calls to Xiaomi Cloud. Handles token refresh, user info, device control commands, and spec downloads.
**miot_mips.py**: Message bus (MQTT) for subscribing to device property changes and events. Implements both cloud (MipsCloudClient) and local (MipsLocalClient) message handling.
**miot_device.py**: Device entity class. Each MIoT device creates multiple MIoTDevice instances (one per Home Assistant entity). Handles property updates, action execution, and event processing.
**miot_spec.py**: MIoT-Spec-V2 parser. Parses device specifications (URN-based type system) from cloud or local cache. Each spec defines services, properties, events, and actions.
**miot_lan.py**: Local LAN control for IP devices in same network. Discovery and control without cloud (optional).
**miot_mdns.py**: mDNS discovery for Xiaomi Central Hub Gateway services.
**miot_storage.py**: File storage for certificates, device specs, translations, and cached data.
**miot_network.py**: Network status monitoring and IP address detection.
**miot_i18n.py**: Multi-language support (13 languages). Manages translations for entity names.
### Entity Conversion (specs/specv2entity.py)
MIoT-Spec-V2 instances are converted to Home Assistant entities using three mapping dictionaries:
- **SPEC_DEVICE_TRANS_MAP**: Whole-device patterns (e.g., vacuum, humidifier, climate)
- **SPEC_SERVICE_TRANS_MAP**: Service-level patterns (e.g., battery, air-purifier)
- **SPEC_PROP_TRANS_MAP**: Property-level patterns (e.g., temperature, humidity)
Conversion priority: Device > Service > Property > General rules
### Spec Customization Files (miot/specs/)
**spec_filter.yaml**: Filters out MIoT-Spec-V2 instances that should NOT be converted to entities. Uses device URN keys and supports wildcard matching for service/property/event/action IIDs.
**spec_modify.yaml**: Modifies spec instances before conversion (e.g., changing value ranges, access modes).
**multi_lang.json**: Local translation overrides with higher priority than cloud translations. Keyed by device URN (without version).
**spec_add.json**: Additional spec definitions for devices not in cloud database.
**bool_trans.yaml**: Boolean value translation mappings.
After editing spec files, you MUST update conversion rules via Integration CONFIGURE page in Home Assistant.
### Platform Files (custom_components/xiaomi_home/)
Standard Home Assistant platform files (sensor.py, switch.py, climate.py, etc.) implement entity registration and state management. Each platform imports from miot_device.py and creates entity subclasses.
**config_flow.py**: Configuration flow for OAuth login and device selection.
**__init__.py**: Integration setup, entry management, and data structure initialization.
## MIoT-Spec-V2 Concepts
**URN Format**: `urn:<namespace>:<type>:<name>:<value>[:<vendor-product>:<version>]`
- namespace: miot-spec-v2 (Xiaomi), bluetooth-spec (SIG), or vendor-specific
- type: device, service, property, event, action
- name: human-readable identifier (used for mapping)
**IIDs (Instance IDs)**: Decimal identifiers
- siid: Service Instance ID
- piid: Property Instance ID
- eiid: Event Instance ID
- aiid: Action Instance ID
**Instance Code Format**:
```
service:<siid> # service
service:<siid>:property:<piid> # property
service:<siid>:property:<piid>:valuelist:<index> # value list item
service:<siid>:event:<eiid> # event
service:<siid>:action:<aiid> # action
```
## Naming Conventions
From CONTRIBUTING.md:
- **Xiaomi**: Always "Xiaomi" in text. Variables: "xiaomi" or "mi"
- **Xiaomi Home**: Always "Xiaomi Home" in text. Variables: "mihome" or "MiHome"
- **Xiaomi IoT**: Always "MIoT" in text. Variables: "miot" or "MIoT"
- **Home Assistant**: Always "Home Assistant" in text. Variables: "hass" or "hass_xxx"
Mixed Chinese/English: Add space between Chinese and English or use Chinese quotation marks.
## Commit Message Format
```
<type>: <subject>
<body>
<footer>
```
Types: feat, fix, docs, style, refactor, perf, test, chore, revert
Subject: Imperative, present tense. Not capitalized. No period.
Body: Detailed description (mandatory except for docs type).
## Code Style
Follow [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). Use the provided `.pylintrc` for linting.
## Debugging
Enable debug logging in Home Assistant configuration.yaml:
```yaml
logger:
default: critical
logs:
custom_components.xiaomi_home: debug
```
## Control Modes
- **Cloud Control**: MQTT message subscription + HTTP command API
- **Local Control**: Via Xiaomi Central Hub Gateway (firmware 3.3.0_0023+) or LAN control (IP devices only, may be unstable)
Central gateway local control takes priority over LAN control when both are available.
## Multi-Region Support
Regions: China (cn), Europe (eu), India (in), Russia (ru), Singapore (sg), USA (us)
User data is isolated per region. Integration supports multiple regions in same Home Assistant instance.
## Important Files Location
- Integration source: `custom_components/xiaomi_home/`
- Spec mappings: `custom_components/xiaomi_home/miot/specs/specv2entity.py`
- Spec filters: `custom_components/xiaomi_home/miot/specs/spec_filter.yaml`
- Translations: `custom_components/xiaomi_home/translations/` and `custom_components/xiaomi_home/miot/i18n/`
- Tests: `test/`

View File

@@ -328,7 +328,7 @@ Device information service (urn:miot-spec-v2:service:device-information:00007801
## Multiple Language Support
There are 8 languages available for selection in the config flow language option of Xiaomi Home, including Simplified Chinese, Traditional Chinese, English, Spanish, Russian, French, German, and Japanese. The config flow page in Simplified Chinese and English has been manually reviewed by the developer. Other languages are translated by machine translation. If you want to modify the words and sentences in the config flow page, you need to modify the json file of the certain language in `custom_components/xiaomi_home/translations/` and `custom_components/xiaomi_home/miot/i18n/` directory.
There are 13 languages available for selection in the config flow language option of Xiaomi Home, including Simplified Chinese, Traditional Chinese, English, Spanish, Russian, French, German, Japanese, Italian, Dutch, Portuguese, Brazilian Portuguese, and Turkish. The config flow page in Simplified Chinese and English has been manually reviewed by the developer. Other languages are translated by machine translation or community contributions. If you want to modify the words and sentences in the config flow page, you need to modify the json file of the certain language in `custom_components/xiaomi_home/translations/` and `custom_components/xiaomi_home/miot/i18n/` directory.
When displaying Home Assistant entity name, Xiaomi Home downloads the multiple language file configured by the device vendor from MIoT Cloud, which contains translations for MIoT-Spec-V2 instances of the device. `multi_lang.json` is a locally maintained multiple language dictionary, which has a higher priority than the multiple language file obtained from the cloud and can be used to supplement or modify the multiple language translation of devices.
@@ -346,7 +346,7 @@ The format of `multi_lang.json` is as follows.
The key of `multi_lang.json` dictionary is the urn excluding the "version" field of the MIoT-Spec-V2 device instance.
The language code is zh-Hans, zh-Hant, en, es, ru, fr, de, or ja, corresponding to the 8 selectable languages mentioned above.
The language code is zh-Hans, zh-Hant, en, es, ru, fr, de, ja, it, nl, pt, pt-BR, or tr, corresponding to the 13 selectable languages mentioned above.
The instance code is the code of the MIoT-Spec-V2 instance, which is in the format of:
@@ -384,6 +384,7 @@ Example:
- Contribution Guidelines: [English](./CONTRIBUTING.md) | [简体中文](./doc/CONTRIBUTING_zh.md)
- [ChangeLog](./CHANGELOG.md)
- Development Documents: https://developers.home-assistant.io/docs/creating_component_index
- [FAQ](https://github.com/XiaoMi/ha_xiaomi_home/wiki)
## Directory Structure

View File

@@ -70,8 +70,8 @@ async def async_setup_entry(
for miot_device in device_list:
if miot_device.miot_client.display_binary_bool:
for prop in miot_device.prop_list.get('binary_sensor', []):
new_entities.append(BinarySensor(
miot_device=miot_device, spec=prop))
new_entities.append(
BinarySensor(miot_device=miot_device, spec=prop))
if new_entities:
async_add_entities(new_entities)
@@ -90,7 +90,7 @@ class BinarySensor(MIoTPropertyEntity, BinarySensorEntity):
def is_on(self) -> bool:
"""On/Off state. True if the binary sensor is on, False otherwise."""
if self.spec.name == 'contact-state':
return self._value is False
return bool(self._value) is False
elif self.spec.name == 'occupancy-status':
return bool(self._value)
return self._value is True

View File

@@ -320,9 +320,15 @@ class FeatureSwingMode(MIoTServiceEntity, ClimateEntity):
await self.set_property_async(prop=self._prop_vertical_swing,
value=True)
elif swing_mode == SWING_HORIZONTAL:
if self._prop_vertical_swing:
await self.set_property_async(prop=self._prop_vertical_swing,
value=False)
await self.set_property_async(prop=self._prop_horizontal_swing,
value=True)
elif swing_mode == SWING_VERTICAL:
if self._prop_horizontal_swing:
await self.set_property_async(prop=self._prop_horizontal_swing,
value=False)
await self.set_property_async(prop=self._prop_vertical_swing,
value=True)
elif swing_mode == SWING_OFF:
@@ -523,6 +529,8 @@ class AirConditioner(FeatureOnOff, FeatureTargetTemperature,
self._hvac_mode_map[item.value] = HVACMode.DRY
elif item.name in {'fan'}:
self._hvac_mode_map[item.value] = HVACMode.FAN_ONLY
elif item.name in {'heat_cool'}:
self._hvac_mode_map[item.value] = HVACMode.HEAT_COOL
self._attr_hvac_modes = list(self._hvac_mode_map.values())
self._prop_mode = prop
elif prop.name == 'ac-state':

View File

@@ -25,7 +25,7 @@
"cryptography",
"psutil"
],
"version": "v0.4.2",
"version": "v0.4.5",
"zeroconf": [
"_miot-central._tcp.local."
]

View File

@@ -117,6 +117,7 @@ INTEGRATION_LANGUAGES = {
'pt': 'Português',
'pt-BR': 'Português (Brasil)',
'ru': 'Русский',
'tr': 'Türkçe',
'zh-Hans': '简体中文',
'zh-Hant': '繁體中文'
}

View File

@@ -0,0 +1,160 @@
{
"config": {
"other": {
"devices": "Cihazlar",
"found_central_gateway": ", Yerel Merkezi Hub Ağ Geçidi Bulundu",
"without_room": "Oda atanmamış",
"no_display": "Gösterme"
},
"control_mode": {
"auto": "Otomatik",
"cloud": "Bulut"
},
"statistics_logic": {
"or": "VEYA mantığı",
"and": "VE mantığı"
},
"filter_mode": {
"exclude": "Hariç tut",
"include": "Dahil et"
},
"connect_type": {
"0": "WiFi",
"1": "yunyi cihazı",
"2": "Bulut cihazı",
"3": "ZigBee",
"4": "webSocket",
"5": "Sanal cihaz",
"6": "BLE",
"7": "Yerel AP",
"8": "WiFi+BLE",
"9": "Diğer",
"10": "İşlev eklentisi",
"11": "Hücresel ağ",
"12": "Kablo",
"13": "NB-IoT",
"14": "Üçüncü taraf bulut erişimi",
"15": "Kızılötesi uzaktan kumanda cihazı",
"16": "BLE-Mesh",
"17": "Sanal cihaz grubu",
"18": "Ağ geçidi alt cihazı",
"19": "Güvenlik seviyesi ağ geçidi alt cihazı",
"22": "PLC",
"23": "Yalnızca kablo",
"24": "Matter",
"25": "WiFi+Hücresel ağ"
},
"room_name_rule": {
"none": "Senkronize etme",
"home_room": "Ev Adı ve Oda Adı (Xiaomi Home Yatak Odası)",
"room": "Oda Adı (Yatak Odası)",
"home": "Ev Adı (Xiaomi Home)"
},
"option_status": {
"enable": "Etkinleştir",
"disable": "Devre Dışı Bırak"
},
"binary_mode": {
"text": "Metin Sensör Varlığı",
"bool": "İkili Sensör Varlığı"
},
"device_state": {
"add": "Ekle",
"del": "Kullanılamıyor",
"offline": "Çevrimdışı"
},
"lan_ctrl_config": {
"notice_net_dup": "\r\n**[Bildirim]** Aynı ağa bağlı olabilecek birden fazla ağ kartı algılandı. Lütfen seçime dikkat edin.",
"net_unavailable": "Arayüz kullanılamıyor"
}
},
"oauth2": {
"success": {
"title": "Kimlik Doğrulama Başarılı",
"content": "Lütfen bu sayfayı kapatın ve 'İleri'ye tıklamak için hesap kimlik doğrulama sayfasına geri dönün.",
"button": "Kapat"
},
"fail": {
"title": "Kimlik Doğrulama Başarısız",
"content": "{error_msg}, lütfen bu sayfayı kapatın ve kimlik doğrulama bağlantısına tekrar tıklamak için hesap kimlik doğrulama sayfasına geri dönün.",
"button": "Kapat"
},
"error_msg": {
"-10100": "Geçersiz yanıt parametreleri ('code' veya 'state' alanı boş)",
"-10101": "Geçirilen 'state' alanı uyumsuz"
}
},
"miot": {
"client": {
"invalid_oauth_info": "Kimlik doğrulama bilgileri geçersiz, bulut bağlantısı kullanılamayacak, lütfen Xiaomi Home entegrasyon sayfasına girin, yeniden kimlik doğrulaması yapmak için 'Seçenekler'e tıklayın",
"invalid_device_cache": "Önbellek cihaz bilgileri anormal, lütfen Xiaomi Home entegrasyon sayfasına girin, yerel önbelleği güncellemek için 'Seçenekler->Cihaz listesini güncelle'ye tıklayın",
"invalid_cert_info": "Geçersiz kullanıcı sertifikası, yerel merkezi bağlantı kullanılamayacak, lütfen Xiaomi Home entegrasyon sayfasına girin, yeniden kimlik doğrulaması yapmak için 'Seçenekler'e tıklayın",
"device_cloud_error": "Buluttan cihaz bilgileri alınırken bir istisna oluştu, lütfen yerel ağ bağlantısını kontrol edin",
"xiaomi_home_error_title": "Xiaomi Home Entegrasyon Hatası",
"xiaomi_home_error": "**{nick_name}({uid}, {cloud_server})** hatası algılandı, lütfen yeniden yapılandırmak için seçenekler sayfasına girin.\n\n**Hata mesajı**: \n{message}",
"device_list_changed_title": "Xiaomi Home cihaz listesi değişiklikleri",
"device_list_changed": "**{nick_name}({uid}, {cloud_server})** cihaz bilgilerinin değiştiği algılandı, lütfen entegrasyon seçenekleri sayfasına girin, yerel cihaz bilgilerini güncellemek için `Seçenekler->Cihaz listesini güncelle`ye tıklayın.\n\nGeçerli ağ durumu: {network_status}\n{message}\n",
"device_list_add": "\n**{count} yeni cihaz:** \n{message}",
"device_list_del": "\n**{count} cihaz kullanılamıyor:** \n{message}",
"device_list_offline": "\n**{count} cihaz çevrimdışı:** \n{message}",
"network_status_online": "Çevrimiçi",
"network_status_offline": "Çevrimdışı",
"central_state_changed_title": "Merkezi Hub Ağ Geçidi Bağlantı Durumu",
"central_state_changed": "**{nick_name}({uid}, {cloud_server})** Xiaomi merkezi hub ağ geçidine yerel bağlantı: {conn_status}",
"central_state_connected": "Bağlandı",
"central_state_disconnected": "Bağlantı kesildi",
"device_exec_error": "Yürütme hatası"
}
},
"error": {
"common": {
"-10000": "Bilinmeyen hata",
"-10001": "Hizmet kullanılamıyor",
"-10002": "Geçersiz parametre",
"-10003": "Yetersiz kaynaklar",
"-10004": "İç hata",
"-10005": "Yetersiz izinler",
"-10006": "Yürütme zaman aşımı",
"-10007": "Cihaz çevrimdışı veya mevcut değil",
"-10020": "Yetkisiz (OAuth2)",
"-10030": "Geçersiz token (HTTP)",
"-10040": "Geçersiz mesaj formatı",
"-10050": "Geçersiz sertifika",
"-704000000": "Bilinmeyen hata",
"-704010000": "Yetkisiz (cihaz silinmiş olabilir)",
"-704014006": "Cihaz açıklaması bulunamadı",
"-704030013": "Özellik okunabilir değil",
"-704030023": "Özellik yazılabilir değil",
"-704030033": "Özellik abone edilebilir değil",
"-704040002": "Hizmet mevcut değil",
"-704040003": "Özellik mevcut değil",
"-704040004": "Olay mevcut değil",
"-704040005": "Eylem mevcut değil",
"-704040999": "Özellik çevrimiçi değil",
"-704042001": "Cihaz mevcut değil",
"-704042011": "Cihaz çevrimdışı",
"-704053036": "Cihaz işlemi zaman aşımı",
"-704053100": "Cihaz mevcut durumda bu işlemi gerçekleştiremiyor",
"-704083036": "Cihaz işlemi zaman aşımı",
"-704090001": "Cihaz mevcut değil",
"-704220008": "Geçersiz ID",
"-704220025": "Eylem parametre sayısı uyumsuz",
"-704220035": "Eylem parametre hatası",
"-704220043": "Özellik değer hatası",
"-704222034": "Eylem dönüş değer hatası",
"-705004000": "Bilinmeyen hata",
"-705004501": "Bilinmeyen hata",
"-705201013": "Özellik okunabilir değil",
"-705201015": "Eylem yürütme hatası",
"-705201023": "Özellik yazılabilir değil",
"-705201033": "Özellik abone edilebilir değil",
"-706012000": "Bilinmeyen hata",
"-706012013": "Özellik okunabilir değil",
"-706012015": "Eylem yürütme hatası",
"-706012023": "Özellik yazılabilir değil",
"-706012033": "Özellik abone edilebilir değil",
"-706012043": "Özellik değer hatası",
"-706014006": "Cihaz açıklaması bulunamadı"
}
}
}

View File

@@ -1048,11 +1048,11 @@ class MIoTClient:
mips = self._mips_local.get(group_id, None)
if mips:
if state == MipsServiceState.REMOVED:
mips.disconnect()
self._mips_local.pop(group_id, None)
return
if (
# if state == MipsServiceState.REMOVED:
# mips.disconnect()
# self._mips_local.pop(group_id, None)
# return
if ( # ADDED or UPDATED
mips.client_id == self._entry_data['virtual_did']
and mips.host == data['addresses'][0]
and mips.port == data['port']
@@ -1374,10 +1374,13 @@ class MIoTClient:
"""Update cloud devices.
NOTICE: This function will operate the cloud_list
"""
# MIoT cloud service may not publish the online state updating message
# MIoT cloud may not publish the online state updating message
# for the BLE device. Assume that all BLE devices are online.
# MIoT cloud does not publish the online state updating message for the
# child device under the proxy gateway (eg, VRF air conditioner
# controller). Assume that all proxy gateway child devices are online.
for did, info in cloud_list.items():
if did.startswith('blt.'):
if did.startswith('blt.') or did.startswith('proxy.'):
info['online'] = True
for did, info in self._device_list_cache.items():
if filter_dids and did not in filter_dids:

View File

@@ -747,6 +747,8 @@ class MIoTDevice:
'watt': UnitOfPower.WATT,
'w': UnitOfPower.WATT,
'W': UnitOfPower.WATT,
'kW': UnitOfPower.KILO_WATT,
'Wh': UnitOfEnergy.WATT_HOUR,
'kWh': UnitOfEnergy.KILO_WATT_HOUR,
'A': UnitOfElectricCurrent.AMPERE,
'mA': UnitOfElectricCurrent.MILLIAMPERE,
@@ -1039,6 +1041,7 @@ class MIoTServiceEntity(Entity):
f'set property failed, property is None, '
f'{self.entity_id}, {self.name}')
value = prop.value_format(value)
value = prop.value_precision(value)
if prop not in self.entity_data.props:
raise RuntimeError(
f'set property failed, unknown property, '
@@ -1076,9 +1079,11 @@ class MIoTServiceEntity(Entity):
'get property failed, not readable, %s, %s, %s',
self.entity_id, self.name, prop.name)
return None
result = prop.value_format(
value: Any = prop.value_format(
await self.miot_device.miot_client.get_prop_async(
did=self.miot_device.did, siid=prop.service.iid, piid=prop.iid))
value = prop.eval_expr(value)
result = prop.value_precision(value)
if result != self._prop_value_map[prop]:
self._prop_value_map[prop] = result
self.async_write_ha_state()
@@ -1109,7 +1114,7 @@ class MIoTServiceEntity(Entity):
continue
value: Any = prop.value_format(params['value'])
value = prop.eval_expr(value)
value = prop.value_format(value)
value = prop.value_precision(value)
self._prop_value_map[prop] = value
if prop in self._prop_changed_subs:
self._prop_changed_subs[prop](prop, value)
@@ -1257,6 +1262,7 @@ class MIoTPropertyEntity(Entity):
f'set property failed, not writable, '
f'{self.entity_id}, {self.name}')
value = self.spec.value_format(value)
value = self.spec.value_precision(value)
try:
await self.miot_device.miot_client.set_prop_async(
did=self.miot_device.did, siid=self.spec.service.iid,
@@ -1274,16 +1280,19 @@ class MIoTPropertyEntity(Entity):
'get property failed, not readable, %s, %s',
self.entity_id, self.name)
return None
return self.spec.value_format(
value: Any = self.spec.value_format(
await self.miot_device.miot_client.get_prop_async(
did=self.miot_device.did, siid=self.spec.service.iid,
piid=self.spec.iid))
value = self.spec.eval_expr(value)
result = self.spec.value_precision(value)
return result
def __on_value_changed(self, params: dict, ctx: Any) -> None:
_LOGGER.debug('property changed, %s', params)
value: Any = self.spec.value_format(params['value'])
value = self.spec.eval_expr(value)
self._value = self.spec.value_format(value)
self._value = self.spec.value_precision(value)
if not self._pending_write_ha_state_timer:
self.async_write_ha_state()

View File

@@ -232,9 +232,10 @@ class MipsService:
for item in list(self._services.values()):
if item['name'] != name:
continue
service_data = self._services.pop(item['group_id'], {})
self.__call_service_change(
state=MipsServiceState.REMOVED, data=service_data)
# Ignore mdns REMOVED package. Let the connection close by itself.
# service_data = self._services.pop(item['group_id'], {})
# self.__call_service_change(
# state=MipsServiceState.REMOVED, data=service_data)
return
self._main_loop.create_task(
self.__request_service_info_async(zeroconf, service_type, name))

View File

@@ -589,6 +589,13 @@ class _MipsClient(ABC):
def __mqtt_loop_handler(self) -> None:
try:
# If the main loop is closed, stop the internal loop immediately
if self.main_loop.is_closed():
self.log_debug(
'The main loop is closed, stop the internal loop.')
if not self._internal_loop.is_closed():
self._internal_loop.stop()
return
if self._mqtt:
self._mqtt.loop_read()
if self._mqtt:
@@ -998,9 +1005,11 @@ class MipsCloudClient(_MipsClient):
did, MIoTDeviceState.ONLINE if msg['event'] == 'online'
else MIoTDeviceState.OFFLINE, ctx)
if did.startswith('blt.'):
# MIoT cloud may not publish BLE device online/offline state message.
# Do not subscribe BLE device online/offline state.
if did.startswith('blt.') or did.startswith('proxy.'):
# MIoT cloud may not publish BLE device or proxy gateway child device
# online/offline state message.
# Do not subscribe BLE device or proxy gateway child device
# online/offline state.
return True
return self.__reg_broadcast_external(
topic=topic, handler=on_state_msg, handler_ctx=handler_ctx)

View File

@@ -66,7 +66,7 @@ class MIoTSpecValueRange:
"""MIoT SPEC value range class."""
min_: int
max_: int
step: int
step: int | float
def __init__(self, value_range: Union[dict, list]) -> None:
if isinstance(value_range, dict):
@@ -567,9 +567,8 @@ class MIoTSpecProperty(_MIoTSpecBase):
return
self._value_range = MIoTSpecValueRange(value_range=value)
if isinstance(value, list):
self.precision = len(str(
value[2]).split('.')[1].rstrip('0')) if '.' in str(
value[2]) else 0
step_: str = format(value[2], '.10f').rstrip('0').rstrip('.')
self.precision = len(step_.split('.')[1]) if '.' in step_ else 0
@property
def value_list(self) -> Optional[MIoTSpecValueList]:
@@ -600,14 +599,27 @@ class MIoTSpecProperty(_MIoTSpecBase):
def value_format(self, value: Any) -> Any:
if value is None:
return None
if self.format_ == int:
return int(round(value))
if self.format_ == float:
return round(value, self.precision)
if isinstance(value, str):
if self.format_ == int:
value = int(float(value))
elif self.format_ == float:
value = float(value)
if self.format_ == bool:
return bool(value in [True, 1, 'True', 'true', '1'])
return value
def value_precision(self, value: Any) -> Any:
if value is None:
return None
if self.format_ == float:
return round(value, self.precision)
if self.format_ == int:
if self.value_range is None:
return int(round(value))
return int(
round(value / self.value_range.step) * self.value_range.step)
return value
def dump(self) -> dict:
return {
'type': self.type_,

View File

@@ -90,6 +90,9 @@ translate:
ru:
'false': Ложь
'true': Истина
tr:
'false': Yanlış
'true': Doğru
zh-Hans:
'false':
'true':
@@ -127,6 +130,9 @@ translate:
ru:
'false': Нет контакта
'true': Контакт
tr:
'false': Temas Yok
'true': Temas
zh-Hans:
'false': 分离
'true': 接触
@@ -164,6 +170,9 @@ translate:
ru:
'false': Движение не обнаружено
'true': Обнаружено движение
tr:
'false': Hareket Algılanmadı
'true': Hareket Algılandı
zh-Hans:
'false': 无人
'true': 有人
@@ -201,6 +210,9 @@ translate:
ru:
'false': Закрыть
'true': Открыть
tr:
'false': Kapalı
'true': ık
zh-Hans:
'false': 关闭
'true': 开启
@@ -238,6 +250,9 @@ translate:
ru:
'false': Нет
'true': Да
tr:
'false': Hayır
'true': Evet
zh-Hans:
'false':
'true':

View File

@@ -5,6 +5,23 @@
"service:003:property:001:valuelist:001": "Dry"
}
},
"urn:miot-spec-v2:device:electronic-valve:0000A0A7:lxzn-02": {
"zh-Hans": {
"service:004:property:001": "功率过高-阈值设置"
}
},
"urn:miot-spec-v2:device:electronic-valve:0000A0A7:ykcn-cbcs": {
"zh-Hans": {
"service:004:property:001": "功率过高-阈值设置",
"service:004:property:009": "欠压告警-阈值设置"
}
},
"urn:miot-spec-v2:device:fan:0000A005:zhimi-za1": {
"zh-Hans": {
"service:002:property:005:valuelist:000": "自然风",
"service:002:property:005:valuelist:001": "直吹风"
}
},
"urn:miot-spec-v2:device:gateway:0000A019:xiaomi-hub1": {
"de": {
"service:001": "Geräteinformationen",
@@ -274,13 +291,13 @@
"service:002:property:002": "Air Conditioner Mode",
"service:004": "Air Conditioner"
},
"zh_cn": {
"zh-Hans": {
"service:002": "地暖",
"service:004": "空调"
}
},
"urn:miot-spec-v2:device:vacuum:0000A006:ijai-v1": {
"zh_cn": {
"zh-Hans": {
"service:007:property:005:valuelist:000": "安静",
"service:007:property:005:valuelist:001": "标准",
"service:007:property:005:valuelist:002": "中档",

View File

@@ -82,6 +82,22 @@
]
}
],
"urn:miot-spec-v2:device:speaker:0000A015:xiaomi-l05b:1": [
{
"iid": 3,
"type": "urn:miot-spec-v2:service:play:0000781D:xiaomi-l05b:1",
"description": "Play Control",
"actions": [
{
"iid": 2,
"type": "urn:miot-spec-v2:action:play:0000280B:xiaomi-l05b:1",
"description": "Play",
"in": [],
"out": []
}
]
}
],
"urn:miot-spec-v2:device:thermostat:0000A031:tofan-wk01:1:0000C822": [
{
"iid": 2,
@@ -1660,6 +1676,24 @@
]
}
],
"urn:miot-spec-v2:device:vacuum:0000A006:roidmi-v60:3": [
{
"iid": 2,
"type": "urn:miot-spec-v2:service:cleaner:00007810:roidmi-v60:1",
"description": "Robot Cleaner",
"actions": [
{
"iid": 3,
"type": "urn:miot-spec-v2:action:start-room-sweep:00002826:roidmi-v60:1",
"description": "Start Room Sweep",
"in": [
9
],
"out": []
}
]
}
],
"urn:miot-spec-v2:device:water-heater:0000A02A:viomi-m1:2": [
{
"iid": 2,

View File

@@ -1,6 +1,9 @@
urn:miot-spec-v2:device:air-conditioner:0000A004:090615-ktf:
services:
- '4'
urn:miot-spec-v2:device:air-conditioner:0000A004:759413-iez:
properties:
- '2.3'
urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-ma4:
properties:
- 9.*
@@ -44,6 +47,13 @@ urn:miot-spec-v2:device:motion-sensor:0000A014:xiaomi-pir1:
services:
- '1'
- '5'
urn:miot-spec-v2:device:speaker:0000A015:xiaomi-l15a:
properties:
- '3.3'
- '6.1'
- '6.2'
- '6.3'
- '6.4'
urn:miot-spec-v2:device:thermostat:0000A031:tofan-wk01:
services:
- '2'
@@ -54,3 +64,6 @@ urn:miot-spec-v2:device:vacuum:0000A006:narwa-001:
urn:miot-spec-v2:device:vacuum:0000A006:narwa-ax11:
services:
- '*'
urn:miot-spec-v2:device:vacuum:0000A006:roidmi-v60:
actions:
- '2.3'

View File

@@ -1,6 +1,21 @@
urn:miot-spec-v2:device:air-condition-outlet:0000A045:lumi-mcn04:1:
prop.3.4:
format: uint8
urn:miot-spec-v2:device:air-conditioner:0000A004:qdhkl-a42:1:
prop.2.2:
value-list:
- value: 1
description: Cool
- value: 2
description: Dry
- value: 4
description: Fan
- value: 8
description: Heat
- value: 9
description: Auto
- value: 10
description: Heat_cool
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c17:1:
prop.10.6:
unit: none
@@ -11,6 +26,7 @@ urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:1:
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:2: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c20:1
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-c24:1:
prop.8.6:
name: power-consumption
unit: kWh
prop.10.6:
unit: none
@@ -48,6 +64,18 @@ urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-mt0:2: urn:miot-spec-v2:
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:1:
prop.10.6:
unit: none
prop.3.12:
name: vertical-swing-left-up
prop.3.13:
name: vertical-swing-left-down
prop.3.14:
name: vertical-swing-right-up
prop.3.15:
name: vertical-swing-right-down
prop.3.20:
name: horizontal-swing-left
prop.3.22:
name: horizontal-swing-right
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:2: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:1
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:3: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:1
urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:4: urn:miot-spec-v2:device:air-conditioner:0000A004:xiaomi-rr0r00:1
@@ -72,6 +100,8 @@ urn:miot-spec-v2:device:airer:0000A00D:hyd-lyjpro:1:
name: target-position-a
prop.2.9:
name: target-position-b
prop.2.11:
expr: (100-src_value)
urn:miot-spec-v2:device:airer:0000A00D:hyd-znlyj5:1:
prop.2.3:
value-range:
@@ -109,13 +139,72 @@ urn:miot-spec-v2:device:bath-heater:0000A028:xiaomi-s1:1:
urn:miot-spec-v2:device:curtain:0000A00C:bjkcz-kczble:1:0000D031:
prop.2.2:
name: status-a
urn:miot-spec-v2:device:dehumidifier:0000A02D:xiaomi-lite:1:
prop.3.2:
value-range:
- -30
- 100
- 0.1
urn:miot-spec-v2:device:electronic-valve:0000A0A7:lxzn-02:1:0000C833:
prop.3.1:
format: float
value-range:
- 0
- 999999
- 0.01
expr: (src_value/100)
prop.3.2:
unit: mA
prop.3.3:
format: float
value-range:
- 0
- 65535
- 0.1
expr: (src_value/10)
prop.4.1:
unit: kW
urn:miot-spec-v2:device:electronic-valve:0000A0A7:sanmei-s1:1:
prop.3.1:
format: float
value-range:
- 0
- 99999999
- 0.01
expr: round(src_value/100, 2)
prop.3.2:
format: float
value-range:
- 0
- 16777216
- 0.01
expr: round(src_value/100, 2)
prop.3.3:
format: float
value-range:
- 0
- 65535
- 0.1
expr: round(src_value/10, 1)
urn:miot-spec-v2:device:electronic-valve:0000A0A7:ykcn-cbcs:1:0000C833:
prop.3.1:
format: float
value-range:
- 0
- 99999999
- 0.01
expr: round(src_value/100, 2)
prop.3.2:
unit: mA
prop.3.3:
format: float
value-range:
- 0
- 65535
- 0.1
expr: round(src_value/10, 1)
prop.4.1:
unit: kW
urn:miot-spec-v2:device:fan:0000A005:dmaker-p33:1:
prop.2.2:
name: fan-level-a
@@ -191,6 +280,7 @@ urn:miot-spec-v2:device:hood:0000A01B:cykj-jyj22:2: urn:miot-spec-v2:device:hood
urn:miot-spec-v2:device:hood:0000A01B:cykj-jyj22:3:
prop.3.1:
name: on-ventilation
urn:miot-spec-v2:device:hood:0000A01B:cykj-jyj22:4: urn:miot-spec-v2:device:hood:0000A01B:cykj-jyj22:3
urn:miot-spec-v2:device:humidifier:0000A00E:zhimi-ca4:2:
prop.2.7:
unit: percentage
@@ -222,13 +312,30 @@ urn:miot-spec-v2:device:motion-sensor:0000A014:lumi-acn001:1:
- read
- notify
unit: mV
urn:miot-spec-v2:device:motion-sensor:0000A014:lumi-bmgl01:1:
prop.2.2:
value-list:
- value: 0
description: 0 Seconds
- value: 2
description: 2 Minutes
- value: 5
description: 5 Minutes
urn:miot-spec-v2:device:motor-controller:0000A01D:adp-adswb4:1:0000C837:
prop.2.1:
name: motor-switch
urn:miot-spec-v2:device:occupancy-sensor:0000A0BF:ainice-3b:1: urn:miot-spec-v2:device:occupancy-sensor:0000A0BF:ainice-3b:2
urn:miot-spec-v2:device:occupancy-sensor:0000A0BF:ainice-3b:2:
prop.2.5:
name: people-number
prop.2.8:
name: people-number
prop.2.11:
name: people-number
prop.2.14:
name: people-number
prop.2.17:
name: people-number
urn:miot-spec-v2:device:occupancy-sensor:0000A0BF:izq-24:2:0000C824:
prop.2.6:
unit: cm
@@ -239,29 +346,70 @@ urn:miot-spec-v2:device:outlet:0000A002:chuangmi-212a01:1: urn:miot-spec-v2:devi
urn:miot-spec-v2:device:outlet:0000A002:chuangmi-212a01:2: urn:miot-spec-v2:device:outlet:0000A002:chuangmi-212a01:3
urn:miot-spec-v2:device:outlet:0000A002:chuangmi-212a01:3:
prop.5.1:
expr: round(src_value*6/1000000, 3)
format: float
value-range:
- 0
- 65535
- 0.01
expr: round(src_value*6/1000000, 2)
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp1md:1:
prop.2.2:
name: power-consumption
expr: round(src_value/1000, 3)
format: float
value-range:
- 0
- 65535
- 0.01
expr: round(src_value/1000, 2)
prop.2.3:
format: float
value-range:
- 0
- 3000
- 0.1
expr: round(src_value/10, 1)
prop.2.4:
unit: mA
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2:1: urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2:2
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2:2:
prop.2.3:
format: float
value-range:
- 0
- 3000
- 0.1
expr: round(src_value/10, 1)
prop.2.4:
unit: mA
prop.3.2:
format: float
value-range:
- 0
- 65535
- 0.1
expr: round(src_value/10, 1)
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp2d:1:
prop.3.2:
expr: round(src_value/1000, 2)
unit: mA
urn:miot-spec-v2:device:outlet:0000A002:cuco-cp7pd:1:
prop.11.1:
unit: Wh
value-range:
- 0
- 65535
- 0.001
expr: (src_value*1000)
prop.11.4:
value-range:
- 0
- 10000
- 0.01
urn:miot-spec-v2:device:outlet:0000A002:cuco-v3:1:
prop.11.1:
name: power-consumption
format: float
value-range:
- 0
- 65535
- 0.01
expr: round(src_value/100, 2)
urn:miot-spec-v2:device:outlet:0000A002:cuco-v3:2: urn:miot-spec-v2:device:outlet:0000A002:cuco-v3:1
urn:miot-spec-v2:device:outlet:0000A002:giot-v8icm:1:0000C816:
@@ -274,11 +422,20 @@ urn:miot-spec-v2:device:outlet:0000A002:qmi-psv3:1:0000C816:
unit: mA
urn:miot-spec-v2:device:outlet:0000A002:yutai-fsov8m:1:0000C816:
prop.4.1:
format: float
value-range:
- 0
- 429497
- 0.01
expr: round(src_value/10000, 2)
urn:miot-spec-v2:device:outlet:0000A002:zimi-zncz01:1:0000C816: urn:miot-spec-v2:device:outlet:0000A002:zimi-zncz01:2:0000C816
urn:miot-spec-v2:device:outlet:0000A002:zimi-zncz01:2:0000C816:
prop.3.1:
name: electric-power
format: float
value-range:
- 0
- 350000
- 0.01
expr: round(src_value/100, 2)
urn:miot-spec-v2:device:plant-monitor:0000A030:hhcc-v1:1:
prop.2.1:
@@ -311,10 +468,20 @@ urn:miot-spec-v2:device:switch:0000A003:090615-x1tpm:1:0000D042:
name: light-fan-on
urn:miot-spec-v2:device:switch:0000A003:lxzn-cbcsmj:1:0000D00D:
prop.3.1:
format: float
value-range:
- 0
- 99999999
- 0.01
expr: round(src_value/100, 2)
prop.3.2:
expr: round(src_value/1000, 2)
unit: mA
prop.3.3:
format: float
value-range:
- 0
- 65535
- 0.1
expr: round(src_value/10, 1)
urn:miot-spec-v2:device:thermostat:0000A031:suittc-wk168:1:
prop.2.3:
@@ -356,6 +523,24 @@ urn:miot-spec-v2:device:water-purifier:0000A013:roswan-lte01:1:0000D05A:
unit: ppm
prop.4.2:
unit: ppm
urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:1:0000D05A:
prop.3.2:
unit: days
prop.3.3:
unit: days
prop.3.4:
unit: L
prop.3.5:
unit: L
prop.5.2:
unit: days
prop.5.3:
unit: days
prop.5.4:
unit: L
prop.5.5:
unit: L
urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:2:0000D05A: urn:miot-spec-v2:device:water-purifier:0000A013:xiaomi-s1200g:1:0000D05A
urn:miot-spec-v2:device:water-purifier:0000A013:yunmi-s20:1:
prop.4.1:
unit: ppm

View File

@@ -167,11 +167,6 @@ SPEC_DEVICE_TRANS_MAP: dict = {
},
'battery': {
'required': {
'properties': {
'battery-level': {'read'}
}
},
'optional': {
'actions': {
'start-charge'
}

View File

@@ -49,7 +49,7 @@ MIoT redirect web pages.
import os
import asyncio
_template = ''
web_template = ''
def _load_page_template():
@@ -57,18 +57,18 @@ def _load_page_template():
os.path.dirname(os.path.abspath(__file__)),
'resource/oauth_redirect_page.html')
with open(path, 'r', encoding='utf-8') as f:
global _template
_template = f.read()
global web_template
web_template = f.read()
async def oauth_redirect_page(
title: str, content: str, button: str, success: bool
) -> str:
"""Return oauth redirect page."""
if _template == '':
if web_template == '':
await asyncio.get_running_loop().run_in_executor(
None, _load_page_template)
web_page = _template.replace('TITLE_PLACEHOLDER', title)
web_page = web_template.replace('TITLE_PLACEHOLDER', title)
web_page = web_page.replace('CONTENT_PLACEHOLDER', content)
web_page = web_page.replace('BUTTON_PLACEHOLDER', button)
web_page = web_page.replace(

View File

@@ -110,7 +110,7 @@ class Sensor(MIoTPropertyEntity, SensorEntity):
self._attr_native_unit_of_measurement = list(
unit_sets)[0] if unit_sets else None
# Set suggested precision
if spec.format_ in {int, float} and spec.expr is None:
if spec.format_ == float:
self._attr_suggested_display_precision = spec.precision
# Set state_class
if spec.state_class:

View File

@@ -0,0 +1,225 @@
{
"config": {
"flow_title": "Xiaomi Home Entegrasyonu",
"step": {
"eula": {
"title": "Risk Bildirimi",
"description": "1. Xiaomi kullanıcı bilgileriniz ve cihaz bilgileriniz Home Assistant sisteminde saklanacaktır. **Xiaomi, Home Assistant depolama mekanizmasının güvenliğini garanti edemez**. Bilgilerinizin çalınmasını önlemekten siz sorumlusunuz.\r\n2. Bu entegrasyon açık kaynak topluluğu tarafından sürdürülmektedir. Kararlılık sorunları veya diğer sorunlar olabilir. Bu entegrasyonla ilgili sorunlar veya hatalarla karşılaştığınızda, **Xiaomi müşteri hizmetleriyle iletişime geçmek yerine açık kaynak topluluğundan yardım istemelisiniz**.\r\n3. Yerel işletim ortamınızı sürdürmek için teknik beceriye ihtiyacınız vardır. Entegrasyon yeni başlayanlar için kullanıcı dostu değildir.\r\n4. Lütfen başlamadan önce README dosyasını okuyun.\n\n5. Entegrasyonun kararlı kullanımını sağlamak ve arayüz kötüye kullanımını önlemek için, **bu entegrasyonun yalnızca Home Assistant'ta kullanılmasına izin verilir. Ayrıntılar için lütfen LICENSE'a bakın**.",
"data": {
"eula": "Yukarıdaki risklerin farkındayım ve entegrasyonun kullanımıyla ilişkili tüm riskleri gönüllü olarak üstlenmeye razıyım."
}
},
"auth_config": {
"title": "Temel yapılandırma",
"description": "### Giriş Bölgesi\r\nXiaomi hesabınızın bölgesini seçin. Bunu Xiaomi Home UYGULAMASI > Profil (alttaki menüde bulunur) > Ek ayarlar > Xiaomi Home Hakkında bölümünde bulabilirsiniz.\r\n### Dil\r\nCihaz ve varlık adlarının dilini seçin. Çevirisi olmayan bazı cümleler İngilizce olarak görüntülenecektir.\r\n### OAuth2 Yönlendirme URL'si\r\nOAuth2 kimlik doğrulama yönlendirme adresi **[http://homeassistant.local:8123](http://homeassistant.local:8123)** şeklindedir. Home Assistant'ın mevcut işletim terminali (örn. kişisel bilgisayar) ile aynı yerel ağda olması ve işletim terminalinin bu adres üzerinden Home Assistant ana sayfasına erişebilmesi gerekir. Aksi takdirde giriş kimlik doğrulaması başarısız olabilir.\r\n### Entegre Ağ Yapılandırması\r\nYerel ağın düzgün çalışıp çalışmadığını ve ilgili ağ kaynaklarının erişilebilir olup olmadığını kontrol edin. **İlk kez eklerken bunu seçmeniz önerilir.**\r\n### Not\r\n- Yüzlerce veya daha fazla Mi Home cihazına sahip kullanıcılar için, entegrasyonun ilk eklenmesi biraz zaman alacaktır. Lütfen sabırlı olun.\r\n- Home Assistant bir Docker ortamında çalışıyorsa, lütfen Docker ağ modunun host olarak ayarlandığından emin olun, aksi takdirde yerel kontrol işlevi düzgün çalışmayabilir.\r\n- Entegrasyonun yerel kontrol işlevinin bazı bağımlılıkları vardır. Lütfen README'yi dikkatlice okuyun.",
"data": {
"cloud_server": "Giriş Bölgesi",
"integration_language": "Dil",
"oauth_redirect_url": "OAuth2 Yönlendirme URL'si",
"network_detect_config": "Entegre Ağ Yapılandırması"
}
},
"network_detect_config": {
"title": "Entegre Ağ Yapılandırması",
"description": "## Kullanım Tanıtımı\r\n### Ağ Algılama Adresi\r\nAğın düzgün çalışıp çalışmadığını kontrol etmek için kullanılır. Ayarlanmazsa, sistem varsayılan adresi kullanılacaktır. Varsayılan adres kontrolü başarısız olursa, özel bir adres girmeyi deneyebilirsiniz.\r\n- Virgülle ayrılmış birden fazla algılama adresi girebilirsiniz, örneğin `8.8.8.8,https://www.bing.com`\r\n- Bir IP adresi ise, algılama ping üzerinden yapılacaktır. Bir HTTP(s) adresi ise, algılama HTTP GET isteği üzerinden yapılacaktır.\r\n- Sistem varsayılan algılama adresini geri yüklemek istiyorsanız, lütfen bir virgül `,` girin ve 'İleri'ye tıklayın.\r\n- **Bu yapılandırma geneldir ve değişiklikler diğer entegrasyon örneklerini etkileyecektir. Lütfen dikkatli değiştirin.**\r\n### Ağ Bağımlılıklarını Kontrol Et\r\nAşağıdaki ağ bağımlılıklarının erişilebilir olup olmadığını tek tek kontrol edin. İlgili adresler erişilebilir değilse, entegrasyon sorunlarına neden olacaktır.\r\n- OAuth2 Kimlik Doğrulama Adresi: `https://account.xiaomi.com/oauth2/authorize`.\r\n- Xiaomi HTTP API Adresi: `https://{http_host}/app/v2/ha/oauth/get_token`.\r\n- Xiaomi SPEC API Adresi: `https://miot-spec.org/miot-spec-v2/template/list/device`.\r\n- Xiaomi MQTT Broker Adresi: `mqtts://{cloud_server}-ha.mqtt.io.mi.com:8883`.",
"data": {
"network_detect_addr": "Ağ Algılama Adresi",
"check_network_deps": "Ağ Bağımlılıklarını Kontrol Et"
}
},
"oauth_error": {
"title": "Giriş Hatası",
"description": "Tekrar denemek için İLERİ'ye tıklayın."
},
"homes_select": {
"title": "Ev ve Cihaz Seçimi",
"description": "## Tanıtım\r\n### Cihazın Evini İçe Aktar\r\nEntegrasyon, seçilen evden cihazları ekleyecektir.\r\n### Oda Adı Senkronizasyon Modu\r\nMi Home UYGULAMASINDAN Home Assistant'a cihazlar senkronize edilirken, Home Assistant'taki alanın adlandırılması aşağıdaki kurallara uyacaktır. Senkronizasyon işleminin Mi Home UYGULAMASINDAKI ev ve oda ayarlarını değiştirmeyeceğini unutmayın.\r\n- Senkronize etme: Cihaz herhangi bir alana eklenmeyecektir.\r\n- Diğer seçenekler: Cihazın eklendiği alan, Mi Home UYGULAMASINDAKI ev veya oda adına göre adlandırılacaktır.\r\n### Gelişmiş Ayarlar\r\nEntegrasyonun profesyonel yapılandırma seçeneklerini değiştirmek için gelişmiş ayarları gösterin.\r\n\r\n&emsp;\r\n### {nick_name} Merhaba! Lütfen cihaz eklemek istediğiniz evi seçin.",
"data": {
"home_infos": "Cihazın Evini İçe Aktar",
"area_name_rule": "Oda Adı Senkronizasyon Modu",
"advanced_options": "Gelişmiş Ayarlar"
}
},
"advanced_options": {
"title": "Gelişmiş Ayarlar",
"description": "## Tanıtım\r\n### Aşağıdaki seçeneklerin anlamını çok net bir şekilde bilmiyorsanız, lütfen varsayılan ayarları koruyun.\r\n### Cihazları Filtrele\r\nCihazları oda adı ve cihaz türüne göre filtrelemeyi destekler, ayrıca cihaz boyutu filtrelemesini de destekler.\r\n### Kontrol Modu\r\n- Otomatik: Yerel ağda kullanılabilir bir Xiaomi merkezi hub ağ geçidi olduğunda, Home Assistant cihaz kontrol komutlarını öncelikle merkezi hub ağ geçidi üzerinden göndererek yerel kontrolü sağlar. Yerel ağda merkezi hub ağ geçidi yoksa, Xiaomi OT protokolü üzerinden kontrol komutları göndermeye çalışır. Yalnızca yukarıdaki yerel kontrol koşulları karşılanmadığında, cihaz kontrol komutları bulut üzerinden gönderilir.\r\n- Bulut: Tüm kontrol komutları bulut üzerinden gönderilir.\r\n### Eylem Hata Ayıklama Modu\r\nCihaz MIoT-Spec-V2 tarafından tanımlanan yöntemler için, bildirim varlıkları oluşturmaya ek olarak, bir metin girişi kutusu varlığı da oluşturulacaktır. Hata ayıklama sırasında cihaza kontrol komutları göndermek için bunu kullanabilirsiniz.\r\n### Standart Olmayan Oluşturulan Varlıkları Gizle\r\nAdı \"*\" ile başlayan standart olmayan MIoT-Spec-V2 örnekleri tarafından oluşturulan varlıkları gizle.\r\n### İkili Sensör Görüntüleme Modu\r\nXiaomi Home'daki ikili sensörleri metin sensör varlığı veya ikili sensör varlığı olarak görüntüleyin.\r\n### Cihaz Durum Değişikliği Bildirimlerini Göster\r\nDetaylı cihaz durum değişikliği bildirimlerini görüntüleyin, yalnızca seçilen bildirimleri gösterin.",
"data": {
"devices_filter": "Cihazları Filtrele",
"ctrl_mode": "Kontrol Modu",
"action_debug": "Eylem Hata Ayıklama Modu",
"hide_non_standard_entities": "Standart Olmayan Oluşturulan Varlıkları Gizle",
"display_binary_mode": "İkili Sensör Görüntüleme Modu",
"display_devices_changed_notify": "Cihaz Durum Değişikliği Bildirimlerini Göster"
}
},
"devices_filter": {
"title": "Cihazları Filtrele",
"description": "## Kullanım Talimatları\r\nCihazları ev oda adı, cihaz erişim türü ve cihaz modeline göre filtrelemeyi destekler, ayrıca cihaz boyutu filtrelemesini de destekler. Filtreleme mantığı aşağıdaki gibidir:\r\n- İlk olarak, istatistik mantığına göre, dahil edilen tüm öğelerin birleşimini veya kesişimini alın, ardından hariç tutulan öğelerin kesişimini veya birleşimini alın ve son olarak [hariç tutulan özet sonucu]ndan [dahil edilen özet sonucu]nu çıkararak [filtre sonucu]nu elde edin.\r\n- Dahil edilen öğe seçilmemişse, tümünün dahil edildiği anlamına gelir.\r\n### Filtre Modu\r\n- Hariç tut: İstenmeyen öğeleri kaldırın.\r\n- Dahil et: İstenen öğeleri dahil edin.\r\n### İstatistik Mantığı\r\n- VE mantığı: Aynı moddaki tüm öğelerin kesişimini alın.\r\n- VEYA mantığı: Aynı moddaki tüm öğelerin birleşimini alın.\r\n\r\nAyrıca entegrasyon öğesinin [Yapılandırma > Cihaz Listesini Güncelle] sayfasına gidip, yeniden filtrelemek için [Cihazları Filtrele]'yi işaretleyebilirsiniz.",
"data": {
"room_filter_mode": "Ev Odalarını Filtrele",
"room_list": "Ev Odaları",
"type_filter_mode": "Cihaz Bağlantı Türünü Filtrele",
"type_list": "Cihaz Bağlantı Türü",
"model_filter_mode": "Cihaz Modelini Filtrele",
"model_list": "Cihaz Modeli",
"devices_filter_mode": "Cihazları Filtrele",
"device_list": "Cihaz Listesi",
"statistics_logic": "İstatistik Mantığı"
}
}
},
"progress": {
"oauth": "### {link_left}Giriş yapmak için buraya tıklayın{link_right}\r\n(Başarılı girişten sonra otomatik olarak bir sonraki sayfaya yönlendirileceksiniz)"
},
"error": {
"eula_not_agree": "Lütfen risk bildirimini okuyun.",
"get_token_error": "Giriş yetkilendirme bilgileri (OAuth token) alınamadı.",
"get_homeinfo_error": "Ev bilgileri alınamadı.",
"mdns_discovery_error": "Yerel cihaz keşif hizmeti istisnası.",
"get_cert_error": "Merkezi hub ağ geçidi sertifikası alınamadı.",
"no_family_selected": "Ev seçilmedi.",
"no_devices": "Seçilen evde cihaz yok. Lütfen cihazı olan bir ev seçin ve devam edin.",
"no_filter_devices": "Filtrelenmiş cihazlar boş. Lütfen geçerli filtre kriterleri seçin ve devam edin.",
"no_central_device": "[Merkezi Hub Ağ Geçidi Modu], Home Assistant'ın bulunduğu yerel ağda kullanılabilir bir Xiaomi merkezi hub ağ geçidi gerektirir. Lütfen seçilen evin gereksinimi karşılayıp karşılamadığını kontrol edin.",
"invalid_network_addr": "Geçersiz IP adresi veya HTTP adresi algılandı, lütfen geçerli bir adres girin.",
"invalid_ip_addr": "Ulaşılamayan IP adresi algılandı, lütfen geçerli bir IP adresi girin.",
"invalid_http_addr": "Ulaşılamayan HTTP adresi algılandı, lütfen geçerli bir HTTP adresi girin.",
"invalid_default_addr": "Varsayılan ağ algılama adresi ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin veya özel bir ağ algılama adresi kullanın.",
"unreachable_oauth2_host": "OAuth2 kimlik doğrulama adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_http_host": "Xiaomi HTTP API adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_spec_host": "Xiaomi SPEC API adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_mqtt_broker": "Xiaomi MQTT Broker adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin."
},
"abort": {
"ha_uuid_get_failed": "Home Assistant UUID alınamadı.",
"network_connect_error": "Yapılandırma başarısız oldu. Ağ bağlantısı anormal. Lütfen ekipman ağ yapılandırmasını kontrol edin.",
"already_configured": "Bu kullanıcı için yapılandırma zaten tamamlandı. Lütfen entegrasyon sayfasına gidin ve değişiklikler için YAPILANDIRMA düğmesine tıklayın.",
"invalid_auth_info": "Kimlik doğrulama bilgileri süresi doldu. Lütfen entegrasyon sayfasına gidin ve yeniden kimlik doğrulaması yapmak için YAPILANDIRMA düğmesine tıklayın.",
"config_flow_error": "Entegrasyon yapılandırma hatası: {error}."
}
},
"options": {
"step": {
"auth_config": {
"title": "Kimlik Doğrulama Yapılandırması",
"description": "Yerel kimlik doğrulama bilgileri süresi doldu. Lütfen kimlik doğrulama işlemini yeniden başlatın.\r\n### Geçerli Giriş Bölgesi: {cloud_server}\r\n### OAuth2 Yönlendirme URL'si\r\nOAuth2 kimlik doğrulama yönlendirme adresi **[http://homeassistant.local:8123](http://homeassistant.local:8123)** şeklindedir. Home Assistant'ın mevcut işletim terminali (örn. kişisel bilgisayar) ile aynı yerel ağda olması ve işletim terminalinin bu adres üzerinden Home Assistant ana sayfasına erişebilmesi gerekir. Aksi takdirde giriş kimlik doğrulaması başarısız olabilir.",
"data": {
"oauth_redirect_url": "OAuth2 Yönlendirme URL'si"
}
},
"oauth_error": {
"title": "Giriş sırasında bir hata oluştu.",
"description": "Tekrar denemek için İLERİ'ye tıklayın."
},
"config_options": {
"title": "Yapılandırma Seçenekleri",
"description": "### Merhaba, {nick_name}\r\n\r\nXiaomi ID: {uid}\r\nGeçerli Giriş Bölgesi: {cloud_server}\r\nEntegrasyon Örnek Kimliği: {instance_id}\r\n\r\nLütfen yapılandırmak istediğiniz seçenekleri seçin, ardından İLERİ'ye tıklayın.",
"data": {
"integration_language": "Entegrasyon Dili",
"update_user_info": "Kullanıcı bilgilerini güncelle",
"update_devices": "Cihaz listesini güncelle",
"action_debug": "Eylem için hata ayıklama modu",
"hide_non_standard_entities": "Standart olmayan oluşturulan varlıkları gizle",
"display_binary_mode": "İkili Sensör Görüntüleme Modu",
"display_devices_changed_notify": "Cihaz durum değişikliği bildirimlerini göster",
"update_trans_rules": "Varlık dönüştürme kurallarını güncelle",
"update_lan_ctrl_config": "LAN kontrol yapılandırmasını güncelle",
"network_detect_config": "Entegre ağ yapılandırması",
"cover_dead_zone_width": "Perde ölü bölge genişliği"
}
},
"update_user_info": {
"title": "Kullanıcı Takma Adını Güncelle",
"description": "Merhaba {nick_name}, aşağıda özel takma adınızı değiştirebilirsiniz.",
"data": {
"nick_name": "Takma Ad"
}
},
"homes_select": {
"title": "Evi ve Cihazları Yeniden Seç",
"description": "## Kullanım Talimatları\r\n### Evden cihazları içe aktar\r\nEntegrasyon, seçilen evlerden cihazları ekleyecektir.\r\n### Cihazları Filtrele\r\nCihazları ev oda adı, cihaz erişim türü ve cihaz modeline göre filtrelemeyi destekler, ayrıca cihaz boyutu filtrelemesini de destekler. **{local_count}** cihaz filtrelendi.\r\n### Kontrol modu\r\n- Otomatik: Yerel ağda kullanılabilir bir Xiaomi merkezi hub ağ geçidi olduğunda, Home Assistant cihaz kontrol komutlarını öncelikle merkezi hub ağ geçidi üzerinden göndererek yerel kontrolü sağlar. Yerel ağda merkezi hub ağ geçidi yoksa, Xiaomi LAN kontrol işlevi aracılığıyla kontrol komutları göndermeye çalışır. Yalnızca yukarıdaki yerel kontrol koşulları karşılanmadığında, cihaz kontrol komutları bulut üzerinden gönderilir.\r\n- Bulut: Tüm kontrol komutları bulut üzerinden gönderilir.",
"data": {
"home_infos": "Evden cihazları içe aktar",
"devices_filter": "Cihazları filtrele",
"ctrl_mode": "Kontrol modu"
}
},
"devices_filter": {
"title": "Cihazları Filtrele",
"description": "## Kullanım Talimatları\r\nCihazları ev oda adı, cihaz erişim türü ve cihaz modeline göre filtrelemeyi destekler, ayrıca cihaz boyutu filtrelemesini de destekler. Filtreleme mantığı aşağıdaki gibidir:\r\n- İlk olarak, istatistik mantığına göre, dahil edilen tüm öğelerin birleşimini veya kesişimini alın, ardından hariç tutulan öğelerin kesişimini veya birleşimini alın ve son olarak [hariç tutulan özet sonucu]ndan [dahil edilen özet sonucu]nu çıkararak [filtre sonucu]nu elde edin.\r\n- Dahil edilen öğe seçilmemişse, tümünün dahil edildiği anlamına gelir.\r\n### Filtre Modu\r\n- Hariç tut: İstenmeyen öğeleri kaldırın.\r\n- Dahil et: İstenen öğeleri dahil edin.\r\n### İstatistik Mantığı\r\n- VE mantığı: Aynı moddaki tüm öğelerin kesişimini alın.\r\n- VEYA mantığı: Aynı moddaki tüm öğelerin birleşimini alın.\r\n\r\nAyrıca entegrasyon öğesinin [Yapılandırma > Cihaz Listesini Güncelle] sayfasına gidip, yeniden filtrelemek için [Cihazları Filtrele]'yi işaretleyebilirsiniz.",
"data": {
"room_filter_mode": "Ev Odalarını Filtrele",
"room_list": "Ev Odaları",
"type_filter_mode": "Cihaz Bağlantı Türünü Filtrele",
"type_list": "Cihaz Bağlantı Türü",
"model_filter_mode": "Cihaz Modelini Filtrele",
"model_list": "Cihaz Modeli",
"devices_filter_mode": "Cihazları Filtrele",
"device_list": "Cihaz Listesi",
"statistics_logic": "İstatistik Mantığı"
}
},
"update_trans_rules": {
"title": "Varlık Dönüştürme Kurallarını Güncelle",
"description": "## Kullanım Talimatları\r\n- Mevcut entegrasyon örneğindeki cihazların varlık bilgilerini güncelleyin, MIoT-Spec-V2 çok dilli yapılandırma, boolean çeviri ve model filtreleme dahil.\r\n- **Uyarı**: Bu genel bir yapılandırmadır ve yerel önbelleği güncelleyecektir. Tüm entegrasyon örneklerini etkileyecektir.\r\n- Bu işlem biraz zaman alacaktır, lütfen sabırlı olun. \"Güncellemeyi Onayla\"yı işaretleyin ve **{urn_count}** kuralı güncellemeye başlamak için \"İleri\"ye tıklayın, aksi takdirde güncellemeyi atlayın.",
"data": {
"confirm": "Güncellemeyi onayla"
}
},
"update_lan_ctrl_config": {
"title": "LAN kontrol yapılandırmasını güncelle",
"description": "## Kullanım Talimatları\r\nXiaomi LAN kontrol işlevi için yapılandırmaları güncelleyin. Bulut ve merkezi hub ağ geçidi cihazları kontrol edemediğinde, entegrasyon LAN üzerinden cihazları kontrol etmeye çalışacaktır. Hiçbir ağ kartı seçilmezse, LAN kontrol işlevi etkin olmayacaktır.\r\n- Yalnızca LAN'daki MIoT-Spec-V2 uyumlu IP cihazları desteklenir. 2020'den önce üretilen bazı cihazlar LAN kontrolünü veya LAN aboneliğini desteklemeyebilir.\r\n- Lütfen kontrol edilecek cihazlarla aynı ağdaki ağ kartlarını seçin. Birden fazla ağ kartı seçilebilir. Home Assistant'ın birden fazla ağ kartı seçimi nedeniyle yerel ağa iki veya daha fazla bağlantısı varsa, en iyi ağ bağlantısına sahip olanı seçmeniz önerilir, aksi takdirde cihazlar üzerinde kötü etkisi olabilir.\r\n- LAN'da yerel kontrolü destekleyen terminal cihazlar (ekranlı Xiaomi hoparlör, cep telefonu, vb.) varsa, LAN aboneliğini etkinleştirmek yerel otomasyon ve cihaz anormalliklerine neden olabilir.\r\n- **Uyarı**: Bu genel bir yapılandırmadır. Tüm entegrasyon örneklerini etkileyecektir. Lütfen dikkatli kullanın.\r\n{notice_net_dup}",
"data": {
"net_interfaces": "Lütfen kullanılacak ağ kartını seçin",
"enable_subscribe": "LAN aboneliğini etkinleştir"
}
},
"network_detect_config": {
"title": "Entegre Ağ Yapılandırması",
"description": "## Kullanım Tanıtımı\r\n### Ağ Algılama Adresi\r\nAğın düzgün çalışıp çalışmadığını kontrol etmek için kullanılır. Ayarlanmazsa, sistem varsayılan adresi kullanılacaktır. Varsayılan adres kontrolü başarısız olursa, özel bir adres girmeyi deneyebilirsiniz.\r\n- Virgülle ayrılmış birden fazla algılama adresi girebilirsiniz, örneğin `8.8.8.8,https://www.bing.com`\r\n- Bir IP adresi ise, algılama ping üzerinden yapılacaktır. Bir HTTP(s) adresi ise, algılama HTTP GET isteği üzerinden yapılacaktır.\r\n- Sistem varsayılan algılama adresini geri yüklemek istiyorsanız, lütfen bir virgül `,` girin ve 'İleri'ye tıklayın.\r\n- **Bu yapılandırma geneldir ve değişiklikler diğer entegrasyon örneklerini etkileyecektir. Lütfen dikkatli değiştirin.**\r\n### Ağ Bağımlılıklarını Kontrol Et\r\nAşağıdaki ağ bağımlılıklarının erişilebilir olup olmadığını tek tek kontrol edin. İlgili adresler erişilebilir değilse, entegrasyon sorunlarına neden olacaktır.\r\n- OAuth2 Kimlik Doğrulama Adresi: `https://account.xiaomi.com/oauth2/authorize`.\r\n- Xiaomi HTTP API Adresi: `https://{http_host}/app/v2/ha/oauth/get_token`.\r\n- Xiaomi SPEC API Adresi: `https://miot-spec.org/miot-spec-v2/template/list/device`.\r\n- Xiaomi MQTT Broker Adresi: `mqtts://{cloud_server}-ha.mqtt.io.mi.com:8883`.",
"data": {
"network_detect_addr": "Ağ Algılama Adresi",
"check_network_deps": "Ağ Bağımlılıklarını Kontrol Et"
}
},
"config_confirm": {
"title": "Yapılandırmayı Onayla",
"description": "Merhaba **{nick_name}**, lütfen en son yapılandırma bilgilerini onaylayın ve ardından GÖNDER'e tıklayın.\r\nEntegrasyon güncellenmiş yapılandırmayla yeniden yüklenecektir.\r\n\r\nEntegrasyon Dili:\t{lang_new}\r\nTakma Ad:\t{nick_name_new}\r\nEylem için hata ayıklama modu:\t{action_debug}\r\nStandart olmayan oluşturulan varlıkları gizle:\t{hide_non_standard_entities}\r\nPerde ölü bölge genişliği:\t{cover_width_new}\r\nCihaz durum değişikliği bildirimlerini göster:\t{display_devices_changed_notify}\r\nCihaz Değişiklikleri:\t**{devices_add}** cihaz ekle, **{devices_remove}** cihaz kaldır\r\nDönüştürme kuralları değişikliği:\tToplam **{trans_rules_count}** kural var ve **{trans_rules_count_success}** kural güncellendi",
"data": {
"confirm": "Değişikliği onayla"
}
}
},
"progress": {
"oauth": "### {link_left}Yeniden giriş yapmak için lütfen buraya tıklayın{link_right}"
},
"error": {
"not_auth": "Kimlik doğrulanmadı. Lütfen kullanıcı kimliğini doğrulamak için kimlik doğrulama bağlantısına tıklayın.",
"get_token_error": "Giriş yetkilendirme bilgileri (OAuth token) alınamadı.",
"get_homeinfo_error": "Ev bilgileri alınamadı.",
"get_cert_error": "Merkezi hub ağ geçidi sertifikası alınamadı.",
"no_devices": "Seçilen evde cihaz yok. Lütfen cihazı olan bir ev seçin ve devam edin.",
"no_filter_devices": "Filtrelenmiş cihazlar boş. Lütfen geçerli filtre kriterleri seçin ve devam edin.",
"no_family_selected": "Ev seçilmedi.",
"no_central_device": "[Merkezi Hub Ağ Geçidi Modu], Home Assistant'ın bulunduğu yerel ağda kullanılabilir bir Xiaomi merkezi hub ağ geçidi gerektirir. Lütfen seçilen evin gereksinimi karşılayıp karşılamadığını kontrol edin.",
"mdns_discovery_error": "Yerel cihaz keşif hizmeti istisnası.",
"update_config_error": "Yapılandırma bilgileri güncellenemedi.",
"not_confirm": "Değişiklikler onaylanmadı. Lütfen göndermeden önce değişikliği onaylayın.",
"invalid_network_addr": "Geçersiz IP adresi veya HTTP adresi algılandı, lütfen geçerli bir adres girin.",
"invalid_ip_addr": "Ulaşılamayan IP adresi algılandı, lütfen geçerli bir IP adresi girin.",
"invalid_http_addr": "Ulaşılamayan HTTP adresi algılandı, lütfen geçerli bir HTTP adresi girin.",
"invalid_default_addr": "Varsayılan ağ algılama adresi ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin veya özel bir ağ algılama adresi kullanın.",
"unreachable_oauth2_host": "OAuth2 kimlik doğrulama adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_http_host": "Xiaomi HTTP API adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_spec_host": "Xiaomi SPEC API adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin.",
"unreachable_mqtt_broker": "Xiaomi MQTT Broker adresine ulaşılamıyor, lütfen ağ yapılandırmasını kontrol edin."
},
"abort": {
"network_connect_error": "Yapılandırma başarısız oldu. Ağ bağlantısı anormal. Lütfen ekipman ağ yapılandırmasını kontrol edin.",
"options_flow_error": "Entegrasyon yeniden yapılandırma hatası: {error}",
"re_add": "Lütfen entegrasyonu yeniden ekleyin. Hata mesajı: {error}",
"storage_error": "Entegrasyon depolama modülü istisnası. Lütfen tekrar deneyin veya entegrasyonu yeniden ekleyin: {error}",
"inconsistent_account": "Hesap bilgileri tutarsız. Lütfen doğru hesapla giriş yapın."
}
}
}

View File

@@ -90,7 +90,6 @@ class Vacuum(MIoTServiceEntity, StateVacuumEntity):
# pylint: disable=unused-argument
_prop_status: Optional[MIoTSpecProperty]
_prop_fan_level: Optional[MIoTSpecProperty]
_prop_battery_level: Optional[MIoTSpecProperty]
_prop_status_cleaning: Optional[list[int]]
_prop_status_docked: Optional[list[int]]
_prop_status_paused: Optional[list[int]]
@@ -117,7 +116,6 @@ class Vacuum(MIoTServiceEntity, StateVacuumEntity):
self._prop_status = None
self._prop_fan_level = None
self._prop_battery_level = None
self._prop_status_cleaning = []
self._prop_status_docked = []
self._prop_status_paused = []
@@ -180,9 +178,6 @@ class Vacuum(MIoTServiceEntity, StateVacuumEntity):
self._attr_fan_speed_list = list(self._fan_level_map.values())
self._attr_supported_features |= VacuumEntityFeature.FAN_SPEED
self._prop_fan_level = prop
elif prop.name == 'battery-level':
self._attr_supported_features |= VacuumEntityFeature.BATTERY
self._prop_battery_level = prop
# action
for action in entity_data.actions:
if action.name == 'start-sweep':
@@ -251,11 +246,6 @@ class Vacuum(MIoTServiceEntity, StateVacuumEntity):
"""Name of the vacuum entity."""
return self._device_name
@property
def battery_level(self) -> Optional[int]:
"""The current battery level of the vacuum cleaner."""
return self.get_prop_value(prop=self._prop_battery_level)
@property
def fan_speed(self) -> Optional[str]:
"""The current fan speed of the vacuum cleaner."""

View File

@@ -330,7 +330,7 @@ urn:miot-spec-v2:device:gateway:0000A019:xiaomi-hub1:
## 多语言支持
米家集成配置选项中可选择的集成使用的语言有简体中文、繁体中文、英文、西班牙语、俄语、法语、德语、日语这八种语言。目前,米家集成配置页面的简体中文和英文已经过人工校审,其他语言由机器翻译。如果您希望修改配置页面的词句,则需要修改 `custom_components/xiaomi_home/translations/` 以及 `custom_components/xiaomi_home/miot/i18n/` 目录下相应语言的 json 文件。
米家集成配置选项中可选择的集成使用的语言有简体中文、繁体中文、英文、西班牙语、俄语、法语、德语、日语、意大利语、荷兰语、葡萄牙语、巴西葡萄牙语、土耳其语这十三种语言。目前,米家集成配置页面的简体中文和英文已经过人工校审,其他语言由机器翻译或社区贡献。如果您希望修改配置页面的词句,则需要修改 `custom_components/xiaomi_home/translations/` 以及 `custom_components/xiaomi_home/miot/i18n/` 目录下相应语言的 json 文件。
在显示 Home Assistant 实体名称时,米家集成会从小米云下载设备厂商为设备配置的多语言文件,该文件包含设备 MIoT-Spec-V2 实例的多语言翻译。 `multi_lang.json` 是本地维护的多语言配置字典,其优先级高于从云端获取的多语言文件,可用于补充或修改设备的多语言翻译。
@@ -348,7 +348,7 @@ urn:miot-spec-v2:device:gateway:0000A019:xiaomi-hub1:
`multi_lang.json` 的键值为 MIoT-Spec-V2 设备实例的 urn 不含版本号“version”字段
language code 为语言代码,取值为 zh-Hans、zh-Hant、en、es、ru、fr、de、ja (对应上述米家集成可选的种语言)。
language code 为语言代码,取值为 zh-Hans、zh-Hant、en、es、ru、fr、de、ja、it、nl、pt、pt-BR、tr(对应上述米家集成可选的十三种语言)。
instance code 为 MIoT-Spec-V2 实例代码,格式如下:
@@ -386,6 +386,7 @@ siid、piid、eiid、aiid、value 均为十进制三位整数。
- 贡献指南: [English](../CONTRIBUTING.md) | [简体中文](./CONTRIBUTING_zh.md)
- [更新日志](../CHANGELOG.md)
- 开发文档: https://developers.home-assistant.io/docs/creating_component_index
- [常见问题](https://github.com/XiaoMi/ha_xiaomi_home/wiki)
## 目录结构