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.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +41 -0
- data/.gitignore +2 -2
- data/.rubocop.yml +2 -9
- data/.standard.yml +3 -0
- data/CHANGELOG.md +18 -0
- data/Gemfile +2 -2
- data/README.md +40 -77
- data/Rakefile +4 -4
- data/examples/air_purifier.rb +66 -0
- data/examples/air_quality_sensor.rb +119 -0
- data/examples/battery_service.rb +58 -0
- data/examples/carbon_dioxide_sensor.rb +78 -0
- data/examples/carbon_monoxide_sensor.rb +78 -0
- data/examples/contact_sensor.rb +66 -0
- data/examples/door.rb +48 -0
- data/examples/fan.rb +30 -0
- data/examples/fan_v2.rb +68 -0
- data/examples/garage_door_opener.rb +71 -0
- data/examples/heater_cooler.rb +92 -0
- data/examples/humidifier_dehumidifier.rb +88 -0
- data/examples/humidity_sensor.rb +62 -0
- data/examples/leak_sensor.rb +66 -0
- data/examples/light_sensor.rb +64 -0
- data/examples/lightbulb.rb +31 -0
- data/examples/lock_mechanism.rb +34 -0
- data/examples/motion_sensor.rb +66 -0
- data/examples/occupancy_sensor.rb +66 -0
- data/examples/outlet.rb +29 -0
- data/examples/security_system.rb +53 -0
- data/examples/smoke_sensor.rb +66 -0
- data/examples/switch.rb +16 -0
- data/examples/television.rb +73 -0
- data/examples/temperature_sensor.rb +62 -0
- data/examples/thermostat.rb +113 -0
- data/examples/window.rb +48 -0
- data/examples/window_covering.rb +72 -0
- data/lib/ruby_home.rb +21 -22
- data/lib/ruby_home/accessory.rb +1 -1
- data/lib/ruby_home/accessory_collection.rb +6 -6
- data/lib/ruby_home/accessory_info.rb +18 -18
- data/lib/ruby_home/characteristic.rb +13 -7
- data/lib/ruby_home/characteristic_collection.rb +13 -13
- data/lib/ruby_home/config/categories.yml +39 -0
- data/lib/ruby_home/config/characteristics.yml +190 -319
- data/lib/ruby_home/config/manual_characteristics.yml +278 -0
- data/lib/ruby_home/config/manual_services.yml +45 -0
- data/lib/ruby_home/config/services.yml +338 -304
- data/lib/ruby_home/configuration.rb +21 -2
- data/lib/ruby_home/device_id.rb +3 -3
- data/lib/ruby_home/dns/service.rb +4 -6
- data/lib/ruby_home/dns/text_record.rb +10 -10
- data/lib/ruby_home/errors.rb +1 -0
- data/lib/ruby_home/factories/characteristic_factory.rb +38 -37
- data/lib/ruby_home/factories/service_factory.rb +72 -72
- data/lib/ruby_home/factories/templates/characteristic_template.rb +6 -6
- data/lib/ruby_home/factories/templates/service_template.rb +12 -11
- data/lib/ruby_home/hap/crypto/chacha20poly1305.rb +2 -2
- data/lib/ruby_home/hap/crypto/hkdf.rb +4 -4
- data/lib/ruby_home/hap/crypto/session_key.rb +7 -7
- data/lib/ruby_home/hap/decrypter.rb +8 -8
- data/lib/ruby_home/hap/encrypter.rb +5 -6
- data/lib/ruby_home/hap/ev_response.rb +17 -17
- data/lib/ruby_home/hap/hap_request.rb +1 -1
- data/lib/ruby_home/hap/server.rb +4 -4
- data/lib/ruby_home/hap/server_handler.rb +8 -10
- data/lib/ruby_home/hap/session.rb +22 -22
- data/lib/ruby_home/hap/values/base_value.rb +3 -3
- data/lib/ruby_home/hap/values/bool_value.rb +4 -4
- data/lib/ruby_home/hap/values/float_value.rb +4 -4
- data/lib/ruby_home/hap/values/identify_value.rb +1 -1
- data/lib/ruby_home/hap/values/int32_value.rb +4 -4
- data/lib/ruby_home/hap/values/null_value.rb +1 -1
- data/lib/ruby_home/hap/values/string_value.rb +11 -11
- data/lib/ruby_home/hap/values/uint32_value.rb +5 -5
- data/lib/ruby_home/hap/values/uint8_value.rb +14 -14
- data/lib/ruby_home/hex_helper.rb +3 -3
- data/lib/ruby_home/http/application.rb +7 -7
- data/lib/ruby_home/http/controllers/accessories_controller.rb +3 -3
- data/lib/ruby_home/http/controllers/application_controller.rb +6 -6
- data/lib/ruby_home/http/controllers/characteristics_controller.rb +29 -29
- data/lib/ruby_home/http/controllers/identify_controller.rb +10 -10
- data/lib/ruby_home/http/controllers/pair_setups_controller.rb +19 -19
- data/lib/ruby_home/http/controllers/pair_verifies_controller.rb +9 -9
- data/lib/ruby_home/http/controllers/pairings_controller.rb +6 -6
- data/lib/ruby_home/http/serializers/accessory_serializer.rb +5 -5
- data/lib/ruby_home/http/serializers/characteristic_serializer.rb +27 -19
- data/lib/ruby_home/http/serializers/characteristic_value_serializer.rb +5 -5
- data/lib/ruby_home/http/serializers/object_serializer.rb +1 -1
- data/lib/ruby_home/http/serializers/service_serializer.rb +19 -9
- data/lib/ruby_home/http/serializers/uuid_helper.rb +2 -2
- data/lib/ruby_home/http/services/session_notifier.rb +8 -8
- data/lib/ruby_home/http/services/start_srp_service.rb +3 -3
- data/lib/ruby_home/http/services/verify_finish_service.rb +22 -22
- data/lib/ruby_home/http/services/verify_srp_service.rb +22 -22
- data/lib/ruby_home/identifier_cache.rb +4 -5
- data/lib/ruby_home/password.rb +14 -14
- data/lib/ruby_home/persistable.rb +19 -12
- data/lib/ruby_home/service.rb +5 -2
- data/lib/ruby_home/service_collection.rb +1 -1
- data/lib/ruby_home/version.rb +1 -1
- data/rubyhome.gemspec +31 -31
- data/sbin/characteristic_generator.rb +22 -24
- data/sbin/service_generator.rb +38 -19
- metadata +85 -44
- data/.travis.yml +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01126dd521e4351b6b7b801bfbb2e4bfd9ab6e19d47ce1715dc9c964ea5dfeca
|
4
|
+
data.tar.gz: be5d09f37ec55495c374778c4e2c0baea87edd16ea791ff2f9ca65a90a0666ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96fb624e38e24b0b6fc709f6df2f7dd048b2514210f1cd4b43e91a36c2de1bc0f8de22848bb106b44ab7e17f3efbfcab7a3ad839275a819391c745e890e299ea
|
7
|
+
data.tar.gz: bbbc772b8da1669307f63753f23ad07f1ada6e9f675e0a02e174f9653a94f67245cd13564c9d7e57f163fa2ebc1cb4526071df2ef5dc7763466146f446bfb852
|
@@ -0,0 +1,41 @@
|
|
1
|
+
name: Tests
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
ubuntu:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby-version: [3.0, 2.7, 2.6]
|
15
|
+
steps:
|
16
|
+
- name: Install libdnssd
|
17
|
+
run: sudo apt-get install libavahi-compat-libdnssd-dev
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby-version }}
|
23
|
+
- name: Install dependencies
|
24
|
+
run: bundle
|
25
|
+
- name: Run tests
|
26
|
+
run: bundle exec rake
|
27
|
+
mac:
|
28
|
+
runs-on: macos-latest
|
29
|
+
strategy:
|
30
|
+
matrix:
|
31
|
+
ruby-version: [3.0, 2.7, 2.6]
|
32
|
+
steps:
|
33
|
+
- uses: actions/checkout@v2
|
34
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
35
|
+
uses: ruby/setup-ruby@v1
|
36
|
+
with:
|
37
|
+
ruby-version: ${{ matrix.ruby-version }}
|
38
|
+
- name: Install dependencies
|
39
|
+
run: bundle
|
40
|
+
- name: Run tests
|
41
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,9 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Enabled: false
|
4
|
-
Documentation:
|
5
|
-
Enabled: false
|
6
|
-
FrozenStringLiteralComment:
|
7
|
-
Enabled: false
|
8
|
-
IndentationConsistency:
|
9
|
-
AllowProtectedAndPrivateMethodsBeIndented: true
|
1
|
+
inherit_from:
|
2
|
+
- https://raw.githubusercontent.com/testdouble/standard/master/config/base.yml
|
data/.standard.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# ruby_home Changelog
|
2
|
+
|
3
|
+
## [v0.2.6](https://github.com/karlentwistle/ruby_home/releases/tag/v0.2.6) (2021-05-25)
|
4
|
+
|
5
|
+
### Features
|
6
|
+
|
7
|
+
* Introduce in memory cache for identifier_cache and accessory_info to improve read performance
|
8
|
+
|
9
|
+
## [v0.2.5](https://github.com/karlentwistle/ruby_home/releases/tag/v0.2.5) (2021-01-22)
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
* Added support for television service and characteristics (#100, @johndbritton, @getowic)
|
14
|
+
* category_identifier can now be configured (#100, @getowic)
|
15
|
+
|
16
|
+
### Fixes
|
17
|
+
|
18
|
+
* Fix Ruby 3.0 LoadError (#102, @karlentwistle)
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
-
git_source(:github) {|repo_name|
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in ruby_home.gemspec
|
6
6
|
gemspec
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
[](https://codeclimate.com/github/karlentwistle/ruby_home/maintainability)
|
2
|
-
[](https://travis-ci.org/karlentwistle/ruby_home)
|
3
2
|
|
4
3
|
# ruby_home
|
5
4
|
|
@@ -58,6 +57,43 @@ end
|
|
58
57
|
RubyHome.run
|
59
58
|
```
|
60
59
|
|
60
|
+
## Examples
|
61
|
+
|
62
|
+
The following example services are available:
|
63
|
+
|
64
|
+
### Sensors
|
65
|
+
- [Air quality sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/air_quality_sensor.rb)
|
66
|
+
- [Carbon dioxide sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/carbon_dioxide_sensor.rb)
|
67
|
+
- [Carbon monoxide sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/carbon_monoxide_sensor.rb)
|
68
|
+
- [Contact sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/contact_sensor.rb)
|
69
|
+
- [Humidity sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/humidity_sensor.rb)
|
70
|
+
- [Leak sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/leak_sensor.rb)
|
71
|
+
- [Light sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/light_sensor.rb)
|
72
|
+
- [Motion sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/motion_sensor.rb)
|
73
|
+
- [Occupancy sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/occupancy_sensor.rb)
|
74
|
+
- [Smoke sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/smoke_sensor.rb)
|
75
|
+
- [Temperature sensor](https://github.com/karlentwistle/ruby_home/blob/master/examples/temperature_sensor.rb)
|
76
|
+
|
77
|
+
### Controlables
|
78
|
+
- [Air purifier](https://github.com/karlentwistle/ruby_home/blob/master/examples/air_purifier.rb)
|
79
|
+
- [Battery service](https://github.com/karlentwistle/ruby_home/blob/master/examples/battery_service.rb)
|
80
|
+
- [Door](https://github.com/karlentwistle/ruby_home/blob/master/examples/door.rb)
|
81
|
+
- [Fan](https://github.com/karlentwistle/ruby_home/blob/master/examples/fan.rb)
|
82
|
+
- [Fan V2](https://github.com/karlentwistle/ruby_home/blob/master/examples/fan_v2.rb)
|
83
|
+
- [Garage door opener](https://github.com/karlentwistle/ruby_home/blob/master/examples/garage_door_opener.rb)
|
84
|
+
- [Heater cooler](https://github.com/karlentwistle/ruby_home/blob/master/examples/heater_cooler.rb)
|
85
|
+
- [Humidifier dehumidifier](https://github.com/karlentwistle/ruby_home/blob/master/examples/humidifier_dehumidifier.rb)
|
86
|
+
- [Lightbulb](https://github.com/karlentwistle/ruby_home/blob/master/examples/lightbulb.rb)
|
87
|
+
- [Lock mechanism](https://github.com/karlentwistle/ruby_home/blob/master/examples/lock_mechanism.rb)
|
88
|
+
- [Outlet](https://github.com/karlentwistle/ruby_home/blob/master/examples/outlet.rb)
|
89
|
+
- [Security system](https://github.com/karlentwistle/ruby_home/blob/master/examples/security_system.rb)
|
90
|
+
- [Switch](https://github.com/karlentwistle/ruby_home/blob/master/examples/switch.rb)
|
91
|
+
- [Television](https://github.com/karlentwistle/ruby_home/blob/master/examples/television.rb)
|
92
|
+
- [Thermostat](https://github.com/karlentwistle/ruby_home/blob/master/examples/thermostat.rb)
|
93
|
+
- [Window](https://github.com/karlentwistle/ruby_home/blob/master/examples/window.rb)
|
94
|
+
- [Window covering](https://github.com/karlentwistle/ruby_home/blob/master/examples/window_covering.rb)
|
95
|
+
|
96
|
+
|
61
97
|
## Configuration
|
62
98
|
|
63
99
|
The configuration options can be set by using the `configure` helper:
|
@@ -77,6 +113,7 @@ The following is the full list of available configuration options:
|
|
77
113
|
| `password` | Used for pairing, must conform to the format XXX-XX-XXX where each X is a 0-9 digit and dashes are required | Randomly generated | `"101-48-005"` | String |
|
78
114
|
| `host` | The hostname or IP address of the interface to listen on | `"0.0.0.0"` | `"192.168.0.2"` | String |
|
79
115
|
| `port` | The port that should be used when starting the built-in web server | `4567` | `8080` | Integer |
|
116
|
+
| `category_identifier` | Indicates the [category](https://github.com/karlentwistle/ruby_home/blob/master/lib/ruby_home/config/categories.yml) that best describes the primary function of the accessory. | `:bridge` | `:fan` | Symbol |
|
80
117
|
|
81
118
|
## Customization
|
82
119
|
|
@@ -90,7 +127,8 @@ accessory_information = RubyHome::ServiceFactory.create(:accessory_information,
|
|
90
127
|
manufacturer: 'Fake Company',
|
91
128
|
model: 'BSB001',
|
92
129
|
name: 'Kickass fan bridge',
|
93
|
-
serial_number: 'AB1-UK-A123456'
|
130
|
+
serial_number: 'AB1-UK-A123456',
|
131
|
+
category_identifier: :fan
|
94
132
|
)
|
95
133
|
|
96
134
|
fan = RubyHome::ServiceFactory.create(:fan,
|
@@ -148,81 +186,6 @@ end
|
|
148
186
|
RubyHome.run
|
149
187
|
```
|
150
188
|
|
151
|
-
## More examples
|
152
|
-
|
153
|
-
### Create a garage door opener
|
154
|
-
|
155
|
-
```ruby
|
156
|
-
require 'ruby_home'
|
157
|
-
|
158
|
-
accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
|
159
|
-
door = RubyHome::ServiceFactory.create(:garage_door_opener)
|
160
|
-
|
161
|
-
door.target_door_state.after_update do |updated_value|
|
162
|
-
if updated_value == 0 # open
|
163
|
-
sleep 1
|
164
|
-
door.current_door_state = 0
|
165
|
-
elsif updated_value == 1 #closed
|
166
|
-
sleep 1
|
167
|
-
door.current_door_state = 1
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
RubyHome.run
|
172
|
-
```
|
173
|
-
|
174
|
-
### Create a thermostat
|
175
|
-
|
176
|
-
```ruby
|
177
|
-
require 'ruby_home'
|
178
|
-
|
179
|
-
accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
|
180
|
-
thermostat = RubyHome::ServiceFactory.create(:thermostat,
|
181
|
-
current_heating_cooling_state: 0, # off
|
182
|
-
target_heating_cooling_state: 0, # off
|
183
|
-
current_temperature: 18,
|
184
|
-
target_temperature: 18,
|
185
|
-
temperature_display_units: 0
|
186
|
-
)
|
187
|
-
|
188
|
-
thermostat.target_temperature.after_update do |updated_value|
|
189
|
-
if thermostat.current_temperature < updated_value
|
190
|
-
thermostat.target_heating_cooling_state = 1 # heat
|
191
|
-
elsif thermostat.current_temperature > updated_value
|
192
|
-
thermostat.target_heating_cooling_state = 2 # cool
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
thermostat.target_heating_cooling_state.after_update do |updated_value|
|
197
|
-
if updated_value == 1
|
198
|
-
thermostat.current_heating_cooling_state = 1 # heat
|
199
|
-
elsif updated_value == 2
|
200
|
-
thermostat.current_heating_cooling_state = 2 # cool
|
201
|
-
else
|
202
|
-
thermostat.current_heating_cooling_state = 0 # off
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
Thread.new do
|
207
|
-
loop do
|
208
|
-
sleep 5 # seconds
|
209
|
-
|
210
|
-
puts "current_temperature: #{thermostat.current_temperature.value.to_i}"
|
211
|
-
puts "target_temperature: #{thermostat.target_temperature.value.to_i}"
|
212
|
-
|
213
|
-
if thermostat.target_temperature.to_i > thermostat.current_temperature.to_i
|
214
|
-
thermostat.current_temperature += 1
|
215
|
-
elsif thermostat.target_temperature.to_i < thermostat.current_temperature.to_i
|
216
|
-
thermostat.current_temperature -= 1
|
217
|
-
else
|
218
|
-
thermostat.target_heating_cooling_state = 3 # auto
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
RubyHome.run
|
224
|
-
```
|
225
|
-
|
226
189
|
## Development
|
227
190
|
|
228
191
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require_relative
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
require_relative "lib/ruby_home"
|
4
4
|
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
|
7
|
-
task :
|
7
|
+
task default: :spec
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "ruby_home"
|
2
|
+
|
3
|
+
accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
|
4
|
+
air_purifier = RubyHome::ServiceFactory.create(:air_purifier,
|
5
|
+
target_air_purifier_state: 0, # required
|
6
|
+
current_air_purifier_state: 0, # required
|
7
|
+
active: 0, # required
|
8
|
+
name: "air purifier", # optional
|
9
|
+
rotation_speed: 0, # optional
|
10
|
+
swing_mode: 1, # optional
|
11
|
+
lock_physical_controls: 0) # optional
|
12
|
+
|
13
|
+
target_air_purifier_state_values = {
|
14
|
+
0 => "Manual",
|
15
|
+
1 => "Auto"
|
16
|
+
}
|
17
|
+
air_purifier.target_air_purifier_state.after_update do |target_air_purifier_state|
|
18
|
+
state = target_air_purifier_state_values[target_air_purifier_state]
|
19
|
+
puts "air purifier target air purifier state #{state}"
|
20
|
+
end
|
21
|
+
|
22
|
+
current_air_purifier_state_values = {
|
23
|
+
0 => "Inactive",
|
24
|
+
1 => "Idle",
|
25
|
+
2 => "Purifying Air"
|
26
|
+
}
|
27
|
+
air_purifier.current_air_purifier_state.after_update do |current_air_purifier_state|
|
28
|
+
state = current_air_purifier_state_values[current_air_purifier_state]
|
29
|
+
puts "air purifier current air purifier state is #{state}"
|
30
|
+
end
|
31
|
+
|
32
|
+
air_purifier.active.after_update do |active|
|
33
|
+
if active == 0
|
34
|
+
puts "air purifier is inactive"
|
35
|
+
air_purifier.target_air_purifier_state = 0
|
36
|
+
sleep 1
|
37
|
+
air_purifier.current_air_purifier_state = 0
|
38
|
+
elsif active == 1
|
39
|
+
puts "air purifier is active"
|
40
|
+
air_purifier.target_air_purifier_state = 1
|
41
|
+
sleep 1
|
42
|
+
air_purifier.current_air_purifier_state = 2
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
air_purifier.swing_mode.after_update do |swing_mode|
|
47
|
+
if swing_mode == 0
|
48
|
+
puts "air purifier swing is disabled"
|
49
|
+
elsif swing_mode == 1
|
50
|
+
puts "air purifier swing is enabled"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
air_purifier.rotation_speed.after_update do |rotation_speed|
|
55
|
+
puts "air_purifier is spinning at #{rotation_speed} speed"
|
56
|
+
end
|
57
|
+
|
58
|
+
air_purifier.lock_physical_controls.after_update do |lock_physical_controls|
|
59
|
+
if lock_physical_controls == 0
|
60
|
+
puts "air purifier control lock disabled"
|
61
|
+
elsif lock_physical_controls == 1
|
62
|
+
puts "air purifier control lock enabled"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
RubyHome.run
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require "ruby_home"
|
2
|
+
|
3
|
+
accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
|
4
|
+
air_quality_sensor = RubyHome::ServiceFactory.create(:air_quality_sensor,
|
5
|
+
air_quality: 0, # required
|
6
|
+
name: "air quality sensor", # optional
|
7
|
+
carbon_dioxide_level: 0, # optional
|
8
|
+
carbon_monoxide_level: 0, # optional
|
9
|
+
voc_density: 0, # optional
|
10
|
+
pm10_density: 0, # optional
|
11
|
+
pm2_5_density: 0, # optional
|
12
|
+
sulphur_dioxide_density: 0, # optional
|
13
|
+
nitrogen_dioxide_density: 0, # optional
|
14
|
+
ozone_density: 0, # optional
|
15
|
+
status_low_battery: 0, # optional
|
16
|
+
status_tampered: 0, # optional
|
17
|
+
status_fault: 0, # optional
|
18
|
+
status_active: true) # optional
|
19
|
+
|
20
|
+
air_quality_values = {
|
21
|
+
0 => "Unknown",
|
22
|
+
1 => "Excellent",
|
23
|
+
2 => "Good",
|
24
|
+
3 => "Fair",
|
25
|
+
4 => "Inferior",
|
26
|
+
5 => "Poor"
|
27
|
+
}
|
28
|
+
air_quality_sensor.air_quality.after_update do |air_quality|
|
29
|
+
state = air_quality_values[air_quality]
|
30
|
+
puts "air quality sensor air quality is #{state}"
|
31
|
+
end
|
32
|
+
|
33
|
+
air_quality_sensor.carbon_dioxide_level.after_update do |carbon_dioxide_level|
|
34
|
+
puts "air quality sensor carbon_dioxide_level #{carbon_dioxide_level}"
|
35
|
+
end
|
36
|
+
|
37
|
+
air_quality_sensor.carbon_monoxide_level.after_update do |carbon_monoxide_level|
|
38
|
+
puts "air quality sensor carbon_monoxide_level #{carbon_monoxide_level}"
|
39
|
+
end
|
40
|
+
|
41
|
+
air_quality_sensor.voc_density.after_update do |voc_density|
|
42
|
+
puts "air quality sensor voc_density #{voc_density}"
|
43
|
+
end
|
44
|
+
|
45
|
+
air_quality_sensor.pm10_density.after_update do |pm10_density|
|
46
|
+
puts "air quality sensor pm10_density #{pm10_density}"
|
47
|
+
end
|
48
|
+
|
49
|
+
air_quality_sensor.pm2_5_density.after_update do |pm2_5_density|
|
50
|
+
puts "air quality sensor pm2_5_density #{pm2_5_density}"
|
51
|
+
end
|
52
|
+
|
53
|
+
air_quality_sensor.sulphur_dioxide_density.after_update do |sulphur_dioxide_density|
|
54
|
+
puts "air quality sensor sulphur_dioxide_density #{sulphur_dioxide_density}"
|
55
|
+
end
|
56
|
+
|
57
|
+
air_quality_sensor.nitrogen_dioxide_density.after_update do |nitrogen_dioxide_density|
|
58
|
+
puts "air quality sensor nitrogen_dioxide_density #{nitrogen_dioxide_density}"
|
59
|
+
end
|
60
|
+
|
61
|
+
air_quality_sensor.ozone_density.after_update do |ozone_density|
|
62
|
+
puts "air quality sensor ozone_density #{ozone_density}"
|
63
|
+
end
|
64
|
+
|
65
|
+
air_quality_sensor.status_low_battery.after_update do |status_low_battery|
|
66
|
+
if status_low_battery == 0
|
67
|
+
puts "air quality sensor battery level normal"
|
68
|
+
elsif status_low_battery == 1
|
69
|
+
puts "air quality sensor battery level lormal"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
air_quality_sensor.status_tampered.after_update do |status_tampered|
|
74
|
+
if status_tampered == 0
|
75
|
+
puts "air quality sensor status_tampered not tampered"
|
76
|
+
elsif status_tampered == 1
|
77
|
+
puts "air quality sensor status_tampered tampered"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
air_quality_sensor.status_fault.after_update do |status_fault|
|
82
|
+
if status_fault == 0
|
83
|
+
puts "air quality sensor status_fault no fault"
|
84
|
+
elsif status_fault == 1
|
85
|
+
puts "air quality sensor status_fault general fault"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
air_quality_sensor.status_active.after_update do |active|
|
90
|
+
if active
|
91
|
+
puts "air quality sensor is active"
|
92
|
+
else
|
93
|
+
puts "air quality sensor is inactive"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
Thread.new do
|
98
|
+
sleep 30
|
99
|
+
|
100
|
+
loop do
|
101
|
+
air_quality_sensor.air_quality = air_quality_values.keys.sample
|
102
|
+
air_quality_sensor.carbon_dioxide_level = (0..100000).to_a.sample
|
103
|
+
air_quality_sensor.carbon_monoxide_level = (0..100).to_a.sample
|
104
|
+
air_quality_sensor.voc_density = (0..1000).to_a.sample
|
105
|
+
air_quality_sensor.pm10_density = (0..1000).to_a.sample
|
106
|
+
air_quality_sensor.pm2_5_density = (0..1000).to_a.sample
|
107
|
+
air_quality_sensor.sulphur_dioxide_density = (0..1000).to_a.sample
|
108
|
+
air_quality_sensor.nitrogen_dioxide_density = (0..1000).to_a.sample
|
109
|
+
air_quality_sensor.ozone_density = (0..1000).to_a.sample
|
110
|
+
air_quality_sensor.status_low_battery = (0..1).to_a.sample
|
111
|
+
air_quality_sensor.status_tampered = (0..1).to_a.sample
|
112
|
+
air_quality_sensor.status_fault = (0..1).to_a.sample
|
113
|
+
air_quality_sensor.status_active = [true, false].to_a.sample
|
114
|
+
|
115
|
+
sleep 10
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
RubyHome.run
|