mios 0.3.0 → 0.3.1

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 (59) hide show
  1. data/.rubocop.yml +769 -0
  2. data/README.md +21 -3
  3. data/lib/mios/action.rb +25 -18
  4. data/lib/mios/category.rb +14 -0
  5. data/lib/mios/category_collection.rb +38 -0
  6. data/lib/mios/client.rb +35 -0
  7. data/lib/mios/device.rb +47 -55
  8. data/lib/mios/interface.rb +53 -37
  9. data/lib/mios/job.rb +33 -34
  10. data/lib/mios/room.rb +14 -0
  11. data/lib/mios/scene.rb +22 -0
  12. data/lib/mios/services/camera1.rb +4 -5
  13. data/lib/mios/services/dimmable_light1.rb +5 -6
  14. data/lib/mios/services/door_lock1.rb +12 -13
  15. data/lib/mios/services/energy_metering1.rb +5 -6
  16. data/lib/mios/services/generic_sensor1.rb +4 -4
  17. data/lib/mios/services/ha_device1.rb +7 -8
  18. data/lib/mios/services/humidity_sensor1.rb +4 -5
  19. data/lib/mios/services/hvac_fan_operating_mode1.rb +3 -4
  20. data/lib/mios/services/hvac_operating_state1.rb +3 -4
  21. data/lib/mios/services/hvac_user_operating_mode1.rb +3 -4
  22. data/lib/mios/services/light_sensor1.rb +4 -12
  23. data/lib/mios/services/scene_controller1.rb +4 -4
  24. data/lib/mios/services/security_sensor1.rb +11 -12
  25. data/lib/mios/services/switch_power1.rb +7 -8
  26. data/lib/mios/services/temperature_sensor1.rb +3 -4
  27. data/lib/mios/services/temperature_setpoint1_cool.rb +3 -4
  28. data/lib/mios/services/temperature_setpoint1_heat.rb +3 -4
  29. data/lib/mios/services/window_covering1.rb +5 -6
  30. data/lib/mios/services/zwave_device1.rb +3 -3
  31. data/lib/mios/services/zwave_network1.rb +3 -3
  32. data/lib/mios/type_conversion.rb +21 -0
  33. data/lib/mios/version.rb +1 -1
  34. data/lib/mios.rb +12 -6
  35. data/mios.gemspec +2 -3
  36. data/spec/integration/lights_spec.rb +17 -0
  37. data/spec/lib/mios/category_collection_spec.rb +37 -0
  38. data/spec/lib/mios/category_spec.rb +15 -0
  39. data/spec/lib/mios/client_spec.rb +28 -0
  40. data/spec/lib/mios/device_spec.rb +69 -6
  41. data/spec/lib/mios/interface_spec.rb +123 -7
  42. data/spec/lib/mios/job_spec.rb +54 -0
  43. data/spec/lib/mios/room_spec.rb +26 -0
  44. data/spec/lib/mios/scene_spec.rb +27 -0
  45. data/spec/lib/mios/services/energy_metering1_spec.rb +1 -1
  46. data/spec/lib/mios/services/hvac_fan_operating_mode1_spec.rb +1 -1
  47. data/spec/lib/mios/services/hvac_operating_state1_spec.rb +1 -1
  48. data/spec/lib/mios/services/hvac_user_operating_mode1_spec.rb +1 -1
  49. data/spec/lib/mios/services/temperature_setpoint1_cool_spec.rb +1 -1
  50. data/spec/lib/mios/services/temperature_setpoint1_heat_spec.rb +1 -1
  51. data/spec/spec_helper.rb +18 -0
  52. data/spec/support/device_data/category_filter.json +75 -0
  53. data/spec/support/device_data/data_request.json +7814 -0
  54. data/spec/support/device_data/device_attributes.json +21 -0
  55. data/spec/support/vcr_cassettes/data_request_failure.yml +28 -0
  56. data/spec/support/vcr_cassettes/run_scene.yml +28 -0
  57. data/spec/support/vcr_cassettes/turn_off_light.yml +2648 -0
  58. data/spec/support/vcr_cassettes/turn_on_light.yml +2647 -0
  59. metadata +57 -39
