openhab-scripting 4.42.2 → 4.43.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08c9201c21983751d80e9c2e4df683c39cef20763a5321fd2f8fdcd355cdb6c5'
4
- data.tar.gz: f0b2c25837d2396e70d11ba503920ff443992bd9cf007b18a2003f6857a17929
3
+ metadata.gz: a7ffe3540ffb1e1538b60f38b9943e5ed72bded20d313d0702884921d30b5843
4
+ data.tar.gz: bd72fa1f8a18b9a5fa5b06f57e50a5943ecd4252d091307cd21f4f50d0c50805
5
5
  SHA512:
6
- metadata.gz: bff012a5dc7caf0e06fb9d0f3aede99afc9ad067004390ae606d392c34fe3662b017395fa3c200e759c2023e4801fb775ee097a29f0b90554f721d8fbbf9cf47
7
- data.tar.gz: b862f6f69383d86e1a230d2c702c440c0b6dd465ed22ec16ad03a47166bd319004a8f82147eed2da514b301523f99c917c9d93de56f6ea7b9907ab5713f9d61d
6
+ metadata.gz: d980ee1aee7685e711b322baf8307f83e6bff963a59a8dcb00b012e66c6c0b104d3369e39337180554ae24d057ffb2d374654eb3f4ea9a5acf08d78237b2f210
7
+ data.tar.gz: 776d0d64562bb90461b6c87282311e4db548ead4eb8f5823b0ccd042880552f6b5b838b0fd9289adc481ccb988ee3212be583668df2b75e3cd2c03b1103c94a2
@@ -73,9 +73,7 @@ module OpenHAB
73
73
  return if name.count('_') < 3
74
74
 
75
75
  name = name.tr('_', ':')
76
- # rubocop: disable Style/GlobalVars
77
76
  $things.get(Java::OrgOpenhabCoreThing::ThingUID.new(name))
78
- # rubocop: enable Style/GlobalVars
79
77
  end
80
78
 
81
79
  #
@@ -88,7 +86,7 @@ module OpenHAB
88
86
  def self.lookup_item(name)
89
87
  logger.trace("Looking up item(#{name})")
90
88
  name = name.to_s if name.is_a? Symbol
91
- item = $ir.get(name) # rubocop: disable Style/GlobalVars
89
+ item = $ir.get(name)
92
90
  ItemProxy.new(item) unless item.nil?
93
91
  end
94
92
  end
@@ -22,7 +22,7 @@ module OpenHAB
22
22
  # Lookup item from item registry
23
23
  #
24
24
  def __getobj__
25
- $ir.get(@item_name) # rubocop:disable Style/GlobalVars
25
+ $ir.get(@item_name)
26
26
  end
27
27
  end
28
28
  end
@@ -50,9 +50,7 @@ module OpenHAB
50
50
 
51
51
  # Get the OSGI Bundle for ScriptExtension Class
52
52
  def self.bundle
53
- # rubocop: disable Style/GlobalVars
54
53
  @bundle ||= FrameworkUtil.getBundle($scriptExtension.class)
55
- # rubocop: enable Style/GlobalVars
56
54
  end
57
55
  private_class_method :bundle
58
56
  end
@@ -11,7 +11,6 @@ module OpenHAB
11
11
 
12
12
  # Get the OpenHAB automation manager
13
13
  # @return [AutomationManager] OpenHAB Automation manager
14
- # rubocop:disable Style/GlobalVars
15
14
  def self.automation_manager
16
15
  $scriptExtension.get('automationManager')
17
16
  end
@@ -21,6 +20,5 @@ module OpenHAB
21
20
  def self.rule_registry
22
21
  $scriptExtension.get('ruleRegistry')
23
22
  end
24
- # rubocop:enable Style/GlobalVars
25
23
  end
26
24
  end
@@ -33,7 +33,7 @@ module OpenHAB
33
33
  # @param [Hash] values Keys and values to set for running thread, if hash is nil no values are set
34
34
  #
35
35
  def thread_local(**values, &block)
36
- ThreadLocal.thread_local(values, &block)
36
+ ThreadLocal.thread_local(**values, &block)
37
37
  end
38
38
  end
39
39
  end
@@ -29,9 +29,7 @@ module OpenHAB
29
29
  # @return [Object] OpenHAB action
30
30
  #
31
31
  def actions(scope, thing_uid)
