class Domotics::Core::Room

Attributes

elements[R]
name[R]
type[R]

Public Class Methods

[](symbol = nil) click to toggle source

Return requested room like element of array

# File lib/domotics/core/room.rb, line 74
def self.[](symbol = nil)
  return @@rooms[symbol] if symbol
  @@rooms
end
new(args = {}) click to toggle source
# File lib/domotics/core/room.rb, line 6
def initialize(args = {})
  @logger = args[:logger] || Logger.new(STDERR)
  # Save self
  @@rooms[@name = args[:name]] = self
  @type = args[:type]
  # Hash of elements
  @elements = {}
  class << @elements
    def light
      select { |name, element| (element.is_a? Element) and (element.type == :switch) and (name =~ /light/) }
    end
  end
  # New queue thread
  @room_queue = Queue.new
  @queue_thread = Thread.new { loop { event_handler @room_queue.pop } }
end

Public Instance Methods

[](symbol = nil) click to toggle source

Return element object

# File lib/domotics/core/room.rb, line 69
def [](symbol = nil)
  return @elements[symbol] if symbol
  @elements
end
destroy() click to toggle source
# File lib/domotics/core/room.rb, line 64
def destroy
  @queue_thread.exit
end
event_handler(msg = {}) click to toggle source

Default - simple prints event

# File lib/domotics/core/room.rb, line 58
def event_handler(msg = {})
  event, element = msg[:event], msg[:element]
  @logger.info { "[Domotics] event [#{event}] element [#{element}] state [#{element.state}]" }
  Domotics::Core::WsServer.publish "#{element.room.name}/#{element.name}"
end
light(action = :toggle) click to toggle source

Perform action with light

# File lib/domotics/core/room.rb, line 42
def light(action = :toggle)
  case action
  when :on, :off
    @elements.light.values.each { |element| element.public_send(action) if element.respond_to? action }
  when :toggle
    light_off? ? light(:on) : light(:off)
  end
end
light_off?() click to toggle source
# File lib/domotics/core/room.rb, line 50
def light_off?
  @elements.light.values.reduce(true) { |res, el| res && el.off? }
end
method_missing(symbol, *args) click to toggle source

Return requested room like variable

Calls superclass method
# File lib/domotics/core/room.rb, line 79
def method_missing(symbol, *args)
  super unless args.size == 0
  @@rooms[symbol] || BlackHole.new
end
notify(msg) click to toggle source

Method for pushing into queue

# File lib/domotics/core/room.rb, line 54
def notify(msg)
  @room_queue.push(msg)
end
register_element(element, name) click to toggle source

Register element

# File lib/domotics/core/room.rb, line 23
def register_element(element, name)
  @elements[name] = element
  # define accessor method (singleton)
  instance_eval(%(def #{name}; @elements[:#{name}]; end;), __FILE__, __LINE__) unless respond_to? name
end
state() click to toggle source
# File lib/domotics/core/room.rb, line 38
def state
  nil
end
to_s() click to toggle source
# File lib/domotics/core/room.rb, line 83
def to_s
  "Room[#{@name}](id:#{__id__})"
end
verbose_state() click to toggle source

Return state of all elements

# File lib/domotics/core/room.rb, line 29
def verbose_state
  { @name =>
    { :elements =>
        @elements.inject(Hash.new) { |hash, element| hash.merge element[1].verbose_state[@name][:elements] },
      :state => state,
      :info => (info if respond_to? :info)
    }
  }
end