mios 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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