ruby_home 0.2.1 → 0.2.6

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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +41 -0
  3. data/.gitignore +2 -2
  4. data/.rubocop.yml +2 -9
  5. data/.standard.yml +3 -0
  6. data/CHANGELOG.md +18 -0
  7. data/Gemfile +2 -2
  8. data/README.md +40 -77
  9. data/Rakefile +4 -4
  10. data/examples/air_purifier.rb +66 -0
  11. data/examples/air_quality_sensor.rb +119 -0
  12. data/examples/battery_service.rb +58 -0
  13. data/examples/carbon_dioxide_sensor.rb +78 -0
  14. data/examples/carbon_monoxide_sensor.rb +78 -0
  15. data/examples/contact_sensor.rb +66 -0
  16. data/examples/door.rb +48 -0
  17. data/examples/fan.rb +30 -0
  18. data/examples/fan_v2.rb +68 -0
  19. data/examples/garage_door_opener.rb +71 -0
  20. data/examples/heater_cooler.rb +92 -0
  21. data/examples/humidifier_dehumidifier.rb +88 -0
  22. data/examples/humidity_sensor.rb +62 -0
  23. data/examples/leak_sensor.rb +66 -0
  24. data/examples/light_sensor.rb +64 -0
  25. data/examples/lightbulb.rb +31 -0
  26. data/examples/lock_mechanism.rb +34 -0
  27. data/examples/motion_sensor.rb +66 -0
  28. data/examples/occupancy_sensor.rb +66 -0
  29. data/examples/outlet.rb +29 -0
  30. data/examples/security_system.rb +53 -0
  31. data/examples/smoke_sensor.rb +66 -0
  32. data/examples/switch.rb +16 -0
  33. data/examples/television.rb +73 -0
  34. data/examples/temperature_sensor.rb +62 -0
  35. data/examples/thermostat.rb +113 -0
  36. data/examples/window.rb +48 -0
  37. data/examples/window_covering.rb +72 -0
  38. data/lib/ruby_home.rb +21 -22
  39. data/lib/ruby_home/accessory.rb +1 -1
  40. data/lib/ruby_home/accessory_collection.rb +6 -6
  41. data/lib/ruby_home/accessory_info.rb +18 -18
  42. data/lib/ruby_home/characteristic.rb +13 -7
  43. data/lib/ruby_home/characteristic_collection.rb +13 -13
  44. data/lib/ruby_home/config/categories.yml +39 -0
  45. data/lib/ruby_home/config/characteristics.yml +190 -319
  46. data/lib/ruby_home/config/manual_characteristics.yml +278 -0
  47. data/lib/ruby_home/config/manual_services.yml +45 -0
  48. data/lib/ruby_home/config/services.yml +338 -304
  49. data/lib/ruby_home/configuration.rb +21 -2
  50. data/lib/ruby_home/device_id.rb +3 -3
  51. data/lib/ruby_home/dns/service.rb +4 -6
  52. data/lib/ruby_home/dns/text_record.rb +10 -10
  53. data/lib/ruby_home/errors.rb +1 -0
  54. data/lib/ruby_home/factories/characteristic_factory.rb +38 -37
  55. data/lib/ruby_home/factories/service_factory.rb +72 -72
  56. data/lib/ruby_home/factories/templates/characteristic_template.rb +6 -6
  57. data/lib/ruby_home/factories/templates/service_template.rb +12 -11
  58. data/lib/ruby_home/hap/crypto/chacha20poly1305.rb +2 -2
  59. data/lib/ruby_home/hap/crypto/hkdf.rb +4 -4
  60. data/lib/ruby_home/hap/crypto/session_key.rb +7 -7
  61. data/lib/ruby_home/hap/decrypter.rb +8 -8
  62. data/lib/ruby_home/hap/encrypter.rb +5 -6
  63. data/lib/ruby_home/hap/ev_response.rb +17 -17
  64. data/lib/ruby_home/hap/hap_request.rb +1 -1
  65. data/lib/ruby_home/hap/server.rb +4 -4
  66. data/lib/ruby_home/hap/server_handler.rb +8 -10
  67. data/lib/ruby_home/hap/session.rb +22 -22
  68. data/lib/ruby_home/hap/values/base_value.rb +3 -3
  69. data/lib/ruby_home/hap/values/bool_value.rb +4 -4
  70. data/lib/ruby_home/hap/values/float_value.rb +4 -4
  71. data/lib/ruby_home/hap/values/identify_value.rb +1 -1
  72. data/lib/ruby_home/hap/values/int32_value.rb +4 -4
  73. data/lib/ruby_home/hap/values/null_value.rb +1 -1
  74. data/lib/ruby_home/hap/values/string_value.rb +11 -11
  75. data/lib/ruby_home/hap/values/uint32_value.rb +5 -5
  76. data/lib/ruby_home/hap/values/uint8_value.rb +14 -14
  77. data/lib/ruby_home/hex_helper.rb +3 -3
  78. data/lib/ruby_home/http/application.rb +7 -7
  79. data/lib/ruby_home/http/controllers/accessories_controller.rb +3 -3
  80. data/lib/ruby_home/http/controllers/application_controller.rb +6 -6
  81. data/lib/ruby_home/http/controllers/characteristics_controller.rb +29 -29
  82. data/lib/ruby_home/http/controllers/identify_controller.rb +10 -10
  83. data/lib/ruby_home/http/controllers/pair_setups_controller.rb +19 -19
  84. data/lib/ruby_home/http/controllers/pair_verifies_controller.rb +9 -9
  85. data/lib/ruby_home/http/controllers/pairings_controller.rb +6 -6
  86. data/lib/ruby_home/http/serializers/accessory_serializer.rb +5 -5
  87. data/lib/ruby_home/http/serializers/characteristic_serializer.rb +27 -19
  88. data/lib/ruby_home/http/serializers/characteristic_value_serializer.rb +5 -5
  89. data/lib/ruby_home/http/serializers/object_serializer.rb +1 -1
  90. data/lib/ruby_home/http/serializers/service_serializer.rb +19 -9
  91. data/lib/ruby_home/http/serializers/uuid_helper.rb +2 -2
  92. data/lib/ruby_home/http/services/session_notifier.rb +8 -8
  93. data/lib/ruby_home/http/services/start_srp_service.rb +3 -3
  94. data/lib/ruby_home/http/services/verify_finish_service.rb +22 -22
  95. data/lib/ruby_home/http/services/verify_srp_service.rb +22 -22
  96. data/lib/ruby_home/identifier_cache.rb +4 -5
  97. data/lib/ruby_home/password.rb +14 -14
  98. data/lib/ruby_home/persistable.rb +19 -12
  99. data/lib/ruby_home/service.rb +5 -2
  100. data/lib/ruby_home/service_collection.rb +1 -1
  101. data/lib/ruby_home/version.rb +1 -1
  102. data/rubyhome.gemspec +31 -31
  103. data/sbin/characteristic_generator.rb +22 -24
  104. data/sbin/service_generator.rb +38 -19
  105. metadata +85 -44
  106. data/.travis.yml +0 -31