32
- # rubocop: disable Style/GlobalVars
33
32
  $actions.get(scope, thing_uid)
34
- # rubocop: enable Style/GlobalVars
35
33
  end
36
34
 
37
35
  #
@@ -43,9 +41,7 @@ module OpenHAB
43
41
  #
44
42
  def actions_for_thing(thing_uid)
45
43
  thing_uid = thing_uid.to_s
46
- # rubocop: disable Style/GlobalVars
47
44
  action_keys = $actions.action_keys
48
- # rubocop: enable Style/GlobalVars
49
45
  logger.trace("Registered actions: '#{action_keys}' for thing '#{thing_uid}'")
50
46
  action_keys.map { |action_key| action_key.split('-', 2) }
51
47
  .select { |action_pair| action_pair.last == thing_uid }
@@ -101,6 +97,18 @@ module OpenHAB
101
97
  volume = Types::PercentType.new(volume) unless volume.is_a?(Types::PercentType) || volume.nil?
102
98
  Audio.playSound sink&.to_s, filename.to_s, volume
103
99
  end
100
+
101
+ #
102
+ # Play an audio stream from an URL to the given sink(s). Set url to nil if streaming should be stopped
103
+ #
104
+ # @param [String] url The URL of the audio stream
105
+ # @param [String] sink The audio sink, or nil to use the default audio sink
106
+ #
107
+ # @return [void]
108
+ #
109
+ def play_stream(url, sink: nil)
110
+ Audio.playStream sink&.to_s, url
111
+ end
104
112
  end
105
113
  end
106
114
  end
@@ -46,7 +46,7 @@ module OpenHAB
46
46
 
47
47
  # explicit conversion to array
48
48
  def to_a
49
- $ir.items.grep(org.openhab.core.items.GroupItem) # rubocop:disable Style/GlobalVars
49
+ $ir.items.grep(org.openhab.core.items.GroupItem)
50
50
  end
51
51
  end
52
52
  end
@@ -51,6 +51,14 @@ module OpenHAB
51
51
  # @!method decrease
52
52
  # Send the +DECREASE+ command to the item
53
53
  # @return [DimmerItem] +self+
54
+
55
+ # raw numbers translate directly to PercentType, not a DecimalType
56
+ # @!visibility private
57
+ def format_type(command)
58
+ return Types::PercentType.new(command) if command.is_a?(Numeric)
59
+
60
+ super
61
+ end
54
62
  end
55
63
  end
56
64
  end
@@ -88,6 +88,7 @@ module OpenHAB
88
88
  @item.__send__(method, *args, &block)
89
89
  end
90
90
  end
91
+ ruby2_keywords :method_missing if respond_to? :ruby2_keywords
91
92
 
92
93
  # .
93
94
  def respond_to_missing?(method, include_private = false)
@@ -39,14 +39,14 @@ module OpenHAB
39
39
  # @param name [String] Item name to check
40
40
  # @return [Boolean] true if the item exists, false otherwise
41
41
  def include?(name)
42
- !$ir.getItems(name).empty? # rubocop: disable Style/GlobalVars
42
+ !$ir.getItems(name).empty?
43
43
  end
44
44
  alias key? include?
45
45
 
46
46
  # Explicit conversion to array
47
47
  # @return [Array]
48
48
  def to_a
49
- $ir.items.to_a # rubocop:disable Style/GlobalVars
49
+ $ir.items.to_a
50
50
  end
51
51
  end
52
52
  end
@@ -64,15 +64,10 @@ module OpenHAB
64
64
  return [other, state] if other.is_a?(Types::NumericType) || other.respond_to?(:to_d)
65
65
  end
66
66
 
67
- # strip trailing zeros from commands
67
+ # raw numbers translate directly to DecimalType, not a string
68
68
  # @!visibility private
69
69
  def format_type(command)
70
- # DecimalType and PercentType we want to make sure we don't have extra zeros
71
- if command.instance_of?(Types::DecimalType) || command.instance_of?(Types::PercentType)
72
- return command.to_big_decimal.strip_trailing_zeros.to_plain_string
73
- end
74
- # BigDecimal types have trailing zeros stripped
75
- return command.to_java.strip_trailing_zeros.to_plain_string if command.is_a?(BigDecimal)
70
+ return Types::DecimalType.new(command) if command.is_a?(Numeric)
76
71
 
