tinderfridge 0.1.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tinderfridge/device.rb +105 -0
  3. data/lib/tinderfridge/device_collection.rb +101 -4
  4. data/lib/tinderfridge/device_info.txt +2 -0
  5. data/lib/tinderfridge/devices/brick_hat/brick_hat.json +10 -0
  6. data/lib/tinderfridge/devices/brick_hat/brick_hat.rb +18 -0
  7. data/lib/tinderfridge/devices/brick_hat_zero/brick_hat_zero.json +10 -0
  8. data/lib/tinderfridge/devices/brick_hat_zero/brick_hat_zero.rb +14 -0
  9. data/lib/tinderfridge/devices/bricklet_air_quality/bricklet_air_quality.json +3 -0
  10. data/lib/tinderfridge/devices/bricklet_air_quality/bricklet_air_quality.rb +20 -0
  11. data/lib/tinderfridge/devices/bricklet_ambient_light_v3/bricklet_ambient_light_v3.json +3 -0
  12. data/lib/tinderfridge/devices/bricklet_ambient_light_v3/bricklet_ambient_light_v3.rb +19 -0
  13. data/lib/tinderfridge/devices/bricklet_color_v2/bricklet_color_v2.json +3 -0
  14. data/lib/tinderfridge/devices/bricklet_color_v2/bricklet_color_v2.rb +31 -0
  15. data/lib/tinderfridge/devices/bricklet_dmx/bricklet_dmx.json +3 -0
  16. data/lib/tinderfridge/devices/bricklet_dmx/bricklet_dmx.rb +18 -0
  17. data/lib/tinderfridge/devices/bricklet_gps_v2/bricklet_gps_v2.json +3 -0
  18. data/lib/tinderfridge/devices/bricklet_gps_v2/bricklet_gps_v2.rb +31 -0
  19. data/lib/tinderfridge/devices/bricklet_imu_v3/bricklet_imu_v3.json +3 -0
  20. data/lib/tinderfridge/devices/bricklet_industrial_dual_relay/bricklet_industrial_dual_relay.json +3 -0
  21. data/lib/tinderfridge/devices/bricklet_industrial_dual_relay/bricklet_industrial_dual_relay.rb +20 -0
  22. data/lib/tinderfridge/devices/bricklet_isolator/bricklet_isolator.json +3 -0
  23. data/lib/tinderfridge/devices/bricklet_isolator/bricklet_isolator.rb +17 -0
  24. data/lib/tinderfridge/devices/bricklet_joystick_v2/bricklet_joystick_v2.json +3 -0
  25. data/lib/tinderfridge/devices/bricklet_joystick_v2/bricklet_joystick_v2.rb +15 -0
  26. data/lib/tinderfridge/devices/bricklet_lcd_128x64/bricklet_lcd_128x64.json +3 -0
  27. data/lib/tinderfridge/devices/bricklet_lcd_128x64/bricklet_lcd_128x64.rb +31 -0
  28. data/lib/tinderfridge/devices/bricklet_led_strip_v2/bricklet_led_strip_v2.json +3 -0
  29. data/lib/tinderfridge/devices/bricklet_led_strip_v2/bricklet_led_strip_v2.rb +55 -0
  30. data/lib/tinderfridge/devices/bricklet_motion_detector_v2/bricklet_motion_detector_v2.json +3 -0
  31. data/lib/tinderfridge/devices/bricklet_motion_detector_v2/bricklet_motion_detector_v2.rb +22 -0
  32. data/lib/tinderfridge/devices/bricklet_motorized_linear_poti/bricklet_motorized_linear_poti.json +3 -0
  33. data/lib/tinderfridge/devices/bricklet_motorized_linear_poti/bricklet_motorized_linear_poti.rb +42 -0
  34. data/lib/tinderfridge/devices/bricklet_multi_touch_v2/bricklet_multi_touch_v2.json +3 -0
  35. data/lib/tinderfridge/devices/bricklet_multi_touch_v2/bricklet_multi_touch_v2.rb +16 -0
  36. data/lib/tinderfridge/devices/bricklet_nfc/bricklet_nfc.json +3 -0
  37. data/lib/tinderfridge/devices/bricklet_nfc/bricklet_nfc.rb +16 -0
  38. data/lib/tinderfridge/devices/bricklet_outdoor_weather/bricklet_outdoor_weather.json +3 -0
  39. data/lib/tinderfridge/devices/bricklet_outdoor_weather/bricklet_outdoor_weather.rb +19 -0
  40. data/lib/tinderfridge/devices/bricklet_performance_dc/bricklet_performance_dc.json +3 -0
  41. data/lib/tinderfridge/devices/bricklet_remote_switch_v2/bricklet_remote_switch_v2.json +3 -0
  42. data/lib/tinderfridge/devices/bricklet_remote_switch_v2/bricklet_remote_switch_v2.rb +15 -0
  43. data/lib/tinderfridge/devices/bricklet_rgb_led_button/bricklet_rgb_led_button.json +3 -0
  44. data/lib/tinderfridge/devices/bricklet_rgb_led_button/bricklet_rgb_led_button.rb +34 -0
  45. data/lib/tinderfridge/devices/bricklet_rgb_led_v2/bricklet_rgb_led_v2.json +3 -0
  46. data/lib/tinderfridge/devices/bricklet_rgb_led_v2/bricklet_rgb_led_v2.rb +32 -0
  47. data/lib/tinderfridge/devices/bricklet_rotary_encoder_v2/bricklet_rotary_encoder_v2.json +3 -0
  48. data/lib/tinderfridge/devices/bricklet_rotary_encoder_v2/bricklet_rotary_encoder_v2.rb +20 -0
  49. data/lib/tinderfridge/devices/bricklet_segment_display_4x7_v2/bricklet_segment_display_4x7_v2.json +3 -0
  50. data/lib/tinderfridge/devices/bricklet_segment_display_4x7_v2/bricklet_segment_display_4x7_v2.rb +128 -0
  51. data/lib/tinderfridge/devices/bricklet_servo_v2/bricklet_servo_v2.json +3 -0
  52. data/lib/tinderfridge/devices/bricklet_voltage_current_v2/bricklet_voltage_current_v2.json +3 -0
  53. data/lib/tinderfridge/devices/bricklet_voltage_current_v2/bricklet_voltage_current_v2.rb +18 -0
  54. data/lib/tinderfridge/ip_connection.rb +76 -21
  55. data/lib/tinderfridge/tinkerforge.rb +3 -0
  56. data/lib/tinderfridge/version.rb +1 -1
  57. metadata +59 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92034339759c82954498219a57e8070f6859b907e135a8d9a8df936abd58a01f
