openhab-scripting 4.5.0 → 4.6.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/dsl/items/items.rb +1 -0
- data/lib/openhab/dsl/items/location_item.rb +54 -0
- data/lib/openhab/dsl/monkey_patch/ruby/number.rb +1 -1
- data/lib/openhab/dsl/types/point_type.rb +151 -0
- data/lib/openhab/dsl/types/types.rb +1 -0
- data/lib/openhab/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9ccae52c29da91b7fadc2ac7ba2459e9870a257396849535458497ba48601e5
|
4
|
+
data.tar.gz: 0015aca73a5c79082adefb486afcbb545e324c0695d492e15397d2e0d691a204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2db7c0a6f4182d3145871ab6936aa92d5acbe2a6d29e79f793a464d4fbb9514555021d9f0b103130ed99b04c9e149a414ea96df8f134f7db2fb71bade3824168
|
7
|
+
data.tar.gz: da447a4315a8d177db5fc6e476dd30ba93a071f06c6dc612a361f9d12a8539932f8a1659bdd919d8cdf61be2da759f720020d57fe399eaa1a2533bf5e1f56203
|
@@ -14,6 +14,7 @@ require_relative 'color_item'
|
|
14
14
|
require_relative 'contact_item'
|
15
15
|
require_relative 'group_item'
|
16
16
|
require_relative 'image_item'
|
17
|
+
require_relative 'location_item'
|
17
18
|
require_relative 'number_item'
|
18
19
|
require_relative 'player_item'
|
19
20
|
require_relative 'rollershutter_item'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
require_relative 'comparable_item'
|
6
|
+
require 'openhab/dsl/types/point_type'
|
7
|
+
|
8
|
+
module OpenHAB
|
9
|
+
module DSL
|
10
|
+
module Items
|
11
|
+
java_import org.openhab.core.library.items.LocationItem
|
12
|
+
|
13
|
+
# Adds methods to core OpenHAB NumberItem type to make it more natural in
|
14
|
+
# Ruby
|
15
|
+
class LocationItem < GenericItem
|
16
|
+
extend Forwardable
|
17
|
+
include ComparableItem
|
18
|
+
|
19
|
+
# !@visibility private
|
20
|
+
def ==(other)
|
21
|
+
# need to check if we're referring to the same item before
|
22
|
+
# forwarding to <=> (and thus checking equality with state)
|
23
|
+
return true if equal?(other) || eql?(other)
|
24
|
+
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# Type Coercion
|
30
|
+
#
|
31
|
+
# Coerce object to a PointType
|
32
|
+
#
|
33
|
+
# @param [Types::PointType, String] other object to coerce to a
|
34
|
+
# PointType
|
35
|
+
#
|
36
|
+
# @return [[Types::PointType, Types::PointType]]
|
37
|
+
#
|
38
|
+
def coerce(other)
|
39
|
+
logger.trace("Coercing #{self} as a request from #{other.class}")
|
40
|
+
return [other, nil] unless state?
|
41
|
+
return [other, state] if other.is_a?(Types::PointType) || other.respond_to?(:to_str)
|
42
|
+
|
43
|
+
raise TypeError, "can't convert #{other.class} into #{self.class}"
|
44
|
+
end
|
45
|
+
|
46
|
+
# OpenHAB has this method, but it _only_ accepts PointType, so remove it and delegate
|
47
|
+
remove_method :distance_from
|
48
|
+
|
49
|
+
# any method that exists on {Types::PointType} gets forwarded to +state+
|
50
|
+
delegate (Types::PointType.instance_methods - instance_methods) => :state
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenHAB
|
4
|
+
module DSL
|
5
|
+
module Types
|
6
|
+
java_import org.openhab.core.library.types.PointType
|
7
|
+
|
8
|
+
# global scope
|
9
|
+
# @!visibility private
|
10
|
+
::PointType = PointType
|
11
|
+
|
12
|
+
# Adds methods to core OpenHAB PointType to make it more natural in Ruby
|
13
|
+
class PointType
|
14
|
+
# @!parse include PrimitiveType
|
15
|
+
|
16
|
+
# @param latitude [DecimalType, QuantityType, StringType, Numeric]
|
17
|
+
# @param longitude [DecimalType, QuantityType, StringType, Numeric]
|
18
|
+
# @param altitude [DecimalType, QuantityType, StringType, Numeric]
|
19
|
+
def initialize(*args) # rubocop:disable Metrics
|
20
|
+
if (2..3).cover?(args.length)
|
21
|
+
args = args.each_with_index.map do |value, index|
|
22
|
+
if value.is_a?(DecimalType) || value.is_a?(StringType)
|
23
|
+
value
|
24
|
+
elsif value.is_a?(QuantityType)
|
25
|
+
unit = index == 2 ? Units.unit || SIUnits::METRE : Units::DEGREE_ANGLE
|
26
|
+
DecimalType.new(value.to_unit(unit).to_big_decimal)
|
27
|
+
elsif value.respond_to?(:to_str)
|
28
|
+
StringType.new(value.to_str)
|
29
|
+
elsif value.respond_to?(:to_d)
|
30
|
+
DecimalType.new(value)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
super(*args)
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Check equality without type conversion
|
40
|
+
#
|
41
|
+
# @return [Boolean] if the same value is represented, without type
|
42
|
+
# conversion
|
43
|
+
def eql?(other)
|
44
|
+
return false unless other.instance_of?(self.class)
|
45
|
+
|
46
|
+
equals(other.to_s).zero?
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Check equality with type conversion
|
51
|
+
#
|
52
|
+
# @param [PointType, Items::LocationItem, String]
|
53
|
+
# other object to compare to
|
54
|
+
#
|
55
|
+
# @return [Boolean]
|
56
|
+
#
|
57
|
+
def ==(other) # rubocop:disable Metrics
|
58
|
+
logger.trace("(#{self.class}) #{self} == #{other} (#{other.class})")
|
59
|
+
if other.is_a?(Items::LocationItem) ||
|
60
|
+
(other.is_a?(Items::GroupItem) && other.base_item.is_a?(LocationItem))
|
61
|
+
return false unless other.state?
|
62
|
+
|
63
|
+
self == other.state
|
64
|
+
elsif other.respond_to?(:to_str)
|
65
|
+
self == PointType.new(other)
|
66
|
+
elsif other.respond_to?(:coerce)
|
67
|
+
lhs, rhs = other.coerce(self)
|
68
|
+
lhs == rhs
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# Type Coercion
|
74
|
+
#
|
75
|
+
# Coerce object to a PointType
|
76
|
+
#
|
77
|
+
# @param [Items::LocationItem, String] other object to coerce to a
|
78
|
+
# PointType
|
79
|
+
#
|
80
|
+
# @return [[PointType, PointType]]
|
81
|
+
#
|
82
|
+
def coerce(other)
|
83
|
+
[coerce_single(other), self]
|
84
|
+
end
|
85
|
+
|
86
|
+
# rename raw methods so we can overwrite them
|
87
|
+
# @!visibility private
|
88
|
+
alias raw_latitude latitude
|
89
|
+
# .
|
90
|
+
# @!visibility private
|
91
|
+
alias raw_longitude longitude
|
92
|
+
# .
|
93
|
+
# @!visibility private
|
94
|
+
alias raw_altitude altitude
|
95
|
+
# .
|
96
|
+
# @!visibility private
|
97
|
+
alias raw_distance_from distance_from
|
98
|
+
|
99
|
+
# @!attribute [r] latitude
|
100
|
+
# @return [QuantityType]
|
101
|
+
def latitude
|
102
|
+
QuantityType.new(raw_latitude.to_big_decimal, SIUnits::DEGREE_ANGLE)
|
103
|
+
end
|
104
|
+
|
105
|
+
# @!attribute [r] longitude
|
106
|
+
# @return [QuantityType]
|
107
|
+
def longitude
|
108
|
+
QuantityType.new(raw_longitude.to_big_decimal, SIUnits::DEGREE_ANGLE)
|
109
|
+
end
|
110
|
+
|
111
|
+
# @!attribute [r] altitude
|
112
|
+
# @return [QuantityType]
|
113
|
+
def altitude
|
114
|
+
QuantityType.new(raw_altitude.to_big_decimal, Units::METRE)
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Calculate the distance in meters from other, ignoring altitude.
|
119
|
+
#
|
120
|
+
# This algorithm also ignores the oblate spheroid shape of Earth and
|
121
|
+
# assumes a perfect sphere, so results are inexact.
|
122
|
+
#
|
123
|
+
# @return [QuantityType]
|
124
|
+
def distance_from(other)
|
125
|
+
logger.trace("(#{self}).distance_from(#{other} (#{other.class})")
|
126
|
+
QuantityType.new(raw_distance_from(coerce_single(other)), SIUnits::METRE)
|
127
|
+
end
|
128
|
+
alias - distance_from
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
# coerce an object to a PointType
|
133
|
+
# @return [PointType]
|
134
|
+
def coerce_single(other) # rubocop:disable Metrics/MethodLength
|
135
|
+
logger.trace("Coercing #{self} as a request from #{other.class}")
|
136
|
+
if other.is_a?(PointType)
|
137
|
+
other
|
138
|
+
elsif other.is_a?(Items::LocationItem)
|
139
|
+
raise TypeError, "can't convert #{other.raw_state} into #{self.class}" unless other.state?
|
140
|
+
|
141
|
+
other.state
|
142
|
+
elsif other.respond_to?(:to_str)
|
143
|
+
PointType.new(other.to_str)
|
144
|
+
else
|
145
|
+
raise TypeError, "can't convert #{other.class} into #{self.class}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -11,6 +11,7 @@ require_relative 'open_closed_type'
|
|
11
11
|
require_relative 'on_off_type'
|
12
12
|
require_relative 'percent_type'
|
13
13
|
require_relative 'play_pause_type'
|
14
|
+
require_relative 'point_type'
|
14
15
|
require_relative 'quantity_type'
|
15
16
|
require_relative 'refresh_type'
|
16
17
|
require_relative 'rewind_fastforward_type'
|
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: 4.
|
4
|
+
version: 4.6.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-10-
|
11
|
+
date: 2021-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/openhab/dsl/items/item_equality.rb
|
67
67
|
- lib/openhab/dsl/items/item_registry.rb
|
68
68
|
- lib/openhab/dsl/items/items.rb
|
69
|
+
- lib/openhab/dsl/items/location_item.rb
|
69
70
|
- lib/openhab/dsl/items/metadata.rb
|
70
71
|
- lib/openhab/dsl/items/number_item.rb
|
71
72
|
- lib/openhab/dsl/items/numeric_item.rb
|
@@ -114,6 +115,7 @@ files:
|
|
114
115
|
- lib/openhab/dsl/types/open_closed_type.rb
|
115
116
|
- lib/openhab/dsl/types/percent_type.rb
|
116
117
|
- lib/openhab/dsl/types/play_pause_type.rb
|
118
|
+
- lib/openhab/dsl/types/point_type.rb
|
117
119
|
- lib/openhab/dsl/types/quantity_type.rb
|
118
120
|
- lib/openhab/dsl/types/refresh_type.rb
|
119
121
|
- lib/openhab/dsl/types/rewind_fastforward_type.rb
|