openhab-scripting 4.43.0 → 4.43.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ced4a751b4de9b352e205574f4351ed291efe23b2b096b5be7f40e12cc20777
4
- data.tar.gz: 914351269a8c397536cb1df56907891565d9214b1d11f6124543dbf91b6aa0f2
3
+ metadata.gz: deaecd8879b238c5372c733482c69ef38703231f42a8869954d692ebd3c4fc7b
4
+ data.tar.gz: d11b35e9b654531f1c248992cb1cd2eca1e675dd37898ca28ce16760a1531c07
5
5
  SHA512:
6
- metadata.gz: e6f5fd13e613a4b4b018f73236bb050b5b80f1087ac24e6747d5b5aa710920ad9b9bc6bbc56d437b4b8c8ba39f9db516995b15d64592ad813e4bee276ba79b67
7
- data.tar.gz: fbee80a3b22ad7c2ee83c42e6294602a88b522926340fe0d5f089a76284b7742bc1d50352de8d2c087fd1a399b810f0182ea8c15f4d2e666eb86465ce6b907d1
6
+ metadata.gz: 3052e39904c2548942c1018b592ca3370b3c15bdd1dc92685ee647f9854bcc406b886f1168b75954adab98884a45c9a92a7eb039a13056be5f4a99772111e425
7
+ data.tar.gz: 752cd312e184091663ea4c47506787fdd6ea9e56b1a794593c093b413784340bbb97c95956e716762757b355a6089e45cb96dbe2d61b6787f98641bbde557e75
@@ -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
@@ -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
@@ -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
+ added_rule.actions.first.id = '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) # rubocop:disable Style/GlobalVars
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
@@ -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
@@ -5,5 +5,5 @@
5
5
  #
6
6
  module OpenHAB
7
7
  # @return [String] Version of OpenHAB helper libraries
8
- VERSION = '4.43.0'
8
+ VERSION = '4.43.1'
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.43.0
4
+ version: 4.43.1
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-07-11 00:00:00.000000000 Z
11
+ date: 2022-07-18 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