raspberry_pi_iot 0.0.8 → 0.1.3

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.
Files changed (109) hide show
  1. checksums.yaml +5 -5
  2. data/doc/IoT.html +8 -6
  3. data/doc/{Bus.html → RaspberryPiIoT.html} +21 -26
  4. data/doc/_index.html +84 -77
  5. data/doc/class_list.html +1 -1
  6. data/doc/file.LICENSE.html +92 -0
  7. data/doc/file.README.html +63 -29
  8. data/doc/file_list.html +5 -0
  9. data/doc/frames.html +1 -1
  10. data/doc/index.html +63 -29
  11. data/doc/method_list.html +170 -202
  12. data/doc/top-level-namespace.html +4 -6
  13. data/lib/bus.rb +0 -2
  14. data/lib/iot.rb +4 -2
  15. data/lib/iot/actuator.rb +7 -0
  16. data/lib/iot/bh1750.rb +54 -0
  17. data/lib/iot/binary_actuator.rb +7 -0
  18. data/lib/iot/binary_effector.rb +11 -0
  19. data/lib/iot/binary_receptor.rb +20 -0
  20. data/lib/iot/binary_sensor.rb +7 -0
  21. data/lib/iot/bmx_sensor.rb +73 -0
  22. data/lib/iot/button.rb +100 -0
  23. data/lib/iot/dht_sensor.rb +41 -0
  24. data/lib/iot/digital_actuator.rb +7 -0
  25. data/lib/iot/digital_effector.rb +67 -0
  26. data/lib/iot/digital_receptor.rb +17 -0
  27. data/lib/iot/digital_sensor.rb +7 -0
  28. data/lib/iot/ds18b20.rb +25 -0
  29. data/lib/iot/effector.rb +32 -0
  30. data/lib/iot/hcsr501.rb +8 -0
  31. data/lib/iot/humiture_sensor.rb +27 -0
  32. data/lib/iot/led.rb +64 -0
  33. data/lib/iot/led_pwm.rb +8 -0
  34. data/lib/iot/led_rgb.rb +86 -0
  35. data/lib/iot/max44009.rb +84 -0
  36. data/lib/iot/receptor.rb +38 -0
  37. data/lib/iot/sensor.rb +8 -0
  38. data/lib/iot/temperature_sensor.rb +51 -0
  39. data/lib/raspberry_pi.rb +46 -1
  40. data/lib/raspberry_pi_iot.rb +9 -3
  41. data/lib/raspberry_pi_iot/version.rb +3 -0
  42. data/lib/thermal_sensor.rb +2 -3
  43. data/test/test.sh +17 -0
  44. data/test/test.txt +173 -0
  45. data/test/test_Raspberry_Pi_IoT.rb +10 -0
  46. data/test/test_bh1750.rb +9 -4
  47. data/test/{standalone_test_bmp280.rb → test_bme280.rb} +24 -19
  48. data/test/test_bmp280.rb +52 -0
  49. data/test/test_button.rb +25 -14
  50. data/test/test_dht11.rb +3 -3
  51. data/test/test_dht22.rb +35 -0
  52. data/test/test_ds18b20.rb +4 -3
  53. data/test/test_helper.rb +6 -0
  54. data/test/test_info.rb +24 -3
  55. data/test/test_ky008.rb +41 -0
  56. data/test/test_led.rb +9 -9
  57. data/test/test_led_rgb.rb +28 -5
  58. data/test/test_max44009_gy49.rb +4 -4
  59. data/test/test_thermal.rb +27 -0
  60. metadata +103 -59
  61. data/doc/Actuator.html +0 -145
  62. data/doc/BH1750.html +0 -541
  63. data/doc/BME280.html +0 -276
  64. data/doc/BMP280.html +0 -276
  65. data/doc/BMxSensor.html +0 -557
  66. data/doc/BinaryActuator.html +0 -177
  67. data/doc/BinaryEffector.html +0 -246
  68. data/doc/BinaryReceptor.html +0 -387
  69. data/doc/BinarySensor.html +0 -168
  70. data/doc/Button.html +0 -986
  71. data/doc/DHT11.html +0 -287
  72. data/doc/DHT22.html +0 -287
  73. data/doc/DHTxxSensor.html +0 -361
  74. data/doc/DS18B20.html +0 -339
  75. data/doc/DigitalActuator.html +0 -164
  76. data/doc/DigitalEffector.html +0 -636
  77. data/doc/DigitalReceptor.html +0 -242
  78. data/doc/DigitalSensor.html +0 -162
  79. data/doc/Effector.html +0 -257
  80. data/doc/HCSR501.html +0 -172
  81. data/doc/HumitureSensor.html +0 -453
  82. data/doc/LED.html +0 -784
  83. data/doc/MAX44009.html +0 -830
  84. data/doc/RaspberryPi.html +0 -317
  85. data/doc/Receptor.html +0 -257
  86. data/doc/Sensor.html +0 -145
  87. data/doc/TemperatureSensor.html +0 -644
  88. data/lib/bh1750.rb +0 -46
  89. data/lib/binary_actuator.rb +0 -5
  90. data/lib/binary_effector.rb +0 -12
  91. data/lib/binary_receptor.rb +0 -19
  92. data/lib/binary_sensor.rb +0 -5
  93. data/lib/bmx_sensor.rb +0 -85
  94. data/lib/button.rb +0 -70
  95. data/lib/dht_sensor.rb +0 -36
  96. data/lib/digital_actuator.rb +0 -5
  97. data/lib/digital_effector.rb +0 -69
  98. data/lib/digital_receptor.rb +0 -16
  99. data/lib/digital_sensor.rb +0 -5
  100. data/lib/ds18b20.rb +0 -24
  101. data/lib/effector.rb +0 -32
  102. data/lib/hcsr501.rb +0 -7
  103. data/lib/humiture_sensor.rb +0 -26
  104. data/lib/led.rb +0 -58
  105. data/lib/led_pwm.rb +0 -6
  106. data/lib/led_rgb.rb +0 -101
  107. data/lib/max44009.rb +0 -77
  108. data/lib/receptor.rb +0 -33
  109. data/lib/temperature_sensor.rb +0 -49
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.9.16
9
+ &mdash; Documentation by YARD 0.9.20
10
10
 
