tinderfridge 0.12.0 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11aec071db2201e67dee0935c5a37ba2f801d2337cf0dc938ea465a9c0435bd3
4
- data.tar.gz: ad2faa18ff3320c9320ded930b47f54c38e9471eba0bb52e2aa23cb48da3d108
3
+ metadata.gz: a5370c2b6210bbb986208ce2afc7f6ce9573592b7707bf14a8bc371ffb47050c
4
+ data.tar.gz: 79338d5081d87b1aff9402eaf656be89ed5a50c52f59f597c68a84e9462ccdd4
5
5
  SHA512:
6
- metadata.gz: 440adf1b54a1787963688f4392fe686e07b898eae1361d3f245526a244f6e677b5a29a7cd84f2f3aa0221ef4300372dcbae18b55200cef2b96d6fa7206a0c7d0
7
- data.tar.gz: 8204e15a1106392bbde997f2e65704b2cfd176c4e18066685f26e8a50a6cd62e3002b10e8fd6224f16540d946c94c66f66e96f6941b90c7255beec4e4c545a60
6
+ metadata.gz: c0077e242170d67d5c8ffdc63efd702183865d2e475c4be0c0f93bc4bf33aff1c313838a96ade44255245c320057e5369133d860fd5755b585f0fa92f1ae823c
7
+ data.tar.gz: 3a98205cf201dd8df8ca95378ad1bb82fa41af517f2f8b87a910f4f43b7753344ea0538d90aab6015fd3b8d16d2627b3ef24167380457601cf20f7aae19addfe
@@ -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,7 +92,7 @@ module Tinkerforge
80
92
 
81
93
  # Returns a programmer-friendly representation of the device.
82
94
  def inspect
83
- "%s (%s@%s:%s)" % [self.class, uid_string, ipcon.host, ipcon.port]
95
+ "#{self.class} (#{uid_string}" + ( ipcon.host ? "@#{ipcon.host}:#{ipcon.port})" : ')' )
84
96
  end
85
97
 
86
98
  # Returns the device's properties.
@@ -122,6 +134,17 @@ module Tinkerforge
122
134
  ].compact.to_h
123
135
  end
124
136
 
137
+ # Returns configuration data for the device (a mutable Hash).
138
+ def config
139
+ @config ||= {}
140
+ end
141
+
142
+ # Sets configuration data (a Hash) for the device.
143
+ def config=(configuration)
144
+ raise(ArgumentError, 'Invalid configuration') unless configuration.class == Hash
145
+ @config = configuration
146
+ end
147
+
125
148
  # Opens the online documentation for the device (Mac OS only).
126
149
  #
127
150
  # When the URL for the documentation is not known, does nothing.
@@ -61,7 +61,7 @@ module Tinkerforge
61
61
  # Prints a list of devices in the collection.
62
62
  def ls
63
63
  keys.sort_by(&:downcase).each do |k|
64
- puts "%-8s %.40s" % [k, Tinkerforge.device_info(self[k])[1]]
64
+ puts "%-8s %.40s" % [k, self[k].device_display_name]
65
65
  end.size
66
66
  end
67
67
 
@@ -77,6 +77,21 @@ module Tinkerforge
77
77
  smap 'state'
78
78
  end
79
79
 
80
+ # Returns configuration data of devices in the collection.
81
+ def config
82
+ smap 'config'
83
+ end
84
+
85
+ # Sets configuration data of devices in the collection.
86
+ def config=(configuration)
87
+ raise ArgumentError, 'invalid configuration' unless (configuration.class == Hash)
88
+ each do |k,v|
89
+ if configuration[k]
90
+ v.config = configuration[k]
91
+ end
92
+ end
93
+ end
94
+
80
95
  # Opens the online documentation for the devices in the collection (Mac OS only).
81
96
  #
82
97
  # When the URL for a device's documentation is not known, does nothing.
@@ -86,6 +101,18 @@ module Tinkerforge
86
101
 
87
102
  alias doc open_documentation
88
103
 
104
+ # On Mac OS, opens a new Brick Viewer for each unique
105
+ # IP Connection used by devices in the collection.
106
+ #
107
+ # Not supported on other platforms.
108
+ #
109
+ # Requires Brick Viewer version 2.4.23 or later.
110
+ def open_brick_viewer
111
+ ipcons.map { |i| i.open_brick_viewer }
112
+ end
113
+
114
+ alias brickv open_brick_viewer
115
+
89
116
  # Turns off light sources such as screens and RGB LEDs for devices in the collection.
90
117
  #
91
118
  # Ignores devices that do not support the blackout method.
