interstateone/siriproxy-hue

View on GitHub
lib/hue-entity.rb

Summary

Maintainability
A
0 mins
Test Coverage
# SiriProxy-Hue
# https://github.com/interstateone/siriproxy-hue
# copyright 2013, Brandon Evans
#
# Released under MIT License

class HueEntity
    attr_accessor :type
    attr_accessor :name
    attr_accessor :number
    attr_writer :bridgeIP
    attr_writer :username
    
    def initialize (capturedString, bridgeIP, username)
        @bridgeIP = bridgeIP
        @username = username
        response = RestClient.get("#{@bridgeIP}/api/#{@username}")
        data = JSON.parse(response)
        lights = data["lights"].map do |key, light|
            {type: :light, name: light["name"].to_s, number: key.to_i}
        end
        lights.push({type: :group, name: "all", number: 0})
        result = lights.select { |light| light[:name].to_s.downcase.eql?(capturedString) }
        result = result[0]
        
        if result.nil? then raise ArgumentError end
        
        @type = result[:type]
        @number = result[:number]
        @name = result[:name]
    end
    
    def power (value)
        if self.type == :group
        url = "#{@bridgeIP}/api/#{@username}/groups/#{@number}/action"
        else
            url = "#{@bridgeIP}/api/#{@username}/lights/#{@number}/state"
        end
        RestClient.put(url, {on: value}.to_json, content_type: :json)
    end
    
    def brightness (*args)
        if args.size < 1
            url = "#{@bridgeIP}/api/#{@username}/lights/#{@number}"
            response = RestClient.get(url)
            data = JSON.parse(response)
            brightness = data["state"]["bri"].to_i
            return brightness
        elsif args.size == 1
            value = args[0]
            if (value > 254) then value = 254
            elsif (value < 0) then value = 0
            end
            url = "#{@bridgeIP}/api/#{@username}/lights/#{@number}/state"
            RestClient.put(url, {:bri => value}.to_json, content_type: :json)
        end
    end
    
    def color (red, green, blue, saturation)
        calcX = (1.076450 * red.to_i) - (0.237662 * green.to_i) + (0.161212 * blue.to_i)
        calcY = (0.410964 * red.to_i) + (0.554342 * green.to_i) + (0.034694 * blue.to_i)
        calcZ = (-0.010954 * red.to_i) - (0.013389 * green.to_i) + (1.024343 * blue.to_i)
        x = calcX/(calcX + calcY + calcZ)
        y = calcY/(calcX + calcY + calcZ)
        url = "#{@bridgeIP}/api/#{@username}/lights/#{@number}/state"
        RestClient.put(url, {xy: [x,y], sat: (saturation*2.54).to_i}.to_json, content_type: :json)
    end
end