4
- data.tar.gz: a222affea211a17b0e6b9fd0087ddb53830f5e2a0de7a63258ebc566d5e6bd7d
3
+ metadata.gz: f93f157ac5afd9dd2b5a6108889f8b00b58df36c16a78faea7fa788ac64ef37d
4
+ data.tar.gz: b28896b7b8938c3d58a043e0c3ff804f253dbcb8fc5b8605ee6fb2efc4a7b92f
5
5
  SHA512:
6
- metadata.gz: a450530444bcaeeed475e6476d12d7cfeedda25f02cb2619b4ccdd62951f9f16f9a1f03f874c6807fef6efddbe7fe3b06825c5ca120ca6828ef1e332844cceb3
7
- data.tar.gz: a7c84f3fd084e655a81f79d58a3bbf1173f31ca0b0fafd5a66041c3aefd689f5a04d18045599a645073ccae693b13a07c6af0f51d668eb0ab8bd0954dbf6f1e9
6
+ metadata.gz: 2b436ea8162a3d32352a3b5d37a6cd3b5efdebb76cb21f51f9cf6fc393ba4a03eaed7bb0385c9471e80eb5c91ba20d56e89e4d425c02f4f7f3475947bf74fc57
7
+ data.tar.gz: 24671e0d6c6ff57bfb4bdb4094919c70803cdb7f63cf814c25c879e3c2d9555cbb803dba3c9dff6cc14cac2a4ad339af754993fcb4594ec8309e70ded461d7b1
@@ -1,6 +1,7 @@
1
1
  require 'tinkerforge/ip_connection'
