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.
@@ -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
- await self._subscribe_topic(ctrl._setting_cmd_topic("auto_advance"), handle_auto_advance)
342
- await self._subscribe_topic(ctrl._setting_cmd_topic("reverse"), handle_reverse)
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
- _pub(
405
- id=f"{ctrl.id}_auto_advance",
406
- ha_type="switch",
407
- payload=ha_irrigation_switch_message(
408
- ctrl.id,
409
- ctrl.name,
410
- suffix="auto_advance",
411
- name=f"{ctrl.name} Auto Advance",
412
- config_helper=cfg,
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
- _pub(
417
- id=f"{ctrl.id}_reverse",
418
- ha_type="switch",
419
- payload=ha_irrigation_switch_message(
420
- ctrl.id,
421
- ctrl.name,
422
- suffix="reverse",
423
- name=f"{ctrl.name} Reverse",
424
- config_helper=cfg,
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
- _pub(
485
- id=f"{ctrl.id}_next_valve",
486
- ha_type="button",
487
- payload=ha_irrigation_button_message(
488
- ctrl.id,
489
- ctrl.name,
490
- suffix="next_valve",
491
- name=f"{ctrl.name} Next Valve",
492
- payload_press=NEXT_VALVE,
493
- config_helper=cfg,
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.0dev8"
2
+ __version__ = "1.4.0dev10"
@@ -184,10 +184,40 @@ def slider_tile(
184
184
  "entity": entity,
185
185
  "name": name,
186
186
  "icon": icon,
187
- "features": [{"type": "numeric-input", "style": "buttons"}],
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 in rows of 2 ──────────────
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
- zone_tiles.append(tile_card(
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 — inline entities card ────────────────────
629
- duration_entities: list[str] = [
630
- eid("number", f"zone_{zone.id}_duration") for zone in ctrl.zones
631
- ]
632
- cards.append(entities_card(duration_entities, title="Czasy podlewania"))
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
- controls: list[str | dict] = [
636
- eid("switch", s) for s in ("auto_advance", "standby", "skip_next_run", "reverse")
637
- ]
638
- controls.append(eid("number", "multiplier"))
639
- controls.append(eid("number", "repeat"))
640
- cards.append(entities_card(controls, title="Ustawienia"))
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(entities_card([
644
- eid("button", "pause"),
645
- eid("button", "resume"),
646
- eid("button", "next_valve"),
647
- ], title="Sterowanie"))
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(entities_card([eid("select", "water_source")], title="Źródło wody"))
652
-
653
- # ── 6. Harmonogramy ───────────────────────────────────────────────
654
- for idx, sched in enumerate(ctrl._schedule):
655
- sched_skip = eid("switch", f"schedule_{idx}_skip")
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 ────────────────────────────────────────────────────
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.4.0.dev8
3
+ Version: 1.4.0.dev10
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
@@ -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=wzBqnG04PYPRWxDR2HMRsisX8CzxTr1RMyjv4-ekT_I,41
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=UjDPtJq-naNRZGS47qgHMQ0ixkfz6O-Rj8dZPk7UPXk,24513
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=c1V6B2oCoXU8o-4MwgPDO_lYJewXwf0pjj9EykDlvAM,6986
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=HZYVRUim-Mk-RyQCgxZkxgltO9F-nXZopzwisDngBcY,25916
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.dev8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
439
- boneio-1.4.0.dev8.dist-info/METADATA,sha256=jJyXXtfE0Ri6ocp6qgGCH74Q-JaoPwmh2bj1Fgb3qvE,1961
440
- boneio-1.4.0.dev8.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
441
- boneio-1.4.0.dev8.dist-info/entry_points.txt,sha256=JX7gluDIkQ6MBlzzxGHMItnBjciiJ73tsXwYcazMW_U,47
442
- boneio-1.4.0.dev8.dist-info/top_level.txt,sha256=ag9S5n1_KXZfyk9tN8R0YUDYbdA--e5a2w2FOD_yMdg,7
443
- boneio-1.4.0.dev8.dist-info/RECORD,,
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,,