boneIO 1.4.0.dev8__py3-none-any.whl → 1.4.0.dev10__py3-none-any.whl
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.
- boneio/core/manager/irrigation.py +49 -39
- boneio/version.py +1 -1
- boneio/webui/dashboard_cards.py +31 -1
- boneio/webui/routes/irrigation.py +39 -35
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/METADATA +1 -1
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/RECORD +10 -10
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/WHEEL +0 -0
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/entry_points.txt +0 -0
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/licenses/LICENSE +0 -0
- {boneio-1.4.0.dev8.dist-info → boneio-1.4.0.dev10.dist-info}/top_level.txt +0 -0
|
@@ -276,17 +276,21 @@ class IrrigationManager:
|
|
|
276
276
|
# Build list of discovery IDs to remove
|
|
277
277
|
discovery_ids: list[tuple[str, str]] = [
|
|
278
278
|
(f"{ctrl.id}", "switch"),
|
|
279
|
-
(f"{ctrl.id}_auto_advance", "switch"),
|
|
280
|
-
(f"{ctrl.id}_reverse", "switch"),
|
|
281
279
|
(f"{ctrl.id}_skip_next_run", "switch"),
|
|
282
280
|
(f"{ctrl.id}_standby", "switch"),
|
|
283
281
|
(f"{ctrl.id}_multiplier", "number"),
|
|
284
282
|
(f"{ctrl.id}_repeat", "number"),
|
|
285
|
-
(f"{ctrl.id}_next_valve", "button"),
|
|
286
283
|
(f"{ctrl.id}_pause", "button"),
|
|
287
284
|
(f"{ctrl.id}_resume", "button"),
|
|
288
285
|
(f"{ctrl.id}_event", "event"),
|
|
289
286
|
]
|
|
287
|
+
# Multi-zone-only entities
|
|
288
|
+
if len(ctrl.zones) > 1:
|
|
289
|
+
discovery_ids.extend([
|
|
290
|
+
(f"{ctrl.id}_auto_advance", "switch"),
|
|
291
|
+
(f"{ctrl.id}_reverse", "switch"),
|
|
292
|
+
(f"{ctrl.id}_next_valve", "button"),
|
|
293
|
+
])
|
|
290
294
|
for zone in ctrl.zones:
|
|
291
295
|
discovery_ids.append((f"{ctrl.id}_zone_{zone.id}", "valve"))
|
|
292
296
|
discovery_ids.append((f"{ctrl.id}_zone_{zone.id}_enabled", "switch"))
|
|
@@ -338,8 +342,10 @@ class IrrigationManager:
|
|
|
338
342
|
async def handle_standby(_topic: str, payload: str, _ctrl: IrrigationController = ctrl) -> None:
|
|
339
343
|
await _ctrl.set_standby(payload.strip().upper() == ON)
|
|
340
344
|
|
|
341
|
-
|
|
342
|
-
|
|
345
|
+
# Subscribe multi-zone-only MQTT handlers
|
|
346
|
+
if len(ctrl.zones) > 1:
|
|
347
|
+
await self._subscribe_topic(ctrl._setting_cmd_topic("auto_advance"), handle_auto_advance)
|
|
348
|
+
await self._subscribe_topic(ctrl._setting_cmd_topic("reverse"), handle_reverse)
|
|
343
349
|
await self._subscribe_topic(ctrl._setting_cmd_topic("multiplier"), handle_multiplier)
|
|
344
350
|
await self._subscribe_topic(ctrl._setting_cmd_topic("repeat"), handle_repeat)
|
|
345
351
|
await self._subscribe_topic(ctrl._setting_cmd_topic("skip_next_run"), handle_skip_next)
|
|
@@ -401,29 +407,31 @@ class IrrigationManager:
|
|
|
401
407
|
payload=ha_irrigation_main_switch_message(ctrl.id, ctrl.name, cfg),
|
|
402
408
|
)
|
|
403
409
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
410
|
+
# Multi-zone-only switches: auto_advance, reverse
|
|
411
|
+
if len(ctrl.zones) > 1:
|
|
412
|
+
_pub(
|
|
413
|
+
id=f"{ctrl.id}_auto_advance",
|
|
414
|
+
ha_type="switch",
|
|
415
|
+
payload=ha_irrigation_switch_message(
|
|
416
|
+
ctrl.id,
|
|
417
|
+
ctrl.name,
|
|
418
|
+
suffix="auto_advance",
|
|
419
|
+
name=f"{ctrl.name} Auto Advance",
|
|
420
|
+
config_helper=cfg,
|
|
421
|
+
),
|
|
422
|
+
)
|
|
415
423
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
424
|
+
_pub(
|
|
425
|
+
id=f"{ctrl.id}_reverse",
|
|
426
|
+
ha_type="switch",
|
|
427
|
+
payload=ha_irrigation_switch_message(
|
|
428
|
+
ctrl.id,
|
|
429
|
+
ctrl.name,
|
|
430
|
+
suffix="reverse",
|
|
431
|
+
name=f"{ctrl.name} Reverse",
|
|
432
|
+
config_helper=cfg,
|
|
433
|
+
),
|
|
434
|
+
)
|
|
427
435
|
|
|
428
436
|
_pub(
|
|
429
437
|
id=f"{ctrl.id}_skip_next_run",
|
|
@@ -481,18 +489,20 @@ class IrrigationManager:
|
|
|
481
489
|
),
|
|
482
490
|
)
|
|
483
491
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
492
|
+
# Multi-zone-only button: next_valve
|
|
493
|
+
if len(ctrl.zones) > 1:
|
|
494
|
+
_pub(
|
|
495
|
+
id=f"{ctrl.id}_next_valve",
|
|
496
|
+
ha_type="button",
|
|
497
|
+
payload=ha_irrigation_button_message(
|
|
498
|
+
ctrl.id,
|
|
499
|
+
ctrl.name,
|
|
500
|
+
suffix="next_valve",
|
|
501
|
+
name=f"{ctrl.name} Next Valve",
|
|
502
|
+
payload_press=NEXT_VALVE,
|
|
503
|
+
config_helper=cfg,
|
|
504
|
+
),
|
|
505
|
+
)
|
|
496
506
|
|
|
497
507
|
_pub(
|
|
498
508
|
id=f"{ctrl.id}_pause",
|
boneio/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# flake8: noqa
|
|
2
|
-
__version__ = "1.4.
|
|
2
|
+
__version__ = "1.4.0dev10"
|
boneio/webui/dashboard_cards.py
CHANGED
|
@@ -184,10 +184,40 @@ def slider_tile(
|
|
|
184
184
|
"entity": entity,
|
|
185
185
|
"name": name,
|
|
186
186
|
"icon": icon,
|
|
187
|
-
"
|
|
187
|
+
"vertical": False,
|
|
188
|
+
"features": [{"type": "numeric-input", "style": "slider"}],
|
|
189
|
+
"features_position": "inline",
|
|
188
190
|
}
|
|
189
191
|
|
|
190
192
|
|
|
193
|
+
def inline_tile(
|
|
194
|
+
entity: str,
|
|
195
|
+
features: list[dict[str, Any]] | None = None,
|
|
196
|
+
) -> dict[str, Any]:
|
|
197
|
+
"""Create a compact inline tile card using the entity's HA name.
|
|
198
|
+
|
|
199
|
+
Uses ``name: {type: entity}`` so HA displays the entity's friendly
|
|
200
|
+
name automatically. ``features_position`` is always ``inline``.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
entity: Full HA entity ID.
|
|
204
|
+
features: Optional features list (e.g. ``[{type: numeric-input}]``).
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Inline tile card dict.
|
|
208
|
+
"""
|
|
209
|
+
card: dict[str, Any] = {
|
|
210
|
+
"type": "tile",
|
|
211
|
+
"entity": entity,
|
|
212
|
+
"name": {"type": "entity"},
|
|
213
|
+
"vertical": False,
|
|
214
|
+
"features_position": "inline",
|
|
215
|
+
}
|
|
216
|
+
if features:
|
|
217
|
+
card["features"] = features
|
|
218
|
+
return card
|
|
219
|
+
|
|
220
|
+
|
|
191
221
|
def entities_card(
|
|
192
222
|
entities: list[str | dict[str, Any]],
|
|
193
223
|
title: str = "",
|
|
@@ -551,6 +551,7 @@ from boneio.webui.dashboard_cards import (
|
|
|
551
551
|
entity_badge,
|
|
552
552
|
heading_card,
|
|
553
553
|
horizontal_stack,
|
|
554
|
+
inline_tile,
|
|
554
555
|
sensor_tile,
|
|
555
556
|
slider_tile,
|
|
556
557
|
tile_card,
|
|
@@ -608,55 +609,58 @@ def _generate_irrigation_dashboard_cards(ctrl: Any, serial: str) -> list[dict]:
|
|
|
608
609
|
badges=[entity_badge(main_switch), entity_badge(next_run)],
|
|
609
610
|
))
|
|
610
611
|
|
|
611
|
-
# ── 2. Podlewanie ręczne — valve tiles
|
|
612
|
+
# ── 2. Podlewanie ręczne — valve tiles ──────────────────────────
|
|
612
613
|
cards.append(heading_card("Podlewanie ręczne", style="subtitle"))
|
|
613
|
-
zone_tiles: list[dict] = []
|
|
614
614
|
for zone in ctrl.zones:
|
|
615
615
|
zone_valve = eid("valve", f"zone_{zone.id}")
|
|
616
|
-
|
|
616
|
+
cards.append(tile_card(
|
|
617
617
|
zone_valve, zone.name, "mdi:sprinkler-variant",
|
|
618
618
|
state_content=["last_changed", "state"],
|
|
619
619
|
))
|
|
620
|
-
# Pack tiles into horizontal-stacks of 2
|
|
621
|
-
for i in range(0, len(zone_tiles), 2):
|
|
622
|
-
pair = zone_tiles[i : i + 2]
|
|
623
|
-
if len(pair) == 1:
|
|
624
|
-
cards.append(pair[0])
|
|
625
|
-
else:
|
|
626
|
-
cards.append(horizontal_stack(pair))
|
|
627
620
|
|
|
628
|
-
# ── 3. Czasy podlewania —
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
621
|
+
# ── 3. Czasy podlewania — tile cards with +/- buttons ──────────
|
|
622
|
+
cards.append(heading_card("Czasy podlewania", style="subtitle"))
|
|
623
|
+
for zone in ctrl.zones:
|
|
624
|
+
zone_duration = eid("number", f"zone_{zone.id}_duration")
|
|
625
|
+
cards.append(slider_tile(zone_duration, f"{zone.name} czas"))
|
|
633
626
|
|
|
634
627
|
# ── 4. Ustawienia ─────────────────────────────────────────────────
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
628
|
+
cards.append(heading_card("Ustawienia", style="subtitle"))
|
|
629
|
+
# Multi-zone-only switches
|
|
630
|
+
if len(ctrl.zones) > 1:
|
|
631
|
+
for s in ("auto_advance", "standby", "skip_next_run", "reverse"):
|
|
632
|
+
cards.append(inline_tile(eid("switch", s)))
|
|
633
|
+
else:
|
|
634
|
+
for s in ("standby", "skip_next_run"):
|
|
635
|
+
cards.append(inline_tile(eid("switch", s)))
|
|
636
|
+
cards.append(inline_tile(
|
|
637
|
+
eid("number", "multiplier"),
|
|
638
|
+
features=[{"type": "numeric-input", "style": "buttons"}],
|
|
639
|
+
))
|
|
640
|
+
cards.append(inline_tile(
|
|
641
|
+
eid("number", "repeat"),
|
|
642
|
+
features=[{"type": "numeric-input", "style": "buttons"}],
|
|
643
|
+
))
|
|
644
|
+
# Schedule skip switches (inline, folded into Ustawienia)
|
|
645
|
+
for idx, _sched in enumerate(ctrl._schedule):
|
|
646
|
+
cards.append(inline_tile(eid("switch", f"schedule_{idx}_skip")))
|
|
641
647
|
|
|
642
648
|
# ── 5. Sterowanie ─────────────────────────────────────────────────
|
|
643
|
-
cards.append(
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
eid("button", "next_valve"),
|
|
647
|
-
|
|
649
|
+
cards.append(heading_card("Sterowanie", style="subtitle"))
|
|
650
|
+
control_tiles = []
|
|
651
|
+
if len(ctrl.zones) > 1:
|
|
652
|
+
control_tiles.append(tile_card(eid("button", "next_valve"), "Next valve", "mdi:skip-next"))
|
|
653
|
+
control_tiles.append(tile_card(eid("button", "pause"), "Pause", "mdi:pause"))
|
|
654
|
+
control_tiles.append(tile_card(eid("button", "resume"), "Resume", "mdi:play"))
|
|
655
|
+
cards.append(horizontal_stack(control_tiles))
|
|
648
656
|
|
|
649
657
|
# Water source select (if multiple)
|
|
650
658
|
if len(ctrl.water_sources) > 1:
|
|
651
|
-
cards.append(
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
time_str = sched.get("time", "")
|
|
657
|
-
days_str = sched.get("days", "daily")
|
|
658
|
-
cards.append(entities_card(
|
|
659
|
-
[sched_skip], title=f"Harmonogram {idx + 1}: {time_str} ({days_str})",
|
|
659
|
+
cards.append(heading_card("Źródło wody", style="subtitle"))
|
|
660
|
+
cards.append(tile_card(
|
|
661
|
+
eid("select", "water_source"), "Źródło wody", "mdi:water-pump",
|
|
662
|
+
features=[{"type": "select-options"}],
|
|
663
|
+
features_position="inline",
|
|
660
664
|
))
|
|
661
665
|
|
|
662
666
|
# ── 7. Sensory ────────────────────────────────────────────────────
|
|
@@ -3,7 +3,7 @@ boneio/bonecli.py,sha256=MfkiiMkoIZ98davH3L7IrBvugQbiIpAidWEabn5GZmQ,13160
|
|
|
3
3
|
boneio/const.py,sha256=M981R2gwfjDX3lcoufWOyGlNxvGMESWgXOjVkmJfX60,7208
|
|
4
4
|
boneio/exceptions.py,sha256=cBph-TsLF7FSz6p4wYeMs3pjVmVRaNQRJP82JgYYV-c,810
|
|
5
5
|
boneio/runner.py,sha256=q_3050BKgnDcsT1ChFr9IZrAn2p6EyGp4DFKQy9BVno,17886
|
|
6
|
-
boneio/version.py,sha256=
|
|
6
|
+
boneio/version.py,sha256=4sfGul1aAJUPadvpf2CD68UZzkAG4IOmKwCqixxOQxo,42
|
|
7
7
|
boneio/boards/0.2/input.yaml,sha256=K5EcB44BZ8PxbPnH1izYwJ-ePo8gs4qZttMXhnMnfQ8,1259
|
|
8
8
|
boneio/boards/0.2/output_24_16.yaml,sha256=GQGM3gUK7UobdGL-Ejt9UKdCs1HLPgZ7kziVZ1tjQlA,1462
|
|
9
9
|
boneio/boards/0.2/output_32_10.yaml,sha256=169ubuzRqFLGiOr7zgB1xL1tKdQyOx2FJZvTCkxCA4U,1920
|
|
@@ -99,7 +99,7 @@ boneio/core/manager/canopen.py,sha256=t5CNPFB5CZtAgfm0Maac72fBKHNTEYqu6rwdVKoIjd
|
|
|
99
99
|
boneio/core/manager/covers.py,sha256=es4bxUpUv10XI4S3VmNFXtdXkOn3rcLJnSrjxUYxKr0,20744
|
|
100
100
|
boneio/core/manager/display.py,sha256=MeuCvagebfXsJfr2I3PButkQPhPJQeEAIuTPnn9jMFg,12819
|
|
101
101
|
boneio/core/manager/inputs.py,sha256=0QfLmFu2u-ENtpUglfDYrGTCtR7Neu7iOHlRtbHqPic,41370
|
|
102
|
-
boneio/core/manager/irrigation.py,sha256=
|
|
102
|
+
boneio/core/manager/irrigation.py,sha256=kFTmBa6mKOylV6o2gflPFCZoztuejxlku4C77ggvYwM,25035
|
|
103
103
|
boneio/core/manager/manager.py,sha256=wLKIANaissYd7Q0ihU9Fh2vfStmAsHM88yuMOjAOFC0,81704
|
|
104
104
|
boneio/core/manager/modbus.py,sha256=xkKdn3gQviHubW8VwYq_cW0tCyI31Jna2TcOyxRsNfc,15854
|
|
105
105
|
boneio/core/manager/outputs.py,sha256=XKu4RFcPirdpul89-airVEEBrfQH4ZJlUmCXx6VNNzw,37983
|
|
@@ -325,7 +325,7 @@ boneio/schema/temp_unit.yaml,sha256=m32VGz9RTW92Lz08l9n6RftkcVNZquOGPPr5mc3eZVc,
|
|
|
325
325
|
boneio/schema/update_interval.yaml,sha256=RBuAFj1gGn89ydZkaUUP-f88utvth1Qtt5u6lau2iOc,186
|
|
326
326
|
boneio/webui/action_validation.py,sha256=2tdshl9MpgjHIYXYDV4XHW6lGTZn-05XgicFMWRcny4,7318
|
|
327
327
|
boneio/webui/app.py,sha256=yN53jS8p91hIiwKKJFLprv3nQ6gVhknchF_c9nSbCL4,33123
|
|
328
|
-
boneio/webui/dashboard_cards.py,sha256=
|
|
328
|
+
boneio/webui/dashboard_cards.py,sha256=ssurw3oD5VH3-52AbizTQsRPP-A3Bfyafx_Fd810dw4,7800
|
|
329
329
|
boneio/webui/web_server.py,sha256=EZRUqwLqwLA5kdUZeYuriBY0nCq0Ffmo5f-Dz_eSxxg,9471
|
|
330
330
|
boneio/webui/websocket_manager.py,sha256=MGo_yaXEC-30EB0mvA1dnZ14YZglFZlXBq-vTgl1rlc,6430
|
|
331
331
|
boneio/webui/frontend-dist/boneio-192.png,sha256=2Q-HiAx3kB1yppMriZ46fDZ94Ft_1VpDbZ9EShGUBSo,23489
|
|
@@ -390,7 +390,7 @@ boneio/webui/routes/caddy.py,sha256=zS21OctOueuza_zigWoEz9V9-1S6IN4D77AKI5U7Pd4,
|
|
|
390
390
|
boneio/webui/routes/can.py,sha256=18RVS2pPe_bNeZDcHSmwoLqsdmizjvTf18IdphfmeuU,14660
|
|
391
391
|
boneio/webui/routes/config.py,sha256=Lg70p4CA-k7DcKkSGizTi4IaNWz83O8vT4hr6i9ln9U,52450
|
|
392
392
|
boneio/webui/routes/covers.py,sha256=DtT4hSomRjR2MzBrfBiT0e4T0xbwet49hlpjXGv8vuw,3719
|
|
393
|
-
boneio/webui/routes/irrigation.py,sha256=
|
|
393
|
+
boneio/webui/routes/irrigation.py,sha256=BCJMNtXNqQ0oNGjZJcjlzXS-l17c0x-h_qCYxxe9PQg,26186
|
|
394
394
|
boneio/webui/routes/migrations.py,sha256=Xa2CUg8wvhIRgHkDqd7C9AVVXLfZSLeSA74U62SFkLU,5895
|
|
395
395
|
boneio/webui/routes/modbus.py,sha256=4ZLB0Wrpdf1xLUMGbJXNE7txoHrpi4UPJ-ejrnjcxoA,28401
|
|
396
396
|
boneio/webui/routes/outputs.py,sha256=5ze6qYHYGcM0L0Hsx-4TPX-SG_WkfAWWAvKjaGKxJlQ,6241
|
|
@@ -435,9 +435,9 @@ boneio/webui/schema/virtual_energy_sensor.schema.json,sha256=BN6Egh-CAnXSa80bQ6Y
|
|
|
435
435
|
boneio/webui/schema/web.schema.json,sha256=cactLq1MVwDL5hu8bLeuq5yiz49BWVS4OtjWLmhbw2M,2592
|
|
436
436
|
boneio/webui/services/__init__.py,sha256=l_L3YUPhc0ZbrWqKH1RurC7UQ4q0k-5ABGTwOSS-YFQ,282
|
|
437
437
|
boneio/webui/services/logs.py,sha256=7n596oxeWNIPDyKYdMJXFpH-GCvdKb_YrqTLy6kPBWA,11423
|
|
438
|
-
boneio-1.4.0.
|
|
439
|
-
boneio-1.4.0.
|
|
440
|
-
boneio-1.4.0.
|
|
441
|
-
boneio-1.4.0.
|
|
442
|
-
boneio-1.4.0.
|
|
443
|
-
boneio-1.4.0.
|
|
438
|
+
boneio-1.4.0.dev10.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
439
|
+
boneio-1.4.0.dev10.dist-info/METADATA,sha256=bq4xV70Z3ODICX7nS1utyc2hne3GpEuhUQ8fSZvcadI,1962
|
|
440
|
+
boneio-1.4.0.dev10.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
441
|
+
boneio-1.4.0.dev10.dist-info/entry_points.txt,sha256=JX7gluDIkQ6MBlzzxGHMItnBjciiJ73tsXwYcazMW_U,47
|
|
442
|
+
boneio-1.4.0.dev10.dist-info/top_level.txt,sha256=ag9S5n1_KXZfyk9tN8R0YUDYbdA--e5a2w2FOD_yMdg,7
|
|
443
|
+
boneio-1.4.0.dev10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|