2
2
 
3
3
  module Tinkerforge
4
+
4
5
  class Device
5
6
 
6
7
  #----------------------------------------------------------------------#
@@ -33,20 +34,97 @@ module Tinkerforge
33
34
  end.compact.sort_by { |i| i[0] }
34
35
  end
35
36
 
37
+ private
38
+
39
+ # Primitive superhook:
40
+ # Every time a class inherits from the Device class,
41
+ # attempts to load an extension for that new class.
42
+ def inherited(klass)
43
+ if info = Tinkerforge.device_info(klass)
44
+ begin
45
+ require("tinderfridge/devices/#{info[2][1]}/#{info[2][1]}")
46
+ rescue LoadError
47
+ # No extension found for this device
48
+ end
49
+ end
50
+ end
51
+
36
52
  end
37
53
 
38
54
  #----------------------------------------------------------------------#
39
55
  # Instance Methods #
40
56
  #----------------------------------------------------------------------#
41
57
 
58
+ # Returns the device's UID. Not to be confused with #uid, which returns the numeric UID.
59
+ attr_reader :uid_string
60
+
61
+ # Returns the device's numeric Device Identifier.
62
+ attr_reader :device_identifier
63
+
64
+ # Returns the device's Display Name.
65
+ attr_reader :device_display_name
66
+
42
67
  # Returns the device's IPConnection object.
43
68
  attr_reader :ipcon
44
69
 
70
+ # Returns device information.
71
+ #
72
+ # Device information is an array:
73
+ # - 0 : Device Identifier
74
+ # - 1 : Device Display Name
75
+ # - 2 : Associated class name and source file
76
+ def device_info
77
+ Tinkerforge.device_info device_identifier
78
+ end
79
+
45
80
  # Returns a programmer-friendly representation of the device.
46
81
  def inspect
47
82
  "%s (%s@%s:%s)" % [self.class, @uid_string, ipcon.host, ipcon.port]
48
83
  end
49
84
 
85
+ # Returns the device's properties.
86
+ def properties
87
+ @properties ||= {
88
+ 'device_identifier' => device_identifier,
89
+ 'device_display_name' => device_display_name,
90
+ }.merge load_properties
91
+ end
92
+
93
+ alias props properties
94
+
95
+ # Returns the device's state.
96
+ def state
97
+ identity = get_identity
98
+
99
+ [
100
+ [ 'uid' , uid_string ],
101
+ [ 'update_time' , Time.now.gmtime ],
102
+ [ 'firmware_version' , identity[4].join('.') ],
103
+
104
+ [ 'connected', { 'uid' => identity[1], 'position' => identity[2] } ],
105
+ [ 'ipcon' , { 'host' => ipcon.host , 'port' => ipcon.port } ],
106
+
107
+ respond_to?('get_chip_temperature' ) ? [ 'chip_temperature' , get_chip_temperature ] : nil,
108
+ respond_to?('get_spitfp_error_count') ? [ 'spitfp_error_count', get_spitfp_error_count ] : nil,
109
+ respond_to?('get_status_led_config' ) ? [ 'status_led_config' , get_status_led_config ] : nil,
110
+
111
+ ].compact.to_h
112
+ end
113
+
114
+ # Opens the online documentation for the device (Mac OS only).
115
+ #
116
+ # When the URL for the documentation is not known, does nothing.
117
+ def open_documentation
118
+ if properties['documentation_en_url'] and ( RUBY_PLATFORM =~ /darwin/ )
119
+ `open #{properties['documentation_en_url']}`
120
+ properties['documentation_en_url']
121
+ else
122
+ nil
123
+ end
124
+ end
125
+
126
+ alias doc open_documentation
127
+
50
128
  # Identifies a Tinkerforge device by blinking its status led.