77
72
  super
78
73
  end
@@ -37,6 +37,14 @@ module OpenHAB
37
37
  # @!method move
38
38
  # Send the +MOVE+ command to the item
39
39
  # @return [RollershutterItem] +self+
40
+
41
+ # raw numbers translate directly to PercentType, not a DecimalType
42
+ # @!visibility private
43
+ def format_type(command)
44
+ return Types::PercentType.new(command) if command.is_a?(Numeric)
45
+
46
+ super
47
+ end
40
48
  end
41
49
  end
42
50
  end
@@ -173,14 +173,12 @@ module OpenHAB
173
173
  def execute(_mod = nil, inputs = nil)
174
174
  OpenHAB::DSL.import_presets
175
175
  @semaphore.synchronize do
176
- thread_local(@thread_locals) do
176
+ thread_local(**@thread_locals) do
177
177
  logger.trace "Canceling implicit timer #{@timed_command_details.timer} for "\
178
178
  "#{@timed_command_details.item.id} because received event #{inputs}"
179
179
  @timed_command_details.timer.cancel
180
- # rubocop: disable Style/GlobalVars
181
180
  # Disabled due to OpenHAB design
182
181
  $scriptExtension.get('ruleRegistry').remove(@timed_command_details.rule_uid)
183
- # rubocop: enable Style/GlobalVars
184
182
  TimedCommand.timed_commands.delete(@timed_command_details.item)
185
183
  if @block
186
184
  logger.trace 'Executing user supplied block on timed command cancelation'
@@ -12,7 +12,7 @@ module OpenHAB
12
12
  #
13
13
  # MonkeyPatching ScriptThingActions
14
14
  #
15
- class << $actions # rubocop:disable Style/GlobalVars
15
+ class << $actions
16
16
  field_reader :THING_ACTIONS_MAP
17
17
 
18
18
  #
@@ -24,18 +24,21 @@ module OpenHAB
24
24
  include OpenHAB::Core::ThreadLocal
25
25
  include OpenHAB::DSL::Between
26
26
 
27
+ field_writer :uid
28
+
27
29
  #
28
30
  # Create a new Rule
29
31
  #
30
32
  # @param [Config] config Rule configuration
31
33
  #
32
34
  # Constructor sets a number of variables, no further decomposition necessary
33
- def initialize(config:) # rubocop:disable Metrics/MethodLength
35
+ def initialize(config:) # rubocop:disable Metrics
34
36
  # Metrics disabled because only setters are called or defaults set.
35
37
  super()
36
38
  set_name(config.name)
37
39
  set_description(config.description)
38
40
  set_triggers(config.triggers)
41
+ self.uid = config.uid
39
42
  @run_context = config.caller
40
43
  @run_queue = config.run
41
44
  @guard = config.guard
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'method_source'
4
+
3
5
  require 'openhab/core/thread_local'
4
6
  require 'openhab/core/services'
5
7
  require 'openhab/log/logger'
@@ -32,6 +34,12 @@ module OpenHAB
32
34
 
33
35
  module_function
34
36
 
37
+ # get the block's source location, and simplify to a simple filename
38
+ def self.infer_rule_id_from_block(block)
39
+ file = File.basename(block.source_location.first)
40
+ "#{file}:#{block.source_location.last}"
41
+ end
42
+
35
43
  #
36
44
  # Create a new rule
37
45
  #
@@ -39,21 +47,25 @@ module OpenHAB
39
47
  # @yield [] Block executed in context of a RuleConfig
40
48
  #
41
49
  #
42
- # rubocop:disable Metrics/MethodLength
43
- def rule(rule_name, &block)
50
+ def rule(rule_name = nil, id: nil, script: nil, &block) # rubocop:disable Metrics
51
+ id ||= Rule.infer_rule_id_from_block(block)
52
+ rule_name ||= id
53
+ script ||= block.source rescue nil # rubocop:disable Style/RescueModifier
54
+
44
55
  OpenHAB::Core::ThreadLocal.thread_local(RULE_NAME: rule_name) do
45
56
  @rule_name = rule_name
57
+
46
58
  config = RuleConfig.new(rule_name, block.binding)
59
+ config.uid(id)
47
60
  config.instance_exec(config, &block)
48
61
  config.guard = Guard::Guard.new(run_context: config.caller, only_if: config.only_if,
49
62
  not_if: config.not_if)
