Restructure public config and deployment

This commit is contained in:
ajp_anton
2026-05-30 19:17:27 +00:00
parent cc4e0c2c0f
commit cdf1f4e3a1
24 changed files with 710 additions and 302 deletions
+32 -31
View File
@@ -14,7 +14,7 @@ A runtime config module should export:
## Example
```python
from configs.example_controllers import define_lights
from controllers import define_lights
LIGHTS = define_lights({
"living_room": {
@@ -92,29 +92,30 @@ Numba is an optional dependency. Install it with the `speed` extra before select
## Config File Layout
The public example entry point is `configs/example.py`. It imports focused files:
The public example entry point is `config.example/lights_config.py`. It imports focused files:
- `configs/example_controllers.py`: physical controller/channel helper functions and constants.
- `configs/example_lights.py`: individual virtual lights and which controllers they abstract.
- `configs/example_groups.py`: room/group membership, optional member restrictions, and group balancing policy.
- `configs/example_remotes.py`: physical remote sensor IDs mapped to internal `remote_id` values.
- `configs/example_actions.py`: scenes, action helpers, and remote automation mappings.
- `config.example/controllers.py`: physical controller/channel helper functions and constants.
- `config.example/lights.py`: individual virtual lights and which controllers they abstract.
- `config.example/groups.py`: room/group membership, optional member restrictions, and group balancing policy.
- `config.example/remotes.py`: physical remote sensor IDs mapped to internal `remote_id` values.
- `config.example/actions.py`: scenes, action helpers, and remote automation mappings.
Real home configs should stay in ignored local files such as `configs/local/`. The entry point should stay small and only assemble `SETTINGS`, `LIGHTS`, `GROUPS`, `REMOTES`, and `AUTOMATIONS`.
Real home configs should stay in ignored local files such as `config/`. The entry point should stay small and only assemble `SETTINGS`, `LIGHTS`, `GROUPS`, `REMOTES`, and `AUTOMATIONS`.
For a private local setup, copy the public example into the ignored local directory:
```bash
mkdir -p configs/local
cp configs/example.py configs/local/lights_config.py
cp configs/example_*.py configs/local/
mkdir -p config
cp config.example/*.py config/
cp config.example/service.env.example config/service.env
cp config.example/deploy.env.example config/deploy.env
```
Then edit the copied files. If you keep the split-file imports, update them from `configs.example_*` to `configs.local.example_*`, or rename the copied split files and import those names instead. Run with:
Then edit the copied files. The example entry point imports sibling files such as `actions.py`, `groups.py`, and `lights.py`, so the same imports continue to work after copying into `config/`. Run with:
```bash
ha-deconz-bridge-service configs/local/lights_config.py
ha-deconz-bridge-debug-web configs/local/lights_config.py "Example Mixed North"
ha-deconz-bridge-service config/lights_config.py
ha-deconz-bridge-debug-web config/lights_config.py "Living Room Ceiling"
```
The runtime accepts either a Python module name or a `.py` file path.
@@ -125,12 +126,12 @@ Groups are defined with `GroupSpec`. A member can be listed by name, or wrapped
from ha_deconz_bridge.groups import GroupMemberSpec, GroupSpec
GROUPS = {
"Example Plant": GroupSpec(
name="Example Plant",
"Plant Lights": GroupSpec(
name="Plant Lights",
members=(
"Example Fixed White A",
"Example Fixed White B",
GroupMemberSpec("Example Mixed North", fixed_color=182),
"Plant Light Left",
"Plant Light Right",
GroupMemberSpec("Living Room Ceiling", fixed_color=182),
),
balance="relative_member",
),
@@ -156,7 +157,7 @@ REMOTES = {
"example_sensor_1": RemoteSpec(
sensor_id="example_sensor_1",
remote_id="example_living",
name="Example living remote",
name="Living room remote",
model="RWL021",
double_press_window=0.45, # optional override
),
@@ -165,13 +166,13 @@ REMOTES = {
AUTOMATION_CONFIG = {
"example_living": {
"top": {
"single": (ActionSpec("set_scene", target="Example Living", brightness=180, color_temp=330),),
"single": (ActionSpec("set_scene", target="Living Room", brightness=180, color_temp=330),),
},
"bottom": {
"single": (ActionSpec("turn_off", target="Example Living"),),
"single": (ActionSpec("turn_off", target="Living Room"),),
},
"up": {
"hold": (ActionSpec("brightness_step", target="Example Living", brightness_step=16),),
"hold": (ActionSpec("brightness_step", target="Living Room", brightness_step=16),),
},
},
}
@@ -211,13 +212,13 @@ Action targets may be exact virtual light names, group names, or group expressio
If the target exactly matches an exposed virtual light or group and contains no `+` or `-`, the action is sent to that virtual entity directly. Compound expressions expand to individual virtual lights.
## Example Groups
## Sample Groups
`configs/example.py` exposes sanitized example groups in addition to individual lights:
`config.example/lights_config.py` exposes sanitized example groups in addition to individual lights:
- `Example Hall`: three RGB+CCT virtual lights.
- `Example Kitchen`: one RGB+CCT virtual light.
- `Example Bathroom`: one multi-controller ceiling light and one mirror light.
- `Example Bedroom`: two RGB+CCT virtual lights.
- `Example Living`: fixed-white, mixed RGB/CCT, and on/off examples.
- `Example Plant`: fixed-white examples plus one constrained mixed light, using relative member brightness balancing.
- `Hallway`: three RGB+CCT virtual lights.
- `Kitchen`: one RGB+CCT virtual light.
- `Bathroom`: one multi-controller ceiling light and one mirror light.
- `Bedroom`: two RGB+CCT virtual lights.
- `Living Room`: fixed-white, mixed RGB/CCT, and on/off examples.
- `Plant Lights`: fixed-white lights plus one constrained mixed light, using relative member brightness balancing.