51
129
  #
52
130
  # Supports recent devices. When invoked on older devices, does nothing.
@@ -67,5 +145,32 @@ module Tinkerforge
67
145
  end
68
146
  end
69
147
 
148
+ private
149
+
150
+ def load_properties
151
+ if device_info
152
+ properties_file = File.join(
153
+ File.dirname(__FILE__),
154
+ 'devices',
155
+ device_info[2][1],
156
+ device_info[2][1],
157
+ ) + '.json'
158
+
159
+ if File.readable? properties_file
160
+ begin
161
+ require 'json'
162
+ JSON.load File.read properties_file
163
+ rescue
164
+ {}
165
+ end
166
+ else
167
+ {}
168
+ end
169
+ else
170
+ {}
171
+ end
172
+ end
173
+
70
174
  end
175
+
71
176
  end
@@ -6,28 +6,43 @@ module Tinkerforge
6
6
  #
7
7
  # Nil for devices that do not support the get_chip_temperature method.
8
8
  def get_chip_temperature
9
- map { |k,d| [ k, d.respond_to?('get_chip_temperature' ) ? d.get_chip_temperature : nil ] }.to_h
9
+ smap 'get_chip_temperature'
10
+ end
11
+
12
+ # Returns identity information for devices in the collection.
13
+ #
14
+ # Identity information is returned as an array:
15
+ # - 0 : UID
16
+ # - 1 : Connected UID
17
+ # - 2 : Connected port (position)
18
+ # - 3 : Hardware version
19
+ # - 4 : Firmware version
20
+ # - 5 : Device Identifier
21
+ #
22
+ # Nil for devices that do not support the get_identity method.
23
+ def get_identity
24
+ smap 'get_identity'
10
25
  end
11
26
 
12
27
  # Returns the error counts for devices in the collection.
13
28
  #
14
29
  # Nil for devices that do not support the get_spitfp_error_count method.
15
30
  def get_spitfp_error_count
16
- map { |k,d| [ k, d.respond_to?('get_spitfp_error_count' ) ? d.get_spitfp_error_count : nil ] }.to_h
31
+ smap 'get_spitfp_error_count'
17
32
  end
18
33
 
19
34
  # Returns the status LED configuration for devices in the collection.
20
35
  #
21
36
  # Nil for devices that do not support the get_status_led_config method.
22
37
  def get_status_led_config
23
- map { |k,d| [ k, d.respond_to?('get_status_led_config') ? d.get_status_led_config : nil ] }.to_h
38
+ smap 'get_status_led_config'
24
39
  end
25
40
 
26
41
  # Sets the status LED configuration for devices in the collection.
27
42
  #
28
43
  # Ignores devices that do not support the set_status_led_config method.
29
44
  #
30
- # Argument can be an Integer (e.g. 0=off, 1=on), or a Hash (as returned by #get_status_led_config).
45
+ # Argument can be an integer (e.g. 0=off, 1=on), or a hash (as returned by #get_status_led_config).
31
46
  def set_status_led_config(state)
32
47
  case state
33
48
  when Integer
@@ -41,6 +56,88 @@ module Tinkerforge
41
56
  end
42
57
  end
43
58
 
