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
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            occupancy_sensor = RubyHome::ServiceFactory.create(:occupancy_sensor,
         | 
| 5 | 
            +
              motion_detected: false, # required
         | 
| 6 | 
            +
              name: "occupancy 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 | 
            +
            occupancy_sensor.occupancy_detected.after_update do |occupancy_detected|
         | 
| 13 | 
            +
              if occupancy_detected == 0
         | 
| 14 | 
            +
                puts "occupancy sensor occupancy not detected"
         | 
| 15 | 
            +
              else
         | 
| 16 | 
            +
                puts "occupancy sensor occupancy detected"
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            occupancy_sensor.status_low_battery.after_update do |status_low_battery|
         | 
| 21 | 
            +
              if status_low_battery == 0
         | 
| 22 | 
            +
                puts "occupancy sensor battery level normal"
         | 
| 23 | 
            +
              elsif status_low_battery == 1
         | 
| 24 | 
            +
                puts "occupancy sensor battery level lormal"
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            occupancy_sensor.status_tampered.after_update do |status_tampered|
         | 
| 29 | 
            +
              if status_tampered == 0
         | 
| 30 | 
            +
                puts "occupancy sensor status_tampered not tampered"
         | 
| 31 | 
            +
              elsif status_tampered == 1
         | 
| 32 | 
            +
                puts "occupancy sensor status_tampered tampered"
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            occupancy_sensor.status_fault.after_update do |status_fault|
         | 
| 37 | 
            +
              if status_fault == 0
         | 
| 38 | 
            +
                puts "occupancy sensor status_fault no fault"
         | 
| 39 | 
            +
              elsif status_fault == 1
         | 
| 40 | 
            +
                puts "occupancy sensor status_fault general fault"
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            occupancy_sensor.status_active.after_update do |active|
         | 
| 45 | 
            +
              if active
         | 
| 46 | 
            +
                puts "occupancy sensor is active"
         | 
| 47 | 
            +
              else
         | 
| 48 | 
            +
                puts "occupancy sensor is inactive"
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            Thread.new do
         | 
| 53 | 
            +
              sleep 30
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              loop do
         | 
| 56 | 
            +
                occupancy_sensor.occupancy_detected = (0..1).to_a.sample
         | 
| 57 | 
            +
                occupancy_sensor.status_low_battery = (0..1).to_a.sample
         | 
| 58 | 
            +
                occupancy_sensor.status_tampered = (0..1).to_a.sample
         | 
| 59 | 
            +
                occupancy_sensor.status_fault = (0..1).to_a.sample
         | 
| 60 | 
            +
                occupancy_sensor.status_active = [true, false].to_a.sample
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                sleep 10
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            RubyHome.run
         | 
    
        data/examples/outlet.rb
    ADDED
    
    | @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            outlet = RubyHome::ServiceFactory.create(:outlet,
         | 
| 5 | 
            +
              outlet_in_use: false, # required
         | 
| 6 | 
            +
              on: false, # required
         | 
| 7 | 
            +
              name: "occupancy sensor") # optional
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            outlet.outlet_in_use.after_update do |outlet_in_use|
         | 
| 10 | 
            +
              if outlet_in_use
         | 
| 11 | 
            +
                puts "outlet in use"
         | 
| 12 | 
            +
              else
         | 
| 13 | 
            +
                puts "outlet not in use"
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            outlet.on.after_update do |on|
         | 
| 18 | 
            +
              if on
         | 
| 19 | 
            +
                puts "outlet is on"
         | 
| 20 | 
            +
                sleep 1
         | 
| 21 | 
            +
                outlet.outlet_in_use = true
         | 
| 22 | 
            +
              else
         | 
| 23 | 
            +
                puts "outlet is off"
         | 
| 24 | 
            +
                sleep 1
         | 
| 25 | 
            +
                outlet.outlet_in_use = false
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            RubyHome.run
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            security_system = RubyHome::ServiceFactory.create(:security_system,
         | 
| 5 | 
            +
              security_system_target_state: 0, # required
         | 
| 6 | 
            +
              security_system_current_state: 0, # required
         | 
| 7 | 
            +
              name: "security system", # optional
         | 
| 8 | 
            +
              security_system_alarm_type: 0, # optional
         | 
| 9 | 
            +
              status_tampered: 0, # optional
         | 
| 10 | 
            +
              status_fault: 0) # optional
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            security_system_target_state_values = {
         | 
| 13 | 
            +
              0 => "Stay Arm",
         | 
| 14 | 
            +
              1 => "Away Arm",
         | 
| 15 | 
            +
              2 => "Night Arm",
         | 
| 16 | 
            +
              3 => "Disarm"
         | 
| 17 | 
            +
            }
         | 
| 18 | 
            +
            security_system.security_system_target_state.after_update do |security_system_target_state|
         | 
| 19 | 
            +
              state = security_system_target_state_values[security_system_target_state]
         | 
| 20 | 
            +
              puts "security system security_system_target_state #{state}"
         | 
| 21 | 
            +
              sleep 1
         | 
| 22 | 
            +
              security_system.security_system_current_state = security_system_target_state
         | 
| 23 | 
            +
            end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            security_system_current_state_values = {
         | 
| 26 | 
            +
              0 => "Stay Arm",
         | 
| 27 | 
            +
              1 => "Away Arm",
         | 
| 28 | 
            +
              2 => "Night Arm",
         | 
| 29 | 
            +
              3 => "Disarmed",
         | 
| 30 | 
            +
              4 => "Alarm Triggered"
         | 
| 31 | 
            +
            }
         | 
| 32 | 
            +
            security_system.security_system_current_state.after_update do |security_system_current_state|
         | 
| 33 | 
            +
              state = security_system_current_state_values[security_system_current_state]
         | 
| 34 | 
            +
              puts "security system security_system_current_state state #{state}"
         | 
| 35 | 
            +
            end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            security_system.status_tampered.after_update do |status_tampered|
         | 
| 38 | 
            +
              if status_tampered == 0
         | 
| 39 | 
            +
                puts "security system status_tampered not tampered"
         | 
| 40 | 
            +
              elsif status_tampered == 1
         | 
| 41 | 
            +
                puts "security system status_tampered tampered"
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            security_system.status_fault.after_update do |status_fault|
         | 
| 46 | 
            +
              if status_fault == 0
         | 
| 47 | 
            +
                puts "security system status_fault no fault"
         | 
| 48 | 
            +
              elsif status_fault == 1
         | 
| 49 | 
            +
                puts "security system status_fault general fault"
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            RubyHome.run
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            smoke_sensor = RubyHome::ServiceFactory.create(:smoke_sensor,
         | 
| 5 | 
            +
              smoke_detected: 0, # required
         | 
| 6 | 
            +
              name: "smoke 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 | 
            +
            smoke_sensor.smoke_detected.after_update do |smoke_detected|
         | 
| 13 | 
            +
              if smoke_detected == 0
         | 
| 14 | 
            +
                puts "smoke sensor smoke not detected"
         | 
| 15 | 
            +
              elsif smoke_detected == 1
         | 
| 16 | 
            +
                puts "smoke sensor smoke detected"
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            smoke_sensor.status_low_battery.after_update do |status_low_battery|
         | 
| 21 | 
            +
              if status_low_battery == 0
         | 
| 22 | 
            +
                puts "smoke sensor battery level normal"
         | 
| 23 | 
            +
              elsif status_low_battery == 1
         | 
| 24 | 
            +
                puts "smoke sensor battery level lormal"
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            smoke_sensor.status_tampered.after_update do |status_tampered|
         | 
| 29 | 
            +
              if status_tampered == 0
         | 
| 30 | 
            +
                puts "smoke sensor status_tampered not tampered"
         | 
| 31 | 
            +
              elsif status_tampered == 1
         | 
| 32 | 
            +
                puts "smoke sensor status_tampered tampered"
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            smoke_sensor.status_fault.after_update do |status_fault|
         | 
| 37 | 
            +
              if status_fault == 0
         | 
| 38 | 
            +
                puts "smoke sensor status_fault no fault"
         | 
| 39 | 
            +
              elsif status_fault == 1
         | 
| 40 | 
            +
                puts "smoke sensor status_fault general fault"
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            smoke_sensor.status_active.after_update do |active|
         | 
| 45 | 
            +
              if active
         | 
| 46 | 
            +
                puts "smoke sensor is active"
         | 
| 47 | 
            +
              else
         | 
| 48 | 
            +
                puts "smoke sensor is inactive"
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            Thread.new do
         | 
| 53 | 
            +
              sleep 30
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              loop do
         | 
| 56 | 
            +
                smoke_sensor.smoke_detected = (0..1).to_a.sample
         | 
| 57 | 
            +
                smoke_sensor.status_low_battery = (0..1).to_a.sample
         | 
| 58 | 
            +
                smoke_sensor.status_tampered = (0..1).to_a.sample
         | 
| 59 | 
            +
                smoke_sensor.status_fault = (0..1).to_a.sample
         | 
| 60 | 
            +
                smoke_sensor.status_active = [true, false].to_a.sample
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                sleep 10
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            RubyHome.run
         | 
    
        data/examples/switch.rb
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            switch = RubyHome::ServiceFactory.create(:switch,
         | 
| 5 | 
            +
              on: false, # required
         | 
| 6 | 
            +
              name: "switch") # optional
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            switch.on.after_update do |on|
         | 
| 9 | 
            +
              if on
         | 
| 10 | 
            +
                puts "switch is on"
         | 
| 11 | 
            +
              else
         | 
| 12 | 
            +
                puts "switch is off"
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            RubyHome.run
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RubyHome.configure do |c|
         | 
| 4 | 
            +
              c.discovery_name = "Television"
         | 
| 5 | 
            +
              c.category_identifier = :television
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            accessory = RubyHome::Accessory.new
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            RubyHome::ServiceFactory.create(:accessory_information,
         | 
| 11 | 
            +
              accessory: accessory) # required
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            television = RubyHome::ServiceFactory.create(:television,
         | 
| 14 | 
            +
              accessory: accessory, # required
         | 
| 15 | 
            +
              primary: true, # required
         | 
| 16 | 
            +
              configured_name: "Television", # required
         | 
| 17 | 
            +
              active: 1, # required
         | 
| 18 | 
            +
              active_identifier: 1, # required
         | 
| 19 | 
            +
              sleep_discovery_mode: 1, # required
         | 
| 20 | 
            +
              remote_key: nil, # required
         | 
| 21 | 
            +
              name: "Television", # optional
         | 
| 22 | 
            +
              power_mode_selection: true, # optional
         | 
| 23 | 
            +
              picture_mode: 4, # optional
         | 
| 24 | 
            +
              target_media_state: 0, # optional
         | 
| 25 | 
            +
              current_media_state: 0, # optional
         | 
| 26 | 
            +
              brightness: 100) # optional
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            television.active.after_update do |active|
         | 
| 29 | 
            +
              if active == 0
         | 
| 30 | 
            +
                puts "television is inactive"
         | 
| 31 | 
            +
              else
         | 
| 32 | 
            +
                puts "television is active"
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            television.active_identifier.after_update do |active_identifier|
         | 
| 37 | 
            +
              puts "television active input source #{active_identifier}"
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            television.remote_key.after_update do |remote_key|
         | 
| 41 | 
            +
              puts "television remote_key #{remote_key}"
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            speaker = RubyHome::ServiceFactory.create(:television_speaker,
         | 
| 45 | 
            +
              accessory: accessory, # required
         | 
| 46 | 
            +
              mute: false, # required
         | 
| 47 | 
            +
              name: "Television Volume", # optional
         | 
| 48 | 
            +
              active: 1, # optional
         | 
| 49 | 
            +
              volume_control_type: 1, # optional
         | 
| 50 | 
            +
              volume_selector: 0) # optional
         | 
| 51 | 
            +
            speaker.volume_selector.after_update do |volume|
         | 
| 52 | 
            +
              if volume == 0
         | 
| 53 | 
            +
                puts "television volume up"
         | 
| 54 | 
            +
              else
         | 
| 55 | 
            +
                puts "television volume down"
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            sources = (1..4).map do |index|
         | 
| 60 | 
            +
              RubyHome::ServiceFactory.create(:input_source,
         | 
| 61 | 
            +
                accessory: accessory, # required
         | 
| 62 | 
            +
                subtype: "source#{index}", # required
         | 
| 63 | 
            +
                name: "Source #{index}", # required
         | 
| 64 | 
            +
                configured_name: "Source #{index}", # required
         | 
| 65 | 
            +
                input_source_type: 3, # required
         | 
| 66 | 
            +
                is_configured: 1, # required
         | 
| 67 | 
            +
                current_visibility_state: 0, # required
         | 
| 68 | 
            +
                identifier: index, # optional
         | 
| 69 | 
            +
                input_device_type: 1) # optional
         | 
| 70 | 
            +
            end
         | 
| 71 | 
            +
            television.linked = [speaker] + sources
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            RubyHome.run
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            temperature_sensor = RubyHome::ServiceFactory.create(:temperature_sensor,
         | 
| 5 | 
            +
              current_temperature: 30, # required
         | 
| 6 | 
            +
              name: "temperature 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 | 
            +
            temperature_sensor.current_temperature.after_update do |current_temperature|
         | 
| 13 | 
            +
              puts "temperature sensor current_temperature #{current_temperature}"
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            temperature_sensor.status_low_battery.after_update do |status_low_battery|
         | 
| 17 | 
            +
              if status_low_battery == 0
         | 
| 18 | 
            +
                puts "temperature sensor battery level normal"
         | 
| 19 | 
            +
              elsif status_low_battery == 1
         | 
| 20 | 
            +
                puts "temperature sensor battery level lormal"
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            temperature_sensor.status_tampered.after_update do |status_tampered|
         | 
| 25 | 
            +
              if status_tampered == 0
         | 
| 26 | 
            +
                puts "temperature sensor status_tampered not tampered"
         | 
| 27 | 
            +
              elsif status_tampered == 1
         | 
| 28 | 
            +
                puts "temperature sensor status_tampered tampered"
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            temperature_sensor.status_fault.after_update do |status_fault|
         | 
| 33 | 
            +
              if status_fault == 0
         | 
| 34 | 
            +
                puts "temperature sensor status_fault no fault"
         | 
| 35 | 
            +
              elsif status_fault == 1
         | 
| 36 | 
            +
                puts "temperature sensor status_fault general fault"
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            temperature_sensor.status_active.after_update do |active|
         | 
| 41 | 
            +
              if active
         | 
| 42 | 
            +
                puts "temperature sensor is active"
         | 
| 43 | 
            +
              else
         | 
| 44 | 
            +
                puts "temperature sensor is inactive"
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            Thread.new do
         | 
| 49 | 
            +
              sleep 30
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              loop do
         | 
| 52 | 
            +
                temperature_sensor.current_temperature = (0..100).to_a.sample
         | 
| 53 | 
            +
                temperature_sensor.status_low_battery = (0..1).to_a.sample
         | 
| 54 | 
            +
                temperature_sensor.status_tampered = (0..1).to_a.sample
         | 
| 55 | 
            +
                temperature_sensor.status_fault = (0..1).to_a.sample
         | 
| 56 | 
            +
                temperature_sensor.status_active = [true, false].to_a.sample
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                sleep 10
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            RubyHome.run
         | 
| @@ -0,0 +1,113 @@ | |
| 1 | 
            +
            require "ruby_home"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            accessory_information = RubyHome::ServiceFactory.create(:accessory_information)
         | 
| 4 | 
            +
            thermostat = RubyHome::ServiceFactory.create(:thermostat,
         | 
| 5 | 
            +
              temperature_display_units: 0, # required
         | 
| 6 | 
            +
              target_temperature: 18, # required
         | 
| 7 | 
            +
              current_temperature: 18, # required
         | 
| 8 | 
            +
              target_heating_cooling_state: 0, # required
         | 
| 9 | 
            +
              current_heating_cooling_state: 0, # required
         | 
| 10 | 
            +
              name: "thermostat", # optional
         | 
| 11 | 
            +
              heating_threshold_temperature: 20, # optional
         | 
| 12 | 
            +
              cooling_threshold_temperature: 10, # optional
         | 
| 13 | 
            +
              target_relative_humidity: 0, # optional
         | 
| 14 | 
            +
              current_relative_humidity: 0) # optional
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            thermostat.temperature_display_units.after_update do |temperature_display_unit|
         | 
| 17 | 
            +
              if temperature_display_unit == 0
         | 
| 18 | 
            +
                puts "thermostat temperature display units Celsius"
         | 
| 19 | 
            +
              elsif temperature_display_unit == 1
         | 
| 20 | 
            +
                puts "thermostat temperature display units Fahrenheit"
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            thermostat.target_temperature.after_update do |target_temperature|
         | 
| 25 | 
            +
              puts "thermostat target_temperature #{target_temperature}"
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              if target_temperature.to_i > thermostat.current_temperature.to_i
         | 
| 28 | 
            +
                thermostat.target_heating_cooling_state = 1
         | 
| 29 | 
            +
              elsif target_temperature < thermostat.current_temperature
         | 
| 30 | 
            +
                thermostat.target_heating_cooling_state = 2
         | 
| 31 | 
            +
              elsif target_temperature.to_i == thermostat.current_temperature.to_i
         | 
| 32 | 
            +
                thermostat.target_heating_cooling_state = 0
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            thermostat.current_temperature.after_update do |current_temperature|
         | 
| 37 | 
            +
              puts "thermostat current_temperature #{current_temperature}"
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              if current_temperature.to_i < thermostat.target_temperature.to_i
         | 
| 40 | 
            +
                thermostat.target_heating_cooling_state = 1
         | 
| 41 | 
            +
              elsif current_temperature.to_i > thermostat.target_temperature.to_i
         | 
| 42 | 
            +
                thermostat.target_heating_cooling_state = 2
         | 
| 43 | 
            +
              elsif current_temperature.to_i == thermostat.target_temperature.to_i
         | 
| 44 | 
            +
                thermostat.target_heating_cooling_state = 0
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            target_heating_cooling_state_values = {
         | 
| 49 | 
            +
              0 => "Off",
         | 
| 50 | 
            +
              1 => "Heat",
         | 
| 51 | 
            +
              2 => "Cool",
         | 
| 52 | 
            +
              3 => "Auto"
         | 
| 53 | 
            +
            }
         | 
| 54 | 
            +
            thermostat.target_heating_cooling_state.after_update do |target_heating_cooling_state|
         | 
| 55 | 
            +
              state = target_heating_cooling_state_values[target_heating_cooling_state]
         | 
| 56 | 
            +
              puts "heater cooler target heating cooler state is #{state}"
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              return true if thermostat.current_heating_cooling_state == target_heating_cooling_state
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              if target_heating_cooling_state == 1
         | 
| 61 | 
            +
                thermostat.current_heating_cooling_state = 1
         | 
| 62 | 
            +
              elsif target_heating_cooling_state == 2
         | 
| 63 | 
            +
                thermostat.current_heating_cooling_state = 2
         | 
| 64 | 
            +
              elsif target_heating_cooling_state == 0
         | 
| 65 | 
            +
                thermostat.current_heating_cooling_state = 0
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            current_heating_cooling_state_values = {
         | 
| 70 | 
            +
              0 => "Off",
         | 
| 71 | 
            +
              1 => "Heat",
         | 
| 72 | 
            +
              2 => "Cool"
         | 
| 73 | 
            +
            }
         | 
| 74 | 
            +
            thermostat.current_heating_cooling_state.after_update do |current_heating_cooling_state|
         | 
| 75 | 
            +
              state = current_heating_cooling_state_values[current_heating_cooling_state]
         | 
| 76 | 
            +
              puts "heater cooler current heating cooler state is #{state}"
         | 
| 77 | 
            +
            end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            thermostat.heating_threshold_temperature.after_update do |heating_threshold_temperature|
         | 
| 80 | 
            +
              # maximum_value: 25
         | 
| 81 | 
            +
              # minimum_value: 0
         | 
| 82 | 
            +
              # step_value: 0.1
         | 
| 83 | 
            +
              puts "heater cooler heating threshold temperature #{heating_threshold_temperature}"
         | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            thermostat.cooling_threshold_temperature.after_update do |cooling_threshold_temperature|
         | 
| 87 | 
            +
              # maximum_value: 35
         | 
| 88 | 
            +
              # minimum_value: 10
         | 
| 89 | 
            +
              # step_value: 0.1
         | 
| 90 | 
            +
              puts "heater cooler cooling threshold temperature temperature #{cooling_threshold_temperature}"
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            thermostat.target_relative_humidity.after_update do |target_relative_humidity|
         | 
| 94 | 
            +
              puts "thermostat target_relative_humidity #{target_relative_humidity}"
         | 
| 95 | 
            +
            end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
            thermostat.current_relative_humidity.after_update do |current_relative_humidity|
         | 
| 98 | 
            +
              puts "thermostat current_relative_humidity #{current_relative_humidity}"
         | 
| 99 | 
            +
            end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            Thread.new do
         | 
| 102 | 
            +
              loop do
         | 
| 103 | 
            +
                sleep 5
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                if thermostat.target_temperature.to_i > thermostat.current_temperature.to_i
         | 
| 106 | 
            +
                  thermostat.current_temperature += 1
         | 
| 107 | 
            +
                elsif thermostat.target_temperature.to_i < thermostat.current_temperature.to_i
         | 
| 108 | 
            +
                  thermostat.current_temperature -= 1
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
              end
         | 
| 111 | 
            +
            end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            RubyHome.run
         |