boneIO 1.2.0.dev6__py3-none-any.whl → 1.2.0.dev7__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/components/input/detectors.py +14 -2
- boneio/core/manager/manager.py +48 -14
- boneio/core/manager/remote.py +106 -6
- boneio/core/remote/esphome.py +8 -0
- boneio/core/remote/wled.py +7 -6
- boneio/schema/actions.yaml +31 -7
- boneio/version.py +1 -1
- boneio/webui/frontend-dist/assets/cssMode-D2_GdEHn.js +4 -0
- boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +12 -0
- boneio/webui/frontend-dist/assets/{freemarker2-cdPkYRmQ.js → freemarker2-Ccev9DQ3.js} +1 -1
- boneio/webui/frontend-dist/assets/{handlebars-Cfxm9RW_.js → handlebars-CSWuYUii.js} +1 -1
- boneio/webui/frontend-dist/assets/{html-BHdohU2S.js → html-BeCDD7uj.js} +1 -1
- boneio/webui/frontend-dist/assets/htmlMode-Csqim4tI.js +4 -0
- boneio/webui/frontend-dist/assets/{index-B_8cgKDq.js → index-C6eDye5h.js} +245 -245
- boneio/webui/frontend-dist/assets/{index-BmuRpNYW.css → index-CyjBlAI7.css} +1 -1
- boneio/webui/frontend-dist/assets/{javascript-cpZp1UNX.js → javascript-CNjo7h5s.js} +1 -1
- boneio/webui/frontend-dist/assets/{json.worker-DaRII17c.js → json.worker-aFakAbRR.js} +22 -22
- boneio/webui/frontend-dist/assets/{jsonMode-B0FgVMkj.js → jsonMode-CrofIOf5.js} +1 -1
- boneio/webui/frontend-dist/assets/{liquid-Z_DgQ0VL.js → liquid-DhQWiRQL.js} +1 -1
- boneio/webui/frontend-dist/assets/{mdx-B8hjkANT.js → mdx-B7NfGq9x.js} +1 -1
- boneio/webui/frontend-dist/assets/{python-B-sOgkv5.js → python-CfAzolFq.js} +1 -1
- boneio/webui/frontend-dist/assets/{razor-32kHacmJ.js → razor-nVU9Xllg.js} +1 -1
- boneio/webui/frontend-dist/assets/{tsMode-B4q7c15W.js → tsMode-DUyiY9xo.js} +1 -1
- boneio/webui/frontend-dist/assets/{typescript-C5K4aTtA.js → typescript-Cz5XSgIr.js} +1 -1
- boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
- boneio/webui/frontend-dist/assets/{xml-BR1__-Hi.js → xml-Bf4znVSR.js} +1 -1
- boneio/webui/frontend-dist/assets/{yaml-Bp8ZLmkj.js → yaml-KWLRG-vP.js} +1 -1
- boneio/webui/frontend-dist/assets/{yaml.worker-BTE-_K6g.js → yaml.worker-DBeHcBRc.js} +200 -200
- boneio/webui/frontend-dist/index.html +2 -2
- boneio/webui/frontend-dist/schem/adc.schema.json +8 -8
- boneio/webui/frontend-dist/schem/areas.schema.json +4 -4
- boneio/webui/frontend-dist/schem/binary_sensor.schema.json +86 -48
- boneio/webui/frontend-dist/schem/boneio.schema.json +2 -2
- boneio/webui/frontend-dist/schem/config.schema.json +598 -427
- boneio/webui/frontend-dist/schem/cover.schema.json +4 -4
- boneio/webui/frontend-dist/schem/ds2482.schema.json +4 -4
- boneio/webui/frontend-dist/schem/event.schema.json +288 -155
- boneio/webui/frontend-dist/schem/ina219.schema.json +14 -14
- boneio/webui/frontend-dist/schem/lm75.schema.json +10 -10
- boneio/webui/frontend-dist/schem/logger.schema.json +2 -2
- boneio/webui/frontend-dist/schem/mcp23017.schema.json +6 -6
- boneio/webui/frontend-dist/schem/mcp9808.schema.json +10 -10
- boneio/webui/frontend-dist/schem/modbus.schema.json +8 -8
- boneio/webui/frontend-dist/schem/modbus_devices.schema.json +22 -22
- boneio/webui/frontend-dist/schem/mqtt.schema.json +6 -6
- boneio/webui/frontend-dist/schem/oled.schema.json +8 -8
- boneio/webui/frontend-dist/schem/output.schema.json +10 -10
- boneio/webui/frontend-dist/schem/output_group.schema.json +6 -6
- boneio/webui/frontend-dist/schem/pca9685.schema.json +6 -6
- boneio/webui/frontend-dist/schem/pcf8575.schema.json +6 -6
- boneio/webui/frontend-dist/schem/remote_devices.schema.json +64 -64
- boneio/webui/frontend-dist/schem/sensor.schema.json +8 -8
- boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +4 -4
- boneio/webui/frontend-dist/schem/web.schema.json +12 -12
- boneio/webui/frontend-dist/sw.js +1 -1
- boneio/webui/routes/system.py +88 -14
- boneio/webui/schema/adc.schema.json +8 -8
- boneio/webui/schema/areas.schema.json +4 -4
- boneio/webui/schema/binary_sensor.schema.json +86 -48
- boneio/webui/schema/boneio.schema.json +2 -2
- boneio/webui/schema/config.schema.json +598 -427
- boneio/webui/schema/cover.schema.json +4 -4
- boneio/webui/schema/ds2482.schema.json +4 -4
- boneio/webui/schema/event.schema.json +288 -155
- boneio/webui/schema/ina219.schema.json +14 -14
- boneio/webui/schema/lm75.schema.json +10 -10
- boneio/webui/schema/logger.schema.json +2 -2
- boneio/webui/schema/mcp23017.schema.json +6 -6
- boneio/webui/schema/mcp9808.schema.json +10 -10
- boneio/webui/schema/modbus.schema.json +8 -8
- boneio/webui/schema/modbus_devices.schema.json +22 -22
- boneio/webui/schema/mqtt.schema.json +6 -6
- boneio/webui/schema/oled.schema.json +8 -8
- boneio/webui/schema/output.schema.json +10 -10
- boneio/webui/schema/output_group.schema.json +6 -6
- boneio/webui/schema/pca9685.schema.json +6 -6
- boneio/webui/schema/pcf8575.schema.json +6 -6
- boneio/webui/schema/remote_devices.schema.json +64 -64
- boneio/webui/schema/sensor.schema.json +8 -8
- boneio/webui/schema/virtual_energy_sensor.schema.json +4 -4
- boneio/webui/schema/web.schema.json +12 -12
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/METADATA +1 -1
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/RECORD +87 -87
- boneio/webui/frontend-dist/assets/cssMode-CvZwGOXM.js +0 -4
- boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -12
- boneio/webui/frontend-dist/assets/htmlMode-D09isE-q.js +0 -4
- boneio/webui/frontend-dist/assets/workbox-window.prod.es5-vqzQaGvo.js +0 -2
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/WHEEL +0 -0
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/entry_points.txt +0 -0
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/licenses/LICENSE +0 -0
- {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/top_level.txt +0 -0
|
@@ -470,7 +470,7 @@ class MultiClickDetector:
|
|
|
470
470
|
elif event.event_type is event.Type.RISING_EDGE:
|
|
471
471
|
# Button released (RISING_EDGE on BeagleBone with pull-up)
|
|
472
472
|
|
|
473
|
-
# Software debounce
|
|
473
|
+
# Software debounce (release-vs-release)
|
|
474
474
|
if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
|
|
475
475
|
delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
|
|
476
476
|
_LOGGER.debug(
|
|
@@ -479,8 +479,20 @@ class MultiClickDetector:
|
|
|
479
479
|
delta_ms,
|
|
480
480
|
)
|
|
481
481
|
return
|
|
482
|
+
|
|
483
|
+
# Cross-debounce: ignore release too close to press (bounce on rising edge)
|
|
484
|
+
if self._state.last_press_ts and (timestamp_s - self._state.last_press_ts) < self._debounce_seconds:
|
|
485
|
+
delta_ms = (timestamp_s - self._state.last_press_ts) * 1000
|
|
486
|
+
_LOGGER.debug(
|
|
487
|
+
"Ignoring bounced release on %s (%.3f ms since press, debounce %.3f ms)",
|
|
488
|
+
self._name,
|
|
489
|
+
delta_ms,
|
|
490
|
+
self._debounce_seconds * 1000,
|
|
491
|
+
)
|
|
492
|
+
return
|
|
482
493
|
|
|
483
|
-
|
|
494
|
+
press_duration_ms = (timestamp_s - self._state.last_press_ts) * 1000 if self._state.last_press_ts else 0
|
|
495
|
+
_LOGGER.debug("RELEASED: %s (%s) after %.1f ms", self._name, self._pin, press_duration_ms)
|
|
484
496
|
self._state.last_release_ts = timestamp_s
|
|
485
497
|
|
|
486
498
|
_LOGGER.debug(
|
boneio/core/manager/manager.py
CHANGED
|
@@ -440,7 +440,12 @@ class Manager:
|
|
|
440
440
|
parsed_action[key] = action_definition[key]
|
|
441
441
|
if action_definition.get("repeat"):
|
|
442
442
|
parsed_action["repeat"] = True
|
|
443
|
-
|
|
443
|
+
ri = action_definition.get("repeat_interval", 1000)
|
|
444
|
+
# TimePeriod object from schema validation -> convert to ms
|
|
445
|
+
if hasattr(ri, "total_milliseconds"):
|
|
446
|
+
parsed_action["repeat_interval"] = ri.total_milliseconds
|
|
447
|
+
else:
|
|
448
|
+
parsed_action["repeat_interval"] = ri
|
|
444
449
|
|
|
445
450
|
parsed_actions = {}
|
|
446
451
|
for click_type in actions:
|
|
@@ -552,6 +557,15 @@ class Manager:
|
|
|
552
557
|
"output_id": output_id,
|
|
553
558
|
"action_output": action_output,
|
|
554
559
|
}
|
|
560
|
+
# Copy optional light/WLED parameters
|
|
561
|
+
for opt_key in (
|
|
562
|
+
"brightness", "color_temp", "rgb", "transition",
|
|
563
|
+
"effect", "palette", "effect_speed", "effect_intensity",
|
|
564
|
+
"colors", "presets",
|
|
565
|
+
):
|
|
566
|
+
val = action_definition.get(opt_key)
|
|
567
|
+
if val is not None:
|
|
568
|
+
parsed_action[opt_key] = val
|
|
555
569
|
_copy_long_press_meta(parsed_action, action_definition)
|
|
556
570
|
parsed_actions[click_type].append(parsed_action)
|
|
557
571
|
continue
|
|
@@ -724,19 +738,39 @@ class Manager:
|
|
|
724
738
|
remote_device_id = action_definition.get("remote_device")
|
|
725
739
|
output_id = action_definition.get("output_id")
|
|
726
740
|
action_output = action_definition.get("action_output", "TOGGLE")
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
741
|
+
|
|
742
|
+
if action_output == "CYCLE_COLOR":
|
|
743
|
+
await self.remote_devices.cycle_color(
|
|
744
|
+
device_id=remote_device_id,
|
|
745
|
+
output_id=output_id,
|
|
746
|
+
colors=action_definition.get("colors", []),
|
|
747
|
+
action_idx=idx,
|
|
748
|
+
transition=action_definition.get("transition"),
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
elif action_output == "CYCLE_PRESET":
|
|
752
|
+
await self.remote_devices.cycle_preset(
|
|
753
|
+
device_id=remote_device_id,
|
|
754
|
+
output_id=output_id,
|
|
755
|
+
presets=action_definition.get("presets", []),
|
|
756
|
+
action_idx=idx,
|
|
757
|
+
transition=action_definition.get("transition"),
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
else:
|
|
761
|
+
await self.remote_devices.control_output(
|
|
762
|
+
device_id=remote_device_id,
|
|
763
|
+
output_id=output_id,
|
|
764
|
+
action=action_output,
|
|
765
|
+
brightness=action_definition.get("brightness"),
|
|
766
|
+
color_temp=action_definition.get("color_temp"),
|
|
767
|
+
rgb=action_definition.get("rgb"),
|
|
768
|
+
transition=action_definition.get("transition"),
|
|
769
|
+
effect=action_definition.get("effect"),
|
|
770
|
+
palette=action_definition.get("palette"),
|
|
771
|
+
effect_speed=action_definition.get("effect_speed"),
|
|
772
|
+
effect_intensity=action_definition.get("effect_intensity"),
|
|
773
|
+
)
|
|
740
774
|
|
|
741
775
|
elif action == REMOTE_COVER:
|
|
742
776
|
# Control cover on remote device (BoneIO MQTT or ESPHome API)
|
boneio/core/manager/remote.py
CHANGED
|
@@ -64,6 +64,9 @@ class RemoteDeviceManager:
|
|
|
64
64
|
self._autodiscovered_devices: dict[str, MQTTRemoteDevice] = {}
|
|
65
65
|
# Track devices that manage this boneIO (received via discovery/managed_by topic)
|
|
66
66
|
self._managed_by_devices: dict[str, dict[str, Any]] = {}
|
|
67
|
+
# Cycle state for CYCLE_COLOR and CYCLE_PRESET actions
|
|
68
|
+
# Key: "device_id:output_id:type:action_idx", Value: current index
|
|
69
|
+
self._cycle_state: dict[str, int] = {}
|
|
67
70
|
|
|
68
71
|
if remote_devices_config:
|
|
69
72
|
self._configure_devices(remote_devices_config)
|
|
@@ -335,14 +338,18 @@ class RemoteDeviceManager:
|
|
|
335
338
|
"""Stop all persistent connections.
|
|
336
339
|
|
|
337
340
|
This should be called during application shutdown.
|
|
341
|
+
Closes ESPHome connections and WLED aiohttp sessions.
|
|
338
342
|
"""
|
|
339
343
|
for device_id, device in self._devices.items():
|
|
340
|
-
|
|
341
|
-
|
|
344
|
+
try:
|
|
345
|
+
if isinstance(device, ESPHomeRemoteDevice):
|
|
342
346
|
await device.disconnect()
|
|
343
347
|
_LOGGER.info("Stopped connection for ESPHome device '%s'", device_id)
|
|
344
|
-
|
|
345
|
-
|
|
348
|
+
elif isinstance(device, WLEDRemoteDevice):
|
|
349
|
+
await device.close()
|
|
350
|
+
_LOGGER.info("Closed session for WLED device '%s'", device_id)
|
|
351
|
+
except Exception as e:
|
|
352
|
+
_LOGGER.error("Failed to stop connection for device '%s': %s", device_id, e)
|
|
346
353
|
|
|
347
354
|
def get_device(self, device_id: str) -> RemoteDevice | None:
|
|
348
355
|
"""Get remote device by ID.
|
|
@@ -372,7 +379,7 @@ class RemoteDeviceManager:
|
|
|
372
379
|
color_temp: int | None = None,
|
|
373
380
|
rgb: list[int] | tuple[int, int, int] | None = None,
|
|
374
381
|
transition: float | None = None,
|
|
375
|
-
effect: int | None = None,
|
|
382
|
+
effect: int | str | None = None,
|
|
376
383
|
palette: int | None = None,
|
|
377
384
|
effect_speed: int | None = None,
|
|
378
385
|
effect_intensity: int | None = None,
|
|
@@ -391,7 +398,7 @@ class RemoteDeviceManager:
|
|
|
391
398
|
color_temp: Color temperature in mireds - only for ESPHome lights
|
|
392
399
|
rgb: RGB color as [R, G, B] list or tuple (0-255 each) - for ESPHome/WLED lights
|
|
393
400
|
transition: Transition time in seconds - for ESPHome/WLED lights
|
|
394
|
-
effect:
|
|
401
|
+
effect: Effect name (str for ESPHome) or effect ID (int for WLED)
|
|
395
402
|
palette: WLED color palette ID
|
|
396
403
|
effect_speed: WLED effect speed (0-255)
|
|
397
404
|
effect_intensity: WLED effect intensity (0-255)
|
|
@@ -413,6 +420,8 @@ class RemoteDeviceManager:
|
|
|
413
420
|
rgb_tuple: tuple[int, int, int] | None = None
|
|
414
421
|
if rgb and len(rgb) >= 3:
|
|
415
422
|
rgb_tuple = (int(rgb[0]), int(rgb[1]), int(rgb[2]))
|
|
423
|
+
# For ESPHome, effect must be a string
|
|
424
|
+
esphome_effect = str(effect) if effect is not None else None
|
|
416
425
|
return await device.control_light(
|
|
417
426
|
light_id=output_id,
|
|
418
427
|
action=action,
|
|
@@ -420,6 +429,7 @@ class RemoteDeviceManager:
|
|
|
420
429
|
color_temp=color_temp,
|
|
421
430
|
rgb=rgb_tuple,
|
|
422
431
|
transition=transition if transition is not None else 0.0,
|
|
432
|
+
effect=esphome_effect,
|
|
423
433
|
)
|
|
424
434
|
# Otherwise treat as switch
|
|
425
435
|
_LOGGER.debug("Controlling ESPHome switch '%s' on device '%s'", output_id, device_id)
|
|
@@ -456,6 +466,96 @@ class RemoteDeviceManager:
|
|
|
456
466
|
message_bus=self._message_bus,
|
|
457
467
|
)
|
|
458
468
|
|
|
469
|
+
async def cycle_color(
|
|
470
|
+
self,
|
|
471
|
+
device_id: str,
|
|
472
|
+
output_id: str,
|
|
473
|
+
colors: list[list[int]],
|
|
474
|
+
action_idx: int = 0,
|
|
475
|
+
transition: float | None = None,
|
|
476
|
+
) -> bool:
|
|
477
|
+
"""Cycle through a list of RGB colors on a remote device light.
|
|
478
|
+
|
|
479
|
+
Each call advances to the next color in the list, wrapping around.
|
|
480
|
+
|
|
481
|
+
Args:
|
|
482
|
+
device_id: ID of the remote device
|
|
483
|
+
output_id: ID of the light to control
|
|
484
|
+
colors: List of RGB colors, each as [R, G, B] (0-255)
|
|
485
|
+
action_idx: Action index for unique cycle state tracking
|
|
486
|
+
transition: Transition time in seconds
|
|
487
|
+
|
|
488
|
+
Returns:
|
|
489
|
+
True if command was sent successfully
|
|
490
|
+
"""
|
|
491
|
+
if not colors:
|
|
492
|
+
_LOGGER.warning("CYCLE_COLOR: no colors defined for %s:%s", device_id, output_id)
|
|
493
|
+
return False
|
|
494
|
+
|
|
495
|
+
cycle_key = f"{device_id}:{output_id}:color:{action_idx}"
|
|
496
|
+
cycle_idx = self._cycle_state.get(cycle_key, 0) % len(colors)
|
|
497
|
+
rgb = colors[cycle_idx]
|
|
498
|
+
self._cycle_state[cycle_key] = cycle_idx + 1
|
|
499
|
+
|
|
500
|
+
_LOGGER.debug(
|
|
501
|
+
"CYCLE_COLOR: %s:%s -> color %d/%d = %s",
|
|
502
|
+
device_id, output_id, cycle_idx + 1, len(colors), rgb
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
return await self.control_output(
|
|
506
|
+
device_id=device_id,
|
|
507
|
+
output_id=output_id,
|
|
508
|
+
action="ON",
|
|
509
|
+
rgb=rgb,
|
|
510
|
+
transition=transition,
|
|
511
|
+
)
|
|
512
|
+
|
|
513
|
+
async def cycle_preset(
|
|
514
|
+
self,
|
|
515
|
+
device_id: str,
|
|
516
|
+
output_id: str,
|
|
517
|
+
presets: list[str | int],
|
|
518
|
+
action_idx: int = 0,
|
|
519
|
+
transition: float | None = None,
|
|
520
|
+
) -> bool:
|
|
521
|
+
"""Cycle through a list of effects/presets on a remote device light.
|
|
522
|
+
|
|
523
|
+
Each call advances to the next preset in the list, wrapping around.
|
|
524
|
+
For ESPHome: presets are effect name strings.
|
|
525
|
+
For WLED: presets are effect IDs (integers).
|
|
526
|
+
|
|
527
|
+
Args:
|
|
528
|
+
device_id: ID of the remote device
|
|
529
|
+
output_id: ID of the light to control
|
|
530
|
+
presets: List of effect names (str) or effect IDs (int)
|
|
531
|
+
action_idx: Action index for unique cycle state tracking
|
|
532
|
+
transition: Transition time in seconds
|
|
533
|
+
|
|
534
|
+
Returns:
|
|
535
|
+
True if command was sent successfully
|
|
536
|
+
"""
|
|
537
|
+
if not presets:
|
|
538
|
+
_LOGGER.warning("CYCLE_PRESET: no presets defined for %s:%s", device_id, output_id)
|
|
539
|
+
return False
|
|
540
|
+
|
|
541
|
+
cycle_key = f"{device_id}:{output_id}:preset:{action_idx}"
|
|
542
|
+
cycle_idx = self._cycle_state.get(cycle_key, 0) % len(presets)
|
|
543
|
+
preset = presets[cycle_idx]
|
|
544
|
+
self._cycle_state[cycle_key] = cycle_idx + 1
|
|
545
|
+
|
|
546
|
+
_LOGGER.debug(
|
|
547
|
+
"CYCLE_PRESET: %s:%s -> preset %d/%d = %s",
|
|
548
|
+
device_id, output_id, cycle_idx + 1, len(presets), preset
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
return await self.control_output(
|
|
552
|
+
device_id=device_id,
|
|
553
|
+
output_id=output_id,
|
|
554
|
+
action="ON",
|
|
555
|
+
effect=preset,
|
|
556
|
+
transition=transition,
|
|
557
|
+
)
|
|
558
|
+
|
|
459
559
|
async def control_cover(
|
|
460
560
|
self,
|
|
461
561
|
device_id: str,
|
boneio/core/remote/esphome.py
CHANGED
|
@@ -505,6 +505,9 @@ class ESPHomeRemoteDevice(RemoteDevice):
|
|
|
505
505
|
if (mode & LightColorCapability.RGB) and (mode & LightColorCapability.WHITE):
|
|
506
506
|
supports_rgbw = True
|
|
507
507
|
|
|
508
|
+
# Get effects list from LightInfo
|
|
509
|
+
effects_list = list(getattr(entity, 'effects', []))
|
|
510
|
+
|
|
508
511
|
light_data = {
|
|
509
512
|
"id": entity.object_id,
|
|
510
513
|
"name": entity.name,
|
|
@@ -515,6 +518,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
|
|
|
515
518
|
"supports_rgbw": supports_rgbw,
|
|
516
519
|
"min_mireds": getattr(entity, 'min_mireds', None),
|
|
517
520
|
"max_mireds": getattr(entity, 'max_mireds', None),
|
|
521
|
+
"effects": effects_list,
|
|
518
522
|
}
|
|
519
523
|
|
|
520
524
|
result["lights"].append(light_data)
|
|
@@ -625,6 +629,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
|
|
|
625
629
|
color_temp: int | None = None,
|
|
626
630
|
rgb: tuple[int, int, int] | None = None,
|
|
627
631
|
transition: float = 0.0,
|
|
632
|
+
effect: str | None = None,
|
|
628
633
|
) -> bool:
|
|
629
634
|
"""Control a light on the ESPHome device.
|
|
630
635
|
|
|
@@ -635,6 +640,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
|
|
|
635
640
|
color_temp: Color temperature in mireds
|
|
636
641
|
rgb: RGB color tuple (0-255 each)
|
|
637
642
|
transition: Transition time in seconds
|
|
643
|
+
effect: Effect name string (e.g. "Rainbow", "Strobe")
|
|
638
644
|
|
|
639
645
|
Returns:
|
|
640
646
|
True if command was sent successfully
|
|
@@ -669,6 +675,8 @@ class ESPHomeRemoteDevice(RemoteDevice):
|
|
|
669
675
|
cmd_kwargs["color_temperature"] = color_temp
|
|
670
676
|
if rgb is not None:
|
|
671
677
|
cmd_kwargs["rgb"] = tuple(c / 255.0 for c in rgb)
|
|
678
|
+
if effect is not None:
|
|
679
|
+
cmd_kwargs["effect"] = effect
|
|
672
680
|
self._client.light_command(light_key, **cmd_kwargs)
|
|
673
681
|
|
|
674
682
|
elif action_upper == "TOGGLE":
|
boneio/core/remote/wled.py
CHANGED
|
@@ -135,6 +135,13 @@ class WLEDRemoteDevice(RemoteDevice):
|
|
|
135
135
|
return seg
|
|
136
136
|
return None
|
|
137
137
|
|
|
138
|
+
async def close(self) -> None:
|
|
139
|
+
"""Close aiohttp session."""
|
|
140
|
+
if self._session and not self._session.closed:
|
|
141
|
+
await self._session.close()
|
|
142
|
+
self._session = None
|
|
143
|
+
_LOGGER.debug("Closed aiohttp session for WLED '%s'", self._name)
|
|
144
|
+
|
|
138
145
|
async def _get_session(self) -> aiohttp.ClientSession:
|
|
139
146
|
"""Get or create aiohttp session."""
|
|
140
147
|
if self._session is None or self._session.closed:
|
|
@@ -425,12 +432,6 @@ class WLEDRemoteDevice(RemoteDevice):
|
|
|
425
432
|
_LOGGER.error("WLED discovery unexpected error for %s: %s", self._host, e)
|
|
426
433
|
return {"error": str(e)}
|
|
427
434
|
|
|
428
|
-
async def close(self) -> None:
|
|
429
|
-
"""Close HTTP session."""
|
|
430
|
-
if self._session and not self._session.closed:
|
|
431
|
-
await self._session.close()
|
|
432
|
-
self._session = None
|
|
433
|
-
|
|
434
435
|
def to_dict(self) -> dict[str, Any]:
|
|
435
436
|
"""Convert to dictionary representation.
|
|
436
437
|
|
boneio/schema/actions.yaml
CHANGED
|
@@ -64,7 +64,7 @@ schema:
|
|
|
64
64
|
action: ['output', 'output_over_mqtt', 'remote_output']
|
|
65
65
|
forbidden_if:
|
|
66
66
|
action: ['cover', 'mqtt', 'cover_over_mqtt', 'remote_cover']
|
|
67
|
-
allowed: ['TOGGLE', 'ON', 'OFF', 'BRIGHTNESS_UP', 'BRIGHTNESS_DOWN', 'SET_BRIGHTNESS']
|
|
67
|
+
allowed: ['TOGGLE', 'ON', 'OFF', 'BRIGHTNESS_UP', 'BRIGHTNESS_DOWN', 'SET_BRIGHTNESS', 'CYCLE_COLOR', 'CYCLE_PRESET']
|
|
68
68
|
coerce: action_field
|
|
69
69
|
default: TOGGLE
|
|
70
70
|
case_insensitive: true
|
|
@@ -75,6 +75,8 @@ schema:
|
|
|
75
75
|
- BRIGHTNESS_UP: Increase brightness by 10%
|
|
76
76
|
- BRIGHTNESS_DOWN: Decrease brightness by 10%
|
|
77
77
|
- SET_BRIGHTNESS: Set specific brightness (requires brightness field)
|
|
78
|
+
- CYCLE_COLOR: Cycle through a list of RGB colors on each press (requires colors field)
|
|
79
|
+
- CYCLE_PRESET: Cycle through a list of effects/presets on each press (requires presets field)
|
|
78
80
|
action_mqtt_msg:
|
|
79
81
|
type: string
|
|
80
82
|
required_if:
|
|
@@ -166,6 +168,28 @@ schema:
|
|
|
166
168
|
label: Transition Time (seconds)
|
|
167
169
|
description: "Time in seconds to transition to the new state. Only for ESPHome lights."
|
|
168
170
|
|
|
171
|
+
# Cycle color/preset support
|
|
172
|
+
colors:
|
|
173
|
+
type: list
|
|
174
|
+
required: False
|
|
175
|
+
meta:
|
|
176
|
+
label: Color List for CYCLE_COLOR
|
|
177
|
+
description: |
|
|
178
|
+
List of RGB colors to cycle through on each press.
|
|
179
|
+
Each color is a list of [R, G, B] values (0-255).
|
|
180
|
+
Only used when action_output is CYCLE_COLOR.
|
|
181
|
+
Example: [[255, 0, 0], [0, 255, 0], [0, 0, 255]]
|
|
182
|
+
presets:
|
|
183
|
+
type: list
|
|
184
|
+
required: False
|
|
185
|
+
meta:
|
|
186
|
+
label: Preset/Effect List for CYCLE_PRESET
|
|
187
|
+
description: |
|
|
188
|
+
List of effect names (ESPHome) or effect IDs (WLED) to cycle through on each press.
|
|
189
|
+
For ESPHome: list of effect name strings, e.g. ["Rainbow", "Strobe", "Color Wipe"]
|
|
190
|
+
For WLED: list of effect IDs (integers), e.g. [0, 9, 47]
|
|
191
|
+
Only used when action_output is CYCLE_PRESET.
|
|
192
|
+
|
|
169
193
|
# Repeat support for long press actions
|
|
170
194
|
repeat:
|
|
171
195
|
type: boolean
|
|
@@ -178,13 +202,13 @@ schema:
|
|
|
178
202
|
Only effective for actions under the 'long' click type.
|
|
179
203
|
Example: brightness_up with repeat will increase brightness continuously while holding.
|
|
180
204
|
repeat_interval:
|
|
181
|
-
type:
|
|
205
|
+
type: timeperiod
|
|
206
|
+
coerce: positive_time_period
|
|
182
207
|
required: False
|
|
183
|
-
default:
|
|
184
|
-
min: 200
|
|
208
|
+
default: 800ms
|
|
185
209
|
meta:
|
|
186
|
-
label: Repeat Interval
|
|
210
|
+
label: Repeat Interval
|
|
187
211
|
description: |
|
|
188
|
-
Minimum interval
|
|
189
|
-
Only used when repeat is true. Default:
|
|
212
|
+
Minimum interval between repeated executions.
|
|
213
|
+
Only used when repeat is true. Default: 800ms.
|
|
190
214
|
Minimum: 200ms (matches periodic event interval).
|
boneio/version.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# flake8: noqa
|
|
2
|
-
__version__ = "1.2.
|
|
2
|
+
__version__ = "1.2.0dev7"
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{m as et}from"./index-C6eDye5h.js";var tt=Object.defineProperty,rt=Object.getOwnPropertyDescriptor,nt=Object.getOwnPropertyNames,it=Object.prototype.hasOwnProperty,ot=(e,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of nt(n))!it.call(e,t)&&t!==i&&tt(e,t,{get:()=>n[t],enumerable:!(r=rt(n,t))||r.enumerable});return e},at=(e,n,i)=>(ot(e,n,"default"),i),d={};at(d,et);var st=120*1e3,ut=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>st&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let n;return this._getClient().then(i=>{n=i}).then(i=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(i=>n)}},T;(function(e){function n(i){return typeof i=="string"}e.is=n})(T||(T={}));var O;(function(e){function n(i){return typeof i=="string"}e.is=n})(O||(O={}));var Y;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(Y||(Y={}));var M;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(M||(M={}));var w;(function(e){function n(r,t){return r===Number.MAX_VALUE&&(r=M.MAX_VALUE),t===Number.MAX_VALUE&&(t=M.MAX_VALUE),{line:r,character:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.line)&&a.uinteger(t.character)}e.is=i})(w||(w={}));var h;(function(e){function n(r,t,o,s){if(a.uinteger(r)&&a.uinteger(t)&&a.uinteger(o)&&a.uinteger(s))return{start:w.create(r,t),end:w.create(o,s)};if(w.is(r)&&w.is(t))return{start:r,end:t};throw new Error(`Range#create called with invalid arguments[${r}, ${t}, ${o}, ${s}]`)}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&w.is(t.start)&&w.is(t.end)}e.is=i})(h||(h={}));var C;(function(e){function n(r,t){return{uri:r,range:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(a.string(t.uri)||a.undefined(t.uri))}e.is=i})(C||(C={}));var Z;(function(e){function n(r,t,o,s){return{targetUri:r,targetRange:t,targetSelectionRange:o,originSelectionRange:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.targetRange)&&a.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||a.undefined(t.originSelectionRange))}e.is=i})(Z||(Z={}));var S;(function(e){function n(r,t,o,s){return{red:r,green:t,blue:o,alpha:s}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.numberRange(t.red,0,1)&&a.numberRange(t.green,0,1)&&a.numberRange(t.blue,0,1)&&a.numberRange(t.alpha,0,1)}e.is=i})(S||(S={}));var K;(function(e){function n(r,t){return{range:r,color:t}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&h.is(t.range)&&S.is(t.color)}e.is=i})(K||(K={}));var ee;(function(e){function n(r,t,o){return{label:r,textEdit:t,additionalTextEdits:o}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.undefined(t.textEdit)||E.is(t))&&(a.undefined(t.additionalTextEdits)||a.typedArray(t.additionalTextEdits,E.is))}e.is=i})(ee||(ee={}));var A;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(A||(A={}));var te;(function(e){function n(r,t,o,s,u,f){const c={startLine:r,endLine:t};return a.defined(o)&&(c.startCharacter=o),a.defined(s)&&(c.endCharacter=s),a.defined(u)&&(c.kind=u),a.defined(f)&&(c.collapsedText=f),c}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.uinteger(t.startLine)&&a.uinteger(t.startLine)&&(a.undefined(t.startCharacter)||a.uinteger(t.startCharacter))&&(a.undefined(t.endCharacter)||a.uinteger(t.endCharacter))&&(a.undefined(t.kind)||a.string(t.kind))}e.is=i})(te||(te={}));var U;(function(e){function n(r,t){return{location:r,message:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&C.is(t.location)&&a.string(t.message)}e.is=i})(U||(U={}));var x;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(x||(x={}));var re;(function(e){e.Unnecessary=1,e.Deprecated=2})(re||(re={}));var ne;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&a.string(r.href)}e.is=n})(ne||(ne={}));var y;(function(e){function n(r,t,o,s,u,f){let c={range:r,message:t};return a.defined(o)&&(c.severity=o),a.defined(s)&&(c.code=s),a.defined(u)&&(c.source=u),a.defined(f)&&(c.relatedInformation=f),c}e.create=n;function i(r){var t;let o=r;return a.defined(o)&&h.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((t=o.codeDescription)===null||t===void 0?void 0:t.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,U.is))}e.is=i})(y||(y={}));var I;(function(e){function n(r,t,...o){let s={title:r,command:t};return a.defined(o)&&o.length>0&&(s.arguments=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.title)&&a.string(t.command)}e.is=i})(I||(I={}));var E;(function(e){function n(o,s){return{range:o,newText:s}}e.replace=n;function i(o,s){return{range:{start:o,end:o},newText:s}}e.insert=i;function r(o){return{range:o,newText:""}}e.del=r;function t(o){const s=o;return a.objectLiteral(s)&&a.string(s.newText)&&h.is(s.range)}e.is=t})(E||(E={}));var V;(function(e){function n(r,t,o){const s={label:r};return t!==void 0&&(s.needsConfirmation=t),o!==void 0&&(s.description=o),s}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(a.string(t.description)||t.description===void 0)}e.is=i})(V||(V={}));var L;(function(e){function n(i){const r=i;return a.string(r)}e.is=n})(L||(L={}));var ie;(function(e){function n(o,s,u){return{range:o,newText:s,annotationId:u}}e.replace=n;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}e.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}e.del=r;function t(o){const s=o;return E.is(s)&&(V.is(s.annotationId)||L.is(s.annotationId))}e.is=t})(ie||(ie={}));var W;(function(e){function n(r,t){return{textDocument:r,edits:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&B.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(W||(W={}));var H;(function(e){function n(r,t,o){let s={kind:"create",uri:r};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="create"&&a.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(H||(H={}));var X;(function(e){function n(r,t,o,s){let u={kind:"rename",oldUri:r,newUri:t};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}e.create=n;function i(r){let t=r;return t&&t.kind==="rename"&&a.string(t.oldUri)&&a.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(X||(X={}));var $;(function(e){function n(r,t,o){let s={kind:"delete",uri:r};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="delete"&&a.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||a.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||a.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})($||($={}));var z;(function(e){function n(i){let r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(t=>a.string(t.kind)?H.is(t)||X.is(t)||$.is(t):W.is(t)))}e.is=n})(z||(z={}));var oe;(function(e){function n(r){return{uri:r}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)}e.is=i})(oe||(oe={}));var ae;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.integer(t.version)}e.is=i})(ae||(ae={}));var B;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&(t.version===null||a.integer(t.version))}e.is=i})(B||(B={}));var se;(function(e){function n(r,t,o,s){return{uri:r,languageId:t,version:o,text:s}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.string(t.languageId)&&a.integer(t.version)&&a.string(t.text)}e.is=i})(se||(se={}));var q;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function n(i){const r=i;return r===e.PlainText||r===e.Markdown}e.is=n})(q||(q={}));var P;(function(e){function n(i){const r=i;return a.objectLiteral(i)&&q.is(r.kind)&&a.string(r.value)}e.is=n})(P||(P={}));var v;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(v||(v={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var ue;(function(e){e.Deprecated=1})(ue||(ue={}));var ce;(function(e){function n(r,t,o){return{newText:r,insert:t,replace:o}}e.create=n;function i(r){const t=r;return t&&a.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(ce||(ce={}));var de;(function(e){e.asIs=1,e.adjustIndentation=2})(de||(de={}));var le;(function(e){function n(i){const r=i;return r&&(a.string(r.detail)||r.detail===void 0)&&(a.string(r.description)||r.description===void 0)}e.is=n})(le||(le={}));var fe;(function(e){function n(i){return{label:i}}e.create=n})(fe||(fe={}));var ge;(function(e){function n(i,r){return{items:i||[],isIncomplete:!!r}}e.create=n})(ge||(ge={}));var F;(function(e){function n(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=n;function i(r){const t=r;return a.string(t)||a.objectLiteral(t)&&a.string(t.language)&&a.string(t.value)}e.is=i})(F||(F={}));var he;(function(e){function n(i){let r=i;return!!r&&a.objectLiteral(r)&&(P.is(r.contents)||F.is(r.contents)||a.typedArray(r.contents,F.is))&&(i.range===void 0||h.is(i.range))}e.is=n})(he||(he={}));var ve;(function(e){function n(i,r){return r?{label:i,documentation:r}:{label:i}}e.create=n})(ve||(ve={}));var pe;(function(e){function n(i,r,...t){let o={label:i};return a.defined(r)&&(o.documentation=r),a.defined(t)?o.parameters=t:o.parameters=[],o}e.create=n})(pe||(pe={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var me;(function(e){function n(i,r){let t={range:i};return a.number(r)&&(t.kind=r),t}e.create=n})(me||(me={}));var p;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(p||(p={}));var _e;(function(e){e.Deprecated=1})(_e||(_e={}));var be;(function(e){function n(i,r,t,o,s){let u={name:i,kind:r,location:{uri:o,range:t}};return s&&(u.containerName=s),u}e.create=n})(be||(be={}));var we;(function(e){function n(i,r,t,o){return o!==void 0?{name:i,kind:r,location:{uri:t,range:o}}:{name:i,kind:r,location:{uri:t}}}e.create=n})(we||(we={}));var ke;(function(e){function n(r,t,o,s,u,f){let c={name:r,detail:t,kind:o,range:s,selectionRange:u};return f!==void 0&&(c.children=f),c}e.create=n;function i(r){let t=r;return t&&a.string(t.name)&&a.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||a.string(t.detail))&&(t.deprecated===void 0||a.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ke||(ke={}));var xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(xe||(xe={}));var j;(function(e){e.Invoked=1,e.Automatic=2})(j||(j={}));var Ie;(function(e){function n(r,t,o){let s={diagnostics:r};return t!=null&&(s.only=t),o!=null&&(s.triggerKind=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.typedArray(t.diagnostics,y.is)&&(t.only===void 0||a.typedArray(t.only,a.string))&&(t.triggerKind===void 0||t.triggerKind===j.Invoked||t.triggerKind===j.Automatic)}e.is=i})(Ie||(Ie={}));var Ee;(function(e){function n(r,t,o){let s={title:r},u=!0;return typeof t=="string"?(u=!1,s.kind=t):I.is(t)?s.command=t:s.edit=t,u&&o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return t&&a.string(t.title)&&(t.diagnostics===void 0||a.typedArray(t.diagnostics,y.is))&&(t.kind===void 0||a.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||I.is(t.command))&&(t.isPreferred===void 0||a.boolean(t.isPreferred))&&(t.edit===void 0||z.is(t.edit))}e.is=i})(Ee||(Ee={}));var Le;(function(e){function n(r,t){let o={range:r};return a.defined(t)&&(o.data=t),o}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.command)||I.is(t.command))}e.is=i})(Le||(Le={}));var Ae;(function(e){function n(r,t){return{tabSize:r,insertSpaces:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.uinteger(t.tabSize)&&a.boolean(t.insertSpaces)}e.is=i})(Ae||(Ae={}));var Re;(function(e){function n(r,t,o){return{range:r,target:t,data:o}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.target)||a.string(t.target))}e.is=i})(Re||(Re={}));var Pe;(function(e){function n(r,t){return{range:r,parent:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Pe||(Pe={}));var De;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(De||(De={}));var Me;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Me||(Me={}));var Ce;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&(r.resultId===void 0||typeof r.resultId=="string")&&Array.isArray(r.data)&&(r.data.length===0||typeof r.data[0]=="number")}e.is=n})(Ce||(Ce={}));var ye;(function(e){function n(r,t){return{range:r,text:t}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&a.string(t.text)}e.is=i})(ye||(ye={}));var Fe;(function(e){function n(r,t,o){return{range:r,variableName:t,caseSensitiveLookup:o}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&a.boolean(t.caseSensitiveLookup)&&(a.string(t.variableName)||t.variableName===void 0)}e.is=i})(Fe||(Fe={}));var je;(function(e){function n(r,t){return{range:r,expression:t}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&(a.string(t.expression)||t.expression===void 0)}e.is=i})(je||(je={}));var Ne;(function(e){function n(r,t){return{frameId:r,stoppedLocation:t}}e.create=n;function i(r){const t=r;return a.defined(t)&&h.is(r.stoppedLocation)}e.is=i})(Ne||(Ne={}));var G;(function(e){e.Type=1,e.Parameter=2;function n(i){return i===1||i===2}e.is=n})(G||(G={}));var J;(function(e){function n(r){return{value:r}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&(t.tooltip===void 0||a.string(t.tooltip)||P.is(t.tooltip))&&(t.location===void 0||C.is(t.location))&&(t.command===void 0||I.is(t.command))}e.is=i})(J||(J={}));var Oe;(function(e){function n(r,t,o){const s={position:r,label:t};return o!==void 0&&(s.kind=o),s}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&w.is(t.position)&&(a.string(t.label)||a.typedArray(t.label,J.is))&&(t.kind===void 0||G.is(t.kind))&&t.textEdits===void 0||a.typedArray(t.textEdits,E.is)&&(t.tooltip===void 0||a.string(t.tooltip)||P.is(t.tooltip))&&(t.paddingLeft===void 0||a.boolean(t.paddingLeft))&&(t.paddingRight===void 0||a.boolean(t.paddingRight))}e.is=i})(Oe||(Oe={}));var Se;(function(e){function n(i){return{kind:"snippet",value:i}}e.createSnippet=n})(Se||(Se={}));var Ue;(function(e){function n(i,r,t,o){return{insertText:i,filterText:r,range:t,command:o}}e.create=n})(Ue||(Ue={}));var Ve;(function(e){function n(i){return{items:i}}e.create=n})(Ve||(Ve={}));var We;(function(e){e.Invoked=0,e.Automatic=1})(We||(We={}));var He;(function(e){function n(i,r){return{range:i,text:r}}e.create=n})(He||(He={}));var Xe;(function(e){function n(i,r){return{triggerKind:i,selectedCompletionInfo:r}}e.create=n})(Xe||(Xe={}));var $e;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&O.is(r.uri)&&a.string(r.name)}e.is=n})($e||($e={}));var ze;(function(e){function n(o,s,u,f){return new ct(o,s,u,f)}e.create=n;function i(o){let s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}e.is=i;function r(o,s){let u=o.getText(),f=t(s,(g,_)=>{let b=g.range.start.line-_.range.start.line;return b===0?g.range.start.character-_.range.start.character:b}),c=u.length;for(let g=f.length-1;g>=0;g--){let _=f[g],b=o.offsetAt(_.range.start),l=o.offsetAt(_.range.end);if(l<=c)u=u.substring(0,b)+_.newText+u.substring(l,u.length);else throw new Error("Overlapping edit");c=b}return u}e.applyEdits=r;function t(o,s){if(o.length<=1)return o;const u=o.length/2|0,f=o.slice(0,u),c=o.slice(u);t(f,s),t(c,s);let g=0,_=0,b=0;for(;g<f.length&&_<c.length;)s(f[g],c[_])<=0?o[b++]=f[g++]:o[b++]=c[_++];for(;g<f.length;)o[b++]=f[g++];for(;_<c.length;)o[b++]=c[_++];return o}})(ze||(ze={}));var ct=class{constructor(e,n,i,r){this._uri=e,this._languageId=n,this._version=i,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let n=this.offsetAt(e.start),i=this.offsetAt(e.end);return this._content.substring(n,i)}return this._content}update(e,n){this._content=e.text,this._version=n,this._lineOffsets=void 0}getLineOffsets(){if(this._lineOffsets===void 0){let e=[],n=this._content,i=!0;for(let r=0;r<n.length;r++){i&&(e.push(r),i=!1);let t=n.charAt(r);i=t==="\r"||t===`
|
|
2
|
+
`,t==="\r"&&r+1<n.length&&n.charAt(r+1)===`
|
|
3
|
+
`&&r++}i&&n.length>0&&e.push(n.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let n=this.getLineOffsets(),i=0,r=n.length;if(r===0)return w.create(0,e);for(;i<r;){let o=Math.floor((i+r)/2);n[o]>e?r=o:i=o+1}let t=i-1;return w.create(t,e-n[t])}offsetAt(e){let n=this.getLineOffsets();if(e.line>=n.length)return this._content.length;if(e.line<0)return 0;let i=n[e.line],r=e.line+1<n.length?n[e.line+1]:this._content.length;return Math.max(Math.min(i+e.character,r),i)}get lineCount(){return this.getLineOffsets().length}},a;(function(e){const n=Object.prototype.toString;function i(l){return typeof l<"u"}e.defined=i;function r(l){return typeof l>"u"}e.undefined=r;function t(l){return l===!0||l===!1}e.boolean=t;function o(l){return n.call(l)==="[object String]"}e.string=o;function s(l){return n.call(l)==="[object Number]"}e.number=s;function u(l,N,Ke){return n.call(l)==="[object Number]"&&N<=l&&l<=Ke}e.numberRange=u;function f(l){return n.call(l)==="[object Number]"&&-2147483648<=l&&l<=2147483647}e.integer=f;function c(l){return n.call(l)==="[object Number]"&&0<=l&&l<=2147483647}e.uinteger=c;function g(l){return n.call(l)==="[object Function]"}e.func=g;function _(l){return l!==null&&typeof l=="object"}e.objectLiteral=_;function b(l,N){return Array.isArray(l)&&l.every(N)}e.typedArray=b})(a||(a={}));var dt=class{constructor(e,n,i){this._languageId=e,this._worker=n,this._disposables=[],this._listener=Object.create(null);const r=o=>{let s=o.getLanguageId();if(s!==this._languageId)return;let u;this._listener[o.uri.toString()]=o.onDidChangeContent(()=>{window.clearTimeout(u),u=window.setTimeout(()=>this._doValidate(o.uri,s),500)}),this._doValidate(o.uri,s)},t=o=>{d.editor.setModelMarkers(o,this._languageId,[]);let s=o.uri.toString(),u=this._listener[s];u&&(u.dispose(),delete this._listener[s])};this._disposables.push(d.editor.onDidCreateModel(r)),this._disposables.push(d.editor.onWillDisposeModel(t)),this._disposables.push(d.editor.onDidChangeModelLanguage(o=>{t(o.model),r(o.model)})),this._disposables.push(i(o=>{d.editor.getModels().forEach(s=>{s.getLanguageId()===this._languageId&&(t(s),r(s))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(t);for(let o in this._listener)this._listener[o].dispose()}}),d.editor.getModels().forEach(r)}dispose(){this._disposables.forEach(e=>e&&e.dispose()),this._disposables.length=0}_doValidate(e,n){this._worker(e).then(i=>i.doValidation(e.toString())).then(i=>{const r=i.map(o=>ft(e,o));let t=d.editor.getModel(e);t&&t.getLanguageId()===n&&d.editor.setModelMarkers(t,n,r)}).then(void 0,i=>{console.error(i)})}};function lt(e){switch(e){case x.Error:return d.MarkerSeverity.Error;case x.Warning:return d.MarkerSeverity.Warning;case x.Information:return d.MarkerSeverity.Info;case x.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function ft(e,n){let i=typeof n.code=="number"?String(n.code):n.code;return{severity:lt(n.severity),startLineNumber:n.range.start.line+1,startColumn:n.range.start.character+1,endLineNumber:n.range.end.line+1,endColumn:n.range.end.character+1,message:n.message,code:i,source:n.source}}var gt=class{constructor(e,n){this._worker=e,this._triggerCharacters=n}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.doComplete(t.toString(),k(n))).then(o=>{if(!o)return;const s=e.getWordUntilPosition(n),u=new d.Range(n.lineNumber,s.startColumn,n.lineNumber,s.endColumn),f=o.items.map(c=>{const g={label:c.label,insertText:c.insertText||c.label,sortText:c.sortText,filterText:c.filterText,documentation:c.documentation,detail:c.detail,command:pt(c.command),range:u,kind:vt(c.kind)};return c.textEdit&&(ht(c.textEdit)?g.range={insert:m(c.textEdit.insert),replace:m(c.textEdit.replace)}:g.range=m(c.textEdit.range),g.insertText=c.textEdit.newText),c.additionalTextEdits&&(g.additionalTextEdits=c.additionalTextEdits.map(D)),c.insertTextFormat===Q.Snippet&&(g.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),g});return{isIncomplete:o.isIncomplete,suggestions:f}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function Qe(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function m(e){if(e)return new d.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function ht(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function vt(e){const n=d.languages.CompletionItemKind;switch(e){case v.Text:return n.Text;case v.Method:return n.Method;case v.Function:return n.Function;case v.Constructor:return n.Constructor;case v.Field:return n.Field;case v.Variable:return n.Variable;case v.Class:return n.Class;case v.Interface:return n.Interface;case v.Module:return n.Module;case v.Property:return n.Property;case v.Unit:return n.Unit;case v.Value:return n.Value;case v.Enum:return n.Enum;case v.Keyword:return n.Keyword;case v.Snippet:return n.Snippet;case v.Color:return n.Color;case v.File:return n.File;case v.Reference:return n.Reference}return n.Property}function D(e){if(e)return{range:m(e.range),text:e.newText}}function pt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var mt=class{constructor(e){this._worker=e}provideHover(e,n,i){let r=e.uri;return this._worker(r).then(t=>t.doHover(r.toString(),k(n))).then(t=>{if(t)return{range:m(t.range),contents:bt(t.contents)}})}};function _t(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function Be(e){return typeof e=="string"?{value:e}:_t(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+`
|
|
4
|
+
`+e.value+"\n```\n"}}function bt(e){if(e)return Array.isArray(e)?e.map(Be):[Be(e)]}var wt=class{constructor(e){this._worker=e}provideDocumentHighlights(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.findDocumentHighlights(r.toString(),k(n))).then(t=>{if(t)return t.map(o=>({range:m(o.range),kind:kt(o.kind)}))})}};function kt(e){switch(e){case R.Read:return d.languages.DocumentHighlightKind.Read;case R.Write:return d.languages.DocumentHighlightKind.Write;case R.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var xt=class{constructor(e){this._worker=e}provideDefinition(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.findDefinition(r.toString(),k(n))).then(t=>{if(t)return[Ge(t)]})}};function Ge(e){return{uri:d.Uri.parse(e.uri),range:m(e.range)}}var It=class{constructor(e){this._worker=e}provideReferences(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.findReferences(t.toString(),k(n))).then(o=>{if(o)return o.map(Ge)})}},Et=class{constructor(e){this._worker=e}provideRenameEdits(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.doRename(t.toString(),k(n),i)).then(o=>Lt(o))}};function Lt(e){if(!e||!e.changes)return;let n=[];for(let i in e.changes){const r=d.Uri.parse(i);for(let t of e.changes[i])n.push({resource:r,versionId:void 0,textEdit:{range:m(t.range),text:t.newText}})}return{edits:n}}var At=class{constructor(e){this._worker=e}provideDocumentSymbols(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentSymbols(i.toString())).then(r=>{if(r)return r.map(t=>Rt(t)?Je(t):{name:t.name,detail:"",containerName:t.containerName,kind:Te(t.kind),range:m(t.location.range),selectionRange:m(t.location.range),tags:[]})})}};function Rt(e){return"children"in e}function Je(e){return{name:e.name,detail:e.detail??"",kind:Te(e.kind),range:m(e.range),selectionRange:m(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(n=>Je(n))}}function Te(e){let n=d.languages.SymbolKind;switch(e){case p.File:return n.File;case p.Module:return n.Module;case p.Namespace:return n.Namespace;case p.Package:return n.Package;case p.Class:return n.Class;case p.Method:return n.Method;case p.Property:return n.Property;case p.Field:return n.Field;case p.Constructor:return n.Constructor;case p.Enum:return n.Enum;case p.Interface:return n.Interface;case p.Function:return n.Function;case p.Variable:return n.Variable;case p.Constant:return n.Constant;case p.String:return n.String;case p.Number:return n.Number;case p.Boolean:return n.Boolean;case p.Array:return n.Array}return n.Function}var Nt=class{constructor(e){this._worker=e}provideLinks(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentLinks(i.toString())).then(r=>{if(r)return{links:r.map(t=>({range:m(t.range),url:t.target}))}})}},Pt=class{constructor(e){this._worker=e}provideDocumentFormattingEdits(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.format(r.toString(),null,Ye(n)).then(o=>{if(!(!o||o.length===0))return o.map(D)}))}},Dt=class{constructor(e){this._worker=e,this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.format(t.toString(),Qe(n),Ye(i)).then(s=>{if(!(!s||s.length===0))return s.map(D)}))}};function Ye(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var Mt=class{constructor(e){this._worker=e}provideDocumentColors(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentColors(i.toString())).then(r=>{if(r)return r.map(t=>({color:t.color,range:m(t.range)}))})}provideColorPresentations(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getColorPresentations(r.toString(),n.color,Qe(n.range))).then(t=>{if(t)return t.map(o=>{let s={label:o.label};return o.textEdit&&(s.textEdit=D(o.textEdit)),o.additionalTextEdits&&(s.additionalTextEdits=o.additionalTextEdits.map(D)),s})})}},Ct=class{constructor(e){this._worker=e}provideFoldingRanges(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getFoldingRanges(r.toString(),n)).then(t=>{if(t)return t.map(o=>{const s={start:o.startLine+1,end:o.endLine+1};return typeof o.kind<"u"&&(s.kind=yt(o.kind)),s})})}};function yt(e){switch(e){case A.Comment:return d.languages.FoldingRangeKind.Comment;case A.Imports:return d.languages.FoldingRangeKind.Imports;case A.Region:return d.languages.FoldingRangeKind.Region}}var Ft=class{constructor(e){this._worker=e}provideSelectionRanges(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getSelectionRanges(r.toString(),n.map(k))).then(t=>{if(t)return t.map(o=>{const s=[];for(;o;)s.push({range:m(o.range)}),o=o.parent;return s})})}};function Ot(e){const n=[],i=[],r=new ut(e);n.push(r);const t=(...s)=>r.getLanguageServiceWorker(...s);function o(){const{languageId:s,modeConfiguration:u}=e;Ze(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new gt(t,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new mt(t))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new wt(t))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new xt(t))),u.references&&i.push(d.languages.registerReferenceProvider(s,new It(t))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new At(t))),u.rename&&i.push(d.languages.registerRenameProvider(s,new Et(t))),u.colors&&i.push(d.languages.registerColorProvider(s,new Mt(t))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new Ct(t))),u.diagnostics&&i.push(new dt(s,t,e.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new Ft(t))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new Pt(t))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new Dt(t)))}return o(),n.push(qe(i)),qe(n)}function qe(e){return{dispose:()=>Ze(e)}}function Ze(e){for(;e.length;)e.pop().dispose()}export{gt as CompletionAdapter,xt as DefinitionAdapter,dt as DiagnosticsAdapter,Mt as DocumentColorAdapter,Pt as DocumentFormattingEditProvider,wt as DocumentHighlightAdapter,Nt as DocumentLinkAdapter,Dt as DocumentRangeFormattingEditProvider,At as DocumentSymbolAdapter,Ct as FoldingRangeAdapter,mt as HoverAdapter,It as ReferenceAdapter,Et as RenameAdapter,Ft as SelectionRangeAdapter,ut as WorkerManager,k as fromPosition,Qe as fromRange,Ot as setupMode,m as toRange,D as toTextEdit};
|