openhab-scripting 2.11.0 → 2.14.0
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/dsl/items/items.rb +10 -0
- data/lib/openhab/core/dsl/monkey_patch/items/dimmer_item.rb +42 -0
- data/lib/openhab/core/dsl/monkey_patch/ruby/number.rb +7 -35
- data/lib/openhab/core/dsl/rule/cron.rb +26 -3
- data/lib/openhab/core/dsl/rule/item.rb +0 -4
- data/lib/openhab/core/dsl/rule/rule.rb +32 -2
- data/lib/openhab/core/dsl/timers.rb +2 -4
- data/lib/openhab/version.rb +1 -1
- metadata +2 -3
- data/lib/openhab/core/duration.rb +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 376e7ceca67ad5ca1dfedcacee9096e97819f3a382404ddde4f7beb579416e7d
|
4
|
+
data.tar.gz: bdffa11dab63e1910d38a1232c38e2b9d64deaac1d8ea3610de464792d75173e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 712aa971a831d8b700ecbe23b429a083518deb3bf7c2b68aa91cc0f3e5253ac9a32087025994705b94d268db58ef73e27767dcb3ce182e4477bfa115c6c476e0
|
7
|
+
data.tar.gz: e450d32857df9dd5aea47cc5e0baa7043e06901282324d2dfd4623cb2eac03c8fb60335e3de2e680911f1d4ad24095c2533fd3a9d5c90501694f849019e2d225
|
@@ -22,7 +22,17 @@ module OpenHAB
|
|
22
22
|
item = $ir.getItem(name)
|
23
23
|
# rubocop: enable Style/GlobalVars
|
24
24
|
(item.is_a? GroupItem) ? nil : item
|
25
|
+
rescue Java::OrgOpenhabCoreItems::ItemNotFoundException
|
26
|
+
nil
|
25
27
|
end
|
28
|
+
|
29
|
+
# Returns true if the given item name exists
|
30
|
+
# @param name [String] Item name to check
|
31
|
+
# @return [Boolean] true if the item exists, false otherwise
|
32
|
+
def include?(name)
|
33
|
+
!$ir.getItems(name).empty?
|
34
|
+
end
|
35
|
+
alias key? include?
|
26
36
|
end
|
27
37
|
|
28
38
|
java_import org.openhab.core.items.GroupItem
|
@@ -14,6 +14,7 @@ Dimmer = DimmerItem
|
|
14
14
|
#
|
15
15
|
# rubocop:disable Style/ClassAndModuleChildren
|
16
16
|
class Java::OrgOpenhabCoreLibraryItems::DimmerItem
|
17
|
+
include Comparable
|
17
18
|
# rubocop:enable Style/ClassAndModuleChildren
|
18
19
|
java_import org.openhab.core.library.types.DecimalType
|
19
20
|
java_import org.openhab.core.library.types.IncreaseDecreaseType
|
@@ -85,6 +86,38 @@ class Java::OrgOpenhabCoreLibraryItems::DimmerItem
|
|
85
86
|
target
|
86
87
|
end
|
87
88
|
|
89
|
+
#
|
90
|
+
# Compare DimmerItem to supplied object
|
91
|
+
#
|
92
|
+
# @param [Object] other object to compare to
|
93
|
+
#
|
94
|
+
# @return [Integer] -1,0,1 or nil depending on value supplied, nil comparison to supplied object is not possible.
|
95
|
+
#
|
96
|
+
def <=>(other)
|
97
|
+
logger.trace("Comparing #{self} to #{other}")
|
98
|
+
case other
|
99
|
+
when DimmerItem, NumberItem
|
100
|
+
state <=> other.state
|
101
|
+
when DecimalType
|
102
|
+
state <=> other
|
103
|
+
else
|
104
|
+
to_i <=> other.to_i
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# Compare DimmerItem to supplied object.
|
110
|
+
# The == operator needs to be overridden because the parent java object
|
111
|
+
# has .equals which overrides the <=> operator above
|
112
|
+
#
|
113
|
+
# @param [Object] other object to compare to
|
114
|
+
#
|
115
|
+
# @return [Integer] true if the two objects contain the same value, false otherwise
|
116
|
+
#
|
117
|
+
def ==(other)
|
118
|
+
(self <=> other).zero?
|
119
|
+
end
|
120
|
+
|
88
121
|
#
|
89
122
|
# Check if dimmer has a state and state is not zero
|
90
123
|
#
|
@@ -105,6 +138,15 @@ class Java::OrgOpenhabCoreLibraryItems::DimmerItem
|
|
105
138
|
|
106
139
|
alias to_int to_i
|
107
140
|
|
141
|
+
#
|
142
|
+
# Return the string representation of the dimmer item
|
143
|
+
#
|
144
|
+
# @return [String] String version of the dimmer value
|
145
|
+
#
|
146
|
+
def to_s
|
147
|
+
to_i.to_s
|
148
|
+
end
|
149
|
+
|
108
150
|
#
|
109
151
|
# Check if dimmer is on
|
110
152
|
#
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'core/duration'
|
4
|
-
|
5
3
|
module OpenHAB
|
6
4
|
module Core
|
7
5
|
module DSL
|
@@ -14,44 +12,18 @@ module OpenHAB
|
|
14
12
|
include OpenHAB::Core
|
15
13
|
|
16
14
|
#
|
17
|
-
# Create Duration with
|
18
|
-
#
|
19
|
-
# @return [OpenHAB::Core::Duration] Duration with number of seconds from self
|
20
|
-
#
|
21
|
-
def seconds
|
22
|
-
Duration.new(temporal_unit: :SECONDS, amount: self)
|
23
|
-
end
|
24
|
-
|
25
|
-
#
|
26
|
-
# Create Duration with unit of milliseconds
|
27
|
-
#
|
28
|
-
# @return [OpenHAB::Core::Duration] Duration with number of milliseconds from self
|
29
|
-
#
|
30
|
-
def milliseconds
|
31
|
-
Duration.new(temporal_unit: :MILLISECONDS, amount: self)
|
32
|
-
end
|
33
|
-
|
34
|
-
#
|
35
|
-
# Create Duration with unit of minutes
|
36
|
-
#
|
37
|
-
# @return [OpenHAB::Core::Duration] Duration with number of minutes from self
|
38
|
-
#
|
39
|
-
def minutes
|
40
|
-
Duration.new(temporal_unit: :MINUTES, amount: self)
|
41
|
-
end
|
42
|
-
|
43
|
-
#
|
44
|
-
# Create Duration with unit of hours
|
15
|
+
# Create Duration with the specified unit
|
45
16
|
#
|
46
|
-
# @return [
|
17
|
+
# @return [Java::JavaTime::Duration] Duration with number of units from self
|
47
18
|
#
|
48
|
-
|
49
|
-
Duration.
|
19
|
+
%w[millis seconds minutes hours].each do |unit|
|
20
|
+
define_method(unit) { Java::JavaTime::Duration.public_send("of_#{unit}", self) }
|
50
21
|
end
|
51
22
|
|
52
23
|
alias second seconds
|
53
|
-
alias millisecond
|
54
|
-
alias
|
24
|
+
alias millisecond millis
|
25
|
+
alias milliseconds millis
|
26
|
+
alias ms millis
|
55
27
|
alias minute minutes
|
56
28
|
alias hour hours
|
57
29
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'java'
|
4
|
-
require 'core/duration'
|
5
4
|
require 'core/dsl/time_of_day'
|
6
5
|
require 'core/cron'
|
7
6
|
|
@@ -64,8 +63,10 @@ module OpenHAB
|
|
64
63
|
expression_map = EXPRESSION_MAP[value]
|
65
64
|
expression_map = at_condition(expression_map, at) if at
|
66
65
|
cron(map_to_cron(expression_map))
|
67
|
-
when Duration
|
68
|
-
|
66
|
+
when Java::JavaTime::Duration
|
67
|
+
raise ArgumentError, '"at" cannot be used with duration' if at
|
68
|
+
|
69
|
+
cron(map_to_cron(duration_to_map(value)))
|
69
70
|
else
|
70
71
|
raise ArgumentExpression, 'Unknown interval' unless expression_map
|
71
72
|
end
|
@@ -93,6 +94,28 @@ module OpenHAB
|
|
93
94
|
%i[second minute hour dom month dow].map { |field| map.fetch(field) }.join(' ')
|
94
95
|
end
|
95
96
|
|
97
|
+
#
|
98
|
+
# Convert a Java Duration to a map for the map_to_cron method
|
99
|
+
#
|
100
|
+
# @param duration [Java::JavaTime::Duration] The duration object
|
101
|
+
#
|
102
|
+
# @return [Hash] a map suitable for map_to_cron
|
103
|
+
#
|
104
|
+
def duration_to_map(duration)
|
105
|
+
if duration.to_millis_part.zero? && duration.to_nanos_part.zero? && duration.to_days.zero?
|
106
|
+
%i[second minute hour].each do |unit|
|
107
|
+
to_unit_part = duration.public_send("to_#{unit}s_part")
|
108
|
+
next unless to_unit_part.positive?
|
109
|
+
|
110
|
+
to_unit = duration.public_send("to_#{unit}s")
|
111
|
+
break unless to_unit_part == to_unit
|
112
|
+
|
113
|
+
return EXPRESSION_MAP[unit].merge(unit => "*/#{to_unit}")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
raise ArgumentError, "Cron Expression not supported for duration: #{duration}"
|
117
|
+
end
|
118
|
+
|
96
119
|
#
|
97
120
|
# If an at time is provided, parse that and merge the new fields into the expression.
|
98
121
|
#
|
@@ -35,9 +35,6 @@ module OpenHAB
|
|
35
35
|
# @return [Array] Array of current TriggerDelay objects
|
36
36
|
#
|
37
37
|
def changed_wait(item, duration:, to: nil, from: nil)
|
38
|
-
# Convert to testing the group if group specified rather than item
|
39
|
-
item = item.group if item.is_a? Group
|
40
|
-
|
41
38
|
# If GroupItems specified, use the group state trigger instead
|
42
39
|
if item.is_a? GroupItems
|
43
40
|
config = { 'groupName' => item.group.name }
|
@@ -128,7 +125,6 @@ module OpenHAB
|
|
128
125
|
#
|
129
126
|
def changed(*items, to: nil, from: nil, for: nil)
|
130
127
|
items.flatten.each do |item|
|
131
|
-
item = item.group if item.is_a? Group
|
132
128
|
logger.trace("Creating changed trigger for entity(#{item}), to(#{to}), from(#{from})")
|
133
129
|
# for is a reserved word in ruby, so use local_variable_get :for
|
134
130
|
if (wait_duration = binding.local_variable_get(:for))
|
@@ -113,6 +113,19 @@ module OpenHAB
|
|
113
113
|
def my(&block)
|
114
114
|
@caller.instance_eval(&block)
|
115
115
|
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Create a logger where name includes rule name if name is set
|
119
|
+
#
|
120
|
+
# @return [Logging::Logger] Logger with name that appended with rule name if rule name is set
|
121
|
+
#
|
122
|
+
def logger
|
123
|
+
if name
|
124
|
+
Logging.logger(name.chomp.gsub(/\s+/, '_'))
|
125
|
+
else
|
126
|
+
super
|
127
|
+
end
|
128
|
+
end
|
116
129
|
end
|
117
130
|
|
118
131
|
#
|
@@ -274,7 +287,7 @@ module OpenHAB
|
|
274
287
|
process_trigger_delay(mod, inputs)
|
275
288
|
else
|
276
289
|
logger.trace("Item changed to #{state} for #{trigger_delay}, rescheduling timer.")
|
277
|
-
trigger_delay.timer.reschedule(ZonedDateTime.now.plus(
|
290
|
+
trigger_delay.timer.reschedule(ZonedDateTime.now.plus(duration))
|
278
291
|
end
|
279
292
|
end
|
280
293
|
else
|
@@ -303,6 +316,23 @@ module OpenHAB
|
|
303
316
|
false
|
304
317
|
end
|
305
318
|
|
319
|
+
#
|
320
|
+
# Patch event to include event.item when it doesn't exist
|
321
|
+
# This is to patch a bug see https://github.com/boc-tothefuture/openhab-jruby/issues/75
|
322
|
+
# It may be fixed in the openhab core in the future, in which case, this patch will no longer be necessary
|
323
|
+
#
|
324
|
+
# @param [OpenHAB Event] event to check for item accessor
|
325
|
+
# @param [OpenHAB Event Inputs] inputs inputs to running rule
|
326
|
+
#
|
327
|
+
def add_event_item(event, inputs)
|
328
|
+
return if event.nil? || defined?(event.item)
|
329
|
+
|
330
|
+
class << event
|
331
|
+
attr_accessor :item
|
332
|
+
end
|
333
|
+
event.item = inputs&.dig('triggeringItem')
|
334
|
+
end
|
335
|
+
|
306
336
|
#
|
307
337
|
# Process the run queue
|
308
338
|
#
|
@@ -317,7 +347,7 @@ module OpenHAB
|
|
317
347
|
when RuleConfig::Run
|
318
348
|
|
319
349
|
event = inputs&.dig('event')
|
320
|
-
|
350
|
+
add_event_item(event, inputs)
|
321
351
|
logger.trace { "Executing rule '#{name}' run block with event(#{event})" }
|
322
352
|
task.block.call(event)
|
323
353
|
when RuleConfig::Trigger
|
@@ -4,8 +4,6 @@ require 'java'
|
|
4
4
|
require 'delegate'
|
5
5
|
require 'forwardable'
|
6
6
|
|
7
|
-
require 'core/duration'
|
8
|
-
|
9
7
|
module OpenHAB
|
10
8
|
module Core
|
11
9
|
module DSL
|
@@ -49,7 +47,7 @@ module OpenHAB
|
|
49
47
|
|
50
48
|
semaphore.synchronize do
|
51
49
|
@timer = ScriptExecution.createTimer(
|
52
|
-
ZonedDateTime.now.plus(
|
50
|
+
ZonedDateTime.now.plus(@duration), @block
|
53
51
|
)
|
54
52
|
super(@timer)
|
55
53
|
end
|
@@ -64,7 +62,7 @@ module OpenHAB
|
|
64
62
|
#
|
65
63
|
def reschedule(duration = nil)
|
66
64
|
duration ||= @duration
|
67
|
-
@timer.reschedule(ZonedDateTime.now.plus(
|
65
|
+
@timer.reschedule(ZonedDateTime.now.plus(duration))
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
data/lib/openhab/version.rb
CHANGED
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: 2.
|
4
|
+
version: 2.14.0
|
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: 2021-02-
|
11
|
+
date: 2021-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,7 +76,6 @@ files:
|
|
76
76
|
- lib/openhab/core/dsl/timers.rb
|
77
77
|
- lib/openhab/core/dsl/types/quantity.rb
|
78
78
|
- lib/openhab/core/dsl/units.rb
|
79
|
-
- lib/openhab/core/duration.rb
|
80
79
|
- lib/openhab/core/log.rb
|
81
80
|
- lib/openhab/core/patch_load_path.rb
|
82
81
|
- lib/openhab/core/startup_delay.rb
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'openhab/core/cron'
|
4
|
-
|
5
|
-
module OpenHAB
|
6
|
-
module Core
|
7
|
-
#
|
8
|
-
# This class represents a duration of time
|
9
|
-
#
|
10
|
-
class Duration
|
11
|
-
include OpenHAB::Core::Cron
|
12
|
-
|
13
|
-
# @return [Array] of supported temperal units (milliseconds, seconds, minutes and hours)
|
14
|
-
TEMPORAL_UNITS = %i[MILLISECONDS SECONDS MINUTES HOURS].freeze
|
15
|
-
|
16
|
-
#
|
17
|
-
# Create a new Duration object
|
18
|
-
#
|
19
|
-
# @param [Symbol] temporal_unit Unit for duration
|
20
|
-
# @param [Integer] amount of that unit
|
21
|
-
#
|
22
|
-
def initialize(temporal_unit:, amount:)
|
23
|
-
unless TEMPORAL_UNITS.include? temporal_unit
|
24
|
-
raise ArgumentError,
|
25
|
-
"Unexpected Temporal Unit: #{temporal_unit}"
|
26
|
-
end
|
27
|
-
|
28
|
-
@temporal_unit = temporal_unit
|
29
|
-
@amount = amount
|
30
|
-
end
|
31
|
-
|
32
|
-
#
|
33
|
-
# Return a map
|
34
|
-
#
|
35
|
-
# @return [Map] Map with fields representing this duration @see OpenHAB::Core::Cron
|
36
|
-
#
|
37
|
-
def cron_map
|
38
|
-
case @temporal_unit
|
39
|
-
when :SECONDS
|
40
|
-
cron_expression_map.merge(second: "*/#{@amount}")
|
41
|
-
when :MINUTES
|
42
|
-
cron_expression_map.merge(minute: "*/#{@amount}")
|
43
|
-
when :HOURS
|
44
|
-
cron_expression_map.merge(hour: "*/#{@amount}")
|
45
|
-
else
|
46
|
-
raise ArgumentError, "Cron Expression not supported for temporal unit: #{temporal_unit}"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
#
|
51
|
-
# Convert the duration to milliseconds
|
52
|
-
#
|
53
|
-
# @return [Integer] Duration in milliseconds
|
54
|
-
#
|
55
|
-
def to_ms
|
56
|
-
case @temporal_unit
|
57
|
-
when :MILLISECONDS
|
58
|
-
@amount
|
59
|
-
when :SECONDS
|
60
|
-
@amount * 1000
|
61
|
-
when :MINUTES
|
62
|
-
@amount * 1000 * 60
|
63
|
-
when :HOURS
|
64
|
-
@amount * 1000 * 60 * 60
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
#
|
69
|
-
# Return a string representation of the duration
|
70
|
-
#
|
71
|
-
# @return [String] Duration in string
|
72
|
-
#
|
73
|
-
def to_s
|
74
|
-
"#{@amount} #{(@amount == 1) ? @temporal_unit.to_s.downcase.delete_suffix('s') : @temporal_unit.to_s.downcase}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|