11
11
  </title>
12
12
 
@@ -82,12 +82,10 @@
82
82
  <p class="children">
83
83
 
84
84
 
85
- <strong class="modules">Modules:</strong> <span class='object_link'><a href="Bus.html" title="Bus (module)">Bus</a></span>, <span class='object_link'><a href="IoT.html" title="IoT (module)">IoT</a></span>, <span class='object_link'><a href="RaspberryPi.html" title="RaspberryPi (module)">RaspberryPi</a></span>
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="IoT.html" title="IoT (module)">IoT</a></span>, <span class='object_link'><a href="RaspberryPiIoT.html" title="RaspberryPiIoT (module)">RaspberryPiIoT</a></span>
86
86
 
87
87
 
88
88
 
89
- <strong class="classes">Classes:</strong> <span class='object_link'><a href="Actuator.html" title="Actuator (class)">Actuator</a></span>, <span class='object_link'><a href="BH1750.html" title="BH1750 (class)">BH1750</a></span>, <span class='object_link'><a href="BME280.html" title="BME280 (class)">BME280</a></span>, <span class='object_link'><a href="BMP280.html" title="BMP280 (class)">BMP280</a></span>, <span class='object_link'><a href="BMxSensor.html" title="BMxSensor (class)">BMxSensor</a></span>, <span class='object_link'><a href="BinaryActuator.html" title="BinaryActuator (class)">BinaryActuator</a></span>, <span class='object_link'><a href="BinaryEffector.html" title="BinaryEffector (class)">BinaryEffector</a></span>, <span class='object_link'><a href="BinaryReceptor.html" title="BinaryReceptor (class)">BinaryReceptor</a></span>, <span class='object_link'><a href="BinarySensor.html" title="BinarySensor (class)">BinarySensor</a></span>, <span class='object_link'><a href="Button.html" title="Button (class)">Button</a></span>, <span class='object_link'><a href="DHT11.html" title="DHT11 (class)">DHT11</a></span>, <span class='object_link'><a href="DHT22.html" title="DHT22 (class)">DHT22</a></span>, <span class='object_link'><a href="DHTxxSensor.html" title="DHTxxSensor (class)">DHTxxSensor</a></span>, <span class='object_link'><a href="DS18B20.html" title="DS18B20 (class)">DS18B20</a></span>, <span class='object_link'><a href="DigitalActuator.html" title="DigitalActuator (class)">DigitalActuator</a></span>, <span class='object_link'><a href="DigitalEffector.html" title="DigitalEffector (class)">DigitalEffector</a></span>, <span class='object_link'><a href="DigitalReceptor.html" title="DigitalReceptor (class)">DigitalReceptor</a></span>, <span class='object_link'><a href="DigitalSensor.html" title="DigitalSensor (class)">DigitalSensor</a></span>, <span class='object_link'><a href="Effector.html" title="Effector (class)">Effector</a></span>, <span class='object_link'><a href="HCSR501.html" title="HCSR501 (class)">HCSR501</a></span>, <span class='object_link'><a href="HumitureSensor.html" title="HumitureSensor (class)">HumitureSensor</a></span>, <span class='object_link'><a href="LED.html" title="LED (class)">LED</a></span>, <span class='object_link'><a href="MAX44009.html" title="MAX44009 (class)">MAX44009</a></span>, <span class='object_link'><a href="Receptor.html" title="Receptor (class)">Receptor</a></span>, <span class='object_link'><a href="Sensor.html" title="Sensor (class)">Sensor</a></span>, <span class='object_link'><a href="TemperatureSensor.html" title="TemperatureSensor (class)">TemperatureSensor</a></span>
90
-
91
89
 