50
63
  logger.trace { config.inspect }
51
- process_rule_config(config)
64
+ process_rule_config(config, script)
52
65
  end
53
66
  rescue StandardError => e
54
67
  logger.log_exception(e, @rule_name)
55
68
  end
56
- # rubocop:enable Metrics/MethodLength
57
69
 
58
70
  #
59
71
  # Cleanup rules in this script file
@@ -71,12 +83,15 @@ module OpenHAB
71
83
  # @param [RuleConfig] config for rule
72
84
  #
73
85
  #
74
- def process_rule_config(config)
86
+ def process_rule_config(config, script) # rubocop:disable Metrics
75
87
  return unless create_rule?(config)
76
88
 
77
89
  rule = AutomationRule.new(config: config)
78
90
  Rule.script_rules << rule
79
91
  added_rule = add_rule(rule)
92
+ # add config so that MainUI can show the script
93
+ added_rule.actions.first.configuration.put('type', 'application/x-ruby')
94
+ added_rule.actions.first.configuration.put('script', script)
80
95
 
81
96
  rule.execute(nil, { 'event' => Struct.new(:attachment).new(config.start_attachment) }) if config.on_start?
82
97
  added_rule
@@ -131,6 +146,12 @@ module OpenHAB
131
146
  #
132
147
  #
133
148
  def add_rule(rule)
149
+ base_uid = rule.uid
150
+ duplicate_index = 1
151
+ while $rules.get(rule.uid)
152
+ duplicate_index += 1
153
+ rule.uid = "#{base_uid} (#{duplicate_index})"
154
+ end
134
155
  logger.trace("Adding rule: #{rule.inspect}")
135
156
  Rule.automation_manager.addRule(rule)
136
157
  end
@@ -61,6 +61,7 @@ module OpenHAB
61
61
  prop_array :delay, :array_name => :run_queue, :wrapper => Delay
62
62
  prop_array :otherwise, :array_name => :run_queue, :wrapper => Otherwise
63
63
 
64
+ prop :uid
64
65
  prop :name
65
66
  prop :description
66
67
  prop :enabled
@@ -7,17 +7,44 @@ module OpenHAB
7
7
  module TerseRule
8
8
  %i[changed channel cron every updated received_command].each do |trigger|
9
9
  class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
