openhab-jrubyscripting 5.0.0.rc5 → 5.0.0.rc6
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.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions.rb +6 -6
- data/lib/openhab/core/dependency_tracking.rb +34 -0
- data/lib/openhab/core/entity_lookup.rb +132 -78
- data/lib/openhab/core/events/item_channel_link.rb +2 -2
- data/lib/openhab/core/events/item_command_event.rb +1 -1
- data/lib/openhab/core/events/item_event.rb +2 -2
- data/lib/openhab/core/events/item_state_changed_event.rb +1 -1
- data/lib/openhab/core/events/thing.rb +1 -1
- data/lib/openhab/core/items/accepted_data_types.rb +2 -2
- data/lib/openhab/core/items/contact_item.rb +1 -1
- data/lib/openhab/core/items/dimmer_item.rb +2 -2
- data/lib/openhab/core/items/generic_item.rb +45 -224
- data/lib/openhab/core/items/group_item.rb +5 -3
- data/lib/openhab/core/items/image_item.rb +2 -2
- data/lib/openhab/core/items/item.rb +219 -0
- data/lib/openhab/core/items/metadata/hash.rb +1 -1
- data/lib/openhab/core/items/persistence.rb +4 -5
- data/lib/openhab/core/items/provider.rb +2 -2
- data/lib/openhab/core/items/proxy.rb +68 -7
- data/lib/openhab/core/items/registry.rb +6 -6
- data/lib/openhab/core/items/semantics/enumerable.rb +6 -6
- data/lib/openhab/core/items/semantics.rb +8 -7
- data/lib/openhab/core/items.rb +2 -1
- data/lib/openhab/core/provider.rb +14 -7
- data/lib/openhab/core/rules/registry.rb +2 -2
- data/lib/openhab/core/rules.rb +1 -1
- data/lib/openhab/core/script_handling.rb +6 -6
- data/lib/openhab/core/things/channel.rb +1 -1
- data/lib/openhab/core/things/channel_uid.rb +2 -2
- data/lib/openhab/core/things/item_channel_link.rb +2 -2
- data/lib/openhab/core/things/links/provider.rb +2 -2
- data/lib/openhab/core/things/registry.rb +1 -1
- data/lib/openhab/core/things/thing.rb +1 -1
- data/lib/openhab/core/types/date_time_type.rb +4 -4
- data/lib/openhab/core/types/hsb_type.rb +2 -2
- data/lib/openhab/core/types/quantity_type.rb +1 -1
- data/lib/openhab/core/types.rb +1 -1
- data/lib/openhab/core/uid.rb +1 -1
- data/lib/openhab/core/value_cache.rb +188 -0
- data/lib/openhab/core.rb +57 -15
- data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
- data/lib/openhab/dsl/items/builder.rb +17 -10
- data/lib/openhab/dsl/items/ensure.rb +5 -5
- data/lib/openhab/dsl/items/timed_command.rb +4 -4
- data/lib/openhab/dsl/rules/automation_rule.rb +53 -39
- data/lib/openhab/dsl/rules/builder.rb +128 -79
- data/lib/openhab/dsl/rules/guard.rb +5 -5
- data/lib/openhab/dsl/rules/name_inference.rb +20 -1
- data/lib/openhab/dsl/rules/rule_triggers.rb +3 -3
- data/lib/openhab/dsl/rules/terse.rb +1 -0
- data/lib/openhab/dsl/rules/triggers/changed.rb +26 -23
- data/lib/openhab/dsl/rules/triggers/command.rb +6 -5
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +2 -2
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +2 -2
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +6 -6
- data/lib/openhab/dsl/rules/triggers/updated.rb +5 -5
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +11 -12
- data/lib/openhab/dsl/things/builder.rb +73 -14
- data/lib/openhab/dsl/version.rb +2 -2
- data/lib/openhab/dsl.rb +43 -17
- data/lib/openhab/log.rb +5 -5
- data/lib/openhab/rspec/configuration.rb +5 -5
- data/lib/openhab/rspec/example_group.rb +1 -1
- data/lib/openhab/rspec/helpers.rb +4 -4
- data/lib/openhab/rspec/hooks.rb +19 -1
- data/lib/openhab/rspec/karaf.rb +12 -19
- data/lib/openhab/rspec/suspend_rules.rb +2 -1
- data/lib/openhab/yard/base_helper.rb +46 -0
- data/lib/openhab/yard/markdown_directive.rb +125 -0
- data/lib/openhab/yard/markdown_helper.rb +99 -0
- metadata +10 -3
@@ -14,15 +14,18 @@ end
|
|
14
14
|
module OpenHAB
|
15
15
|
module DSL
|
16
16
|
#
|
17
|
-
# Creates and manages
|
17
|
+
# Creates and manages openHAB Rules
|
18
18
|
#
|
19
19
|
module Rules
|
20
|
-
# A rules builder allows you to create
|
20
|
+
# A rules builder allows you to create openHAB rules.
|
21
21
|
#
|
22
22
|
# Note that all methods on this module are also availabe directly on {OpenHAB::DSL}.
|
23
23
|
#
|
24
24
|
class Builder
|
25
25
|
include Terse
|
26
|
+
include Core::EntityLookup
|
27
|
+
|
28
|
+
self.create_dummy_items = true
|
26
29
|
|
27
30
|
# @return [org.openhab.core.automation.RuleProvider]
|
28
31
|
attr_reader :provider
|
@@ -34,21 +37,24 @@ module OpenHAB
|
|
34
37
|
#
|
35
38
|
# Create a new rule
|
36
39
|
#
|
40
|
+
# The rule must have at least one trigger and one execution block.
|
41
|
+
# To create a "script" without any triggers, use {#script}.
|
42
|
+
#
|
37
43
|
# @param [String] name The rule name
|
38
|
-
# @yield Block executed in the context of a {Rules::
|
39
|
-
# @yieldparam [Rules::
|
44
|
+
# @yield Block executed in the context of a {Rules::BuilderDSL}
|
45
|
+
# @yieldparam [Rules::BuilderDSL] rule
|
40
46
|
# Optional parameter to access the rule configuration from within execution blocks and guards.
|
41
|
-
# @return [Rule]
|
47
|
+
# @return [Core::Rules::Rule, nil] The rule object, or nil if no rule was created.
|
42
48
|
#
|
43
|
-
# @see OpenHAB::DSL::Rules::
|
49
|
+
# @see OpenHAB::DSL::Rules::BuilderDSL Rule BuilderDSL for details on rule triggers, guards and execution blocks
|
44
50
|
# @see Rules::Terse Terse Rules
|
45
51
|
#
|
46
52
|
# @example
|
47
53
|
# require "openhab/dsl"
|
48
54
|
#
|
49
55
|
# rule "name" do
|
50
|
-
# <
|
51
|
-
# <
|
56
|
+
# <one or more triggers>
|
57
|
+
# <one or more execution blocks>
|
52
58
|
# <zero or more guards>
|
53
59
|
# end
|
54
60
|
#
|
@@ -85,7 +91,7 @@ module OpenHAB
|
|
85
91
|
# @param [String] name A descriptive name
|
86
92
|
# @param [String] id The script's ID
|
87
93
|
# @yield [] Block executed when the script is executed.
|
88
|
-
# @return [Rule]
|
94
|
+
# @return [Core::Rules::Rule]
|
89
95
|
#
|
90
96
|
def script(name = nil, id: nil, script: nil, &block)
|
91
97
|
raise ArgumentError, "Block is required" unless block
|
@@ -108,7 +114,7 @@ module OpenHAB
|
|
108
114
|
end
|
109
115
|
|
110
116
|
#
|
111
|
-
# Rule configuration for
|
117
|
+
# Rule configuration for openHAB Rules engine
|
112
118
|
#
|
113
119
|
class BuilderDSL
|
114
120
|
include Core::EntityLookup
|
@@ -117,6 +123,8 @@ module OpenHAB
|
|
117
123
|
extend Property
|
118
124
|
extend Forwardable
|
119
125
|
|
126
|
+
self.create_dummy_items = true
|
127
|
+
|
120
128
|
delegate %i[triggers trigger_conditions attachments] => :@rule_triggers
|
121
129
|
|
122
130
|
# @!visibility private
|
@@ -259,7 +267,7 @@ module OpenHAB
|
|
259
267
|
#
|
260
268
|
# @example
|
261
269
|
# rule 'Delay sleeps between execution elements' do
|
262
|
-
#
|
270
|
+
# on_load
|
263
271
|
# run { logger.info("Sleeping") }
|
264
272
|
# delay 5.seconds
|
265
273
|
# run { logger.info("Awake") }
|
@@ -267,7 +275,7 @@ module OpenHAB
|
|
267
275
|
#
|
268
276
|
# @example Like other execution blocks, multiple can exist in a single rule.
|
269
277
|
# rule 'Multiple delays can exist in a rule' do
|
270
|
-
#
|
278
|
+
# on_load
|
271
279
|
# run { logger.info("Sleeping") }
|
272
280
|
# delay 5.seconds
|
273
281
|
# run { logger.info("Sleeping Again") }
|
@@ -277,7 +285,7 @@ module OpenHAB
|
|
277
285
|
#
|
278
286
|
# @example You can use Ruby code in your rule across multiple execution blocks like a run and a delay.
|
279
287
|
# rule 'Dim a switch on system startup over 100 seconds' do
|
280
|
-
#
|
288
|
+
# on_load
|
281
289
|
# 100.times do
|
282
290
|
# run { DimmerSwitch.dim }
|
283
291
|
# delay 1.second
|
@@ -302,7 +310,7 @@ module OpenHAB
|
|
302
310
|
#
|
303
311
|
# @example
|
304
312
|
# rule 'Turn switch ON or OFF based on value of another switch' do
|
305
|
-
#
|
313
|
+
# on_load
|
306
314
|
# run { TestSwitch << ON }
|
307
315
|
# otherwise { TestSwitch << OFF }
|
308
316
|
# only_if { OtherSwitch.on? }
|
@@ -425,28 +433,28 @@ module OpenHAB
|
|
425
433
|
#
|
426
434
|
# @example String of {LocalTime}
|
427
435
|
# rule 'Log an entry if started between 3:30:04 and midnight using strings' do
|
428
|
-
#
|
436
|
+
# on_load
|
429
437
|
# run { logger.info ("Started at #{LocalTime.now}")}
|
430
438
|
# between '3:30:04'..LocalTime::MIDNIGHT
|
431
439
|
# end
|
432
440
|
#
|
433
441
|
# @example {LocalTime}
|
434
442
|
# rule 'Log an entry if started between 3:30:04 and midnight using LocalTime objects' do
|
435
|
-
#
|
443
|
+
# on_load
|
436
444
|
# run { logger.info ("Started at #{LocalTime.now}")}
|
437
445
|
# between LocalTime.of(3, 30, 4)..LocalTime::MIDNIGHT
|
438
446
|
# end
|
439
447
|
#
|
440
448
|
# @example String of {MonthDay}
|
441
449
|
# rule 'Log an entry if started between March 9th and April 10ths' do
|
442
|
-
#
|
450
|
+
# on_load
|
443
451
|
# run { logger.info ("Started at #{Time.now}")}
|
444
452
|
# between '03-09'..'04-10'
|
445
453
|
# end
|
446
454
|
#
|
447
455
|
# @example {MonthDay}
|
448
456
|
# rule 'Log an entry if started between March 9th and April 10ths' do
|
449
|
-
#
|
457
|
+
# on_load
|
450
458
|
# run { logger.info ("Started at #{Time.now}")}
|
451
459
|
# between MonthDay.of(03,09)..'04-06'
|
452
460
|
# end
|
@@ -533,8 +541,8 @@ module OpenHAB
|
|
533
541
|
@rule_triggers = RuleTriggers.new
|
534
542
|
@caller = caller_binding.eval "self"
|
535
543
|
@ruby_triggers = []
|
544
|
+
@on_load_id = nil
|
536
545
|
enabled(true)
|
537
|
-
on_start(false)
|
538
546
|
tags([])
|
539
547
|
end
|
540
548
|
|
@@ -789,19 +797,19 @@ module OpenHAB
|
|
789
797
|
# for is a reserved word in ruby, so use local_variable_get :for
|
790
798
|
duration = binding.local_variable_get(:for)
|
791
799
|
|
800
|
+
@ruby_triggers << [:changed, items, { to: to, from: from, duration: duration }]
|
801
|
+
|
792
802
|
from = [nil] if from.nil?
|
793
803
|
to = [nil] if to.nil?
|
794
|
-
|
795
|
-
@ruby_triggers << [:changed, items, { to: to, from: from, duration: duration }]
|
796
804
|
items.each do |item|
|
797
805
|
case item
|
798
806
|
when Core::Things::Thing,
|
799
807
|
Core::Things::ThingUID,
|
800
|
-
Core::Items::
|
808
|
+
Core::Items::Item,
|
801
809
|
Core::Items::GroupItem::Members
|
802
810
|
nil
|
803
811
|
else
|
804
|
-
raise ArgumentError, "items must be
|
812
|
+
raise ArgumentError, "items must be an Item, GroupItem::Members, Thing, or ThingUID"
|
805
813
|
end
|
806
814
|
|
807
815
|
logger.trace("Creating changed trigger for entity(#{item}), to(#{to.inspect}), from(#{from.inspect})")
|
@@ -818,7 +826,7 @@ module OpenHAB
|
|
818
826
|
# Create a cron trigger
|
819
827
|
#
|
820
828
|
# @overload cron(expression, attach: nil)
|
821
|
-
# @param [String, nil] expression [
|
829
|
+
# @param [String, nil] expression [openHAB style cron expression](https://www.openhab.org/docs/configuration/rules-dsl.html#time-based-triggers)
|
822
830
|
# @param [Object] attach object to be attached to the trigger
|
823
831
|
#
|
824
832
|
# @example Using a cron expression
|
@@ -962,45 +970,116 @@ module OpenHAB
|
|
962
970
|
end
|
963
971
|
|
964
972
|
#
|
965
|
-
#
|
973
|
+
# Creates a trigger that executes when the script is loaded
|
966
974
|
#
|
967
|
-
# Execute the rule
|
968
|
-
#
|
969
|
-
# especially when combined with other triggers.
|
975
|
+
# Execute the rule whenever the script is first loaded, including on openHAB start up,
|
976
|
+
# and on subsequent reloads on file modifications.
|
977
|
+
# This is useful to perform initialization routines, especially when combined with other triggers.
|
970
978
|
#
|
971
|
-
# @param [
|
972
|
-
# @param [Object] attach object to be attached to the trigger
|
979
|
+
# @param [Object] attach Object to be attached to the trigger
|
973
980
|
# @return [void]
|
974
981
|
#
|
975
982
|
# @example
|
976
|
-
# rule "startup rule" do
|
977
|
-
#
|
983
|
+
# rule "script startup rule" do
|
984
|
+
# on_load
|
978
985
|
# run do
|
979
986
|
# <calculate some item state>
|
980
987
|
# end
|
981
988
|
# end
|
982
989
|
#
|
983
990
|
# @example
|
984
|
-
# rule
|
985
|
-
#
|
991
|
+
# rule "Ensure all security lights are on" do
|
992
|
+
# on_load
|
986
993
|
# run { Security_Lights.on }
|
987
994
|
# end
|
988
995
|
#
|
989
|
-
|
990
|
-
|
991
|
-
|
996
|
+
def on_load(attach: nil)
|
997
|
+
# prevent overwriting @on_load_id
|
998
|
+
raise ArgumentError, "on_load can only be used once within a rule" if @on_load_id
|
999
|
+
|
1000
|
+
@on_load_id = SecureRandom.uuid
|
1001
|
+
attachments[@on_load_id] = attach
|
1002
|
+
end
|
1003
|
+
|
1004
|
+
#
|
1005
|
+
# Creates a trigger that executes when openHAB reaches a certain start level
|
1006
|
+
#
|
1007
|
+
# This will only trigger once during openHAB start up. It won't trigger on script reloads.
|
1008
|
+
#
|
1009
|
+
# @param [Integer,:rules,:ruleengine,:ui,:things,:complete] at_level
|
1010
|
+
# Zero or more start levels. Note that Startlevels less than 40 are not available as triggers
|
1011
|
+
# because the rule engine needs to start up first before it can execute any rules
|
1012
|
+
#
|
1013
|
+
# | Symbol | Start Level |
|
1014
|
+
# | ------------- | ----------- |
|
1015
|
+
# | `:osgi` | 10 |
|
1016
|
+
# | `:model` | 20 |
|
1017
|
+
# | `:state` | 30 |
|
1018
|
+
# | `:rules` | 40 |
|
1019
|
+
# | `:ruleengine` | 50 |
|
1020
|
+
# | `:ui` | 70 |
|
1021
|
+
# | `:things` | 80 |
|
1022
|
+
# | `:complete` | 100 |
|
1023
|
+
# @param [Array<Integer,:rules,:ruleengine,:ui,:things,:complete>] at_levels Fluent alias for `at_level`
|
1024
|
+
# @param [Object] attach Object to be attached to the trigger
|
1025
|
+
# @return [void]
|
1026
|
+
#
|
1027
|
+
# @example
|
1028
|
+
# rule "Trigger at openHAB system start" do
|
1029
|
+
# on_start # trigger at the default startlevel 100
|
1030
|
+
# run { logger.info "openHAB start up complete." }
|
1031
|
+
# end
|
1032
|
+
#
|
1033
|
+
# @example Trigger at a specific start level
|
1034
|
+
# rule "Trigger after things are loaded" do
|
1035
|
+
# on_start at_level: :things
|
1036
|
+
# run { logger.info "Things are ready!" }
|
1037
|
+
# end
|
1038
|
+
#
|
1039
|
+
# @example Trigger at multiple levels
|
1040
|
+
# rule "Multiple start up triggers" do
|
1041
|
+
# on_start at_levels: %i[ui things complete]
|
1042
|
+
# run do |event|
|
1043
|
+
# logger.info "openHAB startlevel has reached level #{event.startlevel}"
|
1044
|
+
# end
|
1045
|
+
# end
|
1046
|
+
#
|
1047
|
+
# @see https://www.openhab.org/docs/configuration/rules-dsl.html#system-based-triggers System based triggers
|
1048
|
+
#
|
1049
|
+
def on_start(at_level: nil, at_levels: nil, attach: nil)
|
1050
|
+
levels = Array.wrap(at_level) | Array.wrap(at_levels)
|
1051
|
+
levels = [100] if levels.empty?
|
1052
|
+
|
1053
|
+
levels.map! do |level|
|
1054
|
+
next level unless level.is_a?(Symbol)
|
1055
|
+
|
1056
|
+
begin
|
1057
|
+
klass = org.openhab.core.service.StartLevelService.java_class
|
1058
|
+
klass.declared_field("STARTLEVEL_#{level.upcase}").get_int(klass)
|
1059
|
+
rescue java.lang.NoSuchFieldException
|
1060
|
+
raise ArgumentError, "Invalid symbol for at_level: :#{level}"
|
1061
|
+
end
|
1062
|
+
end
|
1063
|
+
|
1064
|
+
@ruby_triggers << [:on_start, levels]
|
1065
|
+
levels.each do |level|
|
1066
|
+
logger.warn "Rule engine doesn't start until start level 40" if level < 40
|
1067
|
+
config = { startlevel: level }
|
1068
|
+
logger.trace("Creating a SystemStartlevelTrigger with startlevel=#{level}")
|
1069
|
+
Triggers::Trigger.new(rule_triggers: @rule_triggers)
|
1070
|
+
.append_trigger(type: "core.SystemStartlevelTrigger", config: config, attach: attach)
|
1071
|
+
end
|
992
1072
|
end
|
993
|
-
# rubocop:enable Style/OptionalBooleanParameter
|
994
1073
|
|
995
1074
|
#
|
996
|
-
#
|
1075
|
+
# Creates a trigger for when an item or group receives a command.
|
997
1076
|
#
|
998
1077
|
# The command/commands parameters are replicated for DSL fluency.
|
999
1078
|
#
|
1000
1079
|
# The `event` passed to run blocks will be an
|
1001
1080
|
# {Core::Events::ItemCommandEvent}.
|
1002
1081
|
#
|
1003
|
-
# @param [
|
1082
|
+
# @param [Item, GroupItem::Members] items Items to create trigger for
|
1004
1083
|
# @param [Core::TypesCommand, Array<Command>, Range, Proc] command commands to match for trigger
|
1005
1084
|
# @param [Array<Command>, Range, Proc] commands Fluent alias for `command`
|
1006
1085
|
# @param [Object] attach object to be attached to the trigger
|
@@ -1072,11 +1151,11 @@ module OpenHAB
|
|
1072
1151
|
|
1073
1152
|
items.each do |item|
|
1074
1153
|
case item
|
1075
|
-
when Core::Items::
|
1154
|
+
when Core::Items::Item,
|
1076
1155
|
Core::Items::GroupItem::Members
|
1077
1156
|
nil
|
1078
1157
|
else
|
1079
|
-
raise ArgumentError, "items must be
|
1158
|
+
raise ArgumentError, "items must be an Item or GroupItem::Members"
|
1080
1159
|
end
|
1081
1160
|
commands.each do |cmd|
|
1082
1161
|
logger.trace "Creating received command trigger for items #{item.inspect} and commands #{cmd.inspect}"
|
@@ -1194,7 +1273,7 @@ module OpenHAB
|
|
1194
1273
|
# {Core::Events::ThingStatusInfoEvent} depending on if the triggering
|
1195
1274
|
# element was an item or a thing.
|
1196
1275
|
#
|
1197
|
-
# @param [
|
1276
|
+
# @param [Item, GroupItem::Members, Thing] items
|
1198
1277
|
# Objects to create trigger for.
|
1199
1278
|
# @param [State, Array<State>, Range, Proc, Symbol, String] to
|
1200
1279
|
# Only execute rule if the state matches `to` state(s). If the
|
@@ -1271,11 +1350,11 @@ module OpenHAB
|
|
1271
1350
|
case item
|
1272
1351
|
when Core::Things::Thing,
|
1273
1352
|
Core::Things::ThingUID,
|
1274
|
-
Core::Items::
|
1353
|
+
Core::Items::Item,
|
1275
1354
|
Core::Items::GroupItem::Members
|
1276
1355
|
nil
|
1277
1356
|
else
|
1278
|
-
raise ArgumentError, "items must be
|
1357
|
+
raise ArgumentError, "items must be an Item, GroupItem::Members, Thing, or ThingUID"
|
1279
1358
|
end
|
1280
1359
|
|
1281
1360
|
logger.trace("Creating updated trigger for item(#{item}) to(#{to})")
|
@@ -1317,7 +1396,7 @@ module OpenHAB
|
|
1317
1396
|
# @param [Object] attach object to be attached to the trigger
|
1318
1397
|
# @return [void]
|
1319
1398
|
#
|
1320
|
-
# @example Watch `items` directory inside of the
|
1399
|
+
# @example Watch `items` directory inside of the openHAB configuration path and log any changes.
|
1321
1400
|
# rule 'watch directory' do
|
1322
1401
|
# watch OpenHAB::Core.config_folder / 'items'
|
1323
1402
|
# run { |event| logger.info("#{event.path.basename} - #{event.type}") }
|
@@ -1358,36 +1437,6 @@ module OpenHAB
|
|
1358
1437
|
|
1359
1438
|
# @!endgroup
|
1360
1439
|
|
1361
|
-
#
|
1362
|
-
# Checks if this rule should run on start
|
1363
|
-
#
|
1364
|
-
# @return [true, false] True if rule should run on start, false otherwise.
|
1365
|
-
#
|
1366
|
-
def on_start?
|
1367
|
-
@on_start.enabled
|
1368
|
-
end
|
1369
|
-
|
1370
|
-
#
|
1371
|
-
# Get the optional start attachment
|
1372
|
-
#
|
1373
|
-
# @return [Object] optional user provided attachment to the on_start method
|
1374
|
-
#
|
1375
|
-
# @!visibility private
|
1376
|
-
def start_attachment
|
1377
|
-
@on_start.attach
|
1378
|
-
end
|
1379
|
-
|
1380
|
-
# @!visibility private
|
1381
|
-
#
|
1382
|
-
# Run the supplied block inside the object instance of the object that created the rule
|
1383
|
-
#
|
1384
|
-
# @yield [] Block executed in context of the object creating the rule
|
1385
|
-
#
|
1386
|
-
#
|
1387
|
-
def my(&block)
|
1388
|
-
@caller.instance_eval(&block)
|
1389
|
-
end
|
1390
|
-
|
1391
1440
|
#
|
1392
1441
|
# @return [String]
|
1393
1442
|
#
|
@@ -1396,7 +1445,7 @@ module OpenHAB
|
|
1396
1445
|
#<OpenHAB::DSL::Rules::Builder: #{uid}
|
1397
1446
|
triggers=#{triggers.inspect},
|
1398
1447
|
run blocks=#{run.inspect},
|
1399
|
-
|
1448
|
+
on_load=#{!@on_load_id.nil?},
|
1400
1449
|
Trigger Conditions=#{trigger_conditions.inspect},
|
1401
1450
|
Trigger UIDs=#{triggers.map(&:id).inspect},
|
1402
1451
|
Attachments=#{attachments.inspect}
|
@@ -1419,7 +1468,7 @@ module OpenHAB
|
|
1419
1468
|
added_rule.actions.first.configuration.put("type", "application/x-ruby")
|
1420
1469
|
added_rule.actions.first.configuration.put("script", script) if script
|
1421
1470
|
|
1422
|
-
rule.execute(nil, { "
|
1471
|
+
rule.execute(nil, { "module" => @on_load_id }) if @on_load_id
|
1423
1472
|
added_rule
|
1424
1473
|
end
|
1425
1474
|
|
@@ -1456,7 +1505,7 @@ module OpenHAB
|
|
1456
1505
|
# @return [true,false] True if rule has triggers, false otherwise
|
1457
1506
|
#
|
1458
1507
|
def triggers?
|
1459
|
-
|
1508
|
+
@on_load_id || !triggers.empty?
|
1460
1509
|
end
|
1461
1510
|
|
1462
1511
|
#
|
@@ -34,7 +34,7 @@ module OpenHAB
|
|
34
34
|
#
|
35
35
|
# Checks if a guard should run
|
36
36
|
#
|
37
|
-
# @param [
|
37
|
+
# @param [Object] event openHAB Trigger Event
|
38
38
|
#
|
39
39
|
# @return [true,false] True if guard is satisfied, false otherwise
|
40
40
|
#
|
@@ -51,7 +51,7 @@ module OpenHAB
|
|
51
51
|
#
|
52
52
|
# @param [Array] conditions to check
|
53
53
|
# @param [Symbol] check_type type of check to perform (:only_if or :not_if)
|
54
|
-
# @param [Event] event
|
54
|
+
# @param [Event] event openHAB event to see if it satisfies the guard
|
55
55
|
#
|
56
56
|
# @return [true,false] True if guard is satisfied, false otherwise
|
57
57
|
#
|
@@ -70,7 +70,7 @@ module OpenHAB
|
|
70
70
|
# Execute the guard check
|
71
71
|
#
|
72
72
|
# @param [Symbol] check_type :only_if or :not_if to check
|
73
|
-
# @param [
|
73
|
+
# @param [Object] event event to check if meets guard
|
74
74
|
# @param [Array<Item>] items to check if satisfy criteria
|
75
75
|
# @param [Array] procs to check if satisfy criteria
|
76
76
|
#
|
@@ -87,7 +87,7 @@ module OpenHAB
|
|
87
87
|
#
|
88
88
|
# Check not_if guard
|
89
89
|
#
|
90
|
-
# @param [
|
90
|
+
# @param [Object] event to check if meets guard
|
91
91
|
# @param [Array<Item>] items to check if satisfy criteria
|
92
92
|
# @param [Array] procs to check if satisfy criteria
|
93
93
|
#
|
@@ -100,7 +100,7 @@ module OpenHAB
|
|
100
100
|
#
|
101
101
|
# Check only_if guard
|
102
102
|
#
|
103
|
-
# @param [
|
103
|
+
# @param [Object] event to check if meets guard
|
104
104
|
# @param [Array<Item>] items to check if satisfy criteria
|
105
105
|
# @param [Array] procs to check if satisfy criteria
|
106
106
|
#
|
@@ -18,6 +18,7 @@ module OpenHAB
|
|
18
18
|
"core.ItemCommandTrigger",
|
19
19
|
"core.ItemStateChangeTrigger",
|
20
20
|
"core.ItemStateUpdateTrigger",
|
21
|
+
"core.SystemStartlevelTrigger",
|
21
22
|
Triggers::Cron::CRON_TRIGGER_MODULE_ID
|
22
23
|
].freeze
|
23
24
|
private_constant :KNOWN_TRIGGER_TYPES
|
@@ -61,6 +62,8 @@ module OpenHAB
|
|
61
62
|
infer_rule_name_from_channel_link_trigger(trigger)
|
62
63
|
when :thing_added, :thing_removed, :thing_updated
|
63
64
|
infer_rule_name_from_thing_trigger(trigger)
|
65
|
+
when :on_start
|
66
|
+
infer_rule_name_from_on_start_trigger(items)
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
@@ -122,6 +125,22 @@ module OpenHAB
|
|
122
125
|
}[trigger]
|
123
126
|
end
|
124
127
|
|
128
|
+
# formulate a readable rule name from an on_start trigger
|
129
|
+
def infer_rule_name_from_on_start_trigger(levels)
|
130
|
+
levels = levels.map { |level| "#{level} (#{start_level_description(level)})" }
|
131
|
+
levels = format_array(levels)
|
132
|
+
"System Start Level reached #{levels}"
|
133
|
+
end
|
134
|
+
|
135
|
+
def start_level_description(level)
|
136
|
+
klass = org.openhab.core.service.StartLevelService.java_class
|
137
|
+
start_level_type = klass.declared_field("STARTLEVEL_OSGI").type
|
138
|
+
klass.declared_fields
|
139
|
+
.select { |field| field.type == start_level_type && field.name.start_with?("STARTLEVEL_") }
|
140
|
+
.find { |field| field.get_int(klass) == level }
|
141
|
+
.name.split("_", 2).last.downcase
|
142
|
+
end
|
143
|
+
|
125
144
|
# format an array of words that will be the beginning of a sentence
|
126
145
|
def format_beginning_of_sentence_array(array)
|
127
146
|
result = format_array(array)
|
@@ -146,7 +165,7 @@ module OpenHAB
|
|
146
165
|
return array[0] if array.length == 1
|
147
166
|
return "#{array[0]} or #{array[1]}" if array.length == 2
|
148
167
|
|
149
|
-
"
|
168
|
+
"#{array[0..-2].join(", ")}, or #{array[-1]}"
|
150
169
|
end
|
151
170
|
end
|
152
171
|
end
|
@@ -10,7 +10,7 @@ module OpenHAB
|
|
10
10
|
module DSL
|
11
11
|
module Rules
|
12
12
|
#
|
13
|
-
# Rule configuration for
|
13
|
+
# Rule configuration for openHAB Rules engine
|
14
14
|
#
|
15
15
|
# @!visibility private
|
16
16
|
class RuleTriggers
|
@@ -39,7 +39,7 @@ module OpenHAB
|
|
39
39
|
# @param [Map] config map describing trigger configuration
|
40
40
|
# @param [Object] attach object to be attached to the trigger
|
41
41
|
#
|
42
|
-
# @return [Trigger]
|
42
|
+
# @return [org.openhab.core.automation.Trigger] openHAB trigger
|
43
43
|
#
|
44
44
|
def append_trigger(type:, config:, attach: nil, conditions: nil)
|
45
45
|
config.transform_keys!(&:to_s)
|
@@ -57,7 +57,7 @@ module OpenHAB
|
|
57
57
|
# @param [String] type of trigger
|
58
58
|
# @param [Map] config map
|
59
59
|
#
|
60
|
-
# @return [
|
60
|
+
# @return [org.openhab.core.automation.Trigger] configured by type and supplied config
|
61
61
|
#
|
62
62
|
def self.trigger(type:, config:)
|
63
63
|
logger.trace("Creating trigger of type '#{type}' config: #{config}")
|
@@ -16,13 +16,13 @@ module OpenHAB
|
|
16
16
|
#
|
17
17
|
# Create the trigger
|
18
18
|
#
|
19
|
-
# @param [
|
20
|
-
# @param [
|
21
|
-
# @param [
|
22
|
-
# @param [Duration, nil] duration
|
19
|
+
# @param [Core::Items::Item, Core::Items::GroupItem::Members] item item to create trigger for
|
20
|
+
# @param [Core::Types::State, Array<Core::Types::State>, Range, Proc] from state to restrict trigger to
|
21
|
+
# @param [Core::Types::State, Array<Core::Types::State>, Range, Proc] to state to restrict trigger to
|
22
|
+
# @param [Duration, nil] duration duration to delay trigger until to state is met
|
23
23
|
# @param [Object] attach object to be attached to the trigger
|
24
24
|
#
|
25
|
-
# @return [Trigger]
|
25
|
+
# @return [org.openhab.core.automation.Trigger] openHAB triggers
|
26
26
|
#
|
27
27
|
def trigger(item:, from:, to:, duration:, attach:)
|
28
28
|
if duration
|
@@ -50,13 +50,15 @@ module OpenHAB
|
|
50
50
|
#
|
51
51
|
# Create a TriggerDelay for for an item or group that is changed for a specific duration
|
52
52
|
#
|
53
|
-
# @param [
|
53
|
+
# @param [Core::Items::Item, Core::Items::GroupItem::Members] item to create trigger delay for
|
54
54
|
# @param [Duration] duration to delay trigger for until condition is met
|
55
|
-
# @param [
|
56
|
-
#
|
55
|
+
# @param [Core::Types::State, Array<Core::Types::State>, Range, Proc] to
|
56
|
+
# State item or group needs to change to
|
57
|
+
# @param [Core::Types::State, Array<Core::Types::State>, Range, Proc] from
|
58
|
+
# State item or group needs to be coming from
|
57
59
|
# @param [Object] attach object to be attached to the trigger
|
58
60
|
#
|
59
|
-
# @return [Trigger]
|
61
|
+
# @return [org.openhab.core.automation.Trigger]
|
60
62
|
#
|
61
63
|
def wait_trigger(item:, duration:, to: nil, from: nil, attach: nil)
|
62
64
|
item_name = item.respond_to?(:name) ? item.name : item.to_s
|
@@ -68,11 +70,11 @@ module OpenHAB
|
|
68
70
|
|
69
71
|
#
|
70
72
|
# Creates a trigger with a range condition on either 'from' or 'to' field
|
71
|
-
# @param [
|
72
|
-
# @param [
|
73
|
-
# @param [
|
73
|
+
# @param [Core::Items::Item, Core::Items::GroupItem::Members] item to create changed trigger on
|
74
|
+
# @param [Range] from state to restrict trigger to
|
75
|
+
# @param [Range] to state restrict trigger to
|
74
76
|
# @param [Object] attach object to be attached to the trigger
|
75
|
-
# @return [Trigger]
|
77
|
+
# @return [org.openhab.core.automation.Trigger]
|
76
78
|
#
|
77
79
|
def range_trigger(item:, from:, to:, attach:)
|
78
80
|
from, to = Conditions::Proc.range_procs(from, to)
|
@@ -81,11 +83,11 @@ module OpenHAB
|
|
81
83
|
|
82
84
|
#
|
83
85
|
# Creates a trigger with a proc condition on either 'from' or 'to' field
|
84
|
-
# @param [
|
85
|
-
# @param [
|
86
|
-
# @param [
|
86
|
+
# @param [Core::Items::Item, Core::Items::GroupItem::Members] item to create changed trigger on
|
87
|
+
# @param [Proc] from state to restrict trigger to
|
88
|
+
# @param [Proc] to state restrict trigger to
|
87
89
|
# @param [Object] attach object to be attached to the trigger
|
88
|
-
# @return [Trigger]
|
90
|
+
# @return [org.openhab.core.automation.Trigger]
|
89
91
|
#
|
90
92
|
def proc_trigger(item:, from:, to:, attach:)
|
91
93
|
# swap from/to w/ nil if from/to is a proc
|
@@ -100,10 +102,11 @@ module OpenHAB
|
|
100
102
|
#
|
101
103
|
# Create a changed trigger
|
102
104
|
#
|
103
|
-
# @param [
|
104
|
-
# @param [
|
105
|
-
# @param [
|
105
|
+
# @param [Core::Items::Item, Core::Items::GroupItem::Members] item to create changed trigger on
|
106
|
+
# @param [Core::Items::State, Array<Core::Items::State>] from state to restrict trigger to
|
107
|
+
# @param [Core::Items::State, Array<Core::Items::State>] to state restrict trigger to
|
106
108
|
# @param [Object] attach object to be attached to the trigger
|
109
|
+
# @return [org.openhab.core.automation.Trigger]
|
107
110
|
#
|
108
111
|
def changed_trigger(item:, from:, to:, attach: nil, conditions: nil)
|
109
112
|
type, config = case item
|
@@ -121,7 +124,7 @@ module OpenHAB
|
|
121
124
|
#
|
122
125
|
# Create a changed trigger for a thing
|
123
126
|
#
|
124
|
-
# @param [Thing] thing to detected changed states on
|
127
|
+
# @param [Core::Things::Thing] thing to detected changed states on
|
125
128
|
# @param [String] from state to restrict trigger to
|
126
129
|
# @param [String] to state to restrict trigger to
|
127
130
|
#
|
@@ -152,7 +155,7 @@ module OpenHAB
|
|
152
155
|
#
|
153
156
|
# Create a changed trigger for group items
|
154
157
|
#
|
155
|
-
# @param [
|
158
|
+
# @param [GroupItem] group to detected changed states on
|
156
159
|
# @param [String] from state to restrict trigger to
|
157
160
|
# @param [String] to to restrict trigger to
|
158
161
|
#
|
@@ -160,7 +163,7 @@ module OpenHAB
|
|
160
163
|
# second element is a Hash configuring trigger
|
161
164
|
#
|
162
165
|
def group(group:, from:, to:)
|
163
|
-
config = { "groupName" => group.
|
166
|
+
config = { "groupName" => group.name }
|
164
167
|
config["state"] = to.to_s if to
|
165
168
|
config["previousState"] = from.to_s if from
|
166
169
|
[GROUP_STATE_CHANGE, config]
|