92
90
  </p>
93
91
 
@@ -102,9 +100,9 @@
102
100
  </div>
103
101
 
104
102
  <div id="footer">
105
- Generated on Tue Dec 18 16:03:38 2018 by
103
+ Generated on Wed Jun 10 16:52:49 2020 by
106
104
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
- 0.9.16 (ruby-2.3.3).
105
+ 0.9.20 (ruby-2.5.5).
108
106
  </div>
109
107
 
110
108
  </div>
data/lib/bus.rb CHANGED
@@ -1,5 +1,3 @@
1
-
2
- #$LOAD_PATH << '~/lib/ruby-i2c-devices/lib'
3
1
  gem 'i2c-devices'
4
2
  require 'i2c'
5
3
  require 'i2c/driver/i2c-dev'
data/lib/iot.rb CHANGED
@@ -1,9 +1,11 @@
1
+ require_relative 'iot/receptor'
2
+ require_relative 'iot/effector'
3
+
1
4
  # IoT - Internet of Things classes and modules
2
5
  module IoT
3
-
4
6
  # Logging events and actions
5
7
  class Log
6
- @file_name = nil
8
+ attr_accessor :file_name
7
9
 
8
10
  def initialize(file_name='/tmp/iot.log')
9
11
  @file_name = file_name