@@ -98,6 +125,11 @@ module Tinkerforge
98
125
  smap('ipcon').values.compact.uniq
99
126
  end
100
127
 
128
+ # Disconnects IP Connections used by devices in the collection.
129
+ def disconnect
130
+ ipcons.map { |i| [i, (i.get_connection_state == 0 ? nil : i.disconnect) ] }.to_h
131
+ end
132
+
101
133
  # Returns an array of devices in the collection matching the selector.
102
134
  #
103
135
  # Selector argument can be:
@@ -5,7 +5,7 @@ module Tinkerforge
5
5
  private
6
6
 
7
7
  def _view_21x8
8
- "ESP32 Eth #{uid_string.rjust 8}"
8
+ "ESP32Eth #{uid_string.rjust 8}"
9
9
  end
10
10
 
11
11
  end
@@ -14,6 +14,15 @@ module Tinkerforge
14
14
  )
15
15
  end
16
16
 
17
+ private
18
+
19
+ def _view_21x8
20
+ s = state
21
+ "AmbiLightV3 #{uid_string.rjust 8}\n\n\n" +
22
+ ("%.2f Lux" % [0.01 * s['illuminance_raw']]).center(21) + "\n\n\n\n" +
23
+ ("max %d / %d ms" % [ s['illuminance_range'], s['integration_time'] ]).center(21)
24
+ end
25
+
17
26
  end
18
27
 
19
28
  end
@@ -18,11 +18,8 @@ module Tinkerforge
18
18
  private
19
19
 
20
20
  def _view_21x8
21
- <<~ET
22
- Baro #{uid_string.rjust 8}
23
-
24
- #{'%7.2f hPa' % [get_air_pressure*0.001]}
25
- ET
21
+ "BaroV2 #{uid_string.rjust 8}\n\n\n" +
22
+ ('%.2f hPa' % [get_air_pressure*0.001]).center(21)
26
23
  end
27
24
 
28
25
  end
@@ -17,11 +17,8 @@ module Tinkerforge
17
17
  private
18
18
 
19
19
  def _view_21x8
20
- <<~ET
21
- CO2 #{uid_string.rjust 8}
22
-
23
- #{'%5d PPM' % get_co2_concentration}
24
- ET
20
+ "CO2V2 #{uid_string.rjust 8}\n\n\n" +
21
+ ('%d PPM' % get_co2_concentration).center(21)
25
22
  end
26
23
 
27
24
  end
@@ -49,7 +49,7 @@ module Tinkerforge
49
49
  private
50
50
 
51
51
  def _view_21x8
52
- "GPSv2 #{uid_string.rjust 8}\n\n" +
52
+ "GPSV2 #{uid_string.rjust 8}\n\n" +
53
53
  ((c = coordinates) ? (" Lat %10.5f\n Lon %10.5f" % c) : ' no fix')
54
54
  end
55
55
 
@@ -49,7 +49,7 @@ module Tinkerforge
49
49
  private
50
50
 
51
51
  def _view_21x8
52
- "GPSv3 #{uid_string.rjust 8}\n\n" +
52
+ "GPSV3 #{uid_string.rjust 8}\n\n" +
53
53
  ((c = coordinates) ? (" Lat %10.5f\n Lon %10.5f" % c) : ' no fix')
54
54
  end
55
55
 
@@ -106,7 +106,7 @@ module Tinkerforge
106
106
  private
107
107
 
108
108
  def _view_21x8
109
- "LCD #{uid_string.rjust 8}"
109
+ "LCD128x64 #{uid_string.rjust 8}"
110
110
  end
111
111
 
112
112
  end
@@ -86,7 +86,7 @@ module Tinkerforge
86
86
  private
87
87
 
88
88
  def _view_21x8
89
- "OLED #{uid_string.rjust 8}"
89
+ "OLED128x64V2 #{uid_string.rjust 8}"
90
90
  end
91
91
 
92
92
  end
@@ -11,13 +11,18 @@ module Tinkerforge
11
11
 
12
12
  # Returns the last measured data for all sensors.
13
13
  #
14
- # The result is a Hash, with sensor identifiers as the keys. Values per sensor are:
14
+ # The result is a Hash, with sensor identifiers (or their mapped values) as the keys. Values per sensor are:
15
15
  # - 0: Temperature (°C)
16
16
  # - 1: Relative humidity (%RH)
17
17
  # - 2: Last change (seconds)
18
+ #
19
+ # Sensor identifiers can be mapped to descriptive strings or other values:
20
+ # @example
21
+ # my_weather_bricklet.config['sensormap'] = { 202 => 'outdoors' }
18
22
  def sensors