@@ -1,20 +1,19 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module EnergyMetering1
4
- def self.extended(base)
5
- base.instance_variable_set("@energymetering1_urn", "urn:micasaverde-com:serviceId:EnergyMetering1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:EnergyMetering1'
7
6
 
8
7
  def watts
9
- integer_for(@energymetering1_urn, 'Watts')
8
+ value_for URN, 'Watts', as: Integer
10
9
  end
11
10
 
12
11
  def kWh
13
- float_for(@energymetering1_urn, 'KWH')
12
+ value_for URN, 'KWH', as: Float
14
13
  end
15
14
 
16
15
  def last_reading_at
17
- time_for(@energymetering1_urn, "KWHReading")
16
+ value_for URN, 'KWHReading', as: Time
18
17
  end
19
18
  end
20
19
  end
@@ -1,9 +1,9 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module GenericSensor1
4
- def self.extended(base)
5
- base.instance_variable_set("@genericsensor1_urn", "urn:micasaverde-com:serviceId:GenericSensor1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:GenericSensor1'
6
+
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -1,28 +1,27 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module HaDevice1
4
- def self.extended(base)
5
- base.instance_variable_set("@hadevice1_urn", "urn:micasaverde-com:serviceId:HaDevice1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:HaDevice1'
7
6
 
8
7
  def auto_configure
9
- boolean_for(@hadevice1_urn, "AutoConfigure")
8
+ value_for(URN, 'AutoConfigure', as: Boolean)
10
9
  end
11
10
 
12
11
  def battery_date
13
- timestamp_for(@hadevice1_urn, "BatteryDate")
12
+ value_for(URN, 'BatteryDate', as: Time)
14
13
  end
15
14
 
16
15
  def battery_level
17
- integer_for(@hadevice1_urn, "BatteryLevel")
16
+ value_for(URN, 'BatteryLevel', as: Integer)
18
17
  end
19
18
 
20
19
  def first_configured
21
- timestamp_for(@hadevice1_urn, "FirstConfigured")
20
+ value_for(URN, 'FirstConfigured', as: Time)
22
21
  end
23
22
 
24
23
  def last_update
25
- timestamp_for(@hadevice1_urn, "LastUpdate")
24
+ value_for(URN, 'LastUpdate', as: Time)
26
25
  end
27
26
  end
28
27
  end
@@ -1,13 +1,12 @@
1
- # NOTE: Currently untested with a real humidity sensor
1
+ # Tested with Everspring Combo Sensor
2
2
  module MiOS
3
3
  module Services
4
4
  module HumiditySensor1
5
- def self.extended(base)
6
- base.instance_variable_set("@humiditysensor1_urn", "urn:upnp-org:serviceId:HumiditySensor1")
7
- end
5
+
6
+ URN = 'urn:micasaverde-com:serviceId:HumiditySensor1'
8
7
 
9
8
  def humidity
10
- integer_for(@humiditysensor1_urn, 'CurrentHumidity')
9
+ value_for URN, 'CurrentLevel', as: Integer
11
10
  end
12
11
  end
13
12
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module HVACFanOperatingMode1
4
- def self.extended(base)
5
- base.instance_variable_set("@hvac_fan_operating_mode1_urn", "urn:upnp-org:serviceId:HVAC_FanOperatingMode1")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:HVAC_FanOperatingMode1'
7
6
 
8
7
  def fan_mode
9
- value_for(@hvac_fan_operating_mode1_urn, 'Mode')
8
+ value_for URN, 'Mode'
10
9
  end
11
10
  end
12
11
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module HVACOperatingState1
4
- def self.extended(base)
5
- base.instance_variable_set("@hvac_operating_state1_urn", "urn:micasaverde-com:serviceId:HVAC_OperatingState1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:HVAC_OperatingState1'
7
6
 
8
7
  def operating_state
9
- value_for(@hvac_operating_state1_urn, 'ModeState')
8
+ value_for URN, 'ModeState'
10
9
  end
11
10
  end
12
11
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module HVACUserOperatingMode1
4
- def self.extended(base)
5
- base.instance_variable_set("@hvac_user_operating_mode1_urn", "urn:upnp-org:serviceId:HVAC_UserOperatingMode1")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:HVAC_UserOperatingMode1'
7
6
 
8
7
  def mode
9
- value_for(@hvac_user_operating_mode1_urn, 'ModeStatus')
8
+ value_for URN, 'ModeStatus'
10
9
  end
11
10
  end
12
11
  end
@@ -1,21 +1,13 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module LightSensor1
4
- def self.extended(base)
5
- base.instance_variable_set("@lightsensor1_urn", "urn:micasaverde-com:serviceId:LightSensor1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:LightSensor1'
7
6
 
8
7
  def level
9
- @states.each do |state_hash|
10
- if state_hash['service'] == @lightsensor1_urn
11
- if state_hash['variable'] == "CurrentLevel"
12
- return state_hash['value'].to_i
13
- end
14
- end
15
- end
16
-
17
- return nil
8
+ value_for URN, 'CurrentLevel', as: Integer
18
9
  end
10
+
19
11
  end
20
12
  end
21
13
  end
@@ -1,9 +1,9 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module SceneController1
4
- def self.extended(base)
5
- base.instance_variable_set("@scenecontroller1_urn", "urn:micasaverde-com:serviceId:SceneController1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:SceneController1'
6
+
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -1,32 +1,31 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module SecuritySensor1
4
- def self.extended(base)
5
- base.instance_variable_set("@securitysensor1_urn", "urn:micasaverde-com:serviceId:SecuritySensor1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:SecuritySensor1'
7
6
 
8
7
  def tripped?
9
- boolean_for(@securitysensor1_urn, 'Tripped')
8
+ value_for URN, 'Tripped', as: Boolean
10
9
  end
11
-
10
+
12
11
  def armed?
13
- boolean_for(@securitysensor1_urn, 'Armed')
12
+ value_for URN, 'Armed', as: Boolean
14
13
  end
15
-
14
+
16
15
  def disarmed?
17
16
  !armed?
18
17
  end
19
-
18
+
20
19
  def lasttrip
21
- timestamp_for(@securitysensor1_urn, 'LastTrip')
20
+ value_for URN, 'LastTrip', as: Time
22
21
  end
23
-
22
+
24
23
  def arm!(async=false, &block)
25
- set(@securitysensor1_urn, "SetArmed", {"newArmedValue" => 1}, async, &block)
24
+ set(URN, 'SetArmed', { "newArmedValue" => 1 }, async, &block)
26
25
  end
27
26
 
28
27
  def disarm!(async=false, &block)
29
- set(@securitysensor1_urn, "SetArmed", {"newArmedValue" => 0}, async, &block)
28
+ set(URN, 'SetArmed', { "newArmedValue" => 0 }, async, &block)
30
29
  end
31
30
  end
32
31
  end
@@ -1,24 +1,23 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module SwitchPower1
4
- def self.extended(base)
5
- base.instance_variable_set("@switchpower1_urn", "urn:upnp-org:serviceId:SwitchPower1")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:SwitchPower1'
7
6
 
8
7
  def on?
9
- boolean_for(@switchpower1_urn, 'Status')
8
+ value_for URN, 'Status', as: Boolean
10
9
  end
11
-
10
+
12
11
  def off?
13
12
  !on?
14
13
  end
15
-
14
+
16
15
  def on!(async=false, &block)
17
- set(@switchpower1_urn, "SetTarget", {"newTargetValue" => 1}, async, &block)
16
+ set(URN, 'SetTarget', { "newTargetValue" => 1 }, async, &block)
18
17
  end
19
18
 
20
19
  def off!(async=false, &block)
21
- set(@switchpower1_urn, "SetTarget", {"newTargetValue" => 0}, async, &block)
20
+ set(URN, 'SetTarget', { "newTargetValue" => 0 }, async, &block)
22
21
  end
23
22
  end
24
23
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module TemperatureSensor1
4
- def self.extended(base)
5
- base.instance_variable_set("@temperaturesensor1_urn", "urn:upnp-org:serviceId:TemperatureSensor1")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:TemperatureSensor1'
7
6
 
8
7
  def temperature
9
- integer_for(@temperaturesensor1_urn, 'CurrentTemperature')
8
+ value_for URN 'CurrentTemperature', as: Integer
10
9
  end
11
10
  end
12
11
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module TemperatureSetpoint1Cool
4
- def self.extended(base)
5
- base.instance_variable_set("@temperaturesetpoint1cool_urn", "urn:upnp-org:serviceId:TemperatureSetpoint1_Cool")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:TemperatureSetpoint1_Cool'
7
6
 
8
7
  def cool_target
9
- integer_for(@temperaturesetpoint1cool_urn, 'CurrentSetpoint')
8
+ value_for URN, 'CurrentSetpoint', as: Integer
10
9
  end
11
10
  end
12
11
  end
@@ -1,12 +1,11 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module TemperatureSetpoint1Heat
4
- def self.extended(base)
5
- base.instance_variable_set("@temperaturesetpoint1heat_urn", "urn:upnp-org:serviceId:TemperatureSetpoint1_Heat")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:TemperatureSetpoint1_Heat'
7
6
 
8
7
  def heat_target
9
- integer_for(@temperaturesetpoint1heat_urn, 'CurrentSetpoint')
8
+ value_for URN, 'CurrentSetpoint', as: Integer
10
9
  end
11
10
  end
12
11
  end
@@ -1,20 +1,19 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module WindowCovering1
4
- def self.extended(base)
5
- base.instance_variable_set("@windowcovering1_urn", "urn:upnp-org:serviceId:WindowCovering1")
6
- end
4
+
5
+ URN = 'urn:upnp-org:serviceId:WindowCovering1'
7
6
 
8
7
  def up!(async=false, &block)
9
- set(@windowcovering1_urn, "Up", async, &block)
8
+ set(URN, 'Up', async, &block)
10
9
  end
11
10
 
12
11
  def down!(async=false, &block)
13
- set(@windowcovering1_urn, "Down", async, &block)
12
+ set(URN, 'Down', async, &block)
14
13
  end
15
14
 
16
15
  def stop!(async=false, &block)
17
- set(@windowcovering1_urn, "Stop", async, &block)
16
+ set(URN, 'Stop', async, &block)
18
17
  end
19
18
  end
20
19
  end
@@ -1,9 +1,9 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module ZWaveDevice1
4
- def self.extended(base)
5
- base.instance_variable_set("@zwavedevice1_urn", "urn:micasaverde-com:serviceId:ZWaveDevice1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:ZWaveDevice1'
6
+
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  module MiOS
2
2
  module Services
3
3
  module ZWaveNetwork1
4
- def self.extended(base)
5
- base.instance_variable_set("@zwavenetwork1_urn", "urn:micasaverde-com:serviceId:ZWaveNetwork1")
6
- end
4
+
5
+ URN = 'urn:micasaverde-com:serviceId:ZWaveNetwork1'
6
+
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,21 @@
1
+ class Boolean; end
2
+
3
+ module MiOS
4
+
5
+ def self.cast(value, type)
6
+ result = case
7
+ when type == Integer
8
+ value.to_i
9
+ when type == Time
10
+ Time.at(value.to_i)
11
+ when type == Boolean
12
+ value.to_i == 1
13
+ when type == Float
14
+ value.to_f
15
+ else
16
+ value
17
+ end
18
+ result
19
+ end
20
+
21
+ end
data/lib/mios/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module MiOS
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
data/lib/mios.rb CHANGED
@@ -1,8 +1,14 @@
1
1
  require 'httpclient'
2
- require 'multi_json'
3
- require "mios/version"
4
- require "mios/interface"
5
- require "mios/device"
6
- require "mios/action"
7
- require "mios/job"
2
+ require 'json'
3
+ require 'mios/version'
4
+ require 'mios/interface'
5
+ require 'mios/device'
6
+ require 'mios/action'
7
+ require 'mios/job'
8
+ require 'mios/client'
9
+ require 'mios/category'
10
+ require 'mios/category_collection'
11
+ require 'mios/room'
12
+ require 'mios/type_conversion'
13
+ require 'mios/scene'
8
14
  Dir[File.dirname(__FILE__) + '/mios/services/*.rb'].each {|file| require file }
data/mios.gemspec CHANGED
@@ -16,10 +16,9 @@ Gem::Specification.new do |gem|
16
16
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
-
19
+
20
20
  gem.add_dependency "httpclient", ">= 2.2.0"
21
- gem.add_dependency "multi_json", ">= 1.3.0"
22
-
21
+
23
22
  gem.add_development_dependency "rspec", ">= 2.8.0"
24
23
  gem.add_development_dependency "syntax"
25
24
  gem.add_development_dependency "rake", ">= 0.9.2"
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'light type device control' do
4
+ let(:mios) { MiOS::Interface.new('http://192.168.50.21:3480') }
5
+
6
+ it 'should turn on the light' do
7
+ VCR.use_cassette('turn_on_light') do
8
+ mios.devices[11].on! { expect(mios.devices[11]).to be_on }
9
+ end
10
+ end
11
+
12
+ it 'should turn off the light' do
13
+ VCR.use_cassette('turn_off_light') do
14
+ mios.devices[11].off! { expect(mios.devices[11]).to be_off }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module MiOS
4
+ describe CategoryCollection do
5
+ before do
6
+ filters = JSON.parse(File.read('spec/support/device_data/category_filter.json'))
7
+ @category_collection = CategoryCollection.new(filters)
8
+ @category = @category_collection.all[5]
9
+ end
10
+
11
+ describe :find_for_id do
12
+ it 'should return a Category object given an id' do
13
+ category = @category_collection.find_by_id(16)
14
+ expect(category).to eql @category
15
+ end
16
+ end
17
+
18
+ describe :find_for_label do
19
+ it 'should return a Category object given a label' do
20
+ category = @category_collection.find_by_label('Sensors')
21
+ expect(category).to eql @category
22
+ end
23
+ end
24
+
25
+ describe :all do
26
+ it 'should return an array of all Categories' do
27
+ expect(@category_collection.all.count).to eql 7
28
+ end
29
+ end
30
+
31
+ describe :to_s do
32
+ it 'should return the correct string' do
33
+ expect(@category_collection.to_s).to_not be_empty
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ module MiOS
4
+ describe Category do
5
+ before do
6
+ @category = Category.new('Sensors', [4, 12, 16, 17, 18])
7
+ end
8
+
9
+ describe :to_s do
10
+ it 'should return the correct string' do
11
+ expect(@category.to_s).to eql 'Sensors'
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe MiOS::Client do
4
+
5
+ it "can be instantiated" do
6
+ client = MiOS::Client.new('0.0.0.0:3000')
7
+ expect(client).to be_a MiOS::Client
8
+ end
9
+
10
+ describe "#data_request" do
11
+ let(:client) { MiOS::Client.new('http://192.168.50.21:3480') }
12
+ let(:data_request_json) { JSON.parse(File.read('spec/support/device_data/data_request.json')) }
13
+
14
+ it "returns ruby object from parsed json" do
15
+ VCR.use_cassette('data_request') do
16
+ test_params = { id: 'user_data', output_format: :json}
17
+ expect(client.data_request(test_params)).to eq data_request_json
18
+ end
19
+ end
20
+
21
+ it "defaults to json output format" do
22
+ VCR.use_cassette('data_request') do
23
+ test_params = { id: 'user_data' }
24
+ expect(client.data_request(test_params)).to eq data_request_json
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,10 +1,73 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "device" do
4
- it "should correctly parse service names" do
5
- output = capture_stderr do
6
- device = MiOS::Device.new(nil, '', MultiJson.load(File.read('spec/support/device_data/echo-energy-manager.json')))
3
+ module MiOS
4
+ describe Device do
5
+ before :each do
6
+ @data_request = JSON.parse(File.read('spec/support/device_data/data_request.json'))
7
+ @states = @data_request['devices'][11]['states']
8
+ @attributes = JSON.parse(File.read('spec/support/device_data/device_attributes.json'))
9
+ VCR.use_cassette('data_request') do
10
+ @interface = MiOS::Interface.new('http://192.168.50.21:3480')
11
+ @interface.stub(:device_status).and_return('id' => '12', 'states' => @states, 'name' => 'On/Off Outlet')
12
+ @device = @interface.devices[11]
13
+ end
14
+ end
15
+
16
+ describe :initialize do
17
+ it 'should be an instance of Device' do
18
+ expect(@device).to be_an_instance_of(MiOS::Device)
19
+ end
20
+
21
+ it 'should output a warning for unsupported services' do
22
+ output = capture_stderr do
23
+ device = MiOS::Device.new(nil, JSON.parse(File.read('spec/support/device_data/echo-energy-manager.json')))
24
+ end
25
+ expect(output).to eql "WARNING: EEMPlugin1 not yet supported\n"
26
+ end
27
+ end
28
+
29
+ describe :method_missing do
30
+ it 'should throw an exception for missing attributes' do
31
+ expect {@device.foo}.to raise_error
32
+ end
33
+
34
+ it 'should not throw an exception for defined attributes' do
35
+ expect {@device.id}.to_not raise_error
36
+ expect(@device.id).to eql '12'
37
+ end
38
+ end
39
+
40
+ describe :states do
41
+ it 'should return the current device states' do
42
+ expect(@device.states).to eql(@states)
43
+ end
44
+ end
45
+
46
+ describe :room do
47
+ it 'should return the correct room for the device' do
48
+ expect(@device.room.name).to eql 'Living Room'
49
+ end
50
+ end
51
+
52
+ describe :reload do
53
+ it 'should change state' do
54
+ expect(@device.states).to eql(@states)
55
+ @states[1]['value'] = 'off'
56
+ @device.reload
57
+ expect(@device.states).to eql(@states)
58
+ end
59
+ end
60
+
61
+ describe :category do
62
+ it 'should return the appropriate category' do
63
+ expect(@device.category.label).to eql 'Lights'
64
+ end
65
+ end
66
+
67
+ describe :attributes do
68
+ it 'should return the attributes hash' do
69
+ expect(@device.attributes).to eql(@attributes)
70
+ end
7
71
  end
8
- expect(output).to eql "WARNING: EEMPlugin1 not yet supported\n"
9
72
  end
10
- end
73
+ end