rustuya-local 0.1.0.dev5__tar.gz → 0.1.0.dev7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/workflows/_test.yml +10 -10
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/workflows/release.yml +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/CHANGELOG.md +12 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/PKG-INFO +19 -19
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/README.md +15 -15
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/__init__.py +4 -4
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/bridge_supervisor.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/const.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/manifest.json +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/strings.json +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/translations/en.json +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/translations/ko.json +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/www/rustuya-panel.js +6 -6
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/docs/MIGRATING.md +6 -6
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/docs/REDESIGN.md +49 -49
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/docs/ROADMAP.md +11 -11
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/pyproject.toml +4 -4
- rustuya_local-0.1.0.dev7/release-notes.md +3 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/scripts/build_dropin.py +5 -5
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/__init__.py +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/bridge_client.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/config.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/__init__.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/devices.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/hub.py +9 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/il.py +2 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/overrides.py +2 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/pack.py +4 -4
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/rules.py +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/runner.py +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/manager_plugin/__init__.py +2 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/manager_plugin/static/index.js +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/service.py +4 -4
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/devices.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_chain_in_process.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_chain_mqtt.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_full_stack_devices.py +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_manager_plugin.py +6 -6
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_init.py +4 -4
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_cover_settings.py +1 -1
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_dropin.py +9 -9
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_host.py +2 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_hub.py +3 -3
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_il_vectors.py +2 -2
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_pack.py +4 -4
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_rule_files.py +7 -7
- rustuya_local-0.1.0.dev5/release-notes.md +0 -8
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/dependabot.yml +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/workflows/ci.yml +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/workflows/hacs.yml +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.github/workflows/hassfest.yml +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/.gitignore +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/LICENSE +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/icon.png +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/icon.svg +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/icon@2x.png +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/logo.png +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/logo.svg +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/brand/logo@2x.png +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/bridge_sync.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/broker.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/config_flow.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/manager_registry.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/manager_session.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/panel.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/panel_bridge.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/services.yaml +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/docs/STATUS.md +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/hacs.json +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/scripts/release_notes.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/__main__.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/async_tools.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/cli.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/files.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/memory.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/mqtt.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/host/transport.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/manager_plugin/api.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/src/rustuya_local/validation.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/conftest.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_bridge_registration.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_daemon.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_full_stack.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_full_stack_custom_templates.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_purge.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/e2e/test_service.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/conftest.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/fake_manager.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_bridge_probe.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_config_flow.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_manager_registry.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_manager_session.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_migrate.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/ha/test_panel.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_config.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_files.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_hazardous.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_link_watcher.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_panel_js.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_plugin_api.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/test_release_notes.py +0 -0
- {rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/tests/unit/tuya_samples.py +0 -0
|
@@ -3,7 +3,7 @@ name: Test (reusable)
|
|
|
3
3
|
# Single source of truth for rustuya-local's pre-merge / pre-publish checks. Called from ci.yml
|
|
4
4
|
# on push/PR and as a gate from release.yml, so a commit that fails these can't reach PyPI.
|
|
5
5
|
#
|
|
6
|
-
#
|
|
6
|
+
# ildevice-homeassistant is not on PyPI yet, so check out ildevice-homeassistant and explicitly
|
|
7
7
|
# install that checkout together with rustuya-local's test extras.
|
|
8
8
|
# Other package dependencies are installed from PyPI.
|
|
9
9
|
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
strategy:
|
|
21
21
|
fail-fast: false
|
|
22
22
|
matrix:
|
|
23
|
-
#
|
|
23
|
+
# ildevice-homeassistant (the test/fullstack sibling dep) requires Python>=3.14; rustuya-local's own
|
|
24
24
|
# requires-python floor (3.13, in pyproject.toml) stays lower since only the test extras
|
|
25
25
|
# need 3.14, not the base package.
|
|
26
26
|
python-version: ["3.14"]
|
|
@@ -31,21 +31,21 @@ jobs:
|
|
|
31
31
|
with:
|
|
32
32
|
path: rustuya-local
|
|
33
33
|
|
|
34
|
-
#
|
|
34
|
+
# Install the integration checkout as the test consumer package.
|
|
35
35
|
- name: Check out ildevice-homeassistant
|
|
36
36
|
uses: actions/checkout@v7
|
|
37
37
|
with:
|
|
38
38
|
repository: 3735943886/ildevice-homeassistant
|
|
39
39
|
path: ildevice-homeassistant
|
|
40
40
|
|
|
41
|
-
#
|
|
41
|
+
# tuya-interpreter is on PyPI (installed below via uv), so this isn't for dependency
|
|
42
42
|
# resolution -- it's so tests/e2e/test_full_stack_devices.py can reach its sibling
|
|
43
43
|
# checkout's tests/golden fixture data, which isn't shipped in the published package.
|
|
44
|
-
- name: Check out
|
|
44
|
+
- name: Check out tuya-interpreter
|
|
45
45
|
uses: actions/checkout@v7
|
|
46
46
|
with:
|
|
47
|
-
repository: 3735943886/
|
|
48
|
-
path:
|
|
47
|
+
repository: 3735943886/tuya-interpreter
|
|
48
|
+
path: tuya-interpreter
|
|
49
49
|
|
|
50
50
|
- name: Set up Python ${{ matrix.python-version }}
|
|
51
51
|
uses: actions/setup-python@v7
|
|
@@ -91,7 +91,7 @@ jobs:
|
|
|
91
91
|
run: pytest -q
|
|
92
92
|
|
|
93
93
|
package:
|
|
94
|
-
# The test job uses an
|
|
94
|
+
# The test job uses an ildevice-homeassistant checkout; this one checks what a user gets: the wheel in a fresh
|
|
95
95
|
# environment, every dependency from PyPI, importing and starting the CLI.
|
|
96
96
|
name: installs from PyPI alone
|
|
97
97
|
runs-on: ubuntu-latest
|
|
@@ -114,7 +114,7 @@ jobs:
|
|
|
114
114
|
"$RUNNER_TEMP/smoke/bin/python" -c "
|
|
115
115
|
import rustuya_local.cli, rustuya_local.manager_plugin, rustuya_local.service
|
|
116
116
|
from rustuya_local import register
|
|
117
|
-
import
|
|
118
|
-
|
|
117
|
+
import tuya_interpreter
|
|
118
|
+
tuya_interpreter.preload()
|
|
119
119
|
print('ok')"
|
|
120
120
|
"$RUNNER_TEMP/smoke/bin/rustuya-local" --help
|
|
@@ -96,7 +96,7 @@ jobs:
|
|
|
96
96
|
run: twine check --strict dist/* # --strict: a missing README (long description) fails the release
|
|
97
97
|
|
|
98
98
|
- name: Build the rustuya-manager drop-in zip
|
|
99
|
-
# The manager's plugin catalog installs this asset (it cannot pip-install): rustuya_local with the
|
|
99
|
+
# The manager's plugin catalog installs this asset (it cannot pip-install): rustuya_local with the tuya-interpreter
|
|
100
100
|
# the wheel resolves to vendored inside. Kept out of dist/ so it is not uploaded to PyPI.
|
|
101
101
|
run: |
|
|
102
102
|
python -m pip install dist/*.whl
|
|
@@ -8,6 +8,18 @@ stable release.
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [0.1.0.dev7] — 2026-10-12
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- Use ildevice-homeassistant consistently in documentation, UI text and code comments.
|
|
15
|
+
- Require tuya-interpreter 0.1.0a2 in the package and the Home Assistant integration.
|
|
16
|
+
|
|
17
|
+
## [0.1.0.dev6] — 2026-10-12
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- Require tuya-interpreter 0.1.0a1 (tuya2ildevice renamed) in place of tuya2ildevice, in the package, the Home Assistant integration and the manager drop-in archive.
|
|
21
|
+
- Fetch builtin rule updates from tuya-interpreter's `master` branch.
|
|
22
|
+
|
|
11
23
|
## [0.1.0.dev5] — 2026-10-11
|
|
12
24
|
|
|
13
25
|
### Fixed
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rustuya-local
|
|
3
|
-
Version: 0.1.0.
|
|
4
|
-
Summary: Local Tuya control: rustuya-bridge ->
|
|
3
|
+
Version: 0.1.0.dev7
|
|
4
|
+
Summary: Local Tuya control: rustuya-bridge -> tuya-interpreter -> IL (ildevice). HA-independent core.
|
|
5
5
|
Project-URL: Homepage, https://github.com/3735943886/rustuya-local
|
|
6
6
|
Project-URL: Repository, https://github.com/3735943886/rustuya-local
|
|
7
7
|
Project-URL: Issues, https://github.com/3735943886/rustuya-local/issues
|
|
@@ -10,14 +10,14 @@ License-File: LICENSE
|
|
|
10
10
|
Requires-Python: >=3.13
|
|
11
11
|
Requires-Dist: paho-mqtt>=2.0
|
|
12
12
|
Requires-Dist: pyrustuyabridge>=0.4
|
|
13
|
-
Requires-Dist:
|
|
13
|
+
Requires-Dist: tuya-interpreter>=0.1.0a2
|
|
14
14
|
Provides-Extra: fullstack
|
|
15
15
|
Requires-Dist: tuyamock; extra == 'fullstack'
|
|
16
16
|
Provides-Extra: manager
|
|
17
17
|
Requires-Dist: rustuya-manager[web]>=0.2.2; extra == 'manager'
|
|
18
18
|
Provides-Extra: test
|
|
19
19
|
Requires-Dist: httpx2; extra == 'test'
|
|
20
|
-
Requires-Dist:
|
|
20
|
+
Requires-Dist: ildevice-homeassistant; extra == 'test'
|
|
21
21
|
Requires-Dist: pytest; extra == 'test'
|
|
22
22
|
Requires-Dist: pytest-asyncio; extra == 'test'
|
|
23
23
|
Provides-Extra: test-ha
|
|
@@ -32,17 +32,17 @@ Local control of Tuya devices through [rustuya-bridge](https://github.com/373594
|
|
|
32
32
|
([ildevice](https://github.com/3735943886/ildevice)) devices, and in Home Assistant. It replaces rustuya-homeassistant.
|
|
33
33
|
|
|
34
34
|
```
|
|
35
|
-
rustuya-bridge ──MQTT──► rustuya-local ──MQTT (il/…)──►
|
|
35
|
+
rustuya-bridge ──MQTT──► rustuya-local ──MQTT (il/…)──► ildevice-homeassistant (Home Assistant integration), or any IL consumer
|
|
36
36
|
raw LAN dps Service:
|
|
37
37
|
BridgeClient + rustuya_local.host.Hub
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
- **[
|
|
40
|
+
- **[tuya-interpreter](https://github.com/3735943886/tuya-interpreter)** is the only place that interprets Tuya: Home Assistant core's `tuya` behaviour and
|
|
41
41
|
user overrides for non-standard devices, through its Sans-I/O Rust engine and Python wrapper.
|
|
42
42
|
- **rustuya-local** is one `Service` (`src/rustuya_local/service.py`) and three thin shells that run it:
|
|
43
43
|
the `rustuya-local run` daemon, the `custom_components/rustuya` Home Assistant integration, and a rustuya-manager
|
|
44
44
|
plugin. Its `host` package owns the runner, transports and file watchers. It only produces IL and knows nothing of Home Assistant entities.
|
|
45
|
-
- **[
|
|
45
|
+
- **[ildevice-homeassistant](https://github.com/3735943886/ildevice-homeassistant)** turns IL descriptors into Home Assistant entities.
|
|
46
46
|
|
|
47
47
|
## Daemon
|
|
48
48
|
|
|
@@ -62,7 +62,7 @@ Stopping the daemon only marks it `offline`; its devices stay in IL (retained) f
|
|
|
62
62
|
and run `rustuya-local purge --config config.json`: the retained descriptors, values and presence of its IL prefix and
|
|
63
63
|
source are cleared (other sources on the prefix are left alone), so IL consumers drop the devices.
|
|
64
64
|
|
|
65
|
-
##
|
|
65
|
+
## tuya-interpreter host boundary
|
|
66
66
|
|
|
67
67
|
The shared Rust core interprets one device and has no MQTT or rule-file loading API.
|
|
68
68
|
`rustuya_local.host.Hub` owns the device registry and maps `TuyaDriver` outputs to IL MQTT wire data;
|
|
@@ -75,7 +75,7 @@ MQTT and in-process transport tests exercise the same adapter and the bidirectio
|
|
|
75
75
|
|
|
76
76
|
Coming from rustuya-homeassistant: [docs/MIGRATING.md](docs/MIGRATING.md).
|
|
77
77
|
|
|
78
|
-
Install
|
|
78
|
+
Install ildevice-homeassistant, and run one IL producer per bridge: the daemon, the integration below, or the manager plugin. A second
|
|
79
79
|
one with the same IL prefix and source refuses to start while the first runs (every device would show twice): the
|
|
80
80
|
daemon exits, the integration is retried by Home Assistant, the plugin's tab shows it and retries. To move from one to
|
|
81
81
|
another, stop the old one first.
|
|
@@ -87,7 +87,7 @@ bridge mode, the broker and the IL prefix (it checks an external bridge answers
|
|
|
87
87
|
is not on the default one), then offers to fetch the devices from Tuya Cloud (a saved login is reused; a QR login
|
|
88
88
|
only when there is none), which closing its window skips (it is in *Configure* later, and in the panel); the rest
|
|
89
89
|
starts at its defaults and is changed in the panel's *Settings*. Deleting the integration takes its devices out of IL
|
|
90
|
-
(so
|
|
90
|
+
(so ildevice-homeassistant removes them); with the embedded bridge it also clears that bridge's retained topics and its state file.
|
|
91
91
|
The device list and Tuya login it kept under `.storage/rustuya/` are deleted; a device file you pointed elsewhere, and
|
|
92
92
|
everything on an external bridge, are left as they are.
|
|
93
93
|
|
|
@@ -96,16 +96,16 @@ everything on an external bridge, are left as they are.
|
|
|
96
96
|
Tuya's cloud schemas are fragmented; fixes go in a `custom_converters/` directory (daemon: `custom_converters` in the
|
|
97
97
|
config; integration: `<config>/rustuya_converters`; manager plugin: its data dir), followed live:
|
|
98
98
|
|
|
99
|
-
- `*.json`:
|
|
99
|
+
- `*.json`: tuya-interpreter override blocks by product or device id: rename a dp, define one the schema lacks, map the
|
|
100
100
|
device's words to the standard ones (`remap.alias`), fix labels and classes, define a declarative converter. A cover's
|
|
101
101
|
direction is not set here but with its settings (below). Each file is a rule object with fixes under `overrides`, for example
|
|
102
102
|
`{"overrides": {"product_id": {"cover": {"invert_position": true}}}}`.
|
|
103
103
|
- Converters are JSON programs under `converters.declarative`; Python code plugins are not loaded.
|
|
104
104
|
|
|
105
|
-
See
|
|
106
|
-
ship with
|
|
105
|
+
See tuya-interpreter's [device customization guide](https://github.com/3735943886/tuya-interpreter/blob/master/docs/device-customization.md#user-overrides) for the format. Official builtin rules, including `00-default.json`,
|
|
106
|
+
ship with tuya-interpreter and update when that package is upgraded. They are applied before your own rule files.
|
|
107
107
|
|
|
108
|
-
Online updates fetch the latest [builtin rules](https://github.com/3735943886/
|
|
108
|
+
Online updates fetch the latest [builtin rules](https://github.com/3735943886/tuya-interpreter/tree/master/rules/builtin)
|
|
109
109
|
into `rules/builtin/` inside the overrides directory at start and daily. In the Rustuya panel, use *Update builtin rules*
|
|
110
110
|
to fetch them now or *Automatically update builtin rules* to control automatic updates. Opening the panel checks for
|
|
111
111
|
updates: with automatic updates on, available changes are installed immediately without a yellow dot. With automatic
|
|
@@ -158,7 +158,7 @@ language: Korean, or English.
|
|
|
158
158
|
## rustuya-manager plugin
|
|
159
159
|
|
|
160
160
|
Installed next to rustuya-manager, as a pip package (`pip install rustuya-local` in the manager's environment) or as
|
|
161
|
-
the drop-in zip each release carries (`rustuya_local-<version>-dropin.zip`,
|
|
161
|
+
the drop-in zip each release carries (`rustuya_local-<version>-dropin.zip`, tuya-interpreter binding, native library and builtin rules vendored inside, built by
|
|
162
162
|
`scripts/build_dropin.py`; unpack it into the manager's plugin directory, or install it from the manager's plugin
|
|
163
163
|
catalog once listed there), it appears as a **Tuya (IL)** tab and runs the service under the manager: the manager's broker and bridge root, the manager's device
|
|
164
164
|
list (followed). Its data dir (`rustuya-local/` next to the manager's plugins) holds `settings.json` (`il`,
|
|
@@ -166,7 +166,7 @@ list (followed). Its data dir (`rustuya-local/` next to the manager's plugins) h
|
|
|
166
166
|
converter files are picked up while it runs. A settings file it cannot use is shown on the tab until it is fixed.
|
|
167
167
|
|
|
168
168
|
The drop-in zip includes native code for the platform on which it was built; use a matching OS and architecture,
|
|
169
|
-
or install with pip to select the appropriate wheel. It freezes the
|
|
169
|
+
or install with pip to select the appropriate wheel. It freezes the tuya-interpreter it was built with: a tuya-interpreter fix reaches manager users with the next
|
|
170
170
|
rustuya-local release (bump the patch version and tag; the manager's catalog follows the release). Installed both ways
|
|
171
171
|
(pip and the plugin directory), the plugin runs once.
|
|
172
172
|
|
|
@@ -178,17 +178,17 @@ rustuya-local release (bump the patch version and tag; the manager's catalog fol
|
|
|
178
178
|
|
|
179
179
|
Everything here needs the sibling repos and, for the last two groups, `mosquitto`, `pyrustuya-bridge` and `tuyamock`
|
|
180
180
|
(`pip install -e ".[test,fullstack]"`); those are skipped when missing. Parity with Home Assistant core's fixtures lives in
|
|
181
|
-
`
|
|
181
|
+
`tuya-interpreter/tests/chain`, the wire and topic vectors in `ildevice/vectors`.
|
|
182
182
|
|
|
183
183
|
- `tests/unit/`: the configuration.
|
|
184
184
|
- `tests/e2e/test_service.py`: the service on in-memory brokers (overrides directory, a failed start).
|
|
185
|
-
- `tests/e2e/test_chain_*.py`, `test_daemon.py`: the runner with
|
|
185
|
+
- `tests/e2e/test_chain_*.py`, `test_daemon.py`: the runner with ildevice-homeassistant's consumer model on the other side, in one process
|
|
186
186
|
and over a real broker; the daemon as a subprocess.
|
|
187
187
|
- `tests/e2e/test_manager_plugin.py`: the plugin under rustuya-manager's real plugin host (skipped without it).
|
|
188
188
|
- `tests/ha/`: the integration (config flow, setup).
|
|
189
189
|
- `tests/e2e/test_full_stack*.py`: the real rustuya-bridge (`pyrustuyabridge`, in process) and Tuya device emulators
|
|
190
190
|
(`tuyamock`) around the daemon: state, commands, rejections, a device dropping off and returning, a daemon restart, and a
|
|
191
|
-
differential check that 38 real device shapes come out of the whole chain exactly as `
|
|
191
|
+
differential check that 38 real device shapes come out of the whole chain exactly as `tuya-interpreter` computes them.
|
|
192
192
|
|
|
193
193
|
## Status
|
|
194
194
|
|
|
@@ -6,17 +6,17 @@ Local control of Tuya devices through [rustuya-bridge](https://github.com/373594
|
|
|
6
6
|
([ildevice](https://github.com/3735943886/ildevice)) devices, and in Home Assistant. It replaces rustuya-homeassistant.
|
|
7
7
|
|
|
8
8
|
```
|
|
9
|
-
rustuya-bridge ──MQTT──► rustuya-local ──MQTT (il/…)──►
|
|
9
|
+
rustuya-bridge ──MQTT──► rustuya-local ──MQTT (il/…)──► ildevice-homeassistant (Home Assistant integration), or any IL consumer
|
|
10
10
|
raw LAN dps Service:
|
|
11
11
|
BridgeClient + rustuya_local.host.Hub
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
- **[
|
|
14
|
+
- **[tuya-interpreter](https://github.com/3735943886/tuya-interpreter)** is the only place that interprets Tuya: Home Assistant core's `tuya` behaviour and
|
|
15
15
|
user overrides for non-standard devices, through its Sans-I/O Rust engine and Python wrapper.
|
|
16
16
|
- **rustuya-local** is one `Service` (`src/rustuya_local/service.py`) and three thin shells that run it:
|
|
17
17
|
the `rustuya-local run` daemon, the `custom_components/rustuya` Home Assistant integration, and a rustuya-manager
|
|
18
18
|
plugin. Its `host` package owns the runner, transports and file watchers. It only produces IL and knows nothing of Home Assistant entities.
|
|
19
|
-
- **[
|
|
19
|
+
- **[ildevice-homeassistant](https://github.com/3735943886/ildevice-homeassistant)** turns IL descriptors into Home Assistant entities.
|
|
20
20
|
|
|
21
21
|
## Daemon
|
|
22
22
|
|
|
@@ -36,7 +36,7 @@ Stopping the daemon only marks it `offline`; its devices stay in IL (retained) f
|
|
|
36
36
|
and run `rustuya-local purge --config config.json`: the retained descriptors, values and presence of its IL prefix and
|
|
37
37
|
source are cleared (other sources on the prefix are left alone), so IL consumers drop the devices.
|
|
38
38
|
|
|
39
|
-
##
|
|
39
|
+
## tuya-interpreter host boundary
|
|
40
40
|
|
|
41
41
|
The shared Rust core interprets one device and has no MQTT or rule-file loading API.
|
|
42
42
|
`rustuya_local.host.Hub` owns the device registry and maps `TuyaDriver` outputs to IL MQTT wire data;
|
|
@@ -49,7 +49,7 @@ MQTT and in-process transport tests exercise the same adapter and the bidirectio
|
|
|
49
49
|
|
|
50
50
|
Coming from rustuya-homeassistant: [docs/MIGRATING.md](docs/MIGRATING.md).
|
|
51
51
|
|
|
52
|
-
Install
|
|
52
|
+
Install ildevice-homeassistant, and run one IL producer per bridge: the daemon, the integration below, or the manager plugin. A second
|
|
53
53
|
one with the same IL prefix and source refuses to start while the first runs (every device would show twice): the
|
|
54
54
|
daemon exits, the integration is retried by Home Assistant, the plugin's tab shows it and retries. To move from one to
|
|
55
55
|
another, stop the old one first.
|
|
@@ -61,7 +61,7 @@ bridge mode, the broker and the IL prefix (it checks an external bridge answers
|
|
|
61
61
|
is not on the default one), then offers to fetch the devices from Tuya Cloud (a saved login is reused; a QR login
|
|
62
62
|
only when there is none), which closing its window skips (it is in *Configure* later, and in the panel); the rest
|
|
63
63
|
starts at its defaults and is changed in the panel's *Settings*. Deleting the integration takes its devices out of IL
|
|
64
|
-
(so
|
|
64
|
+
(so ildevice-homeassistant removes them); with the embedded bridge it also clears that bridge's retained topics and its state file.
|
|
65
65
|
The device list and Tuya login it kept under `.storage/rustuya/` are deleted; a device file you pointed elsewhere, and
|
|
66
66
|
everything on an external bridge, are left as they are.
|
|
67
67
|
|
|
@@ -70,16 +70,16 @@ everything on an external bridge, are left as they are.
|
|
|
70
70
|
Tuya's cloud schemas are fragmented; fixes go in a `custom_converters/` directory (daemon: `custom_converters` in the
|
|
71
71
|
config; integration: `<config>/rustuya_converters`; manager plugin: its data dir), followed live:
|
|
72
72
|
|
|
73
|
-
- `*.json`:
|
|
73
|
+
- `*.json`: tuya-interpreter override blocks by product or device id: rename a dp, define one the schema lacks, map the
|
|
74
74
|
device's words to the standard ones (`remap.alias`), fix labels and classes, define a declarative converter. A cover's
|
|
75
75
|
direction is not set here but with its settings (below). Each file is a rule object with fixes under `overrides`, for example
|
|
76
76
|
`{"overrides": {"product_id": {"cover": {"invert_position": true}}}}`.
|
|
77
77
|
- Converters are JSON programs under `converters.declarative`; Python code plugins are not loaded.
|
|
78
78
|
|
|
79
|
-
See
|
|
80
|
-
ship with
|
|
79
|
+
See tuya-interpreter's [device customization guide](https://github.com/3735943886/tuya-interpreter/blob/master/docs/device-customization.md#user-overrides) for the format. Official builtin rules, including `00-default.json`,
|
|
80
|
+
ship with tuya-interpreter and update when that package is upgraded. They are applied before your own rule files.
|
|
81
81
|
|
|
82
|
-
Online updates fetch the latest [builtin rules](https://github.com/3735943886/
|
|
82
|
+
Online updates fetch the latest [builtin rules](https://github.com/3735943886/tuya-interpreter/tree/master/rules/builtin)
|
|
83
83
|
into `rules/builtin/` inside the overrides directory at start and daily. In the Rustuya panel, use *Update builtin rules*
|
|
84
84
|
to fetch them now or *Automatically update builtin rules* to control automatic updates. Opening the panel checks for
|
|
85
85
|
updates: with automatic updates on, available changes are installed immediately without a yellow dot. With automatic
|
|
@@ -132,7 +132,7 @@ language: Korean, or English.
|
|
|
132
132
|
## rustuya-manager plugin
|
|
133
133
|
|
|
134
134
|
Installed next to rustuya-manager, as a pip package (`pip install rustuya-local` in the manager's environment) or as
|
|
135
|
-
the drop-in zip each release carries (`rustuya_local-<version>-dropin.zip`,
|
|
135
|
+
the drop-in zip each release carries (`rustuya_local-<version>-dropin.zip`, tuya-interpreter binding, native library and builtin rules vendored inside, built by
|
|
136
136
|
`scripts/build_dropin.py`; unpack it into the manager's plugin directory, or install it from the manager's plugin
|
|
137
137
|
catalog once listed there), it appears as a **Tuya (IL)** tab and runs the service under the manager: the manager's broker and bridge root, the manager's device
|
|
138
138
|
list (followed). Its data dir (`rustuya-local/` next to the manager's plugins) holds `settings.json` (`il`,
|
|
@@ -140,7 +140,7 @@ list (followed). Its data dir (`rustuya-local/` next to the manager's plugins) h
|
|
|
140
140
|
converter files are picked up while it runs. A settings file it cannot use is shown on the tab until it is fixed.
|
|
141
141
|
|
|
142
142
|
The drop-in zip includes native code for the platform on which it was built; use a matching OS and architecture,
|
|
143
|
-
or install with pip to select the appropriate wheel. It freezes the
|
|
143
|
+
or install with pip to select the appropriate wheel. It freezes the tuya-interpreter it was built with: a tuya-interpreter fix reaches manager users with the next
|
|
144
144
|
rustuya-local release (bump the patch version and tag; the manager's catalog follows the release). Installed both ways
|
|
145
145
|
(pip and the plugin directory), the plugin runs once.
|
|
146
146
|
|
|
@@ -152,17 +152,17 @@ rustuya-local release (bump the patch version and tag; the manager's catalog fol
|
|
|
152
152
|
|
|
153
153
|
Everything here needs the sibling repos and, for the last two groups, `mosquitto`, `pyrustuya-bridge` and `tuyamock`
|
|
154
154
|
(`pip install -e ".[test,fullstack]"`); those are skipped when missing. Parity with Home Assistant core's fixtures lives in
|
|
155
|
-
`
|
|
155
|
+
`tuya-interpreter/tests/chain`, the wire and topic vectors in `ildevice/vectors`.
|
|
156
156
|
|
|
157
157
|
- `tests/unit/`: the configuration.
|
|
158
158
|
- `tests/e2e/test_service.py`: the service on in-memory brokers (overrides directory, a failed start).
|
|
159
|
-
- `tests/e2e/test_chain_*.py`, `test_daemon.py`: the runner with
|
|
159
|
+
- `tests/e2e/test_chain_*.py`, `test_daemon.py`: the runner with ildevice-homeassistant's consumer model on the other side, in one process
|
|
160
160
|
and over a real broker; the daemon as a subprocess.
|
|
161
161
|
- `tests/e2e/test_manager_plugin.py`: the plugin under rustuya-manager's real plugin host (skipped without it).
|
|
162
162
|
- `tests/ha/`: the integration (config flow, setup).
|
|
163
163
|
- `tests/e2e/test_full_stack*.py`: the real rustuya-bridge (`pyrustuyabridge`, in process) and Tuya device emulators
|
|
164
164
|
(`tuyamock`) around the daemon: state, commands, rejections, a device dropping off and returning, a daemon restart, and a
|
|
165
|
-
differential check that 38 real device shapes come out of the whole chain exactly as `
|
|
165
|
+
differential check that 38 real device shapes come out of the whole chain exactly as `tuya-interpreter` computes them.
|
|
166
166
|
|
|
167
167
|
## Status
|
|
168
168
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Rustuya as a Home Assistant integration: runs the same `rustuya_local.service.Service` the standalone
|
|
2
2
|
`rustuya-local` daemon does, tied to this config entry, with an optional embedded rustuya-bridge (`pyrustuyabridge`)
|
|
3
|
-
and user overrides from `<config>/rustuya_converters`. It creates no entities and does not depend on
|
|
4
|
-
*producer* — install
|
|
3
|
+
and user overrides from `<config>/rustuya_converters`. It creates no entities and does not depend on ildevice-homeassistant: it is only an IL
|
|
4
|
+
*producer* — install ildevice-homeassistant (or any IL consumer) separately to turn its devices into entities.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
@@ -105,7 +105,7 @@ async def async_setup(hass: HomeAssistant, config: dict) -> bool:
|
|
|
105
105
|
|
|
106
106
|
def _tuya_id(hass: HomeAssistant, service: Any, device_id: str) -> str:
|
|
107
107
|
"""`device_id` as the Tuya device id: as given when the service drives it, else a Home Assistant device's. An IL
|
|
108
|
-
consumer registers a device with the IL id (the Tuya id) among its identifiers —
|
|
108
|
+
consumer registers a device with the IL id (the Tuya id) among its identifiers — ildevice-homeassistant as `("ildevice", id)`, under
|
|
109
109
|
whatever platform name it runs as — so any identifier value the service drives is taken, when there is exactly one.
|
|
110
110
|
Unresolved, it is returned as given (and refused as an unknown device)."""
|
|
111
111
|
from homeassistant.helpers import device_registry as dr
|
|
@@ -264,7 +264,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|
|
264
264
|
|
|
265
265
|
async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|
266
266
|
"""Deleted, not just unloaded (which only says `offline`, keeping everything for the next start). Clears what this
|
|
267
|
-
entry leaves behind: its IL devices (retained descriptors and values, so
|
|
267
|
+
entry leaves behind: its IL devices (retained descriptors and values, so ildevice-homeassistant and other IL consumers drop them),
|
|
268
268
|
with the embedded bridge also that bridge's retained topics and its state file, and the files it kept in its own
|
|
269
269
|
storage directory (the device list and the Tuya login). A path the user pointed elsewhere is left alone, as is
|
|
270
270
|
everything on an external bridge. A broker that cannot be reached only leaves the retained topics behind; the
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/bridge_supervisor.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""An embedded rustuya-bridge: `pyrustuyabridge.PyBridgeServer` run in a background thread, tied to this config
|
|
2
2
|
entry's lifecycle instead of a separate rustuya-bridge process. Same class our own end-to-end tests drive
|
|
3
|
-
(
|
|
3
|
+
(tuya-interpreter/rustuya-local tests/e2e/test_full_stack.py) — proven against a real broker and real Tuya-protocol
|
|
4
4
|
devices, just supervised here instead of by a test fixture.
|
|
5
5
|
|
|
6
6
|
The embedded bridge still needs a real MQTT broker to talk through (it manages its own native MQTT client); it does
|
|
@@ -28,7 +28,7 @@ CONF_DEVICES_PATH = "devices_path" # tuyadevices.json; the cloud wi
|
|
|
28
28
|
# --- entry options (changed any time through the options flow) -------------------------
|
|
29
29
|
CONF_ALLOW_HAZARDOUS = "allow_hazardous"
|
|
30
30
|
CONF_EXPOSE_UNUSED = "expose_unused"
|
|
31
|
-
CONF_PACK = "pack" # sync
|
|
31
|
+
CONF_PACK = "pack" # sync tuya-interpreter's override pack into CONVERTERS_DIR
|
|
32
32
|
CONF_PANEL = "panel" # the sidebar page (panel.py); Configure adds / removes it
|
|
33
33
|
|
|
34
34
|
DEFAULT_OPTIONS = {CONF_ALLOW_HAZARDOUS: False, CONF_EXPOSE_UNUSED: False, CONF_PACK: True}
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/manifest.json
RENAMED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"iot_class": "local_push",
|
|
10
10
|
"issue_tracker": "https://github.com/3735943886/rustuya-local/issues",
|
|
11
11
|
"requirements": [
|
|
12
|
-
"
|
|
12
|
+
"tuya-interpreter>=0.1.0a2",
|
|
13
13
|
"paho-mqtt>=2.0",
|
|
14
14
|
"rustuya-manager>=0.2.2",
|
|
15
15
|
"pyrustuyabridge>=0.4",
|
|
16
|
-
"rustuya-local>=0.1.0.
|
|
16
|
+
"rustuya-local>=0.1.0.dev7"
|
|
17
17
|
],
|
|
18
18
|
"single_config_entry": true,
|
|
19
|
-
"version": "0.1.0.
|
|
19
|
+
"version": "0.1.0.dev7"
|
|
20
20
|
}
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/strings.json
RENAMED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"il_prefix": "IL topic prefix"
|
|
20
20
|
},
|
|
21
21
|
"data_description": {
|
|
22
|
-
"il_prefix": "Where the devices are published for
|
|
22
|
+
"il_prefix": "Where the devices are published for ildevice-homeassistant (or any IL consumer); ildevice-homeassistant reads il by default."
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"embedded": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"il_prefix": "IL topic prefix"
|
|
34
34
|
},
|
|
35
35
|
"data_description": {
|
|
36
|
-
"il_prefix": "Where the devices are published for
|
|
36
|
+
"il_prefix": "Where the devices are published for ildevice-homeassistant (or any IL consumer); ildevice-homeassistant reads il by default."
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"onboard": {
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
"fields": {
|
|
153
153
|
"device_id": {
|
|
154
154
|
"name": "Device ID",
|
|
155
|
-
"description": "The Tuya device ID (as in the device list), or the Home Assistant device an IL consumer such as
|
|
155
|
+
"description": "The Tuya device ID (as in the device list), or the Home Assistant device an IL consumer such as ildevice-homeassistant made of it."
|
|
156
156
|
},
|
|
157
157
|
"dp": {
|
|
158
158
|
"name": "DP",
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/translations/en.json
RENAMED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"il_prefix": "IL topic prefix"
|
|
20
20
|
},
|
|
21
21
|
"data_description": {
|
|
22
|
-
"il_prefix": "Where the devices are published for
|
|
22
|
+
"il_prefix": "Where the devices are published for ildevice-homeassistant (or any IL consumer); ildevice-homeassistant reads il by default."
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"embedded": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"il_prefix": "IL topic prefix"
|
|
34
34
|
},
|
|
35
35
|
"data_description": {
|
|
36
|
-
"il_prefix": "Where the devices are published for
|
|
36
|
+
"il_prefix": "Where the devices are published for ildevice-homeassistant (or any IL consumer); ildevice-homeassistant reads il by default."
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"onboard": {
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
"fields": {
|
|
153
153
|
"device_id": {
|
|
154
154
|
"name": "Device ID",
|
|
155
|
-
"description": "The Tuya device ID (as in the device list), or the Home Assistant device an IL consumer such as
|
|
155
|
+
"description": "The Tuya device ID (as in the device list), or the Home Assistant device an IL consumer such as ildevice-homeassistant made of it."
|
|
156
156
|
},
|
|
157
157
|
"dp": {
|
|
158
158
|
"name": "DP",
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/translations/ko.json
RENAMED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"il_prefix": "IL 토픽 prefix"
|
|
20
20
|
},
|
|
21
21
|
"data_description": {
|
|
22
|
-
"il_prefix": "
|
|
22
|
+
"il_prefix": "ildevice-homeassistant(또는 다른 IL 소비자)가 읽을 기기를 게시하는 곳입니다. ildevice-homeassistant는 기본으로 il을 읽습니다."
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"embedded": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"il_prefix": "IL 토픽 prefix"
|
|
34
34
|
},
|
|
35
35
|
"data_description": {
|
|
36
|
-
"il_prefix": "
|
|
36
|
+
"il_prefix": "ildevice-homeassistant(또는 다른 IL 소비자)가 읽을 기기를 게시하는 곳입니다. ildevice-homeassistant는 기본으로 il을 읽습니다."
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"onboard": {
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
"fields": {
|
|
153
153
|
"device_id": {
|
|
154
154
|
"name": "기기 ID",
|
|
155
|
-
"description": "Tuya 기기 ID (기기 목록의 것), 또는
|
|
155
|
+
"description": "Tuya 기기 ID (기기 목록의 것), 또는 ildevice-homeassistant 같은 IL consumer가 만든 Home Assistant 기기 ID."
|
|
156
156
|
},
|
|
157
157
|
"dp": {
|
|
158
158
|
"name": "DP",
|
{rustuya_local-0.1.0.dev5 → rustuya_local-0.1.0.dev7}/custom_components/rustuya/www/rustuya-panel.js
RENAMED
|
@@ -176,7 +176,7 @@ const I18N = {
|
|
|
176
176
|
act_add: "Add", act_update: "Update", act_remove: "Remove",
|
|
177
177
|
confirm_remove_device: "Remove {who} from the bridge?",
|
|
178
178
|
set_bridge_root: "Bridge topic root", set_bridge_root_hint: "The MQTT root rustuya-bridge uses (its mqtt_root_topic).",
|
|
179
|
-
set_il_prefix: "IL topic prefix", set_il_prefix_hint: "Where the IL devices are published;
|
|
179
|
+
set_il_prefix: "IL topic prefix", set_il_prefix_hint: "Where the IL devices are published; ildevice-homeassistant reads il by default.",
|
|
180
180
|
set_il_source: "IL source name", set_il_source_hint: "This producer's name on IL (one topic level).",
|
|
181
181
|
set_devices_path: "Device file", set_devices_path_hint: "The tuyadevices.json rustuya-manager keeps; relative to the config directory.",
|
|
182
182
|
set_bridge_state_file: "Bridge state file", set_bridge_state_file_hint: "Where the embedded bridge keeps its device registry.",
|
|
@@ -195,9 +195,9 @@ const I18N = {
|
|
|
195
195
|
settings_unreadable: "Cannot read the settings: {error}", confirm_settings: "Save {names} and restart Rustuya?",
|
|
196
196
|
sync_now: "Update builtin rules", hide_title: "Remove this panel from the sidebar; the integration's Configure adds it back",
|
|
197
197
|
hide: "Hide panel", pack_title: "Builtin rules",
|
|
198
|
-
pack_intro: "Official rules included with
|
|
198
|
+
pack_intro: "Official rules included with tuya-interpreter. Fetch the latest rules without updating the integration.",
|
|
199
199
|
converters_title: "Custom converters",
|
|
200
|
-
converters_intro: "Rule files (*.json: override blocks and declarative converters) in rustuya_converters/. Saved files apply within seconds. See
|
|
200
|
+
converters_intro: "Rule files (*.json: override blocks and declarative converters) in rustuya_converters/. Saved files apply within seconds. See tuya-interpreter docs/device-customization.md, \"User overrides\". Drop files here to copy them in.",
|
|
201
201
|
new_file: "New file", save: "Save", delete: "Delete",
|
|
202
202
|
only_converters: "{name} (only *.json files are converters)",
|
|
203
203
|
confirm_replace_pack: "{name} comes from the override pack. Replaced, it is yours: the pack no longer updates or removes it.",
|
|
@@ -247,7 +247,7 @@ const I18N = {
|
|
|
247
247
|
act_add: "추가", act_update: "갱신", act_remove: "삭제",
|
|
248
248
|
confirm_remove_device: "{who}을(를) 브리지에서 삭제할까요?",
|
|
249
249
|
set_bridge_root: "브리지 토픽 root", set_bridge_root_hint: "rustuya-bridge가 쓰는 MQTT root(mqtt_root_topic).",
|
|
250
|
-
set_il_prefix: "IL 토픽 prefix", set_il_prefix_hint: "IL 기기를 게시하는 곳.
|
|
250
|
+
set_il_prefix: "IL 토픽 prefix", set_il_prefix_hint: "IL 기기를 게시하는 곳. ildevice-homeassistant는 기본으로 il을 읽습니다.",
|
|
251
251
|
set_il_source: "IL source 이름", set_il_source_hint: "IL에서 이 생산자의 이름(토픽 한 단계).",
|
|
252
252
|
set_devices_path: "기기 파일", set_devices_path_hint: "rustuya-manager가 관리하는 tuyadevices.json. config 디렉터리 기준 상대 경로.",
|
|
253
253
|
set_bridge_state_file: "브리지 상태 파일", set_bridge_state_file_hint: "내장 브리지가 기기 목록을 저장하는 곳.",
|
|
@@ -266,9 +266,9 @@ const I18N = {
|
|
|
266
266
|
settings_unreadable: "설정을 읽을 수 없습니다: {error}", confirm_settings: "{names}을(를) 저장하고 Rustuya를 재시작할까요?",
|
|
267
267
|
sync_now: "Builtin 규칙 업데이트", hide_title: "사이드바에서 이 패널을 없앱니다. 통합구성요소의 구성(Configure)에서 다시 추가할 수 있습니다",
|
|
268
268
|
hide: "패널 숨기기", pack_title: "Builtin 규칙",
|
|
269
|
-
pack_intro: "
|
|
269
|
+
pack_intro: "tuya-interpreter에 포함된 공식 규칙입니다. 통합구성요소 업데이트 없이 최신 규칙을 가져옵니다.",
|
|
270
270
|
converters_title: "커스텀 컨버터",
|
|
271
|
-
converters_intro: "rustuya_converters/ 안의 규칙 파일(*.json: 오버라이드 블록과 선언형 컨버터). 저장한 파일은 몇 초 안에 적용됩니다.
|
|
271
|
+
converters_intro: "rustuya_converters/ 안의 규칙 파일(*.json: 오버라이드 블록과 선언형 컨버터). 저장한 파일은 몇 초 안에 적용됩니다. tuya-interpreter docs/device-customization.md의 \"User overrides\"를 참고하세요. 여기에 파일을 끌어다 놓으면 복사됩니다.",
|
|
272
272
|
new_file: "새 파일", save: "저장", delete: "삭제",
|
|
273
273
|
only_converters: "{name} (*.json 파일만 컨버터입니다)",
|
|
274
274
|
confirm_replace_pack: "{name}은(는) 오버라이드 팩의 파일입니다. 바꾸면 내 파일이 되어 팩이 더 이상 갱신하거나 지우지 않습니다.",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Moving to
|
|
1
|
+
# Moving to tuya-interpreter
|
|
2
2
|
|
|
3
3
|
The device file, MQTT configuration and IL topics stay the same. Custom files in the converters directory now use
|
|
4
4
|
the rule-layer format. Wrap an existing product/device override mapping in `{"overrides": ...}`. For example:
|
|
@@ -21,7 +21,7 @@ rustuya-manager plugin. It is retired. Its replacement is two pieces:
|
|
|
21
21
|
- **rustuya-local** turns the devices on rustuya-bridge into IL devices (MQTT topics under a prefix such as `il/tuya`).
|
|
22
22
|
Run it one way: the `rustuya` Home Assistant integration (HACS), the rustuya-manager plugin (catalog: *Tuya (IL)*),
|
|
23
23
|
or the `rustuya-local run` daemon.
|
|
24
|
-
- **
|
|
24
|
+
- **[ildevice-homeassistant](https://github.com/3735943886/ildevice-homeassistant)** (HACS) turns IL devices
|
|
25
25
|
into Home Assistant entities. MQTT discovery is no longer used.
|
|
26
26
|
|
|
27
27
|
## What changes for you
|
|
@@ -30,7 +30,7 @@ rustuya-manager plugin. It is retired. Its replacement is two pieces:
|
|
|
30
30
|
`ildevice`, and Home Assistant keeps the two apart. Automations, scripts and dashboards that name the old entities
|
|
31
31
|
need the new ids. If you clear the old discovery first (step 1), the old ids are free and you can rename the new
|
|
32
32
|
entities to them in Home Assistant.
|
|
33
|
-
- **Entities follow Home Assistant core's `tuya` integration** (
|
|
33
|
+
- **Entities follow Home Assistant core's `tuya` integration** (tuya-interpreter reproduces it), so a device can come out
|
|
34
34
|
with more, fewer or differently split entities than v1 made.
|
|
35
35
|
- **Availability** comes from rustuya-local's presence: when it stops, its devices show unavailable.
|
|
36
36
|
|
|
@@ -48,7 +48,7 @@ rustuya-manager plugin. It is retired. Its replacement is two pieces:
|
|
|
48
48
|
2. **Install rustuya-local** one way (see the [README](../README.md#home-assistant)). Keep the same rustuya-bridge and
|
|
49
49
|
device file (`tuyadevices.json`).
|
|
50
50
|
|
|
51
|
-
3. **Install
|
|
51
|
+
3. **Install ildevice-homeassistant** from HACS and add the **IL device** integration with the prefix rustuya-local publishes under
|
|
52
52
|
(`il` unless you set another one in rustuya-local; both sides must match). Add the devices it offers, or turn on
|
|
53
53
|
*Add discovered devices automatically*.
|
|
54
54
|
|
|
@@ -61,7 +61,7 @@ rustuya-manager plugin. It is retired. Its replacement is two pieces:
|
|
|
61
61
|
| daemon | `custom_converters` in its `config.json` |
|
|
62
62
|
|
|
63
63
|
- `*.json` files are rule layers, with product/device fixes under `overrides`
|
|
64
|
-
([User overrides](https://github.com/3735943886/
|
|
64
|
+
([User overrides](https://github.com/3735943886/tuya-interpreter/blob/master/docs/device-customization.md#user-overrides)); the old ones are not read, so rewrite them.
|
|
65
65
|
A property the tables do not build is defined from its dp in `props`.
|
|
66
66
|
- A curtain's `invert_position` / `invert_set_position`, reversed command words and derived state are not files any
|
|
67
67
|
more: each cover has configuration switches for them (README, *Cover settings*).
|
|
@@ -69,7 +69,7 @@ rustuya-manager plugin. It is retired. Its replacement is two pieces:
|
|
|
69
69
|
- `converters.cover_motion` and a cover's `infer_motion` are read as the cover's `state_source` (`inferred`, or
|
|
70
70
|
`none` for `infer_motion: false`), and a `cover_motion` `settle` as the cover's `settle`; its other keys are
|
|
71
71
|
dropped with a warning. `zz_settings.json` is rewritten in the new form the next time a setting is saved.
|
|
72
|
-
- Leave the old pack (`00_default.json`, `00_curtain.py`, `.rustuya_pack.json`) out. Official rules ship with
|
|
72
|
+
- Leave the old pack (`00_default.json`, `00_curtain.py`, `.rustuya_pack.json`) out. Official rules ship with tuya-interpreter; online updates arrive under
|
|
73
73
|
`rules/builtin/` automatically. User files are applied after all official rules.
|
|
74
74
|
|
|
75
75
|
Changes to the directory are picked up while running, no restart needed.
|