@@ -0,0 +1,7 @@
1
+ require_relative 'effector'
2
+
3
+ module IoT
4
+ # Actuator - a synonym for Effector
5
+ class Actuator < IoT::Effector
6
+ end
7
+ end
@@ -0,0 +1,54 @@
1
+ require 'bus'
2
+ require_relative 'digital_receptor'
3
+
4
+ module IoT
5
+ # BH1750 - ambient light sensor
6
+ class BH1750 < IoT::DigitalReceptor
7
+ DEVICE = 0x23 # I2C sensor address
8
+ POWER_DOWN = 0x00 # off state
9
+ POWER_ON = 0x01 # on state
10
+ RESET = 0x07 # reset state: POWER_DOWN = 0x00
11
+
12
+ CONTINUOUS_LOW_RES_MODE = 0x13 # Measure with resolution 4.0 lx and timing ~16 ms
13
+ CONTINUOUS_HIGH_RES_MODE_1 = 0x10 # Measure with resolution 1.0 lx and timing ~120 ms
14
+ CONTINUOUS_HIGH_RES_MODE_2 = 0x11 # Measure with resolution 0.5 lx and timing ~120 ms
15
+ ONE_TIME_LOW_RES_MODE = 0x23 # Measure with resolution 4.0 lx, POWER DOWN after measuring
16
+ ONE_TIME_HIGH_RES_MODE_1 = 0x20 # Measure with resolution 1.0 lx, POWER DOWN after measuring
17
+ ONE_TIME_HIGH_RES_MODE_2 = 0x21 # Measure with resolution 0.5 lx, POWER DOWN after measuring
18
+
19
+ def initialize(device_address=DEVICE, bus_number=1)
20
+ @sensor_name = 'BH1750'
21
+ Bus::I2C.bus_number = bus_number
22
+ @device_address = device_address
23
+
24
+ @i2c_bus = Bus::I2C.bus
25
+ @device = I2CDevice.new(address: DEVICE, driver: I2CDevice::Driver::I2CDev.new(@i2c_bus))
26
+ @resolution = ONE_TIME_HIGH_RES_MODE_1
27
+ @length = 2
28
+ @value = read
29
+ end
30
+
31
+ # Read raw data from sensor and convert it to numeric
32
+ def read
33
+ data = @device.i2cget(@resolution, @length)
34
+ @value = to_f(data)
35
+ end
36
+
37
+ # Return value in Lux
38
+ def lux
39
+ read
40
+ @value
41
+ end
42
+
43
+
44
+ def name
45
+ @sensor_name
46
+ end
47
+
48
+ private
49
+ # Convert 2 bytes of sensor data to a float number
50
+ def to_f(data)
51
+ return ((data[1].ord + (256 * data[0].ord)) / 1.2)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'binary_effector'
2
+
3
+ module IoT
4
+ # BinaryActuator - a synomym for BinaryEffector
5
+ class BinaryActuator < IoT::BinaryEffector
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'digital_effector'
2
+
3
+ module IoT
4
+ # BinaryEffector - effector with binary logic
5
+ class BinaryEffector < IoT::DigitalEffector
6
+ def initialize(pin=25, state=:low)
7
+ super({:pin => pin}, :low)
8
+ @pin = pin
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'receptor'
2
+
3
+ module IoT
4
+ # BinaryReceptor - receptor/actuator with binary logic
5
+ class BinaryReceptor < IoT::Receptor
6
+
7
+ def initialize(pin=21, pull=:up)
8
+ @pin = pin
9
+ RPi::GPIO.setup pin, :as => :input, :pull => pull
10
+ end
11
+
12
+ def high?
13
+ RPi::GPIO.high? @pin
14
+ end
15
+
16
+ def low?
17
+ RPi::GPIO.low? @pin
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'binary_receptor'
2
+
3
+ module IoT
4
+ # BinarySensor - a synonym for BinaryReceptor
5
+ class BinarySensor < IoT::BinaryReceptor
6
+ end
7
+ end
@@ -0,0 +1,73 @@
1
+ require 'i2c/backends/i2c-dev.rb'
2
+ require 'i2c/bme280'
3
+ require_relative 'humiture_sensor'
4
+
5
+ module IoT
6
+ # Bosch BMP/BME humidity, temperature & atmospheric pressure sensor family
7
+ class BMxSensor < IoT::HumitureSensor
8
+
9
+ def initialize(sensor_name='BMx280', bus=1)
10
+ @sensor_name = sensor_name
11
+
12
+ device = I2C::Dev.create("/dev/i2c-#{bus}")
13
+ @sensor = I2C::Driver::BME280.new(device: device)
14
+ @temperature, @humidity, @pressure = read_data
15
+ end
16
+
17
+ def read_data
18
+ data = @sensor.all
19
+ @temperature = data[:t]
20
+ @pressure = data[:p]
21
+ @humidity = data[:h]
22
+ [@temperature, @humidity, @pressure]
23
+ end
24
+
25
+ def name
26
+ @sensor_name
27
+ end
28
+
29
+ # standard atmospheric pressure @ sea level = 1.01325 bar = 1013.25 mbar = 101.325 kPa
30
+ def hPa
31
+ @pressure
32
+ end
33
+
34
+ def pressure(mode=:hPa)
35
+ case mode
36
+ when :hPa # 1 hPa = 100 Pa = 1 mbar = 1 hPa = 0.750062 mmHg [@ 0°C]
37
+ hPa
38
+ when :kPa # 1 kPa = 1000 Pa = 10 hPa
39
+ hPa / 10.0
40
+ when :Pa # 1 Pa = 0.01 hPa = 0.001 kPa
41
+ hPa * 100.0
42
+ when :mmHg # 1 mmHg = 1.3332236842105263 hPa = 133.322387415 Pa = 1.000000142466321... Torr
43
+ hPa / (1013.25 / 760) # 760 mmHg = 101.3250144354 kPa
44
+ when :atm # 1 atm = 101325 Pa = 101.325 kPa
45
+ hPa / 1013.25
46
+ when :bar # 1 bar ≡ 100000 Pa = 1000 hPa = 0.987 atm = 750.06 mmHg = 750.06 Torr
47
+ hPa / 1000.0
48
+ when :mbar # 1 mbar = 0.001 bar
49
+ bar * 1000.0
50
+ when :Torr # 1 Torr = 1/760 atm = 101325/760 Pa = 0.999999857533699... mmHg
51
+ (hPa / 1013.25) / 760
52
+ else
53
+ hPa
54
+ end
55
+ end
56
+
57
+ def to_s
58
+ sprintf "%5.2f°C, %5.2f %%, %5.2f mmHg", @temperature, @humidity, pressure(:mmHg)
59
+ end
60
+ end
61
+
62
+ class BMP280 < IoT::BMxSensor # combined atmospheric pressure & temperature sensor
63
+ def initialize
64
+ super('BMP280')
65
+ end
66
+ end
67
+
68
+ class BME280 < IoT::BMxSensor # combined atmospheric pressure, temperature & humidity sensor
69
+ def initialize
70
+ super('BME280')
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,100 @@
1
+ require_relative 'binary_receptor'
2
+
3
+ module IoT
4
+ # Button - simple tactile / push button
5
+ class Button < IoT::BinaryReceptor
6
+ attr_writer :measure_pause
7
+
8
+ def initialize(pin)
9
+ @receptor_name = 'BUTTON'
10
+ super(pin)
11
+ @measure_pause = 0.01
12
+ @long_click = 1.0
13
+ @short_interval = 0.2
14
+ @timeout = 30
15
+ @intervals = []
16
+ # samples: wait time press time wait time press time
17
+ # double press: [[1.486804292, 0.090814152], [0.131284967, 0.13125429]]
18
+ # long press: [[0.910878286, 1.109352219]]
19
+ end
20
+
21
+ def name
22
+ @receptor_name
23
+ end
24
+
25
+ # Is button being pressed?
26
+ def pressed?
27
+ low?
28
+ end
29
+
30
+ # Is button not being pressed?
31
+ def not_pressed?
32
+ high?
33
+ end
34
+
35
+ def was_pressed?
36
+ @intervals.size > 0
37
+ end
38
+
39
+ def was_not_pressed?
40
+ !was_pressed?
41
+ end
42
+
43
+ # Wait for the 1st pressing of button
44
+ def wait_for_press
45
+ wait_for_presses(1)
46
+ end
47
+
48
+ # Wait for several sequential presses
49
+ def wait_for_presses(attempts=2, timeout=@timeout)
50
+ @intervals = []
51
+ attempts.times do
52
+ interval = []
53
+ timer = Time.now
54
+ while not_pressed? && (Time.now-timer) < timeout do
55
+ sleep @measure_pause
56
+ end
57
+ interval << Time.now-timer
58
+ timer = Time.now
59
+ while pressed? do
60
+ sleep @measure_pause
61
+ end
62
+ interval << Time.now-timer
63
+ @intervals << interval
64
+ end
65
+ @intervals
66
+ end
67
+
68
+ # Was the button pressed once?
69
+ def single_press?(intervals=@intervals)
70
+ intervals.size == 1
71
+ end
72
+
73
+ # Was the button pressed twice?
74
+ def double_press?(intervals=@intervals)
75
+ intervals.size == 2 && intervals[1][0] <= @short_interval
76
+ end
77
+
78
+ # Was the button pressed 3 times?
79
+ def triple_press?(intervals=@intervals)
80
+ intervals.size == 3
81
+ end
82
+
83
+ # Was the button pressed for more than @long_click?
84
+ def long_press?(intervals=@intervals)
85
+ intervals.size == 1 && intervals[0][1] >= @long_click
86
+ end
87
+
88
+ def set_timeout(timeout)
89
+ @timeout = timeout
90
+ end
91
+
92
+ def timeout?
93
+ min_wait_time = 60.0*60.0*60.00
94
+ @intervals.each do |interval|
95
+ min_wait_time = [min_wait_time, interval[0]].min
96
+ end
97
+ min_wait_time > @timeout
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'humiture_sensor'
2
+ require 'dht-sensor-ffi'
3
+
4
+ module IoT
5
+ # DHT11/22 humidity & temperature sensor family
6
+ class DHTxxSensor < IoT::HumitureSensor
7
+
8
+ def initialize(pin, sensor_model)
9
+ @pin = pin
10
+ @sensor_name = 'DHT'+sensor_model.to_s
11
+ @sensor_model = sensor_model.to_i
12
+ @temperature, @humidity = read_data
13
+ end
14
+
15
+ def name
16
+ @sensor_name
17
+ end
18
+
19
+ # Read values by 'DhtSensor.read' from 'dht-sensor-ffi'
20
+ def read_data
21
+ sensor_data = DhtSensor.read(@pin, @sensor_model)
22
+ @temperature = sensor_data.temp
23
+ @humidity = sensor_data.humidity
24
+ [@temperature, @humidity]
25
+ end
26
+ end
27
+
28
+ # DHT11 - junior model, lower presicion
29
+ class DHT11 < DHTxxSensor
30
+ def initialize(pin)
31
+ super(pin, 11)
32
+ end
33
+ end
34
+
35
+ # DHT22 - senior model, higher presicion
36
+ class DHT22 < DHTxxSensor
37
+ def initialize(pin)
38
+ super(pin, 22)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'digital_effector'
2
+
3
+ module IoT
4
+ # DigitalActuator - a synonym for DigitalEffector
5
+ class DigitalActuator < IoT::DigitalEffector
6
+ end
7
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'effector'
2
+
3
+ RPi::GPIO.set_warnings(false)
4
+ RPi::GPIO.set_numbering :bcm
5
+
6
+ module IoT
7
+ # DigitalEffector - effector/actuator with digitized control
8
+ class DigitalEffector < IoT::Effector
9
+ def initialize(pins={}, state=:low)
10
+ @pin = nil
11
+ @states = {} # ON / Off states for pin numbers
12
+ @pins = pins # DigitalEffector.new {red: 17, green: 28, blue: 22}
13
+ @pins.each_value do |pin|
14
+ RPi::GPIO.setup pin, :as => :output, :initialize => state
15
+ @states[pin] = (state == :high)
16
+ end
17
+ @pin = pins.values[0] # default pin
18
+ end
19
+
20
+ def self.on(pin=@pin)
21
+ RPi::GPIO.set_high pin
22
+ end
23
+
24
+ def self.off(pin=@pin)
25
+ RPi::GPIO.set_low pin
26
+ end
27
+
28
+ def on(pin=@pin)
29
+ DigitalEffector.on pin
30
+ @states[pin_number(pin)] = true
31
+ end
32
+
33
+ def off(pin=@pin)
34
+ DigitalEffector.off pin
35
+ @states[pin_number(pin)] = false
36
+ end
37
+
38
+ def on?(pin=@pin)
39
+ @states[pin_number(pin)]
40
+ end
41
+
42
+ def off?(pin=@pin)
43
+ !on?(pin)
44
+ end
45
+
46
+ private
47
+ def pin_number(pin)
48
+ if (pin.class.name == 'Integer') || (pin.class.name == 'Fixnum') # by number
49
+ pin
50
+ elsif @pins[pin] # by name as Symbol
51
+ @pins[pin]
52
+ end
53
+ end
54
+
55
+ def high?(pin=@pin)
56
+ RPi::GPIO.high? pin
57
+ end
58
+
59
+ def low?(pin=@pin)
60
+ RPi::GPIO.low? pin
61
+ end
62
+
63
+ def state
64
+ [@pins, @states]
65
+ end
66
+ end
67
+ end