59
+ # Prints a list of devices in the collection.
60
+ def ls
61
+ keys.sort_by(&:downcase).each do |k|
62
+ puts "%-8s %.40s" % [k, Tinkerforge.device_info(self[k])[1]]
63
+ end.size
64
+ end
65
+
66
+ # Returns the properties of devices in the collection.
67
+ def properties
68
+ smap 'properties'
69
+ end
70
+
71
+ alias props properties
72
+
73
+ # Returns the state of devices in the collection.
74
+ def state
75
+ smap 'state'
76
+ end
77
+
78
+ # Opens the online documentation for the devices in the collection (Mac OS only).
79
+ #
80
+ # When the URL for a device's documentation is not known, does nothing.
81
+ def open_documentation
82
+ smap 'open_documentation'
83
+ end
84
+
85
+ alias doc open_documentation
86
+
87
+ # Turns off light sources such as screens and RGB LEDs for devices in the collection.
88
+ #
89
+ # Ignores devices that do not support the blackout method.
90
+ def blackout
91
+ smap 'blackout'
92
+ end
93
+
94
+ # Returns a list of unique IP Connections used by devices in the collection.
95
+ def ipcons
96
+ smap('ipcon').values.compact.uniq
97
+ end
98
+
99
+ # Returns an array of devices in the collection matching the selector.
100
+ #
101
+ # Selector argument can be:
102
+ # - Device Identifier
103
+ # - Class name or Device Display Name (Regexp)
104
+ # Selection by regular expression is case-insensitive by default.
105
+ #
106
+ # @example Select by class name and Device Display Name
107
+ # # All 'analog' devices
108
+ # tf = Tinkerforge.connect.discover(1)
109
+ # tf.find_all /analog/
110
+ def find_all(selector)
111
+ case selector
112
+ when Integer
113
+ values.select { |v| v.device_identifier == selector}
114
+ when Regexp
115
+ r = Regexp.new selector.source, Regexp::IGNORECASE
116
+ values.select { |v| v.class.to_s.split('::').last =~ r || v.device_display_name =~ r }
117
+ end
118
+ end
119
+
120
+ # Returns the first device in the collection matching the selector.
121
+ #
122
+ # Selector argument can be:
123
+ # - Device Identifier
124
+ # - Class name or Device Display Name (Regexp)
125
+ # Selection by regular expression is case-insensitive by default.
126
+ #
127
+ # @example Select by Device Identifier
128
+ # # Remote Switch Bricklet 2.0
129
+ # tf = Tinkerforge.connect('myhost.local').discover(1)
130
+ # tf.find 289
131
+ def find(selector)
132
+ find_all(selector).first
133
+ end
134
+
135
+ private
136
+
137
+ def smap(m)
138
+ map { |k,d| [ k, d.respond_to?(m) ? d.send(m) : nil ] }.to_h
139
+ end
140
+
44
141
  end
45
142
 
46
143
  end
@@ -135,5 +135,7 @@
135
135
  2147 CO2 Bricklet 2.0 Tinkerforge::BrickletCO2V2 bricklet_co2_v2
136
136
  2152 Energy Monitor Bricklet Tinkerforge::BrickletEnergyMonitor bricklet_energy_monitor
137
137
  2153 Compass Bricklet Tinkerforge::BrickletCompass bricklet_compass
138
+ 2156 Performance DC Bricklet Tinkerforge::BrickletPerformanceDC bricklet_performance_dc
139
+ 2157 Servo Bricklet 2.0 Tinkerforge::BrickletServoV2 bricklet_servo_v2
138
140
  2161 IMU Bricklet 3.0 Tinkerforge::BrickletIMUV3 bricklet_imu_v3
139
141
  2162 Industrial Dual AC Relay Bricklet Tinkerforge::BrickletIndustrialDualACRelay bricklet_industrial_dual_ac_relay