23
+ sensormap = (config['sensormap'].class == Hash) ? config['sensormap'] : {}
19
24
  get_sensor_identifiers.map do |id|
20
- [ id, get_sensor_data(id).each_with_index.map { |v,i| i == 0 ? v/10.0 : v } ]
25
+ [ (sensormap[id] || id), get_sensor_data(id).each_with_index.map { |v,i| i == 0 ? v/10.0 : v } ]
21
26
  end.to_h
22
27
  end
23
28
 
@@ -26,7 +31,7 @@ module Tinkerforge
26
31
  def _view_21x8
27
32
  "Weather #{uid_string.rjust 8}\n\n" +
28
33
  sensors.first(6).map do |k,v|
29
- %Q(#{v[2] > 100 ? '?' : ' '} %3d %4.1f °C %2d %%\n) % [k,v].flatten
34
+ %Q(#{v[2] > 100 ? '!' : ' '}%-8.8s %5.1f°C%3d%%\n) % [k,v].flatten
30
35
  end.join
31
36
  end
32
37
 
@@ -112,7 +112,9 @@ module Tinkerforge
112
112
 
113
113
  '_' => '0001000',
114
114
  '-' => '0000001',
115
+ '¯' => '1000000',
115
116
  '=' => '0001001',
117
+ '≡' => '1001001',
116
118
 
117
119
  '(' => '1001110',
118
120
  ')' => '1111000',
@@ -147,6 +149,35 @@ module Tinkerforge
147
149
  [value1, value2]
148
150
  end
149
151
 
152
+ # Returns the current thread automatically updating the display.
153
+ def thread
154
+ @thread
155
+ end
156
+
157
+ # Stops automatic updating of the display.
158
+ def stop
159
+ if thread
160
+ thread.exit
161
+ @thread = nil
162
+ end
163
+ end
164
+
165
+ # Continuously displays the current time, in 24-hour format.
166
+ #
167
+ # Starts a new thread automatically updating the display. Use the stop method to end.
168
+ #
169
+ # By default uses local time, or optionally UTC.
170
+ def clock(utc=false)
171
+ stop
172
+ @thread = Thread.new do
173
+ while true
174
+ t = utc ? Time.now.getutc : Time.now
175
+ print t.strftime("%H#{t.sec.even? ? ':' : ''}%M")
176
+ sleep 0.5
177
+ end
178
+ end
179
+ end
180
+
150
181
  end
151
182
 
152
183
  end
@@ -0,0 +1,22 @@
1
+ module Tinkerforge
2
+
3
+ class BrickletSolidStateRelayV2
4
+
5
+ # Returns the device's state.
6
+ def state
7
+ super.merge(
8
+ 'value' => get_state,
9
+ 'monoflop' => get_monoflop,
10
+ )
11
+ end
12
+
13
+ private
14
+
15
+ def _view_21x8
16
+ "SSRelayV2 #{uid_string.rjust 8}\n\n\n" +
17
+ (get_state ? 'ON' : 'Off').center(21)
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -13,13 +13,9 @@ module Tinkerforge
13
13
  private
14
14
 
15
15
  def _view_21x8
16
- <<~ET
17
- Temp #{uid_string.rjust 8}
18
-
19
- #{'%6.2f °C' % [get_temperature*0.01]}
20
-
21
- #{get_heater_configuration == 1 ? 'HEATER' : ''}
22
- ET
16
+ "TempV2 #{uid_string.rjust 8}\n\n\n" +
17
+ ('%.2f °C' % [get_temperature*0.01]).center(21) +
18
+ (get_heater_configuration == 1 ? "\n\n\n HEATER" : '')
23
19
  end
24
20
 
25
21
  end
@@ -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
 
@@ -15,7 +18,7 @@ module Tinkerforge
15
18
 
16
19
  # Returns a programmer-friendly representation of the object.
17
20
  def inspect
18
- "%s (%s:%s)" % [self.class, host, port]
21
+ "#{self.class} (%s:%s)" % (host ? [host, port] : ['-', '-'] )
19
22
  end
20
23
 
21
24
  # Returns the state of the IP Connection.
@@ -86,6 +89,7 @@ module Tinkerforge
86
89
  list = Tinkerforge::DeviceCollection.new
87
90
 
88
91
  self.register_callback(CALLBACK_ENUMERATE) do |*args|
92
+ logger_log_enum(args)
89
93
  case args[6]
90
94
  when 0, 1
91
95
  unless list.key?(args[0])
@@ -95,8 +99,6 @@ module Tinkerforge
95
99
  end
96
100
  when 2
97
101
  list.delete args[0]
98
- else
99
- raise "Unknown Enumeration Type: #{args[6]}"
100
102
  end
101
103
  end
102
104
 
@@ -105,6 +107,21 @@ module Tinkerforge
105
107
  list
106
108
  end
107
109
 
110
+ # On Mac OS, opens a new Brick Viewer,
111
+ # connected to the IP Connection's host and port.
112
+ #
113
+ # Not supported on other platforms.
114
+ #
115
+ # Requires Brick Viewer version 2.4.23 or later.
116
+ def open_brick_viewer
117
+ if host and (RUBY_PLATFORM =~ /darwin/)
118
+ `open -n -a Brickv --args #{host} --port #{port}`
119
+ "#{host}:#{port}"
120
+ end
121
+ end
122
+
123
+ alias brickv open_brick_viewer
124
+
108
125
  private
109
126
 
110
127
  # Takes the args supplied by an enumeration callback, and returns a device instance.
@@ -113,11 +130,19 @@ module Tinkerforge
113
130
  require "tinkerforge/#{dev_info[2][1]}"
114
131
  Tinkerforge.const_get(dev_info[2][0]).new enum_data[0], self
115
132
  else
116
- warn "Unknown Device Identifier: #{enum_data[5]} (UID: #{enum_data[0]})"
133
+ logger_warn "Unknown Device Identifier: #{enum_data[5]} (UID: #{enum_data[0]})"
117
134
  nil
118
135
  end
119
136
  end
120
137
 
138
+ def logger_log_enum(enum_data)
139
+ logger_debug(
140
+ "Device '#{enum_data[0]}' " +
141
+ ['available', 'connected', 'disconnected'][enum_data[6]] +
142
+ ( enum_data[6] == 2 ? '' : " (Device Identifier: #{enum_data[5]})" )
143
+ )
144
+ end
145
+
121
146
  end
122
147
 
123
148
 
@@ -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,38 @@ 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
+
54
+ private
55
+
56
+ def _view_21x8
57
+ "\n" +
58
+ 'Tinkerforge'.center(21) +
59
+ "\n" +
60
+ VERSION.center(21) +
61
+ "\n\n\n\n" +
62
+ "Tinderfridge #{TINDERFRIDGE_VERSION}".center(21) +
63
+ "\n" +
64
+ "Ruby #{RUBY_VERSION}".center(21)
65
+ end
66
+
33
67
  end
34
68
 
35
69
  end
@@ -3,7 +3,7 @@ require 'tinkerforge/version'
3
3
  module Tinkerforge
4
4
 
5
5
  # Tinderfridge version.
6
- TINDERFRIDGE_VERSION = '0.12.0'
6
+ TINDERFRIDGE_VERSION = '0.14.0'
7
7
 
8
8
  # About Tinkerforge & Tinderfridge.
9
9
  def self.about
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.12.0
4
+ version: 0.14.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: 2022-07-22 00:00:00.000000000 Z
11
+ date: 2023-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tinkerforge
@@ -141,6 +141,7 @@ files:
141
141
  - lib/tinderfridge/devices/bricklet_servo_v2/bricklet_servo_v2.json
142
142
  - lib/tinderfridge/devices/bricklet_silent_stepper_v2/bricklet_silent_stepper_v2.json
143
143
  - lib/tinderfridge/devices/bricklet_solid_state_relay_v2/bricklet_solid_state_relay_v2.json
144
+ - lib/tinderfridge/devices/bricklet_solid_state_relay_v2/bricklet_solid_state_relay_v2.rb
144
145
  - lib/tinderfridge/devices/bricklet_sound_pressure_level/bricklet_sound_pressure_level.json
145
146
  - lib/tinderfridge/devices/bricklet_sound_pressure_level/bricklet_sound_pressure_level.rb
146
147
  - lib/tinderfridge/devices/bricklet_temperature_ir_v2/bricklet_temperature_ir_v2.json
@@ -155,6 +156,7 @@ files:
155
156
  - lib/tinderfridge/devices/bricklet_xmc1400_breakout/bricklet_xmc1400_breakout.json
156
157
  - lib/tinderfridge/ip_connection.rb
157
158
  - lib/tinderfridge/shared/display_ibm437_encoding.rb
159
+ - lib/tinderfridge/shared/logger.rb
158
160
  - lib/tinderfridge/tinkerforge.rb
159
161
  - lib/tinderfridge/version.rb
160
162
  homepage: https://github.com/lllisteu/tinderfridge