openhab-scripting 4.47.0 → 5.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions/audio.rb +54 -0
- data/lib/openhab/core/actions/ephemeris.rb +39 -0
- data/lib/openhab/core/actions/exec.rb +51 -0
- data/lib/openhab/core/actions/http.rb +80 -0
- data/lib/openhab/core/actions/ping.rb +30 -0
- data/lib/openhab/core/actions/transformation.rb +32 -0
- data/lib/openhab/core/actions/voice.rb +36 -0
- data/lib/openhab/core/actions.rb +82 -0
- data/lib/openhab/core/dependency_tracking.rb +34 -0
- data/lib/openhab/core/dto/item_channel_link.rb +33 -0
- data/lib/openhab/core/dto/thing.rb +27 -0
- data/lib/openhab/core/dto.rb +11 -0
- data/lib/openhab/core/entity_lookup.rb +152 -70
- data/lib/openhab/core/events/abstract_event.rb +18 -0
- data/lib/openhab/core/events/abstract_item_registry_event.rb +36 -0
- data/lib/openhab/core/events/abstract_thing_registry_event.rb +40 -0
- data/lib/openhab/core/events/item_command_event.rb +78 -0
- data/lib/openhab/core/events/item_event.rb +22 -0
- data/lib/openhab/core/events/item_state_changed_event.rb +75 -0
- data/lib/openhab/core/events/item_state_event.rb +79 -0
- data/lib/openhab/core/events/item_state_updated_event.rb +22 -0
- data/lib/openhab/core/events/thing_status_info_event.rb +55 -0
- data/lib/openhab/core/events.rb +10 -0
- data/lib/openhab/core/items/accepted_data_types.rb +29 -0
- data/lib/openhab/core/items/color_item.rb +52 -0
- data/lib/openhab/core/items/contact_item.rb +52 -0
- data/lib/openhab/core/items/date_time_item.rb +59 -0
- data/lib/openhab/core/items/dimmer_item.rb +148 -0
- data/lib/openhab/core/items/generic_item.rb +292 -0
- data/lib/openhab/core/items/group_item.rb +176 -0
- data/lib/openhab/{dsl → core}/items/image_item.rb +35 -29
- data/lib/openhab/core/items/item.rb +273 -0
- data/lib/openhab/core/items/location_item.rb +34 -0
- data/lib/openhab/core/items/metadata/hash.rb +433 -0
- data/lib/openhab/core/items/metadata/namespace_hash.rb +475 -0
- data/lib/openhab/core/items/metadata/provider.rb +48 -0
- data/lib/openhab/core/items/metadata.rb +11 -0
- data/lib/openhab/core/items/number_item.rb +62 -0
- data/lib/openhab/core/items/numeric_item.rb +22 -0
- data/lib/openhab/core/items/persistence.rb +416 -0
- data/lib/openhab/core/items/player_item.rb +66 -0
- data/lib/openhab/core/items/provider.rb +44 -0
- data/lib/openhab/core/items/proxy.rb +136 -0
- data/lib/openhab/core/items/registry.rb +86 -0
- data/lib/openhab/core/items/rollershutter_item.rb +68 -0
- data/lib/openhab/core/items/semantics/enumerable.rb +177 -0
- data/lib/openhab/core/items/semantics.rb +473 -0
- data/lib/openhab/core/items/state_storage.rb +53 -0
- data/lib/openhab/core/items/string_item.rb +28 -0
- data/lib/openhab/core/items/switch_item.rb +78 -0
- data/lib/openhab/core/items.rb +108 -0
- data/lib/openhab/{dsl → core}/lazy_array.rb +9 -3
- data/lib/openhab/core/profile_factory.rb +132 -0
- data/lib/openhab/core/provider.rb +230 -0
- data/lib/openhab/core/proxy.rb +130 -0
- data/lib/openhab/core/registry.rb +40 -0
- data/lib/openhab/core/rules/module.rb +26 -0
- data/lib/openhab/core/rules/provider.rb +25 -0
- data/lib/openhab/core/rules/registry.rb +94 -0
- data/lib/openhab/core/rules/rule.rb +174 -0
- data/lib/openhab/core/rules.rb +25 -0
- data/lib/openhab/core/script_handling.rb +78 -20
- data/lib/openhab/core/things/channel.rb +48 -0
- data/lib/openhab/core/things/channel_uid.rb +51 -0
- data/lib/openhab/core/things/item_channel_link.rb +33 -0
- data/lib/openhab/core/things/links/provider.rb +78 -0
- data/lib/openhab/core/things/profile_callback.rb +52 -0
- data/lib/openhab/core/things/provider.rb +29 -0
- data/lib/openhab/core/things/proxy.rb +87 -0
- data/lib/openhab/core/things/registry.rb +73 -0
- data/lib/openhab/core/things/thing.rb +194 -0
- data/lib/openhab/core/things.rb +22 -0
- data/lib/openhab/core/timer.rb +148 -0
- data/lib/openhab/{dsl → core}/types/comparable_type.rb +5 -3
- data/lib/openhab/{dsl → core}/types/date_time_type.rb +55 -127
- data/lib/openhab/{dsl → core}/types/decimal_type.rb +50 -48
- data/lib/openhab/{dsl → core}/types/hsb_type.rb +35 -83
- data/lib/openhab/core/types/increase_decrease_type.rb +34 -0
- data/lib/openhab/core/types/next_previous_type.rb +34 -0
- data/lib/openhab/{dsl → core}/types/numeric_type.rb +20 -7
- data/lib/openhab/core/types/on_off_type.rb +46 -0
- data/lib/openhab/core/types/open_closed_type.rb +41 -0
- data/lib/openhab/{dsl → core}/types/percent_type.rb +19 -20
- data/lib/openhab/core/types/play_pause_type.rb +38 -0
- data/lib/openhab/core/types/point_type.rb +117 -0
- data/lib/openhab/core/types/quantity_type.rb +325 -0
- data/lib/openhab/core/types/raw_type.rb +26 -0
- data/lib/openhab/core/types/refresh_type.rb +27 -0
- data/lib/openhab/core/types/rewind_fastforward_type.rb +38 -0
- data/lib/openhab/core/types/stop_move_type.rb +34 -0
- data/lib/openhab/{dsl → core}/types/string_type.rb +17 -28
- data/lib/openhab/{dsl → core}/types/type.rb +42 -40
- data/lib/openhab/core/types/un_def_type.rb +38 -0
- data/lib/openhab/core/types/up_down_type.rb +50 -0
- data/lib/openhab/core/types.rb +82 -0
- data/lib/openhab/{dsl → core}/uid.rb +4 -23
- data/lib/openhab/core/value_cache.rb +188 -0
- data/lib/openhab/core.rb +98 -0
- data/lib/openhab/core_ext/between.rb +32 -0
- data/lib/openhab/core_ext/ephemeris.rb +53 -0
- data/lib/openhab/core_ext/java/class.rb +34 -0
- data/lib/openhab/core_ext/java/duration.rb +142 -0
- data/lib/openhab/core_ext/java/list.rb +436 -0
- data/lib/openhab/core_ext/java/local_date.rb +104 -0
- data/lib/openhab/core_ext/java/local_time.rb +118 -0
- data/lib/openhab/core_ext/java/map.rb +66 -0
- data/lib/openhab/core_ext/java/month.rb +71 -0
- data/lib/openhab/core_ext/java/month_day.rb +119 -0
- data/lib/openhab/core_ext/java/period.rb +103 -0
- data/lib/openhab/core_ext/java/temporal_amount.rb +34 -0
- data/lib/openhab/core_ext/java/time.rb +62 -0
- data/lib/openhab/core_ext/java/unit.rb +15 -0
- data/lib/openhab/core_ext/java/zoned_date_time.rb +213 -0
- data/lib/openhab/core_ext/ruby/array.rb +21 -0
- data/lib/openhab/core_ext/ruby/date.rb +96 -0
- data/lib/openhab/core_ext/ruby/date_time.rb +55 -0
- data/lib/openhab/core_ext/ruby/module.rb +15 -0
- data/lib/openhab/core_ext/ruby/numeric.rb +195 -0
- data/lib/openhab/core_ext/ruby/range.rb +70 -0
- data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
- data/lib/openhab/core_ext/ruby/time.rb +108 -0
- data/lib/openhab/core_ext.rb +18 -0
- data/lib/openhab/dsl/debouncer.rb +259 -0
- data/lib/openhab/dsl/events/watch_event.rb +18 -0
- data/lib/openhab/dsl/events.rb +9 -0
- data/lib/openhab/dsl/gems.rb +1 -1
- data/lib/openhab/dsl/items/builder.rb +578 -0
- data/lib/openhab/dsl/items/ensure.rb +73 -82
- data/lib/openhab/dsl/items/timed_command.rb +214 -159
- data/lib/openhab/dsl/rules/automation_rule.rb +129 -116
- data/lib/openhab/dsl/rules/builder.rb +1935 -0
- data/lib/openhab/dsl/rules/guard.rb +51 -114
- data/lib/openhab/dsl/rules/name_inference.rb +66 -25
- data/lib/openhab/dsl/rules/property.rb +48 -75
- data/lib/openhab/dsl/rules/rule_triggers.rb +22 -27
- data/lib/openhab/dsl/rules/terse.rb +58 -14
- data/lib/openhab/dsl/rules/triggers/changed.rb +48 -94
- data/lib/openhab/dsl/rules/triggers/channel.rb +9 -40
- data/lib/openhab/dsl/rules/triggers/command.rb +14 -63
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +34 -69
- data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +6 -14
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +48 -82
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +30 -47
- data/lib/openhab/dsl/rules/triggers/trigger.rb +7 -28
- data/lib/openhab/dsl/rules/triggers/updated.rb +21 -45
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +257 -102
- data/lib/openhab/dsl/rules/triggers.rb +12 -0
- data/lib/openhab/dsl/rules.rb +8 -0
- data/lib/openhab/dsl/things/builder.rb +299 -0
- data/lib/openhab/{core → dsl}/thread_local.rb +27 -17
- data/lib/openhab/dsl/timer_manager.rb +204 -0
- data/lib/openhab/dsl/version.rb +9 -0
- data/lib/openhab/dsl.rb +979 -0
- data/lib/openhab/log.rb +355 -0
- data/lib/openhab/osgi.rb +68 -0
- data/lib/openhab/rspec/configuration.rb +56 -0
- data/lib/openhab/rspec/example_group.rb +132 -0
- data/lib/openhab/rspec/helpers.rb +458 -0
- data/lib/openhab/rspec/hooks.rb +113 -0
- data/lib/openhab/rspec/jruby.rb +46 -0
- data/lib/openhab/rspec/karaf.rb +851 -0
- data/lib/openhab/rspec/mocks/bundle_install_support.rb +25 -0
- data/lib/openhab/rspec/mocks/bundle_resolver.rb +30 -0
- data/lib/openhab/rspec/mocks/event_admin.rb +146 -0
- data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
- data/lib/openhab/rspec/mocks/persistence_service.rb +155 -0
- data/lib/openhab/rspec/mocks/safe_caller.rb +40 -0
- data/lib/openhab/rspec/mocks/space.rb +23 -0
- data/lib/openhab/rspec/mocks/synchronous_executor.rb +63 -0
- data/lib/openhab/rspec/mocks/thing_handler.rb +76 -0
- data/lib/openhab/rspec/mocks/timer.rb +134 -0
- data/lib/openhab/rspec/openhab/core/actions.rb +38 -0
- data/lib/openhab/rspec/openhab/core/items/proxy.rb +15 -0
- data/lib/openhab/rspec/openhab/core/things/proxy.rb +27 -0
- data/lib/openhab/rspec/shell.rb +31 -0
- data/lib/openhab/rspec/suspend_rules.rb +50 -0
- data/lib/openhab/rspec.rb +26 -0
- data/lib/openhab/yard/base_helper.rb +19 -0
- data/lib/openhab/yard/cli/stats.rb +23 -0
- data/lib/openhab/yard/code_objects/group_object.rb +23 -0
- data/lib/openhab/yard/code_objects/java/base.rb +31 -0
- data/lib/openhab/yard/code_objects/java/class_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/field_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/interface_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/package_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/proxy.rb +23 -0
- data/lib/openhab/yard/coderay.rb +17 -0
- data/lib/openhab/yard/handlers/jruby/base.rb +58 -0
- data/lib/openhab/yard/handlers/jruby/class_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/constant_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +30 -0
- data/lib/openhab/yard/handlers/jruby/mixin_handler.rb +23 -0
- data/lib/openhab/yard/html_helper.rb +78 -0
- data/lib/openhab/yard/markdown_helper.rb +148 -0
- data/lib/openhab/yard/tags/constant_directive.rb +20 -0
- data/lib/openhab/yard/tags/group_directive.rb +24 -0
- data/lib/openhab/yard/tags/library.rb +3 -0
- data/lib/openhab/yard.rb +38 -0
- metadata +476 -106
- data/lib/openhab/core/item_proxy.rb +0 -29
- data/lib/openhab/core/load_path.rb +0 -19
- data/lib/openhab/core/openhab_setup.rb +0 -29
- data/lib/openhab/core/osgi.rb +0 -58
- data/lib/openhab/core/services.rb +0 -24
- data/lib/openhab/dsl/actions.rb +0 -114
- data/lib/openhab/dsl/between.rb +0 -25
- data/lib/openhab/dsl/channel.rb +0 -43
- data/lib/openhab/dsl/dsl.rb +0 -59
- data/lib/openhab/dsl/group.rb +0 -54
- data/lib/openhab/dsl/imports.rb +0 -21
- data/lib/openhab/dsl/items/color_item.rb +0 -76
- data/lib/openhab/dsl/items/comparable_item.rb +0 -62
- data/lib/openhab/dsl/items/contact_item.rb +0 -41
- data/lib/openhab/dsl/items/date_time_item.rb +0 -65
- data/lib/openhab/dsl/items/dimmer_item.rb +0 -65
- data/lib/openhab/dsl/items/generic_item.rb +0 -229
- data/lib/openhab/dsl/items/group_item.rb +0 -127
- data/lib/openhab/dsl/items/item_equality.rb +0 -59
- data/lib/openhab/dsl/items/item_registry.rb +0 -54
- data/lib/openhab/dsl/items/items.rb +0 -109
- data/lib/openhab/dsl/items/location_item.rb +0 -59
- data/lib/openhab/dsl/items/metadata.rb +0 -326
- data/lib/openhab/dsl/items/number_item.rb +0 -17
- data/lib/openhab/dsl/items/numeric_item.rb +0 -87
- data/lib/openhab/dsl/items/persistence.rb +0 -307
- data/lib/openhab/dsl/items/player_item.rb +0 -58
- data/lib/openhab/dsl/items/rollershutter_item.rb +0 -51
- data/lib/openhab/dsl/items/semantics/enumerable.rb +0 -91
- data/lib/openhab/dsl/items/semantics.rb +0 -227
- data/lib/openhab/dsl/items/string_item.rb +0 -51
- data/lib/openhab/dsl/items/switch_item.rb +0 -70
- data/lib/openhab/dsl/monkey_patch/actions/actions.rb +0 -4
- data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +0 -39
- data/lib/openhab/dsl/monkey_patch/events/events.rb +0 -7
- data/lib/openhab/dsl/monkey_patch/events/item_command.rb +0 -85
- data/lib/openhab/dsl/monkey_patch/events/item_event.rb +0 -28
- data/lib/openhab/dsl/monkey_patch/events/item_state.rb +0 -61
- data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +0 -60
- data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +0 -33
- data/lib/openhab/dsl/monkey_patch/java/java.rb +0 -4
- data/lib/openhab/dsl/monkey_patch/java/local_time.rb +0 -44
- data/lib/openhab/dsl/monkey_patch/java/time_extensions.rb +0 -50
- data/lib/openhab/dsl/monkey_patch/java/zoned_date_time.rb +0 -45
- data/lib/openhab/dsl/monkey_patch/ruby/number.rb +0 -104
- data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +0 -6
- data/lib/openhab/dsl/monkey_patch/ruby/string.rb +0 -47
- data/lib/openhab/dsl/monkey_patch/ruby/time.rb +0 -61
- data/lib/openhab/dsl/openhab.rb +0 -30
- data/lib/openhab/dsl/persistence.rb +0 -27
- data/lib/openhab/dsl/rules/item_event.rb +0 -19
- data/lib/openhab/dsl/rules/rule.rb +0 -160
- data/lib/openhab/dsl/rules/rule_config.rb +0 -147
- data/lib/openhab/dsl/rules/triggers/generic.rb +0 -31
- data/lib/openhab/dsl/rules/triggers/triggers.rb +0 -11
- data/lib/openhab/dsl/rules/triggers/watch/watch.rb +0 -81
- data/lib/openhab/dsl/states.rb +0 -89
- data/lib/openhab/dsl/things.rb +0 -147
- data/lib/openhab/dsl/time/month_day.rb +0 -180
- data/lib/openhab/dsl/time/time_of_day.rb +0 -235
- data/lib/openhab/dsl/timers/manager.rb +0 -119
- data/lib/openhab/dsl/timers/reentrant_timer.rb +0 -38
- data/lib/openhab/dsl/timers/timer.rb +0 -132
- data/lib/openhab/dsl/timers.rb +0 -77
- data/lib/openhab/dsl/types/increase_decrease_type.rb +0 -23
- data/lib/openhab/dsl/types/next_previous_type.rb +0 -23
- data/lib/openhab/dsl/types/on_off_type.rb +0 -28
- data/lib/openhab/dsl/types/open_closed_type.rb +0 -29
- data/lib/openhab/dsl/types/play_pause_type.rb +0 -27
- data/lib/openhab/dsl/types/point_type.rb +0 -180
- data/lib/openhab/dsl/types/quantity_type.rb +0 -265
- data/lib/openhab/dsl/types/refresh_type.rb +0 -18
- data/lib/openhab/dsl/types/rewind_fastforward_type.rb +0 -33
- data/lib/openhab/dsl/types/stop_move_type.rb +0 -23
- data/lib/openhab/dsl/types/types.rb +0 -83
- data/lib/openhab/dsl/types/un_def_type.rb +0 -22
- data/lib/openhab/dsl/types/up_down_type.rb +0 -32
- data/lib/openhab/dsl/units.rb +0 -45
- data/lib/openhab/log/configuration.rb +0 -21
- data/lib/openhab/log/logger.rb +0 -282
- data/lib/openhab/version.rb +0 -9
- data/lib/openhab.rb +0 -38
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
4
|
+
|
5
|
+
# Extensions to Time
|
6
|
+
class Time
|
7
|
+
extend Forwardable
|
8
|
+
include OpenHAB::CoreExt::Between
|
9
|
+
include OpenHAB::CoreExt::Ephemeris
|
10
|
+
|
11
|
+
#
|
12
|
+
# @!method +(other)
|
13
|
+
#
|
14
|
+
# Extends {#+} to allow adding a {java.time.temporal.TemporalAmount TemporalAmount}
|
15
|
+
#
|
16
|
+
# @param [java.time.temporal.TemporalAmount] other
|
17
|
+
# @return [ZonedDateTime] If other is a {java.time.temporal.TemporalAmount TemporalAmount}
|
18
|
+
# @return [Time] If other is a Numeric
|
19
|
+
#
|
20
|
+
def plus_with_temporal(other)
|
21
|
+
return to_zoned_date_time + other if other.is_a?(java.time.temporal.TemporalAmount)
|
22
|
+
|
23
|
+
plus_without_temporal(other)
|
24
|
+
end
|
25
|
+
alias_method :plus_without_temporal, :+
|
26
|
+
alias_method :+, :plus_with_temporal
|
27
|
+
|
28
|
+
#
|
29
|
+
# @!method -(other)
|
30
|
+
#
|
31
|
+
# Extends {#-} to allow subtracting a {java.time.temporal.TemporalAmount TemporalAmount}
|
32
|
+
# or any other date/time class that responds to #to_zoned_date_time.
|
33
|
+
#
|
34
|
+
# Subtractions with another object of the same class (e.g. Time - Other Time, or DateTime - Other DateTime)
|
35
|
+
# remains unchanged from its original behavior.
|
36
|
+
#
|
37
|
+
# @example Time - Duration -> ZonedDateTime
|
38
|
+
# zdt_one_hour_ago = Time.now - 1.hour
|
39
|
+
#
|
40
|
+
# @example Time - ZonedDateTime -> Duration
|
41
|
+
# java_duration = Time.now - 1.hour.ago
|
42
|
+
#
|
43
|
+
# @example Time - Numeric -> Time
|
44
|
+
# time_one_hour_ago = Time - 3600
|
45
|
+
#
|
46
|
+
# @example Time - Time -> Float
|
47
|
+
# one_day_in_secs = Time.new(2002, 10, 31) - Time.new(2002, 10, 30)
|
48
|
+
#
|
49
|
+
# @param [java.time.temporal.TemporalAmount, #to_zoned_date_time] other
|
50
|
+
# @return [ZonedDateTime] If other is a {java.time.temporal.TemporalAmount TemporalAmount}
|
51
|
+
# @return [Duration] If other responds to #to_zoned_date_time
|
52
|
+
# @return [Time] If other is a Numeric
|
53
|
+
# @return [Float] If other is a Time
|
54
|
+
#
|
55
|
+
def minus_with_temporal(other)
|
56
|
+
return to_zoned_date_time - other if other.is_a?(java.time.temporal.TemporalAmount)
|
57
|
+
|
58
|
+
# Exclude subtracting against the same class
|
59
|
+
if other.respond_to?(:to_zoned_date_time) && !other.is_a?(self.class)
|
60
|
+
return to_zoned_date_time - other.to_zoned_date_time
|
61
|
+
end
|
62
|
+
|
63
|
+
minus_without_temporal(other)
|
64
|
+
end
|
65
|
+
alias_method :minus_without_temporal, :-
|
66
|
+
alias_method :-, :minus_with_temporal
|
67
|
+
|
68
|
+
# @return [LocalDate]
|
69
|
+
def to_local_date(_context = nil)
|
70
|
+
java.time.LocalDate.of(year, month, day)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @!method to_local_time
|
74
|
+
# @return [LocalTime]
|
75
|
+
def_delegator :to_zoned_date_time, :to_local_time
|
76
|
+
|
77
|
+
# @return [Month]
|
78
|
+
def to_month
|
79
|
+
java.time.Month.of(month)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [MonthDay]
|
83
|
+
def to_month_day
|
84
|
+
java.time.MonthDay.of(month, day)
|
85
|
+
end
|
86
|
+
|
87
|
+
# @param [ZonedDateTime, nil] context
|
88
|
+
# A {ZonedDateTime} used to fill in missing fields
|
89
|
+
# during conversion. Not used in this class.
|
90
|
+
# @return [ZonedDateTime]
|
91
|
+
def to_zoned_date_time(context = nil) # rubocop:disable Lint/UnusedMethodArgument
|
92
|
+
to_java(java.time.ZonedDateTime)
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# Converts to a {ZonedDateTime} if `other`
|
97
|
+
# is also convertible to a ZonedDateTime.
|
98
|
+
#
|
99
|
+
# @param [#to_zoned_date_time] other
|
100
|
+
# @return [Array, nil]
|
101
|
+
#
|
102
|
+
def coerce(other)
|
103
|
+
return unless other.respond_to?(:to_zoned_date_time)
|
104
|
+
|
105
|
+
zdt = to_zoned_date_time
|
106
|
+
[other.to_zoned_date_time(zdt), zdt]
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Dir[File.expand_path("core_ext/**/*.rb", __dir__)].sort.each do |f|
|
4
|
+
require f
|
5
|
+
end
|
6
|
+
|
7
|
+
module OpenHAB
|
8
|
+
# Extensions to core classes
|
9
|
+
module CoreExt
|
10
|
+
# Extensions to core Java classes
|
11
|
+
module Java
|
12
|
+
end
|
13
|
+
|
14
|
+
# Extensions to core Ruby classes
|
15
|
+
module Ruby
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module DSL
|
5
|
+
#
|
6
|
+
# Provides the feature for debouncing calls to a given block.
|
7
|
+
#
|
8
|
+
# The debouncer can filter events and only allow the events on the leading or trailing edge
|
9
|
+
# of the given interval. Its behavior can be customized through settings passed to its
|
10
|
+
# {initialize constructor}.
|
11
|
+
#
|
12
|
+
# The following timing diagram illustrates the incoming triggers and the actual executions
|
13
|
+
# using various options.
|
14
|
+
#
|
15
|
+
# ```ruby
|
16
|
+
# 1 1 2 2 3 3 4 4
|
17
|
+
# 0 5 0 5 0 5 0 5 0 5
|
18
|
+
# Triggers : 'X.X...X...X..XX.X.X......XXXXXXXXXXX....X.....'
|
19
|
+
# leading: false
|
20
|
+
# for:5 : '|....X|....X |....X |....X|....X |....X'
|
21
|
+
# leading: true
|
22
|
+
# for:5 : 'X.....X......X....X......X....X....X....X.....'
|
23
|
+
#
|
24
|
+
# more options, leading: false
|
25
|
+
# Triggers : 'X.X...X...X..XX.X.X......XXXXXXXXXXX....X.....'
|
26
|
+
# for:5 idle:3 : '|....X|......X|......X...|............X.|....X'
|
27
|
+
# for:5 idle:5 : '|......................X.|..............X.....'
|
28
|
+
# for:5..5 idle:X : '|....X|....X.|....X......|....X|....X...|....X'
|
29
|
+
# for:5..6 idle:5 : '|.....X...|.....X.|....X.|.....X|.....X.|....X'
|
30
|
+
# for:5..7 idle:5 : '|......X..|......X|....X.|......X|......X.....'
|
31
|
+
# for:5..8 idle:5 : '|.......X.|.......X......|.......X|.....X.....'
|
32
|
+
# for:5..8 idle:3 : '|....X|......X|......X...|.......X|....X|....X'
|
33
|
+
# for:5..8 idle:2 : '|....X|.....X|......X....|.......X|....X|....X'
|
34
|
+
# ```
|
35
|
+
#
|
36
|
+
# Notes:
|
37
|
+
# - `|` indicates the start of the debounce period
|
38
|
+
# - With `for: 5..5` (a range with begin=end), the `idle_time` argument is irrelevant
|
39
|
+
# and be unset/set to any value as it will not alter the debouncer's behavior.
|
40
|
+
# - Without an `idle_time`, the range end in `for: X..Y` is irrelevant. It is equivalent to
|
41
|
+
# `for: X` without the end of the range.
|
42
|
+
#
|
43
|
+
class Debouncer
|
44
|
+
# @return [Range,nil] The range of accepted debounce period, or nil if debouncing is disabled.
|
45
|
+
attr_reader :interval
|
46
|
+
|
47
|
+
# @return [Duration, nil] The minimum idle time to stop debouncing.
|
48
|
+
attr_reader :idle_time
|
49
|
+
|
50
|
+
#
|
51
|
+
# Constructor to create a debouncer object.
|
52
|
+
#
|
53
|
+
# The constructor sets the options and behaviour of the debouncer when the {#call}
|
54
|
+
# method is called.
|
55
|
+
#
|
56
|
+
# Terminology:
|
57
|
+
# - `calls` are invocations of the {#call} method, i.e. the events that need to be throttled / debounced.
|
58
|
+
# - `executions` are the actual code executions of the given block. Executions usually occur
|
59
|
+
# less frequently than the call to the debounce method.
|
60
|
+
#
|
61
|
+
# @param [Duration,Range,nil] for The minimum and optional maximum execution interval.
|
62
|
+
# - {Duration}: The minimum interval between executions. The debouncer will not execute
|
63
|
+
# the given block more often than this.
|
64
|
+
# - {Range}: A range of {Duration}s for the minimum to maximum interval between executions.
|
65
|
+
# The range end defines the maximum duration from the initial trigger, at which
|
66
|
+
# the debouncer will execute the block, even when an `idle_time` argument was given and
|
67
|
+
# calls continue to occur at an interval less than `idle_time`.
|
68
|
+
# - `nil`: When `nil`, no debouncing is performed, all the other parameters are ignored,
|
69
|
+
# and every call will result in immediate execution of the given block.
|
70
|
+
#
|
71
|
+
# @param [true,false] leading
|
72
|
+
# - `true`: Perform leading edge "debouncing". Execute the first call then ignore
|
73
|
+
# subsequent calls that occur within the debounce period.
|
74
|
+
# - `false`: Perform trailing edge debouncing. Execute the last call at the end of
|
75
|
+
# the debounce period and ignore all the calls leading up to it.
|
76
|
+
#
|
77
|
+
# @param [Duration,nil] idle_time The minimum idle time between calls to stop debouncing.
|
78
|
+
# The debouncer will continue to hold until the interval between two calls is longer
|
79
|
+
# than the idle time or until the maximum interval between executions, when
|
80
|
+
# specified, is reached.
|
81
|
+
#
|
82
|
+
# @return [void]
|
83
|
+
#
|
84
|
+
def initialize(for:, leading: false, idle_time: nil)
|
85
|
+
@interval = binding.local_variable_get(:for)
|
86
|
+
return unless @interval
|
87
|
+
|
88
|
+
@interval = (@interval..) unless @interval.is_a?(Range)
|
89
|
+
|
90
|
+
@leading = leading
|
91
|
+
@idle_time = idle_time
|
92
|
+
@mutex = Mutex.new
|
93
|
+
@block = nil
|
94
|
+
@timer = nil
|
95
|
+
reset
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Debounces calls to the given block.
|
100
|
+
#
|
101
|
+
# This method is meant to be called repeatedly with the same given block.
|
102
|
+
# However, if no block is given, it will call and debounce the previously given block
|
103
|
+
#
|
104
|
+
# @yield Block to be debounced
|
105
|
+
#
|
106
|
+
# @return [void]
|
107
|
+
#
|
108
|
+
# @example Basic trailing edge debouncing
|
109
|
+
# debouncer = Debouncer.new(for: 1.minute)
|
110
|
+
# (1..100).each do
|
111
|
+
# debouncer.call { logger.info "I won't log more often than once a minute" }
|
112
|
+
# sleep 20 # call the debouncer every 20 seconds
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# @example Call the previous debounced block
|
116
|
+
# debouncer = Debouncer.new(for: 1.minute)
|
117
|
+
# debouncer.call { logger.info "Hello. It is #{Time.now}" } # First call to debounce
|
118
|
+
#
|
119
|
+
# after(20.seconds) do |timer|
|
120
|
+
# debouncer.call # Call the original block above
|
121
|
+
# timer.reschedule unless timer.cancelled?
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
def call(&block)
|
125
|
+
@block = block if block
|
126
|
+
raise ArgumentError, "No block has been provided" unless @block
|
127
|
+
|
128
|
+
return call! unless @interval # passthrough mode, no debouncing when @interval is nil
|
129
|
+
|
130
|
+
now = ZonedDateTime.now
|
131
|
+
if leading?
|
132
|
+
leading_edge_debounce(now)
|
133
|
+
else
|
134
|
+
trailing_edge_debounce(now)
|
135
|
+
end
|
136
|
+
@mutex.synchronize { @last_timestamp = now }
|
137
|
+
end
|
138
|
+
|
139
|
+
#
|
140
|
+
# Executes the latest block passed to the {#debounce} call regardless of any debounce settings.
|
141
|
+
#
|
142
|
+
# @return [Object] The return value of the block
|
143
|
+
#
|
144
|
+
def call!
|
145
|
+
@block.call
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
# Resets the debounce period and cancels any outstanding block executions of a trailing edge debouncer.
|
150
|
+
#
|
151
|
+
# - A leading edge debouncer will execute its block on the next call and start a new debounce period.
|
152
|
+
# - A trailing edge debouncer will reset its debounce timer and the next call will become the start
|
153
|
+
# of a new debounce period.
|
154
|
+
#
|
155
|
+
# @return [Boolean] True if a pending execution was cancelled.
|
156
|
+
#
|
157
|
+
def reset
|
158
|
+
@mutex.synchronize do
|
159
|
+
@last_timestamp = @leading_timestamp = @interval.begin.ago - 1.second if leading?
|
160
|
+
@timer&.cancel
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
#
|
165
|
+
# Immediately executes any outstanding event of a trailing edge debounce.
|
166
|
+
# The next call will start a new period.
|
167
|
+
#
|
168
|
+
# It has no effect on a leading edge debouncer - use {#reset} instead.
|
169
|
+
#
|
170
|
+
# @return [Boolean] True if an existing debounce timer was rescheduled to run immediately.
|
171
|
+
# False if there were no outstanding executions.
|
172
|
+
#
|
173
|
+
def flush
|
174
|
+
@mutex.synchronize do
|
175
|
+
if @timer&.cancel
|
176
|
+
call!
|
177
|
+
true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# Returns true to indicate that this is a leading edge debouncer.
|
184
|
+
#
|
185
|
+
# @return [true,false] True if this object was created to be a leading edge debouncer. False otherwise.
|
186
|
+
#
|
187
|
+
def leading?
|
188
|
+
@leading
|
189
|
+
end
|
190
|
+
|
191
|
+
private
|
192
|
+
|
193
|
+
def too_soon?(now)
|
194
|
+
now < @leading_timestamp + @interval.begin
|
195
|
+
end
|
196
|
+
|
197
|
+
# @return [true,false] When max interval is not set/required, always returns false,
|
198
|
+
# because there is no maximum interval requirement.
|
199
|
+
# When it is set, return true if the max interval condition is met, or false otherwise
|
200
|
+
def max_interval?(now)
|
201
|
+
@interval.end && now >= @leading_timestamp + @interval.end
|
202
|
+
end
|
203
|
+
|
204
|
+
# @return [true,false] When idle_time is not set/required, always returns true,
|
205
|
+
# as if the idle time condition is met.
|
206
|
+
# When it is set, return true if the idle time condition is met, or false otherwise
|
207
|
+
def idle?(now)
|
208
|
+
@idle_time.nil? || now >= @last_timestamp + @idle_time
|
209
|
+
end
|
210
|
+
|
211
|
+
def leading_edge_debounce(now)
|
212
|
+
@mutex.synchronize do
|
213
|
+
next if too_soon?(now)
|
214
|
+
next unless idle?(now) || max_interval?(now)
|
215
|
+
|
216
|
+
@leading_timestamp = now
|
217
|
+
call!
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def start_timer(now)
|
222
|
+
@leading_timestamp = now
|
223
|
+
@timer = DSL.after(@interval.begin) { @mutex.synchronize { call! } }
|
224
|
+
end
|
225
|
+
|
226
|
+
def handle_leading_event(now)
|
227
|
+
@leading_timestamp = now
|
228
|
+
@initial_wait ||= [@interval.begin, @idle_time].compact.max
|
229
|
+
@timer.reschedule(@initial_wait)
|
230
|
+
end
|
231
|
+
|
232
|
+
def handle_intermediate_event(now)
|
233
|
+
execution_time = @leading_timestamp + @interval.begin
|
234
|
+
|
235
|
+
execution_time = [execution_time, now + @idle_time].max if @idle_time && (@last_timestamp + @idle_time != now)
|
236
|
+
if @interval.end
|
237
|
+
max_execution_time = @leading_timestamp + @interval.end
|
238
|
+
execution_time = max_execution_time if max_execution_time < execution_time
|
239
|
+
end
|
240
|
+
|
241
|
+
if execution_time <= now
|
242
|
+
@timer.cancel
|
243
|
+
call!
|
244
|
+
elsif execution_time > @timer.execution_time
|
245
|
+
@timer.reschedule(execution_time)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
def trailing_edge_debounce(now)
|
250
|
+
@mutex.synchronize do
|
251
|
+
next start_timer(now) unless @timer
|
252
|
+
next handle_intermediate_event(now) if @timer.active?
|
253
|
+
|
254
|
+
handle_leading_event(now)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module DSL
|
5
|
+
module Events
|
6
|
+
#
|
7
|
+
# Event object passed by a {Rules::BuilderDSL#watch} trigger.
|
8
|
+
#
|
9
|
+
# @!attribute [r] path
|
10
|
+
# @return [Pathname] The path that had an event
|
11
|
+
# @!attribute [r] type
|
12
|
+
# @return [:created, :modified, :deleted] Type of change
|
13
|
+
# @!attribute [r] attachment
|
14
|
+
# @return [Object] The trigger's attachment
|
15
|
+
WatchEvent = Struct.new(:type, :path, :attachment)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/openhab/dsl/gems.rb
CHANGED