10
- def #{trigger}(*args, name: nil, **kwargs, &block) # def changed(*args, name: nil, **kwargs, &block)
11
- # if no name is given, just default to the name of the rules file # # if no name is given, just default to the name of the rules file
12
- name ||= File.basename(caller_locations.last.path) # name ||= File.basename(caller_locations.last.path)
13
- rule name do # rule name do
14
- #{trigger}(*args, **kwargs) # changed(*args, **kwargs)
15
- run(&block) # run(&block)
16
- end # end
17
- end # end
18
- module_function #{trigger.inspect} # module_function :changed
10
+ def #{trigger}(*args, name: nil, **kwargs, &block) # def changed(*args, name: nil, **kwargs, &block)
11
+ name ||= infer_rule_name(#{trigger.inspect}, args, kwargs) # name ||= infer_rule_name(:changed, args, kwargs)
12
+ id = Rule.infer_rule_id_from_block(block) # id = Rule.infer_rule_id_from_block(block)
13
+ name ||= id # name ||= id
14
+ script = block.source rescue nil # script = block.source rescue nil
15
+ rule name, id: id, script: script do # rule name, id: id, script: script do
16
+ #{trigger}(*args, **kwargs) # changed(*args, **kwargs)
17
+ run(&block) # run(&block)
18
+ end # end
19
+ end # end
20
+ module_function #{trigger.inspect} # module_function :changed
19
21
  RUBY
20
22
  end
23
+
24
+ private
25
+
26
+ # formulate a readable rule name such as "TestSwitch received command ON" if possible
27
+ def infer_rule_name(trigger, args, kwargs) # rubocop:disable Metrics
28
+ return unless %i[changed updated received_command].include?(trigger) &&
29
+ args.length == 1 &&
30
+ (kwargs.keys - %i[from to command]).empty?
31
+ return if kwargs[:from].is_a?(Enumerable)
32
+ return if kwargs[:to].is_a?(Enumerable)
33
+ return if kwargs[:command].is_a?(Enumerable)
34
+
35
+ trigger_name = trigger.to_s.tr('_', ' ')
36
+ name = if args.first.is_a?(GroupItem::GroupMembers) # rubocop:disable Style/CaseLikeIf === doesn't work with GenericItem
37
+ "#{args.first.group.name}.members #{trigger_name}"
38
+ elsif args.first.is_a?(GenericItem)
39
+ "#{args.first.name} #{trigger_name}"
40
+ end
41
+ return unless name
42
+
43
+ name += " from #{kwargs[:from].inspect}" if kwargs[:from]
44
+ name += " to #{kwargs[:to].inspect}" if kwargs[:to]
45
+ name += " #{kwargs[:command].inspect}" if kwargs[:command]
46
+ name
47
+ end
21
48
  end
22
49
  end
23
50
  end
@@ -35,6 +35,7 @@ module OpenHAB
35
35
  from = Conditions::Proc.from_value(from)
36
36
  @conditions = Conditions::Proc.new(to: to, from: from)
37
37
  @duration = duration
38
+ @timer = nil
38
39
  logger.trace "Created Duration Condition To(#{to}) From(#{from}) "\
39
40
  "Conditions(#{@conditions}) Duration(#{@duration})"
40
41
  end
@@ -108,7 +108,7 @@ module OpenHAB
108
108
  # @return Thing specified by name/UID or nil if name/UID does not exist in thing registry
109
109
  def [](uid)
110
110
  uid = generate_thing_uid(uid) unless uid.is_a?(org.openhab.core.thing.ThingUID)
111
- thing = $things.get(uid) # rubocop: disable Style/GlobalVars
111
+ thing = $things.get(uid)
112
112
  return unless thing
113
113
 
114
114
  logger.trace("Retrieved Thing(#{thing}) from registry for uid: #{uid}")
@@ -119,7 +119,7 @@ module OpenHAB
119
119
 
120
120
  # explicit conversion to array
121
121
  def to_a
122
- $things.getAll.map { |thing| Thing.new(thing) } # rubocop: disable Style/GlobalVars
122
+ $things.getAll.map { |thing| Thing.new(thing) }
123
123
  end
124
124
 
125
125
  private
@@ -82,7 +82,7 @@ module OpenHAB
82
82
  OpenHAB::DSL.import_presets
83
83
  semaphore.synchronize do
84
84
  Timers.timer_manager.delete(self)
85
- thread_local(@thread_locals) do
85
+ thread_local(**@thread_locals) do
86
86
  yield(self)
87
87
  end
88
88
  end
@@ -36,14 +36,14 @@ module OpenHAB
36
36
  if value.is_a?(java.math.BigDecimal)
37
37
  super
38
38
  elsif value.is_a?(BigDecimal)
39
- super(value.to_java)
39
+ super(value.to_java.strip_trailing_zeros)
40
40
  elsif value.is_a?(DecimalType)
41
41
  super(value.to_big_decimal)
42
42
  elsif value.is_a?(Items::NumericItem) ||
43
43
  (value.is_a?(Items::GroupItem) && value.base_item.is_a?(Items::NumericItem))
44
44
  super(value.state)
45
45
  elsif value.respond_to?(:to_d)
46
- super(value.to_d.to_java)
46
+ super(value.to_d.to_java.strip_trailing_zeros)
47
47
  else # rubocop:disable Lint/DuplicateBranch
48
48
  # duplicates the Java BigDecimal branch, but that needs to go first
49
49
  # in order to avoid unnecessary conversions
@@ -212,7 +212,7 @@ module OpenHAB
212
212
  .then { |klass| java_klass(klass) }
213
213
  .then(&:name)
214
214
  .then { |name| filter_base_classes(name) }
215
- .then { |name| name&.prepend('.') }
215
+ .then { |name| ".#{name}" unless name.nil? } # name is frozen in jruby 9.4
216
216
  end
217
217
 
218
218
  # Get the appropriate java class for the supplied klass if the supplied
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.42.2'
8
+ VERSION = '4.43.2'
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openhab-scripting
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.42.2
4
+ version: 4.43.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian O'Connell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-29 00:00:00.000000000 Z
11
+ date: 2022-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: method_source
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
41
55
  description: JRuby Helper Libraries for OpenHAB Scripting
42
56
  email:
43
57
  - broconne@gmail.com