tinderfridge 0.13.0 → 0.15.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/tinderfridge/device.rb +30 -5
- data/lib/tinderfridge/device_collection.rb +19 -0
- data/lib/tinderfridge/devices/brick_master/brick_master.rb +49 -0
- data/lib/tinderfridge/devices/bricklet_co2_v2/bricklet_co2_v2.rb +8 -0
- data/lib/tinderfridge/devices/bricklet_particulate_matter/bricklet_particulate_matter.rb +38 -0
- data/lib/tinderfridge/devices/bricklet_segment_display_4x7_v2/bricklet_segment_display_4x7_v2.rb +29 -17
- data/lib/tinderfridge/ip_connection.rb +33 -5
- data/lib/tinderfridge/shared/logger.rb +51 -0
- data/lib/tinderfridge/tinkerforge.rb +21 -0
- data/lib/tinderfridge/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: d3c51a0740fb7714bbb9012543195df2539e310653510dfd6f6b4972aaf4b7dd
|
4
|
+
data.tar.gz: d02f24ea04041305ac5cc7b40c73e651451bca9caff08be1476bc592ac9fe56b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d8e2423d20924eb5bcb96083268c337d3dbbb571f395d1d6861ce39de4f2391784de84674b59875fea61a0dc9aca7085aa41c7a7274362394582a6453d5cf5a
|
7
|
+
data.tar.gz: 838806023856f1f566b4f49ce73b04ff6d1bae47b395e7b7d089ee288e1ed0ad85396fda76d7401866dea848b0288fd6be4a6cc1a8e306c0a11a192f09582445
|
data/lib/tinderfridge/device.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'tinkerforge/ip_connection'
|
2
|
+
require 'tinderfridge/shared/logger'
|
2
3
|
|
3
4
|
module Tinkerforge
|
4
5
|
|
@@ -56,6 +57,8 @@ module Tinkerforge
|
|
56
57
|
# Instance Methods #
|
57
58
|
#----------------------------------------------------------------------#
|
58
59
|
|
60
|
+
include Tinkerforge::Shared::Logger
|
61
|
+
|
59
62
|
# Returns the device's UID. Not to be confused with #uid, which returns the numeric UID.
|
60
63
|
attr_reader :uid_string
|
61
64
|
|
@@ -68,6 +71,15 @@ module Tinkerforge
|
|
68
71
|
# Returns the device's IPConnection object.
|
69
72
|
attr_reader :ipcon
|
70
73
|
|
74
|
+
alias original_initialize initialize
|
75
|
+
|
76
|
+
def initialize(uid, ipcon, device_identifier, device_display_name)
|
77
|
+
original_initialize(uid, ipcon, device_identifier, device_display_name)
|
78
|
+
if respond_to? 'get_identity'
|
79
|
+
logger_debug "Created %s '%s'" % [self.class, uid_string]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
71
83
|
# Returns device information.
|
72
84
|
#
|
73
85
|
# Device information is an array:
|
@@ -80,15 +92,22 @@ module Tinkerforge
|
|
80
92
|
|
81
93
|
# Returns a programmer-friendly representation of the device.
|
82
94
|
def inspect
|
83
|
-
"
|
95
|
+
"#{self.class} (#{uid_string}" + ( ipcon.host ? "@#{ipcon.host}:#{ipcon.port})" : ')' )
|
84
96
|
end
|
85
97
|
|
86
98
|
# Returns the device's properties.
|
87
99
|
def properties
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
100
|
+
|
101
|
+
# BrickDaemon inherits from Device, but has no #get_identity.
|
102
|
+
return {} unless respond_to? 'get_identity'
|
103
|
+
|
104
|
+
identity = get_identity
|
105
|
+
|
106
|
+
@properties ||= [
|
107
|
+
[ 'device_identifier' , device_identifier ],
|
108
|
+
[ 'device_display_name', device_display_name ],
|
109
|
+
[ 'hardware_version' , identity[3].join('.') ],
|
110
|
+
].compact.to_h.merge load_properties
|
92
111
|
end
|
93
112
|
|
94
113
|
alias props properties
|
@@ -127,6 +146,12 @@ module Tinkerforge
|
|
127
146
|
@config ||= {}
|
128
147
|
end
|
129
148
|
|
149
|
+
# Sets configuration data (a Hash) for the device.
|
150
|
+
def config=(configuration)
|
151
|
+
raise(ArgumentError, 'Invalid configuration') unless configuration.class == Hash
|
152
|
+
@config = configuration
|
153
|
+
end
|
154
|
+
|
130
155
|
# Opens the online documentation for the device (Mac OS only).
|
131
156
|
#
|
132
157
|
# When the URL for the documentation is not known, does nothing.
|
@@ -2,6 +2,8 @@ module Tinkerforge
|
|
2
2
|
|
3
3
|
class DeviceCollection < Hash
|
4
4
|
|
5
|
+
alias devices values
|
6
|
+
|
5
7
|
# Returns the temperatures as measured inside the microcontrollers of devices in the collection.
|
6
8
|
#
|
7
9
|
# Nil for devices that do not support the get_chip_temperature method.
|
@@ -82,6 +84,16 @@ module Tinkerforge
|
|
82
84
|
smap 'config'
|
83
85
|
end
|
84
86
|
|
87
|
+
# Sets configuration data of devices in the collection.
|
88
|
+
def config=(configuration)
|
89
|
+
raise ArgumentError, 'invalid configuration' unless (configuration.class == Hash)
|
90
|
+
each do |k,v|
|
91
|
+
if configuration[k]
|
92
|
+
v.config = configuration[k]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
85
97
|
# Opens the online documentation for the devices in the collection (Mac OS only).
|
86
98
|
#
|
87
99
|
# When the URL for a device's documentation is not known, does nothing.
|
@@ -115,6 +127,13 @@ module Tinkerforge
|
|
115
127
|
smap('ipcon').values.compact.uniq
|
116
128
|
end
|
117
129
|
|
130
|
+
# Disconnects IP Connections used by devices in the collection, and removes all devices from the collection.
|
131
|
+
def disconnect
|
132
|
+
result = ipcons.map { |i| [i, (i.get_connection_state == 0 ? nil : i.disconnect) ] }.to_h
|
133
|
+
clear
|
134
|
+
result
|
135
|
+
end
|
136
|
+
|
118
137
|
# Returns an array of devices in the collection matching the selector.
|
119
138
|
#
|
120
139
|
# Selector argument can be:
|
@@ -6,6 +6,55 @@ module Tinkerforge
|
|
6
6
|
CHIP_TEMPERATURE_UNIT = 0.1
|
7
7
|
# REVIEW: This should ideally be part of base Tinkerforge.
|
8
8
|
|
9
|
+
# Returns the device's state.
|
10
|
+
def state
|
11
|
+
super.merge [
|
12
|
+
safe_send_state('connection_type' , 'get_connection_type' ), # FW 2.4.0
|
13
|
+
safe_send_state('status_led_enabled', 'is_status_led_enabled'), # FW 2.3.2
|
14
|
+
safe_send_state('chibi_present' , 'is_chibi_present' ),
|
15
|
+
safe_send_state('rs485_present' , 'is_rs485_present' ),
|
16
|
+
safe_send_state('ethernet_present' , 'is_ethernet_present' ), # FW 2.1.0
|
17
|
+
safe_send_state('wifi_present' , 'is_wifi_present' ),
|
18
|
+
safe_send_state('wifi2_present' , 'is_wifi2_present' ), # FW 2.4.0
|
19
|
+
].compact.to_h
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the state of the WIFI Extension 2.0.
|
23
|
+
def wifi2_state
|
24
|
+
if is_wifi2_present
|
25
|
+
[
|
26
|
+
safe_send_state('mesh_configuration' , 'get_wifi2_mesh_configuration' ), # FW 2.4.2 / 2.1.0
|
27
|
+
safe_send_state('mesh_router_ssid' , 'get_wifi2_mesh_router_ssid' ), # FW 2.4.2 / 2.1.0
|
28
|
+
safe_send_state('mesh_common_status' , 'get_wifi2_mesh_common_status' ), # FW 2.4.2 / 2.1.0
|
29
|
+
safe_send_state('mesh_client_status' , 'get_wifi2_mesh_client_status' ), # FW 2.4.2 / 2.1.0
|
30
|
+
safe_send_state('mesh_ap_status' , 'get_wifi2_mesh_ap_status' ), # FW 2.4.2 / 2.1.0
|
31
|
+
safe_send_state('configuration' , 'get_wifi2_configuration' ), # FW 2.4.0
|
32
|
+
safe_send_state('status' , 'get_wifi2_status' ), # FW 2.4.0
|
33
|
+
safe_send_state('client_configuration', 'get_wifi2_client_configuration'), # FW 2.4.0
|
34
|
+
safe_send_state('client_hostname' , 'get_wifi2_client_hostname' ), # FW 2.4.0
|
35
|
+
safe_send_state('ap_configuration' , 'get_wifi2_ap_configuration' ), # FW 2.4.0
|
36
|
+
|
37
|
+
if r = safe_send_state('firmware_version', 'get_wifi2_firmware_version' ) # FW 2.4.0
|
38
|
+
[ r[0], r[1].join('.') ]
|
39
|
+
end
|
40
|
+
].compact.to_h
|
41
|
+
end
|
42
|
+
rescue
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Safely call a method for inclusion in state hash.
|
49
|
+
# When method blows up, state can ignore it.
|
50
|
+
# REVIEW: possible candidate for Device class
|
51
|
+
def safe_send_state(key, methot)
|
52
|
+
[key, send(methot)]
|
53
|
+
rescue => e
|
54
|
+
logger_warn "Device '#{uid_string}': '#{methot}' failed. #{e}"
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
9
58
|
end
|
10
59
|
|
11
60
|
end
|
@@ -16,6 +16,14 @@ module Tinkerforge
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
+
def _print_4
|
20
|
+
if (co2 = get_co2_concentration) > 9999
|
21
|
+
' ol '
|
22
|
+
else
|
23
|
+
'%4d' % co2
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
19
27
|
def _view_21x8
|
20
28
|
"CO2V2 #{uid_string.rjust 8}\n\n\n" +
|
21
29
|
('%d PPM' % get_co2_concentration).center(21)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Tinkerforge
|
2
|
+
|
3
|
+
class BrickletParticulateMatter
|
4
|
+
|
5
|
+
# Enables the fan and the laser diode.
|
6
|
+
def enable
|
7
|
+
set_enable true
|
8
|
+
end
|
9
|
+
|
10
|
+
# Disables the fan and the laser diode.
|
11
|
+
def disable
|
12
|
+
set_enable false
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the device's state.
|
16
|
+
def state
|
17
|
+
super.merge(
|
18
|
+
'enabled' => get_enable,
|
19
|
+
'pm_concentration' => get_pm_concentration,
|
20
|
+
'pm_count' => get_pm_count,
|
21
|
+
'sensor_info' => get_sensor_info,
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def _view_21x8
|
28
|
+
"PM #{uid_string.rjust 8}\n\n" +
|
29
|
+
if get_enable
|
30
|
+
" PM1 %4d\n PM2.5 %4d\n PM10 %4d" % get_pm_concentration
|
31
|
+
else
|
32
|
+
"\n disabled"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/tinderfridge/devices/bricklet_segment_display_4x7_v2/bricklet_segment_display_4x7_v2.rb
CHANGED
@@ -35,30 +35,39 @@ module Tinkerforge
|
|
35
35
|
self.segments = segments.gsub(/[ _]/, '').ljust(35, '0').chars.map { |s| s == '1' }
|
36
36
|
end
|
37
37
|
|
38
|
+
# Turns all 35 segments on.
|
39
|
+
def all_on
|
40
|
+
self.segments = [true]*35
|
41
|
+
end
|
42
|
+
|
38
43
|
# Returns the device's state.
|
39
44
|
def state
|
40
45
|
super.merge( 'brightness' => get_brightness )
|
41
46
|
end
|
42
47
|
|
43
48
|
# Displays a string.
|
44
|
-
def print(
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
def print(text_or_object='')
|
50
|
+
if text_or_object.respond_to?( :_print_4, true)
|
51
|
+
print ( text_or_object.send(:_print_4) rescue '' )
|
52
|
+
else
|
53
|
+
out = ''
|
54
|
+
colon = false
|
55
|
+
|
56
|
+
text_or_object.to_s.chars.each do |c|
|
57
|
+
if glyphs.key? c
|
58
|
+
out << glyphs[c] << '0'
|
59
|
+
elsif c == '.' and out[-1] == '0'
|
60
|
+
out[-1] = '1'
|
61
|
+
elsif c == ':' and out.size == 16
|
62
|
+
colon = true
|
63
|
+
else
|
64
|
+
raise "Can not display '#{text}'"
|
65
|
+
end
|
57
66
|
end
|
58
|
-
end
|
59
67
|
|
60
|
-
|
61
|
-
|
68
|
+
self.segments_string = out[0,32].ljust(32,'0') + ( colon ? '110' : '000' )
|
69
|
+
nil
|
70
|
+
end
|
62
71
|
end
|
63
72
|
|
64
73
|
# Returns the definition of glyphs for Unicode chracters.
|
@@ -78,6 +87,7 @@ module Tinkerforge
|
|
78
87
|
|
79
88
|
'A' => '1110111',
|
80
89
|
'b' => '0011111',
|
90
|
+
'B' => '1111111',
|
81
91
|
'c' => '0001101',
|
82
92
|
'C' => '1001110',
|
83
93
|
'd' => '0111101',
|
@@ -91,6 +101,7 @@ module Tinkerforge
|
|
91
101
|
'J' => '0111000',
|
92
102
|
'L' => '0001110',
|
93
103
|
'l' => '0001100',
|
104
|
+
'N' => '1110110',
|
94
105
|
'n' => '0010101',
|
95
106
|
'O' => '1111110',
|
96
107
|
'o' => '0011101',
|
@@ -103,7 +114,8 @@ module Tinkerforge
|
|
103
114
|
'u' => '0011100',
|
104
115
|
'V' => '0111110',
|
105
116
|
'v' => '0011100',
|
106
|
-
'
|
117
|
+
'Y' => '0111011',
|
118
|
+
'y' => '0111011',
|
107
119
|
|
108
120
|
'ö' => '1011101',
|
109
121
|
'ü' => '1011100',
|
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'tinkerforge/ip_connection'
|
2
|
+
require 'tinderfridge/shared/logger'
|
2
3
|
|
3
4
|
module Tinkerforge
|
4
5
|
|
5
6
|
class IPConnection
|
6
7
|
|
8
|
+
include Tinkerforge::Shared::Logger
|
9
|
+
|
7
10
|
# Returns the host for the IP Connection.
|
8
11
|
attr_reader :host
|
9
12
|
|
@@ -13,9 +16,27 @@ module Tinkerforge
|
|
13
16
|
# Returns the network socket used by the IP Connection.
|
14
17
|
attr_reader :socket
|
15
18
|
|
19
|
+
alias original_connect connect
|
20
|
+
|
21
|
+
# Creates a TCP/IP connection to the given host and port. Logs events if event logging is enabled.
|
22
|
+
def connect(host, port)
|
23
|
+
logger_debug "Connecting to #{host}:#{port}"
|
24
|
+
original_connect(host, port)
|
25
|
+
logger_debug "Connected to #{host}:#{port}"
|
26
|
+
end
|
27
|
+
|
28
|
+
alias original_disconnect disconnect
|
29
|
+
|
30
|
+
# Disconnects the TCP/IP connection. Logs events if event logging is enabled.
|
31
|
+
def disconnect
|
32
|
+
logger_debug "Disconnecting from #{host}:#{port}"
|
33
|
+
original_disconnect
|
34
|
+
logger_debug "Disconnected from #{host}:#{port}"
|
35
|
+
end
|
36
|
+
|
16
37
|
# Returns a programmer-friendly representation of the object.
|
17
38
|
def inspect
|
18
|
-
"
|
39
|
+
"#{self.class} (%s:%s)" % (host ? [host, port] : ['-', '-'] )
|
19
40
|
end
|
20
41
|
|
21
42
|
# Returns the state of the IP Connection.
|
@@ -86,6 +107,7 @@ module Tinkerforge
|
|
86
107
|
list = Tinkerforge::DeviceCollection.new
|
87
108
|
|
88
109
|
self.register_callback(CALLBACK_ENUMERATE) do |*args|
|
110
|
+
logger_log_enum(args)
|
89
111
|
case args[6]
|
90
112
|
when 0, 1
|
91
113
|
unless list.key?(args[0])
|
@@ -95,8 +117,6 @@ module Tinkerforge
|
|
95
117
|
end
|
96
118
|
when 2
|
97
119
|
list.delete args[0]
|
98
|
-
else
|
99
|
-
raise "Unknown Enumeration Type: #{args[6]}"
|
100
120
|
end
|
101
121
|
end
|
102
122
|
|
@@ -112,7 +132,7 @@ module Tinkerforge
|
|
112
132
|
#
|
113
133
|
# Requires Brick Viewer version 2.4.23 or later.
|
114
134
|
def open_brick_viewer
|
115
|
-
if RUBY_PLATFORM =~ /darwin/
|
135
|
+
if host and (RUBY_PLATFORM =~ /darwin/)
|
116
136
|
`open -n -a Brickv --args #{host} --port #{port}`
|
117
137
|
"#{host}:#{port}"
|
118
138
|
end
|
@@ -128,11 +148,19 @@ module Tinkerforge
|
|
128
148
|
require "tinkerforge/#{dev_info[2][1]}"
|
129
149
|
Tinkerforge.const_get(dev_info[2][0]).new enum_data[0], self
|
130
150
|
else
|
131
|
-
|
151
|
+
logger_warn "Unknown Device Identifier: #{enum_data[5]} (UID: #{enum_data[0]})"
|
132
152
|
nil
|
133
153
|
end
|
134
154
|
end
|
135
155
|
|
156
|
+
def logger_log_enum(enum_data)
|
157
|
+
logger_debug(
|
158
|
+
"Device '#{enum_data[0]}' " +
|
159
|
+
['available', 'connected', 'disconnected'][enum_data[6]] +
|
160
|
+
( enum_data[6] == 2 ? '' : " (Device Identifier: #{enum_data[5]})" )
|
161
|
+
)
|
162
|
+
end
|
163
|
+
|
136
164
|
end
|
137
165
|
|
138
166
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Tinkerforge
|
2
|
+
|
3
|
+
module Shared
|
4
|
+
|
5
|
+
# Mixin for event logging to a Logger instance.
|
6
|
+
#
|
7
|
+
# Logger is part of the Ruby Standard Library:
|
8
|
+
# - https://docs.ruby-lang.org/en/master/Logger.html
|
9
|
+
module Logger
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def logger
|
14
|
+
Tinkerforge.logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def logger_debug(msg)
|
18
|
+
if logger
|
19
|
+
logger.debug(msg)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def logger_info(msg)
|
24
|
+
if logger
|
25
|
+
logger.info(msg)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def logger_warn(msg)
|
30
|
+
if logger
|
31
|
+
logger.warn(msg)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def logger_error(msg)
|
36
|
+
if logger
|
37
|
+
logger.error(msg)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def logger_fatal(msg)
|
42
|
+
if logger
|
43
|
+
logger.fatal(msg)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -7,6 +7,8 @@ module Tinkerforge
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
|
10
|
+
@@logger = nil
|
11
|
+
|
10
12
|
# Returns the directory where Tinkerforge bindings appear to be installed.
|
11
13
|
def lib_dir
|
12
14
|
File.dirname File.dirname Device.instance_method('uid').source_location.first
|
@@ -30,6 +32,25 @@ module Tinkerforge
|
|
30
32
|
connect('localhost', port).discover(0.25)
|
31
33
|
end
|
32
34
|
|
35
|
+
# Assign a Logger object to enable logging of Tinkerforge events.
|
36
|
+
def logger=(logger)
|
37
|
+
if logger
|
38
|
+
if logger.respond_to? :debug
|
39
|
+
@@logger = logger
|
40
|
+
logger.debug(about)
|
41
|
+
else
|
42
|
+
raise ArgumentError, 'Invalid Logger'
|
43
|
+
end
|
44
|
+
else
|
45
|
+
@@logger = nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the Logger, or nil
|
50
|
+
def logger
|
51
|
+
@@logger
|
52
|
+
end
|
53
|
+
|
33
54
|
private
|
34
55
|
|
35
56
|
def _view_21x8
|
data/lib/tinderfridge/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tinderfridge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lllist.eu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tinkerforge
|
@@ -120,6 +120,7 @@ files:
|
|
120
120
|
- lib/tinderfridge/devices/bricklet_outdoor_weather/bricklet_outdoor_weather.json
|
121
121
|
- lib/tinderfridge/devices/bricklet_outdoor_weather/bricklet_outdoor_weather.rb
|
122
122
|
- lib/tinderfridge/devices/bricklet_particulate_matter/bricklet_particulate_matter.json
|
123
|
+
- lib/tinderfridge/devices/bricklet_particulate_matter/bricklet_particulate_matter.rb
|
123
124
|
- lib/tinderfridge/devices/bricklet_performance_dc/bricklet_performance_dc.json
|
124
125
|
- lib/tinderfridge/devices/bricklet_piezo_speaker_v2/bricklet_piezo_speaker_v2.json
|
125
126
|
- lib/tinderfridge/devices/bricklet_piezo_speaker_v2/bricklet_piezo_speaker_v2.rb
|
@@ -156,6 +157,7 @@ files:
|
|
156
157
|
- lib/tinderfridge/devices/bricklet_xmc1400_breakout/bricklet_xmc1400_breakout.json
|
157
158
|
- lib/tinderfridge/ip_connection.rb
|
158
159
|
- lib/tinderfridge/shared/display_ibm437_encoding.rb
|
160
|
+
- lib/tinderfridge/shared/logger.rb
|
159
161
|
- lib/tinderfridge/tinkerforge.rb
|
160
162
|
- lib/tinderfridge/version.rb
|
161
163
|
homepage: https://github.com/lllisteu/tinderfridge
|