tp_link_smartplug 0.3.0 → 0.4.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/tp_link_smartplug/_base.rb +0 -2
- data/lib/tp_link_smartplug/command.rb +8 -0
- data/lib/tp_link_smartplug/device.rb +52 -14
- data/lib/tp_link_smartplug/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1739412106dde9bd88df2a292bac503e3c7a00a41d99ea0fa5313af60cbbe873
|
4
|
+
data.tar.gz: a03b730e2e02d3829ae2f37c27dce448d1ac3ed0d2c2122096382733a53ac836
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35bd08c5cacc7e8d9a68bd8a48c3d232f8ae77c5875809d5125fa0c218c7dc260b6633c463f325fcf0ea15eda959028699ab06b5674825ef4af96788cf243e5e
|
7
|
+
data.tar.gz: 5e4ea23acfebad26a9410d0b8c1a0cd7ea755bb3847946e412100375b223ffeaec057964acb3a3a9e153d763b32a1941486babcad6d71a760cb0ad615f1986b9
|
@@ -13,6 +13,8 @@ module TpLinkSmartplug
|
|
13
13
|
WLANSCAN = '{"netif":{"get_scaninfo":{"refresh":0}}}'.freeze
|
14
14
|
# Plug time command
|
15
15
|
TIME = '{"time":{"get_time":{}}}'.freeze
|
16
|
+
# Plug timezone command
|
17
|
+
TIMEZONE = '{"time":{"get_timezone":{}}}'.freeze
|
16
18
|
# Plug schedule command
|
17
19
|
SCHEDULE = '{"schedule":{"get_rules":{}}}'.freeze
|
18
20
|
# Plug countdown command
|
@@ -25,5 +27,11 @@ module TpLinkSmartplug
|
|
25
27
|
RESET = '{"system":{"reset":{"delay":1}}}'.freeze
|
26
28
|
# Plug energy command
|
27
29
|
ENERGY = '{"emeter":{"get_realtime":{}}}'.freeze
|
30
|
+
# Plug energy VGain/IGain settings
|
31
|
+
ENERGYGAINS = '{"emeter":{"get_vgain_igain":{}}}'.freeze
|
32
|
+
# Plug LED On
|
33
|
+
LEDON = '{"system":{"set_led_off":{"off":0}}}'.freeze
|
34
|
+
# Plug LED Off
|
35
|
+
LEDOFF = '{"system":{"set_led_off":{"off":1}}}'.freeze
|
28
36
|
end
|
29
37
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'ipaddr'
|
3
3
|
require 'json'
|
4
|
-
require_relative '
|
4
|
+
require_relative 'message'
|
5
5
|
|
6
|
+
# Top level module
|
6
7
|
module TpLinkSmartplug
|
7
8
|
# Provides an object to represent to a plug
|
8
9
|
#
|
@@ -15,9 +16,9 @@ module TpLinkSmartplug
|
|
15
16
|
include TpLinkSmartplug::Helpers
|
16
17
|
include TpLinkSmartplug::Message
|
17
18
|
|
18
|
-
attr_accessor :address, :port, :timeout, :poll_auto_close, :debug
|
19
|
+
attr_accessor :address, :port, :timeout, :poll_auto_close, :auto_connect, :debug
|
19
20
|
|
20
|
-
def initialize(address:, port: 9999)
|
21
|
+
def initialize(address:, port: 9999, auto_connect: true, auto_disconnect: true)
|
21
22
|
super()
|
22
23
|
|
23
24
|
@address = IPAddr.new(address, Socket::AF_INET)
|
@@ -26,7 +27,10 @@ module TpLinkSmartplug
|
|
26
27
|
@debug = false
|
27
28
|
@sockaddr = Addrinfo.getaddrinfo(@address.to_s, @port, Socket::PF_INET, :STREAM, 6).first.to_sockaddr
|
28
29
|
@socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
|
29
|
-
@poll_auto_close =
|
30
|
+
@poll_auto_close = auto_disconnect
|
31
|
+
@auto_connect = auto_connect
|
32
|
+
|
33
|
+
connect if auto_connect
|
30
34
|
end
|
31
35
|
|
32
36
|
# Open connection to plug
|
@@ -41,7 +45,7 @@ module TpLinkSmartplug
|
|
41
45
|
@socket.connect_nonblock(@sockaddr)
|
42
46
|
debug_message('Connected') if @debug
|
43
47
|
rescue IO::WaitWritable
|
44
|
-
if @socket.wait_writable(timeout)
|
48
|
+
if @socket.wait_writable(@timeout)
|
45
49
|
begin
|
46
50
|
@socket.connect_nonblock(@sockaddr)
|
47
51
|
rescue Errno::EISCONN
|
@@ -55,7 +59,7 @@ module TpLinkSmartplug
|
|
55
59
|
raise
|
56
60
|
end
|
57
61
|
else
|
58
|
-
|
62
|
+
disconnect
|
59
63
|
raise TpLinkSmartplug::DeviceError, "Connection timeout connecting to address #{@address}, port #{@port}."
|
60
64
|
end
|
61
65
|
rescue Errno::EISCONN
|
@@ -71,7 +75,7 @@ module TpLinkSmartplug
|
|
71
75
|
# Close connection to plug
|
72
76
|
#
|
73
77
|
def disconnect
|
74
|
-
@socket.close unless
|
78
|
+
@socket.close unless closed?
|
75
79
|
end
|
76
80
|
|
77
81
|
alias_method :close, :disconnect
|
@@ -87,7 +91,11 @@ module TpLinkSmartplug
|
|
87
91
|
#
|
88
92
|
# @return [True, False]
|
89
93
|
def closed?
|
90
|
-
@socket.
|
94
|
+
@socket.recvfrom_nonblock(0)
|
95
|
+
rescue IO::WaitReadable
|
96
|
+
false
|
97
|
+
rescue Errno::ENOTCONN, IOError
|
98
|
+
true
|
91
99
|
end
|
92
100
|
|
93
101
|
# Polls plug with a command
|
@@ -95,29 +103,29 @@ module TpLinkSmartplug
|
|
95
103
|
# @param command [String] the command to send to the plug
|
96
104
|
# @return [Hash] the output from the plug command
|
97
105
|
def poll(command:)
|
98
|
-
connect
|
106
|
+
connect if closed?
|
99
107
|
|
100
108
|
begin
|
101
109
|
debug_message("Sending: #{decrypt(encrypt(command)[4..(command.length + 4)])}") if @debug
|
102
110
|
@socket.write_nonblock(encrypt(command))
|
103
111
|
rescue IO::WaitWritable
|
104
|
-
|
112
|
+
@socket.wait_writable(@timeout)
|
105
113
|
retry
|
106
114
|
end
|
107
115
|
|
108
116
|
begin
|
109
117
|
data = @socket.recv_nonblock(2048)
|
110
118
|
rescue IO::WaitReadable
|
111
|
-
|
119
|
+
@socket.wait_readable(@timeout)
|
112
120
|
retry
|
113
121
|
end
|
114
122
|
|
115
123
|
if @poll_auto_close && !closed?
|
116
124
|
disconnect
|
117
|
-
raise 'Error occured during disconnect' unless closed?
|
125
|
+
raise DeviceError, 'Error occured during disconnect' unless closed?
|
118
126
|
end
|
119
127
|
|
120
|
-
raise 'No data received' if nil_or_empty?(data)
|
128
|
+
raise DeviceError, 'No data received' if nil_or_empty?(data)
|
121
129
|
|
122
130
|
debug_message("Received Raw: #{data.split('\\')}") if @debug
|
123
131
|
data = decrypt(data[4..data.length])
|
@@ -144,6 +152,9 @@ module TpLinkSmartplug
|
|
144
152
|
# @!method time
|
145
153
|
# Return system time from the plug
|
146
154
|
# @return [Hash]
|
155
|
+
# @!method timezone
|
156
|
+
# Return system timezone from the plug
|
157
|
+
# @return [Hash]
|
147
158
|
# @!method schedule
|
148
159
|
# Return schedule configured on the plug
|
149
160
|
# @return [Hash]
|
@@ -156,12 +167,18 @@ module TpLinkSmartplug
|
|
156
167
|
# @!method reboot
|
157
168
|
# Reboot plug
|
158
169
|
# @return [Hash]
|
159
|
-
# @!method
|
170
|
+
# @!method reset
|
160
171
|
# Reset plug
|
161
172
|
# @return [Hash]
|
162
173
|
# @!method energy
|
163
174
|
# Return plug energy data
|
164
175
|
# @return [Hash]
|
176
|
+
# @!method ledon
|
177
|
+
# Disable plug night mode (LED on)
|
178
|
+
# @return [Hash]
|
179
|
+
# @!method ledoff
|
180
|
+
# Enable plug night mode (LED off)
|
181
|
+
# @return [Hash]
|
165
182
|
[
|
166
183
|
:info,
|
167
184
|
:on,
|
@@ -169,12 +186,16 @@ module TpLinkSmartplug
|
|
169
186
|
:cloudinfo,
|
170
187
|
:wlanscan,
|
171
188
|
:time,
|
189
|
+
:timezone,
|
172
190
|
:schedule,
|
173
191
|
:countdown,
|
174
192
|
:antitheft,
|
175
193
|
:reboot,
|
176
194
|
:reset,
|
177
195
|
:energy,
|
196
|
+
:energygains,
|
197
|
+
:ledon,
|
198
|
+
:ledoff,
|
178
199
|
].each do |method|
|
179
200
|
define_method method do
|
180
201
|
JSON.parse(poll(command: TpLinkSmartplug::Command.const_get(method.upcase)))
|
@@ -182,5 +203,22 @@ module TpLinkSmartplug
|
|
182
203
|
end
|
183
204
|
end
|
184
205
|
|
206
|
+
# Set plug alias
|
207
|
+
#
|
208
|
+
# @param name [String] the name to assign to the plug alias
|
209
|
+
# @return [Hash] the output from the plug command
|
210
|
+
def alias=(name)
|
211
|
+
JSON.parse(poll(command: "{\"system\":{\"set_dev_alias\":{\"alias\":\"#{name}\"}}}"))
|
212
|
+
end
|
213
|
+
|
214
|
+
# Set plug location
|
215
|
+
#
|
216
|
+
# @param longitude [String] the longitude to assign to the plug location
|
217
|
+
# @param lattitude [String] the lattitude to assign to the plug location
|
218
|
+
# @return [Hash] the output from the plug command
|
219
|
+
def location!(longitude, lattitude)
|
220
|
+
JSON.parse(poll(command: "{\"system\":{\"set_dev_location\":{\"longitude\":\"#{lattitude}\", \"latitude\":\"#{longitude}\"}}}"))
|
221
|
+
end
|
222
|
+
|
185
223
|
class DeviceError < TpLinkSmartplug::BaseError; end
|
186
224
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tp_link_smartplug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Hughes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Control and retrieve data from a TP-Link HS100/110 (Metered) Smartplug
|
14
14
|
email: bmhughes@bmhughes.co.uk
|
@@ -28,6 +28,7 @@ licenses:
|
|
28
28
|
- Apache-2.0
|
29
29
|
metadata:
|
30
30
|
github_repo: ssh://github.com/bmhughes/tp_link_smartplug
|
31
|
+
rubygems_mfa_required: 'true'
|
31
32
|
post_install_message:
|
32
33
|
rdoc_options: []
|
33
34
|
require_paths:
|
@@ -43,7 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
44
|
- !ruby/object:Gem::Version
|
44
45
|
version: '0'
|
45
46
|
requirements: []
|
46
|
-
rubygems_version: 3.
|
47
|
+
rubygems_version: 3.3.26
|
47
48
|
signing_key:
|
48
49
|
specification_version: 4
|
49
50
|
summary: TP-Link HS100/110 Smart Plug interaction library
|