@@ -0,0 +1,92 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ heater_cooler = RubyHome::ServiceFactory.create(:heater_cooler,
5
+ current_temperature: 20, # required
6
+ target_heater_cooler_state: 1, # required
7
+ current_heater_cooler_state: 2, # required
8
+ active: 1, # required
9
+ name: "heater cooler", # optional
10
+ rotation_speed: 0, # optional
11
+ temperature_display_units: 0, # optional
12
+ heating_threshold_temperature: 20, # optional
13
+ cooling_threshold_temperature: 10, # optional
14
+ swing_mode: 1, # optional
15
+ lock_physical_controls: 0) # optional
16
+
17
+ heater_cooler.current_temperature.after_update do |current_temperature|
18
+ puts "heater cooler current temperature in celsius #{current_temperature}"
19
+ end
20
+
21
+ target_heater_cooler_state_values = {
22
+ 0 => "Auto",
23
+ 1 => "Heat",
24
+ 2 => "Cool"
25
+ }
26
+ heater_cooler.target_heater_cooler_state.after_update do |target_heater_cooler_state|
27
+ state = target_heater_cooler_state_values[target_heater_cooler_state]
28
+ puts "heater cooler target heater cooler state is #{state}"
29
+ end
30
+
31
+ current_heater_cooler_state_values = {
32
+ 0 => "Inactive",
33
+ 1 => "Idle",
34
+ 2 => "Heating",
35
+ 3 => "Cooling"
36
+ }
37
+ heater_cooler.current_heater_cooler_state.after_update do |current_heater_cooler_state|
38
+ state = current_heater_cooler_state_values[current_heater_cooler_state]
39
+ puts "heater cooler target heater cooler state is #{state}"
40
+ end
41
+
42
+ heater_cooler.active.after_update do |active|
43
+ if active == 0
44
+ puts "heater cooler is inactive"
45
+ elsif active == 1
46
+ puts "heater cooler is active"
47
+ end
48
+ end
49
+
50
+ heater_cooler.rotation_speed.after_update do |rotation_speed|
51
+ puts "heater cooler is spinning at #{rotation_speed} speed"
52
+ end
53
+
54
+ heater_cooler.temperature_display_units.after_update do |temperature_display_unit|
55
+ if temperature_display_unit == 0
56
+ puts "heater cooler temperature display units Celsius"
57
+ elsif temperature_display_unit == 1
58
+ puts "heater cooler temperature display units Fahrenheit"
59
+ end
60
+ end
61
+
62
+ heater_cooler.heating_threshold_temperature.after_update do |heating_threshold_temperature|
63
+ # maximum_value: 25
64
+ # minimum_value: 0
65
+ # step_value: 0.1
66
+ puts "heater cooler heating threshold temperature #{heating_threshold_temperature}"
67
+ end
68
+
69
+ heater_cooler.cooling_threshold_temperature.after_update do |cooling_threshold_temperature|
70
+ # maximum_value: 35
71
+ # minimum_value: 10
72
+ # step_value: 0.1
73
+ puts "heater cooler cooling threshold temperature temperature #{cooling_threshold_temperature}"
74
+ end
75
+
76
+ heater_cooler.swing_mode.after_update do |swing_mode|
77
+ if swing_mode == 0
78
+ puts "heater cooler swimg is disabled"
79
+ elsif swing_mode == 1
80
+ puts "heater cooler swimg is enabled"
81
+ end
82
+ end
83
+
84
+ heater_cooler.lock_physical_controls.after_update do |lock_physical_controls|
85
+ if lock_physical_controls == 0
86
+ puts "heater cooler control lock disabled"
87
+ elsif lock_physical_controls == 1
88
+ puts "heater cooler control lock enabled"
89
+ end
90
+ end
91
+
92
+ RubyHome.run
@@ -0,0 +1,88 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ humidifier_dehumidifier = RubyHome::ServiceFactory.create(:humidifier_dehumidifier,
5
+ active: 1, # required
6
+ target_humidifier_dehumidifier_state: 0, # required
7
+ current_humidifier_dehumidifier_state: 1, # required
8
+ current_relative_humidity: 30, # required
9
+ name: "humidifier dehumidifier", # optional
10
+ rotation_speed: 0, # optional
11
+ relative_humidity_humidifier_threshold: 100, # optional
12
+ relative_humidity_dehumidifier_threshold: 0, # optional
13
+ water_level: 50, # optional
14
+ swing_mode: 1, # optional
15
+ lock_physical_controls: 0) # optional
16
+
17
+ humidifier_dehumidifier.active.after_update do |active|
18
+ if active == 0
19
+ puts "humidifier dehumidifier is inactive"
20
+ elsif active == 1
21
+ puts "humidifier dehumidifier is active"
22
+ end
23
+ end
24
+
25
+ target_humidifier_dehumidifier_state_values = {
26
+ 0 => "Humidifier or Dehumidifier",
27
+ 1 => "Humidifier",
28
+ 2 => "Dehumidifier"
29
+ }
30
+ humidifier_dehumidifier.target_humidifier_dehumidifier_state.after_update do |target_humidifier_dehumidifier_state|
31
+ state = target_humidifier_dehumidifier_state_values[target_humidifier_dehumidifier_state]
32
+ puts "humidifier dehumidifier target humidifier dehumidifier state is #{state}"
33
+ end
34
+
35
+ current_humidifier_dehumidifier_state_values = {
36
+ 0 => "Inactive",
37
+ 1 => "Idle",
38
+ 2 => "Humidifying",
39
+ 3 => "Dehumidifying"
40
+ }
41
+ humidifier_dehumidifier.current_humidifier_dehumidifier_state.after_update do |current_humidifier_dehumidifier_state|
42
+ state = current_humidifier_dehumidifier_state_values[current_humidifier_dehumidifier_state]
43
+ puts "humidifier dehumidifier target humidifier dehumidifier state is #{state}"
44
+ end
45
+
46
+ humidifier_dehumidifier.current_relative_humidity.after_update do |current_relative_humidity|
47
+ puts "humidifier dehumidifier current relative humidity at #{current_relative_humidity}"
48
+ end
49
+
50
+ humidifier_dehumidifier.rotation_speed.after_update do |rotation_speed|
51
+ puts "humidifier dehumidifier is spinning at #{rotation_speed} speed"
52
+ end
53
+
54
+ humidifier_dehumidifier.relative_humidity_humidifier_threshold.after_update do |relative_humidity_humidifier_threshold|
55
+ # maximum_value: 100
56
+ # minimum_value: 0
57
+ # step_value: 1
58
+ puts "humidifier dehumidifier relative humidity humidifier threshold temperature #{relative_humidity_humidifier_threshold}"
59
+ end
60
+
61
+ humidifier_dehumidifier.relative_humidity_dehumidifier_threshold.after_update do |relative_humidity_dehumidifier_threshold|
62
+ # maximum_value: 100
63
+ # minimum_value: 0
64
+ # step_value: 1
65
+ puts "humidifier dehumidifier relative humidity humidifier threshold temperature #{relative_humidity_dehumidifier_threshold}"
66
+ end
67
+
68
+ humidifier_dehumidifier.water_level.after_update do |water_level|
69
+ puts "humidifier dehumidifier water level #{water_level}"
70
+ end
71
+
72
+ humidifier_dehumidifier.swing_mode.after_update do |swing_mode|
73
+ if swing_mode == 0
74
+ puts "humidifier dehumidifier swimg is disabled"
75
+ elsif swing_mode == 1
76
+ puts "humidifier dehumidifier swimg is enabled"
77
+ end
78
+ end
79
+
80
+ humidifier_dehumidifier.lock_physical_controls.after_update do |lock_physical_controls|
81
+ if lock_physical_controls == 0
82
+ puts "humidifier dehumidifier control lock disabled"
83
+ elsif lock_physical_controls == 1
84
+ puts "humidifier dehumidifier control lock enabled"
85
+ end
86
+ end
87
+
88
+ RubyHome.run
@@ -0,0 +1,62 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ humidity_sensor = RubyHome::ServiceFactory.create(:humidity_sensor,
5
+ current_relative_humidity: 20, # required
6
+ name: "humidity sensor", # optional
7
+ status_low_battery: 0, # optional
8
+ status_tampered: 0, # optional
9
+ status_fault: 0, # optional
10
+ status_active: true) # optional
11
+
12
+ humidity_sensor.current_relative_humidity.after_update do |current_relative_humidity|
13
+ puts "humidity sensor current relative humidity #{current_relative_humidity}"
14
+ end
15
+
16
+ humidity_sensor.status_low_battery.after_update do |status_low_battery|
17
+ if status_low_battery == 0
18
+ puts "humidity sensor low battery is battery level normal"
19
+ elsif status_low_battery == 1
20
+ puts "humidity sensor low battery is battery level low"
21
+ end
22
+ end
23
+
24
+ humidity_sensor.status_tampered.after_update do |status_tampered|
25
+ if status_tampered == 0
26
+ puts "humidity sensor status_tampered not tampered"
27
+ elsif status_tampered == 1
28
+ puts "humidity sensor status_tampered tampered"
29
+ end
30
+ end
31
+
32
+ humidity_sensor.status_fault.after_update do |status_fault|
33
+ if status_fault == 0
34
+ puts "humidity sensor status_fault no fault"
35
+ elsif status_fault == 1
36
+ puts "humidity sensor status_fault general fault"
37
+ end
38
+ end
39
+
40
+ humidity_sensor.status_active.after_update do |active|
41
+ if active
42
+ puts "humidity sensor is active"
43
+ else
44
+ puts "humidity sensor is inactive"
45
+ end
46
+ end
47
+
48
+ Thread.new do
49
+ sleep 30
50
+
51
+ loop do
52
+ humidity_sensor.current_relative_humidity = (0..100).to_a.sample
53
+ humidity_sensor.status_low_battery = (0..1).to_a.sample
54
+ humidity_sensor.status_tampered = (0..1).to_a.sample
55
+ humidity_sensor.status_fault = (0..1).to_a.sample
56
+ humidity_sensor.status_active = [true, false].to_a.sample
57
+
58
+ sleep 10
59
+ end
60
+ end
61
+
62
+ RubyHome.run
@@ -0,0 +1,66 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ leak_sensor = RubyHome::ServiceFactory.create(:leak_sensor,
5
+ leak_detected: 0, # required
6
+ name: "leak sensor", # optional
7
+ status_low_battery: 0, # optional
8
+ status_tampered: 0, # optional
9
+ status_fault: 0, # optional
10
+ status_active: true) # optional
11
+
12
+ leak_sensor.leak_detected.after_update do |leak_detected|
13
+ if leak_detected == 0
14
+ puts "leak sensor leak detected leak not detected"
15
+ elsif leak_detected == 1
16
+ puts "leak sensor leak detected leak detected"
17
+ end
18
+ end
19
+
20
+ leak_sensor.status_low_battery.after_update do |status_low_battery|
21
+ if status_low_battery == 0
22
+ puts "leak sensor low battery is battery level normal"
23
+ elsif status_low_battery == 1
24
+ puts "leak sensor low battery is battery level low"
25
+ end
26
+ end
27
+
28
+ leak_sensor.status_tampered.after_update do |status_tampered|
29
+ if status_tampered == 0
30
+ puts "leak sensor status_tampered not tampered"
31
+ elsif status_tampered == 1
32
+ puts "leak sensor status_tampered tampered"
33
+ end
34
+ end
35
+
36
+ leak_sensor.status_fault.after_update do |status_fault|
37
+ if status_fault == 0
38
+ puts "leak sensor status_fault no fault"
39
+ elsif status_fault == 1
40
+ puts "leak sensor status_fault general fault"
41
+ end
42
+ end
43
+
44
+ leak_sensor.status_active.after_update do |active|
45
+ if active
46
+ puts "leak sensor is active"
47
+ else
48
+ puts "leak sensor is inactive"
49
+ end
50
+ end
51
+
52
+ Thread.new do
53
+ sleep 30
54
+
55
+ loop do
56
+ leak_sensor.leak_detected = (0..1).to_a.sample
57
+ leak_sensor.status_low_battery = (0..1).to_a.sample
58
+ leak_sensor.status_tampered = (0..1).to_a.sample
59
+ leak_sensor.status_fault = (0..1).to_a.sample
60
+ leak_sensor.status_active = [true, false].to_a.sample
61
+
62
+ sleep 10
63
+ end
64
+ end
65
+
66
+ RubyHome.run
@@ -0,0 +1,64 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ light_sensor = RubyHome::ServiceFactory.create(:light_sensor,
5
+ current_ambient_light_level: 50000, # required
6
+ name: "light sensor", # optional
7
+ status_low_battery: 0, # optional
8
+ status_tampered: 0, # optional
9
+ status_fault: 0, # optional
10
+ status_active: true) # optional
11
+
12
+ light_sensor.current_ambient_light_level.after_update do |current_ambient_light_level|
13
+ # maximum_value: 100000
14
+ # minimum_value: 0.0001
15
+ puts "light sensor current ambient light level #{current_ambient_light_level}"
16
+ end
17
+
18
+ light_sensor.status_low_battery.after_update do |status_low_battery|
19
+ if status_low_battery == 0
20
+ puts "light sensor low battery is battery level normal"
21
+ elsif status_low_battery == 1
22
+ puts "light sensor low battery is battery level low"
23
+ end
24
+ end
25
+
26
+ light_sensor.status_tampered.after_update do |status_tampered|
27
+ if status_tampered == 0
28
+ puts "light sensor status_tampered not tampered"
29
+ elsif status_tampered == 1
30
+ puts "light sensor status_tampered tampered"
31
+ end
32
+ end
33
+
34
+ light_sensor.status_fault.after_update do |status_fault|
35
+ if status_fault == 0
36
+ puts "light sensor status_fault no fault"
37
+ elsif status_fault == 1
38
+ puts "light sensor status_fault general fault"
39
+ end
40
+ end
41
+
42
+ light_sensor.status_active.after_update do |active|
43
+ if active
44
+ puts "light sensor is active"
45
+ else
46
+ puts "light sensor is inactive"
47
+ end
48
+ end
49
+
50
+ Thread.new do
51
+ sleep 30
52
+
53
+ loop do
54
+ light_sensor.current_ambient_light_level = (1..100000).to_a.sample
55
+ light_sensor.status_low_battery = (0..1).to_a.sample
56
+ light_sensor.status_tampered = (0..1).to_a.sample
57
+ light_sensor.status_fault = (0..1).to_a.sample
58
+ light_sensor.status_active = [true, false].to_a.sample
59
+
60
+ sleep 10
61
+ end
62
+ end
63
+
64
+ RubyHome.run
@@ -0,0 +1,31 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ lightbulb = RubyHome::ServiceFactory.create(:lightbulb,
5
+ on: true, # required
6
+ name: "lightbulb", # optional
7
+ brightness: 100, # optional
8
+ saturation: 100, # optional
9
+ hue: 360) # optional
10
+
11
+ lightbulb.on.after_update do |on|
12
+ if on
13
+ puts "lightbulb is on"
14
+ else
15
+ puts "lightbulb is off"
16
+ end
17
+ end
18
+
19
+ lightbulb.brightness.after_update do |brightness|
20
+ puts "lightbulb is at #{brightness} brightness"
21
+ end
22
+
23
+ lightbulb.saturation.after_update do |saturation|
24
+ puts "lightbulb is at #{saturation} saturation"
25
+ end
26
+
27
+ lightbulb.hue.after_update do |hue|
28
+ puts "lightbulb is at #{hue} hue"
29
+ end
30
+
31
+ RubyHome.run
@@ -0,0 +1,34 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ lock_mechanism = RubyHome::ServiceFactory.create(:lock_mechanism,
5
+ lock_target_state: 1, # required
6
+ lock_current_state: 1, # required
7
+ name: "lock") # optional
8
+
9
+ lock_mechanism.lock_target_state.after_update do |lock_target_state|
10
+ if lock_target_state == 0
11
+ puts "lock target state is unsecured"
12
+
13
+ sleep 1
14
+ lock_mechanism.lock_current_state = 0
15
+ elsif lock_target_state == 1
16
+ puts "lock target state is secured"
17
+
18
+ sleep 1
19
+ lock_mechanism.lock_current_state = 1
20
+ end
21
+ end
22
+
23
+ lock_current_state_values = {
24
+ 0 => "Unsecured",
25
+ 1 => "Secured",
26
+ 2 => "Jammed",
27
+ 3 => "Unknown"
28
+ }
29
+ lock_mechanism.lock_current_state.after_update do |lock_current_state|
30
+ state = lock_current_state_values[lock_current_state]
31
+ puts "lock current state #{state}"
32
+ end
33
+
34
+ RubyHome.run
@@ -0,0 +1,66 @@
1
+ require "ruby_home"
2
+
3
+ accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
4
+ motion_sensor = RubyHome::ServiceFactory.create(:motion_sensor,
5
+ motion_detected: false, # required
6
+ name: "motion sensor", # optional
7
+ status_low_battery: 0, # optional
8
+ status_tampered: 0, # optional
9
+ status_fault: 0, # optional
10
+ status_active: true) # optional
11
+
12
+ motion_sensor.motion_detected.after_update do |motion_detected|
13
+ if motion_detected
14
+ puts "motion sensor detected motion"
15
+ else
16
+ puts "motion sensor no motion detected"
17
+ end
18
+ end
19
+
20
+ motion_sensor.status_low_battery.after_update do |status_low_battery|
21
+ if status_low_battery == 0
22
+ puts "motion sensor battery level normal"
23
+ elsif status_low_battery == 1
24
+ puts "motion sensor battery level lormal"
25
+ end
26
+ end
27
+
28
+ motion_sensor.status_tampered.after_update do |status_tampered|
29
+ if status_tampered == 0
30
+ puts "motion sensor status_tampered not tampered"
31
+ elsif status_tampered == 1
32
+ puts "motion sensor status_tampered tampered"
33
+ end
34
+ end
35
+
36
+ motion_sensor.status_fault.after_update do |status_fault|
37
+ if status_fault == 0
38
+ puts "motion sensor status_fault no fault"
39
+ elsif status_fault == 1
40
+ puts "motion sensor status_fault general fault"
41
+ end
42
+ end
43
+
44
+ motion_sensor.status_active.after_update do |active|
45
+ if active
46
+ puts "motion sensor is active"
47
+ else
48
+ puts "motion sensor is inactive"
49
+ end
50
+ end
51
+
52
+ Thread.new do
53
+ sleep 30
54
+
55
+ loop do
56
+ motion_sensor.motion_detected = [true, false].to_a.sample
57
+ motion_sensor.status_low_battery = (0..1).to_a.sample
58
+ motion_sensor.status_tampered = (0..1).to_a.sample
59
+ motion_sensor.status_fault = (0..1).to_a.sample
60
+ motion_sensor.status_active = [true, false].to_a.sample
61
+
62
+ sleep 10
63
+ end
64
+ end
65
+
66
+ RubyHome.run