openccu-data 2026.4.1__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.
Files changed (102) hide show
  1. openccu_data-2026.4.1/LICENSE +21 -0
  2. openccu_data-2026.4.1/NOTICE.md +49 -0
  3. openccu_data-2026.4.1/PKG-INFO +161 -0
  4. openccu_data-2026.4.1/README.md +127 -0
  5. openccu_data-2026.4.1/openccu_data/__init__.py +5 -0
  6. openccu_data-2026.4.1/openccu_data/const.py +7 -0
  7. openccu_data-2026.4.1/openccu_data/data/__init__.py +5 -0
  8. openccu_data-2026.4.1/openccu_data/data/easymode_extract.json.gz +0 -0
  9. openccu_data-2026.4.1/openccu_data/data/profiles/ACCESS_RECEIVER.json.gz +0 -0
  10. openccu_data-2026.4.1/openccu_data/data/profiles/ACOUSTIC_SIGNAL_VIRTUAL_RECEIVER.json.gz +0 -0
  11. openccu_data-2026.4.1/openccu_data/data/profiles/ACTOR_SECURITY.json.gz +0 -0
  12. openccu_data-2026.4.1/openccu_data/data/profiles/ACTOR_WINDOW.json.gz +0 -0
  13. openccu_data-2026.4.1/openccu_data/data/profiles/ALARMACTUATOR.json.gz +0 -0
  14. openccu_data-2026.4.1/openccu_data/data/profiles/ALARM_COND_SWITCH_RECEIVER.json.gz +0 -0
  15. openccu_data-2026.4.1/openccu_data/data/profiles/ALARM_SWITCH_VIRTUAL_RECEIVER.json.gz +0 -0
  16. openccu_data-2026.4.1/openccu_data/data/profiles/ARMING.json.gz +0 -0
  17. openccu_data-2026.4.1/openccu_data/data/profiles/AUTO_RELOCK_TRANSCEIVER.json.gz +0 -0
  18. openccu_data-2026.4.1/openccu_data/data/profiles/BLIND.json.gz +0 -0
  19. openccu_data-2026.4.1/openccu_data/data/profiles/BLIND_VIRTUAL_RECEIVER.json.gz +0 -0
  20. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_FLOOR_PUMP_TRANSCEIVER.json.gz +0 -0
  21. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_FLOOR_TRANSCEIVER.json.gz +0 -0
  22. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_INPUT_RECEIVER.json.gz +0 -0
  23. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_RECEIVER.json.gz +0 -0
  24. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_RT_RECEIVER.json.gz +0 -0
  25. openccu_data-2026.4.1/openccu_data/data/profiles/CLIMATECONTROL_VENT_DRIVE.json.gz +0 -0
  26. openccu_data-2026.4.1/openccu_data/data/profiles/DDC.json.gz +0 -0
  27. openccu_data-2026.4.1/openccu_data/data/profiles/DIMMER.json.gz +0 -0
  28. openccu_data-2026.4.1/openccu_data/data/profiles/DIMMER_VIRTUAL_RECEIVER.json.gz +0 -0
  29. openccu_data-2026.4.1/openccu_data/data/profiles/DIMMER_woLongKeyPress.json.gz +0 -0
  30. openccu_data-2026.4.1/openccu_data/data/profiles/DOOR_LOCK_TRANSCEIVER.json.gz +0 -0
  31. openccu_data-2026.4.1/openccu_data/data/profiles/DOOR_RECEIVER.json.gz +0 -0
  32. openccu_data-2026.4.1/openccu_data/data/profiles/DUAL_WHITE_BRIGHTNESS.json.gz +0 -0
  33. openccu_data-2026.4.1/openccu_data/data/profiles/DUAL_WHITE_COLOR.json.gz +0 -0
  34. openccu_data-2026.4.1/openccu_data/data/profiles/HEATING_CLIMATECONTROL_CL_RECEIVER.json.gz +0 -0
  35. openccu_data-2026.4.1/openccu_data/data/profiles/HEATING_CLIMATECONTROL_RECEIVER.json.gz +0 -0
  36. openccu_data-2026.4.1/openccu_data/data/profiles/HEATING_KEY_RECEIVER.json.gz +0 -0
  37. openccu_data-2026.4.1/openccu_data/data/profiles/HEATING_ROOM_TH_RECEIVER.json.gz +0 -0
  38. openccu_data-2026.4.1/openccu_data/data/profiles/HMW_BLIND.json.gz +0 -0
  39. openccu_data-2026.4.1/openccu_data/data/profiles/HMW_DIMMER.json.gz +0 -0
  40. openccu_data-2026.4.1/openccu_data/data/profiles/HMW_INPUT_OUTPUT.json.gz +0 -0
  41. openccu_data-2026.4.1/openccu_data/data/profiles/HMW_SWITCH.json.gz +0 -0
  42. openccu_data-2026.4.1/openccu_data/data/profiles/JALOUSIE.json.gz +0 -0
  43. openccu_data-2026.4.1/openccu_data/data/profiles/KEYMATIC.json.gz +0 -0
  44. openccu_data-2026.4.1/openccu_data/data/profiles/REMOTECONTROL_RECEIVER.json.gz +0 -0
  45. openccu_data-2026.4.1/openccu_data/data/profiles/RGBW_AUTOMATIC.json.gz +0 -0
  46. openccu_data-2026.4.1/openccu_data/data/profiles/RGBW_COLOR.json.gz +0 -0
  47. openccu_data-2026.4.1/openccu_data/data/profiles/SERVO_VIRTUAL_RECEIVER.json.gz +0 -0
  48. openccu_data-2026.4.1/openccu_data/data/profiles/SHUTTER_VIRTUAL_RECEIVER.json.gz +0 -0
  49. openccu_data-2026.4.1/openccu_data/data/profiles/SIGNAL_CHIME.json.gz +0 -0
  50. openccu_data-2026.4.1/openccu_data/data/profiles/SIGNAL_CHIMEM.json.gz +0 -0
  51. openccu_data-2026.4.1/openccu_data/data/profiles/SIGNAL_LED.json.gz +0 -0
  52. openccu_data-2026.4.1/openccu_data/data/profiles/SIGNAL_LEDM.json.gz +0 -0
  53. openccu_data-2026.4.1/openccu_data/data/profiles/SIMPLE_SWITCH_RECEIVER.json.gz +0 -0
  54. openccu_data-2026.4.1/openccu_data/data/profiles/STATE_RESET_RECEIVER.json.gz +0 -0
  55. openccu_data-2026.4.1/openccu_data/data/profiles/STATUS_INDICATOR.json.gz +0 -0
  56. openccu_data-2026.4.1/openccu_data/data/profiles/SWITCH.json.gz +0 -0
  57. openccu_data-2026.4.1/openccu_data/data/profiles/SWITCH_PANIC.json.gz +0 -0
  58. openccu_data-2026.4.1/openccu_data/data/profiles/SWITCH_SENSOR.json.gz +0 -0
  59. openccu_data-2026.4.1/openccu_data/data/profiles/SWITCH_VIRTUAL_RECEIVER.json.gz +0 -0
  60. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_ACTOR.json.gz +0 -0
  61. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_LIGHT_RECEIVER_LSC.json.gz +0 -0
  62. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_LIGHT_RECEIVER_PWM.json.gz +0 -0
  63. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGB(W).json.gz +0 -0
  64. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGBW_DALI.json.gz +0 -0
  65. openccu_data-2026.4.1/openccu_data/data/profiles/UNIVERSAL_LIGHT_RECEIVER_TW.json.gz +0 -0
  66. openccu_data-2026.4.1/openccu_data/data/profiles/VIRTUAL_DIMMER.json.gz +0 -0
  67. openccu_data-2026.4.1/openccu_data/data/profiles/VIRTUAL_DUAL_WHITE_COLOR.json.gz +0 -0
  68. openccu_data-2026.4.1/openccu_data/data/profiles/WATER_SWITCH_VIRTUAL_RECEIVER.json.gz +0 -0
  69. openccu_data-2026.4.1/openccu_data/data/profiles/WEATHER_RECEIVER.json.gz +0 -0
  70. openccu_data-2026.4.1/openccu_data/data/profiles/WINDOW_DRIVE_RECEIVER.json.gz +0 -0
  71. openccu_data-2026.4.1/openccu_data/data/profiles/WINDOW_SWITCH_RECEIVER.json.gz +0 -0
  72. openccu_data-2026.4.1/openccu_data/data/profiles/WINMATIC.json.gz +0 -0
  73. openccu_data-2026.4.1/openccu_data/data/profiles/WS_TH.json.gz +0 -0
  74. openccu_data-2026.4.1/openccu_data/data/profiles/_receiver_type_aliases.json +5 -0
  75. openccu_data-2026.4.1/openccu_data/data/translation_custom/channel_types_de.json +21 -0
  76. openccu_data-2026.4.1/openccu_data/data/translation_custom/channel_types_en.json +21 -0
  77. openccu_data-2026.4.1/openccu_data/data/translation_custom/device_icons.json +1 -0
  78. openccu_data-2026.4.1/openccu_data/data/translation_custom/device_models_de.json +142 -0
  79. openccu_data-2026.4.1/openccu_data/data/translation_custom/device_models_en.json +142 -0
  80. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameter_help_de.json +1 -0
  81. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameter_help_en.json +1 -0
  82. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameter_values_de.json +1237 -0
  83. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameter_values_en.json +1240 -0
  84. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameters_de.json +704 -0
  85. openccu_data-2026.4.1/openccu_data/data/translation_custom/parameters_en.json +704 -0
  86. openccu_data-2026.4.1/openccu_data/data/translation_extract.json.gz +0 -0
  87. openccu_data-2026.4.1/openccu_data/easymodes/__init__.py +9 -0
  88. openccu_data-2026.4.1/openccu_data/easymodes/extractor.py +1094 -0
  89. openccu_data-2026.4.1/openccu_data/profiles/__init__.py +9 -0
  90. openccu_data-2026.4.1/openccu_data/profiles/extractor.py +891 -0
  91. openccu_data-2026.4.1/openccu_data/py.typed +0 -0
  92. openccu_data-2026.4.1/openccu_data/translations/__init__.py +9 -0
  93. openccu_data-2026.4.1/openccu_data/translations/extractor.py +1590 -0
  94. openccu_data-2026.4.1/openccu_data.egg-info/PKG-INFO +161 -0
  95. openccu_data-2026.4.1/openccu_data.egg-info/SOURCES.txt +100 -0
  96. openccu_data-2026.4.1/openccu_data.egg-info/dependency_links.txt +1 -0
  97. openccu_data-2026.4.1/openccu_data.egg-info/entry_points.txt +4 -0
  98. openccu_data-2026.4.1/openccu_data.egg-info/requires.txt +4 -0
  99. openccu_data-2026.4.1/openccu_data.egg-info/top_level.txt +1 -0
  100. openccu_data-2026.4.1/pyproject.toml +144 -0
  101. openccu_data-2026.4.1/setup.cfg +4 -0
  102. openccu_data-2026.4.1/tests/test_easymodes_extractor.py +54 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SukramJ
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # NOTICE
2
+
3
+ This repository ships two distinct kinds of files that are governed by
4
+ different licenses. Please respect both when redistributing.
5
+
6
+ ## 1. Original code (MIT License)
7
+
8
+ All Python source code in this repository — extractor modules, CLI entry
9
+ points, tests, and packaging metadata — is original work and licensed under
10
+ the [MIT License](./LICENSE).
11
+
12
+ This covers everything under:
13
+
14
+ - `openccu_data/` (except the `data/` subtree, see below)
15
+ - `script/`
16
+ - `tests/`
17
+ - top-level configuration files (`pyproject.toml`, `.pre-commit-config.yaml`,
18
+ …)
19
+
20
+ ## 2. Extracted data artifacts (EQ-3 / OCCU License)
21
+
22
+ The committed data artifacts under `openccu_data/data/` are derivative works
23
+ generated from the
24
+ [HomeMatic Open Central Control Unit SDK (HM-OCCU-SDK)](https://github.com/eq-3/occu)
25
+ maintained by eQ-3 AG, and from compatible distributions such as
26
+ [OpenCCU](https://github.com/jens-maus/RaspberryMatic).
27
+
28
+ Specifically these files:
29
+
30
+ - `openccu_data/data/easymode_extract.json.gz`
31
+ - `openccu_data/data/translation_extract.json.gz`
32
+ - `openccu_data/data/translation_custom/*.json` _(curated additions, MIT)_
33
+ - `openccu_data/data/profiles/*.json`
34
+
35
+ are obtained by parsing TCL configuration and JavaScript translation files
36
+ shipped with OCCU/RaspberryMatic. They retain the licensing of the original
37
+ upstream sources. Refer to OCCU's `LicenseDE.txt` for the full terms — in
38
+ short: free for private and non-commercial use; commercial redistribution
39
+ requires permission from eQ-3.
40
+
41
+ The `translation_custom/` files are the exception inside the data tree: they
42
+ contain hand-curated translation overrides authored by the openccu-data
43
+ maintainers and are released under the MIT License together with the rest of
44
+ the code.
45
+
46
+ ## Trademarks
47
+
48
+ "Homematic" and "HomematicIP" are trademarks of eQ-3 AG. This project is not
49
+ affiliated with or endorsed by eQ-3 AG.
@@ -0,0 +1,161 @@
1
+ Metadata-Version: 2.4
2
+ Name: openccu-data
3
+ Version: 2026.4.1
4
+ Summary: Extract and distribute Homematic CCU/OpenCCU configuration metadata (translations, easymodes, link profiles).
5
+ Author-email: SukramJ <sukramj@icloud.com>
6
+ License: MIT License
7
+ Project-URL: Homepage, https://github.com/sukramj/openccu-data
8
+ Project-URL: Source Code, https://github.com/sukramj/openccu-data
9
+ Project-URL: Bug Reports, https://github.com/sukramj/openccu-data/issues
10
+ Project-URL: Changelog, https://github.com/sukramj/openccu-data/blob/devel/changelog.md
11
+ Keywords: home,automation,homematic,ccu,openccu,raspberrymatic,easymode
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Natural Language :: English
16
+ Classifier: Natural Language :: German
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Programming Language :: Python :: Implementation :: CPython
23
+ Classifier: Topic :: Home Automation
24
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.14
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ License-File: NOTICE.md
30
+ Provides-Extra: test
31
+ Requires-Dist: pytest>=8.0.0; extra == "test"
32
+ Requires-Dist: pytest-cov>=5.0.0; extra == "test"
33
+ Dynamic: license-file
34
+
35
+ # openccu-data
36
+
37
+ Extract and distribute Homematic CCU configuration metadata
38
+ (translations, easymodes, link profiles) from
39
+ [OCCU](https://github.com/eq-3/occu) /
40
+ [OpenCCU](https://github.com/jens-maus/RaspberryMatic) /
41
+ [RaspberryMatic](https://github.com/jens-maus/RaspberryMatic).
42
+
43
+ This repository is the **single source of truth** for the data artifacts that
44
+ are consumed by [aiohomematic](https://github.com/sukramj/aiohomematic) and
45
+ [aiohomematic-config](https://github.com/sukramj/aiohomematic-config). Both
46
+ projects vendor the produced JSON archives at runtime.
47
+
48
+ ## What this provides
49
+
50
+ | Extractor | Source | Output |
51
+ | ------------------------------ | ------------------------------------ | -------------------------------------------------------------------------------------- |
52
+ | `openccu-extract-easymodes` | TCL config under `config/easymodes/` | `openccu_data/data/easymode_extract.json.gz` |
53
+ | `openccu-extract-translations` | JS translation files + stringtable | `openccu_data/data/translation_extract.json.gz` + `translation_custom/` |
54
+ | `openccu-extract-profiles` | TCL link-profile files per receiver | `openccu_data/data/profiles/<RECEIVER_TYPE>.json.gz` (+ `_receiver_type_aliases.json`) |
55
+
56
+ All three read from either:
57
+
58
+ - a local OCCU/OpenCCU/RaspberryMatic checkout (`OCCU_PATH=/path/to/occu`), or
59
+ - a running CCU instance over HTTP/HTTPS (`CCU_URL=https://my-ccu.local`).
60
+
61
+ If both are set, the easymode/translation extractors merge results; the
62
+ profile extractor prefers the running CCU and falls back to local.
63
+
64
+ ## Repository layout
65
+
66
+ ```
67
+ openccu-data/
68
+ ├── LICENSE MIT (covers the code)
69
+ ├── NOTICE.md Data-artifact licensing (EQ-3/OCCU)
70
+ ├── README.md this file
71
+ ├── CLAUDE.md guide for AI assistants
72
+ ├── changelog.md
73
+ ├── pyproject.toml
74
+ ├── openccu_data/
75
+ │ ├── const.py
76
+ │ ├── easymodes/extractor.py easymode metadata parser
77
+ │ ├── translations/extractor.py CCU WebUI translation parser
78
+ │ ├── profiles/extractor.py easymode link-profile parser
79
+ │ └── data/ committed, vendored output
80
+ │ ├── easymode_extract.json.gz
81
+ │ ├── translation_extract.json.gz
82
+ │ ├── translation_custom/*.json
83
+ │ └── profiles/*.json.gz (+ _receiver_type_aliases.json)
84
+ ├── script/ CLI wrappers
85
+ └── tests/
86
+ ```
87
+
88
+ ## Installation
89
+
90
+ ```bash
91
+ python -m pip install -e .[test]
92
+ ```
93
+
94
+ No third-party runtime dependencies; only the standard library.
95
+
96
+ ## Usage
97
+
98
+ ### Console scripts
99
+
100
+ After installation, three console scripts are available on the PATH:
101
+
102
+ ```bash
103
+ OCCU_PATH=/path/to/occu openccu-extract-easymodes
104
+ OCCU_PATH=/path/to/occu openccu-extract-translations
105
+ CCU_URL=https://my-ccu.local openccu-extract-profiles
106
+ ```
107
+
108
+ Output lands in `openccu_data/data/` by default. Override via `OUTPUT_DIR`.
109
+
110
+ ### Without installation
111
+
112
+ ```bash
113
+ OCCU_PATH=/path/to/occu python script/extract_easymodes.py
114
+ OCCU_PATH=/path/to/occu python script/extract_translations.py
115
+ CCU_URL=https://my-ccu.local python script/extract_profiles.py
116
+ ```
117
+
118
+ ### Environment variables
119
+
120
+ | Variable | Purpose |
121
+ | ------------ | ------------------------------------------------------------------------ |
122
+ | `OCCU_PATH` | Path to a local OCCU/RaspberryMatic checkout |
123
+ | `CCU_URL` | URL of a running CCU/OpenCCU instance (`http://` or `https://`) |
124
+ | `OUTPUT_DIR` | Override the default output directory |
125
+ | `RECEIVERS` | (`extract_profiles` only) comma-separated list of receiver channel types |
126
+
127
+ `.env` files at the repository root are auto-loaded (existing env vars win).
128
+
129
+ ## Vendoring into consumer projects
130
+
131
+ The committed artifacts in `openccu_data/data/` are the **source of truth**.
132
+ Consumers maintain their own runtime copies:
133
+
134
+ | Consumer | Vendored copy |
135
+ | --------------------- | -------------------------------------------------------------------------- |
136
+ | `aiohomematic` | `aiohomematic/ccu_data/easymode_extract.json.gz` |
137
+ | `aiohomematic` | `aiohomematic/ccu_data/translation_extract.json.gz` |
138
+ | `aiohomematic` | `aiohomematic/ccu_data/translation_custom/*.json` |
139
+ | `aiohomematic-config` | `aiohomematic_config/profiles/*.json.gz` (+ `_receiver_type_aliases.json`) |
140
+
141
+ After regenerating any artifact, copy the relevant files into the consumer
142
+ repository and open a PR there as well.
143
+
144
+ ## Development
145
+
146
+ ```bash
147
+ python -m pip install -e .[test]
148
+ pytest tests/
149
+ ruff check openccu_data/ tests/
150
+ mypy
151
+ ```
152
+
153
+ ## License
154
+
155
+ - **Code**: [MIT](./LICENSE).
156
+ - **Data artifacts** under `openccu_data/data/`: derivative of OCCU/RaspberryMatic
157
+ and subject to the EQ-3 license (see [NOTICE.md](./NOTICE.md)). The curated
158
+ `translation_custom/` overrides are MIT.
159
+
160
+ "Homematic" and "HomematicIP" are trademarks of eQ-3 AG. This project is not
161
+ affiliated with or endorsed by eQ-3 AG.
@@ -0,0 +1,127 @@
1
+ # openccu-data
2
+
3
+ Extract and distribute Homematic CCU configuration metadata
4
+ (translations, easymodes, link profiles) from
5
+ [OCCU](https://github.com/eq-3/occu) /
6
+ [OpenCCU](https://github.com/jens-maus/RaspberryMatic) /
7
+ [RaspberryMatic](https://github.com/jens-maus/RaspberryMatic).
8
+
9
+ This repository is the **single source of truth** for the data artifacts that
10
+ are consumed by [aiohomematic](https://github.com/sukramj/aiohomematic) and
11
+ [aiohomematic-config](https://github.com/sukramj/aiohomematic-config). Both
12
+ projects vendor the produced JSON archives at runtime.
13
+
14
+ ## What this provides
15
+
16
+ | Extractor | Source | Output |
17
+ | ------------------------------ | ------------------------------------ | -------------------------------------------------------------------------------------- |
18
+ | `openccu-extract-easymodes` | TCL config under `config/easymodes/` | `openccu_data/data/easymode_extract.json.gz` |
19
+ | `openccu-extract-translations` | JS translation files + stringtable | `openccu_data/data/translation_extract.json.gz` + `translation_custom/` |
20
+ | `openccu-extract-profiles` | TCL link-profile files per receiver | `openccu_data/data/profiles/<RECEIVER_TYPE>.json.gz` (+ `_receiver_type_aliases.json`) |
21
+
22
+ All three read from either:
23
+
24
+ - a local OCCU/OpenCCU/RaspberryMatic checkout (`OCCU_PATH=/path/to/occu`), or
25
+ - a running CCU instance over HTTP/HTTPS (`CCU_URL=https://my-ccu.local`).
26
+
27
+ If both are set, the easymode/translation extractors merge results; the
28
+ profile extractor prefers the running CCU and falls back to local.
29
+
30
+ ## Repository layout
31
+
32
+ ```
33
+ openccu-data/
34
+ ├── LICENSE MIT (covers the code)
35
+ ├── NOTICE.md Data-artifact licensing (EQ-3/OCCU)
36
+ ├── README.md this file
37
+ ├── CLAUDE.md guide for AI assistants
38
+ ├── changelog.md
39
+ ├── pyproject.toml
40
+ ├── openccu_data/
41
+ │ ├── const.py
42
+ │ ├── easymodes/extractor.py easymode metadata parser
43
+ │ ├── translations/extractor.py CCU WebUI translation parser
44
+ │ ├── profiles/extractor.py easymode link-profile parser
45
+ │ └── data/ committed, vendored output
46
+ │ ├── easymode_extract.json.gz
47
+ │ ├── translation_extract.json.gz
48
+ │ ├── translation_custom/*.json
49
+ │ └── profiles/*.json.gz (+ _receiver_type_aliases.json)
50
+ ├── script/ CLI wrappers
51
+ └── tests/
52
+ ```
53
+
54
+ ## Installation
55
+
56
+ ```bash
57
+ python -m pip install -e .[test]
58
+ ```
59
+
60
+ No third-party runtime dependencies; only the standard library.
61
+
62
+ ## Usage
63
+
64
+ ### Console scripts
65
+
66
+ After installation, three console scripts are available on the PATH:
67
+
68
+ ```bash
69
+ OCCU_PATH=/path/to/occu openccu-extract-easymodes
70
+ OCCU_PATH=/path/to/occu openccu-extract-translations
71
+ CCU_URL=https://my-ccu.local openccu-extract-profiles
72
+ ```
73
+
74
+ Output lands in `openccu_data/data/` by default. Override via `OUTPUT_DIR`.
75
+
76
+ ### Without installation
77
+
78
+ ```bash
79
+ OCCU_PATH=/path/to/occu python script/extract_easymodes.py
80
+ OCCU_PATH=/path/to/occu python script/extract_translations.py
81
+ CCU_URL=https://my-ccu.local python script/extract_profiles.py
82
+ ```
83
+
84
+ ### Environment variables
85
+
86
+ | Variable | Purpose |
87
+ | ------------ | ------------------------------------------------------------------------ |
88
+ | `OCCU_PATH` | Path to a local OCCU/RaspberryMatic checkout |
89
+ | `CCU_URL` | URL of a running CCU/OpenCCU instance (`http://` or `https://`) |
90
+ | `OUTPUT_DIR` | Override the default output directory |
91
+ | `RECEIVERS` | (`extract_profiles` only) comma-separated list of receiver channel types |
92
+
93
+ `.env` files at the repository root are auto-loaded (existing env vars win).
94
+
95
+ ## Vendoring into consumer projects
96
+
97
+ The committed artifacts in `openccu_data/data/` are the **source of truth**.
98
+ Consumers maintain their own runtime copies:
99
+
100
+ | Consumer | Vendored copy |
101
+ | --------------------- | -------------------------------------------------------------------------- |
102
+ | `aiohomematic` | `aiohomematic/ccu_data/easymode_extract.json.gz` |
103
+ | `aiohomematic` | `aiohomematic/ccu_data/translation_extract.json.gz` |
104
+ | `aiohomematic` | `aiohomematic/ccu_data/translation_custom/*.json` |
105
+ | `aiohomematic-config` | `aiohomematic_config/profiles/*.json.gz` (+ `_receiver_type_aliases.json`) |
106
+
107
+ After regenerating any artifact, copy the relevant files into the consumer
108
+ repository and open a PR there as well.
109
+
110
+ ## Development
111
+
112
+ ```bash
113
+ python -m pip install -e .[test]
114
+ pytest tests/
115
+ ruff check openccu_data/ tests/
116
+ mypy
117
+ ```
118
+
119
+ ## License
120
+
121
+ - **Code**: [MIT](./LICENSE).
122
+ - **Data artifacts** under `openccu_data/data/`: derivative of OCCU/RaspberryMatic
123
+ and subject to the EQ-3 license (see [NOTICE.md](./NOTICE.md)). The curated
124
+ `translation_custom/` overrides are MIT.
125
+
126
+ "Homematic" and "HomematicIP" are trademarks of eQ-3 AG. This project is not
127
+ affiliated with or endorsed by eQ-3 AG.
@@ -0,0 +1,5 @@
1
+ """openccu-data: extractors and vendored artifacts for Homematic CCU/OpenCCU metadata."""
2
+
3
+ from openccu_data.const import VERSION
4
+
5
+ __all__ = ("VERSION",)
@@ -0,0 +1,7 @@
1
+ """Project-wide constants for openccu-data."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Final
6
+
7
+ VERSION: Final = "2026.4.1"
@@ -0,0 +1,5 @@
1
+ """Vendored data artifacts extracted from OCCU/OpenCCU/RaspberryMatic.
2
+
3
+ These files are derivative works subject to the upstream EQ-3/OCCU license
4
+ terms. See ``NOTICE.md`` at the repository root for the full statement.
5
+ """
@@ -0,0 +1,5 @@
1
+ {
2
+ "OPTICAL_SIGNAL_RECEIVER": "DIMMER_VIRTUAL_RECEIVER",
3
+ "SWITCH_TRANSCEIVER": "SWITCH_VIRTUAL_RECEIVER",
4
+ "UNIVERSAL_LIGHT_RECEIVER": "UNIVERSAL_LIGHT_RECEIVER_LSC"
5
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "accesspoint_generic_receiver": "Access Point Generischer Empfänger",
3
+ "ddc": "Direkte Gerätekommunikation",
4
+ "digital_analog_input": "Digital-/Analogeingang",
5
+ "digital_analog_output": "Digital-/Analogausgang",
6
+ "digital_input": "Digitaleingang",
7
+ "digital_output": "Digitalausgang",
8
+ "ecokey": "ecoKey",
9
+ "generic": "Generischer Kanal",
10
+ "input_output": "Ein-/Ausgang",
11
+ "kwl_controller_transmitter": "Lüftungssteuerung",
12
+ "passage_detector": "Durchgangszähler",
13
+ "passage_detector_direction_transmitter": "Durchgangszähler Richtung",
14
+ "shading_receiver": "Beschattungsempfänger",
15
+ "shading_week_profile": "Beschattungs-Wochenprofil",
16
+ "simple_switch_receiver": "Einfacher Schaltempfänger",
17
+ "temp_humidity_particulate_matter_transmitter": "Temperatur-/Feuchte-/Feinstaubsensor",
18
+ "window": "Fensterkanal",
19
+ "ws_cs": "Wetterstation Kombinationssensor",
20
+ "ws_th": "Wetterstation Temperatur/Feuchte"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "accesspoint_generic_receiver": "Access Point Generic Receiver",
3
+ "ddc": "Direct Device Communication",
4
+ "digital_analog_input": "Digital/Analog Input",
5
+ "digital_analog_output": "Digital/Analog Output",
6
+ "digital_input": "Digital Input",
7
+ "digital_output": "Digital Output",
8
+ "ecokey": "ecoKey",
9
+ "generic": "Generic Channel",
10
+ "input_output": "Input/Output",
11
+ "kwl_controller_transmitter": "Ventilation Controller",
12
+ "passage_detector": "Passage Detector",
13
+ "passage_detector_direction_transmitter": "Passage Detector Direction",
14
+ "shading_receiver": "Shading Receiver",
15
+ "shading_week_profile": "Shading Week Profile",
16
+ "simple_switch_receiver": "Simple Switch Receiver",
17
+ "temp_humidity_particulate_matter_transmitter": "Temperature/Humidity/Particulate Matter Sensor",
18
+ "window": "Window Channel",
19
+ "ws_cs": "Weather Station Combination Sensor",
20
+ "ws_th": "Weather Station Temperature/Humidity"
21
+ }