@@ -0,0 +1,10 @@
1
+ {
2
+ "dimensions": [
3
+ 65,
4
+ 56,
5
+ 25
6
+ ],
7
+ "weight": 30,
8
+ "documentation_en_url": "https://www.tinkerforge.com/en/doc/Hardware/Bricks/HAT_Brick.html",
9
+ "versions_identifier": "bricklets:hat"
10
+ }
@@ -0,0 +1,18 @@
1
+ module Tinkerforge
2
+
3
+ class BrickHAT
4
+
5
+ # Returns the device's state.
6
+ def state
7
+ volts = get_voltages
8
+ super.merge(
9
+ 'bricklet_power' => get_bricklet_power,
10
+ 'usb_voltage' => volts[0],
11
+ 'dc_voltage' => volts[1],
12
+ 'sleep_mode' => get_sleep_mode,
13
+ )
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,10 @@
1
+ {
2
+ "dimensions": [
3
+ 65,
4
+ 30,
5
+ 5
6
+ ],
7
+ "weight": 12,
8
+ "documentation_en_url": "https://www.tinkerforge.com/en/doc/Hardware/Bricks/HAT_Zero_Brick.html",
9
+ "versions_identifier": "bricklets:hat_zero"
10
+ }
@@ -0,0 +1,14 @@
1
+ module Tinkerforge
2
+
3
+ class BrickHATZero
4
+
5
+ # Returns the device's state.
6
+ def state
7
+ super.merge(
8
+ 'usb_voltage' => get_usb_voltage,
9
+ )
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,3 @@
1
+ {
2
+ "documentation_en_url": "https://www.tinkerforge.com/en/doc/Hardware/Bricklets/Air_Quality.html"
3
+ }
@@ -0,0 +1,20 @@
1
+ module Tinkerforge
2
+
3
+ class BrickletAirQuality
4
+
5
+ # Returns the device's state.
6
+ def state
7
+ av = get_all_values
8
+ super.merge(
9
+ 'iaq_index' => av[0],
10
+ 'iaq_index_accuracy' => av[1],
11
+ 'temperature' => av[2],
12
+ 'temperature_offset' => get_temperature_offset,
13
+ 'humidity' => av[3],
14
+ 'air_pressure' => av[4],
15
+ )
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,3 @@
1
+ {
2
+ "documentation_en_url": "https://www.tinkerforge.com/en/doc/Hardware/Bricklets/Ambient_Light_V3.html"
3
+ }
@@ -0,0 +1,19 @@
1
+ module Tinkerforge
2
+
3
+ class BrickletAmbientLightV3
4
+
5
+ ILLUMINANCE_RANGES = [ 64000, 32000, 16000, 8000, 1300, 600, 100000 ]
6
+
7
+ # Returns the device's state.
8
+ def state
9
+ super.merge(
10
+ 'configuration' => conf = get_configuration,
11
+ 'illuminance_range' => ILLUMINANCE_RANGES[ conf[0] ],
12
+ 'integration_time' => 50 + conf[1] * 50,
13
+ 'illuminance_raw' => get_illuminance,
14
+ )
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,3 @@
1
+ {
2
+ "documentation_en_url": "https://www.tinkerforge.com/en/doc/Hardware/Bricklets/Color_V2.html"
3
+ }
@@ -0,0 +1,31 @@
1
+ module Tinkerforge
2
+
3
+ class BrickletColorV2
4
+
5
+ GAINS = [1, 4, 16, 60]
6
+ INTEGRATION_TIMES = [2.4, 24, 101, 154, 700]
7
+
8
+ # Switches off the Bricklet's white LED.
9
+ def blackout
10
+ set_light false
11
+ true
12
+ end
13
+
14
+ # Returns the device's state.
15
+ def state
16
+ super.merge(
17
+ 'configuration' => config = get_configuration,
18
+ 'gain' => GAINS[ config[0] ],
19
+ 'integration_time' => INTEGRATION_TIMES[ config[1] ],
20
+ 'color_rgbc' => color = get_color,
21
+ 'illuminance_raw' => illum = get_illuminance,
22
+ 'illuminance' => illum * 700.0 / GAINS[ config[0] ] / INTEGRATION_TIMES[ config[1] ],
23
+ 'color_temperature' => get_color_temperature,
24
+ 'saturated' => color[0,3].include?(65535),
25
+ 'light' => get_light,
26
+ )
27
+ end
28
+
29
+ end
30
+
31
+ end