lightwaverf 0.0.8 → 0.1.0
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.
- data/bin/lightwaverf +4 -0
- data/bin/lightwaverf-config-json +2 -1
- data/lib/lightwaverf.rb +75 -11
- metadata +4 -3
    
        data/bin/lightwaverf
    CHANGED
    
    | @@ -3,8 +3,12 @@ require 'lightwaverf' | |
| 3 3 | 
             
            case ARGV[0]
         | 
| 4 4 | 
             
              when 'help'
         | 
| 5 5 | 
             
                puts LightWaveRF.new.help
         | 
| 6 | 
            +
              when 'sequence'
         | 
| 7 | 
            +
                puts LightWaveRF.new.sequence ARGV[1], ARGV[2]
         | 
| 6 8 | 
             
              when 'energy'
         | 
| 7 9 | 
             
                puts LightWaveRF.new.energy
         | 
| 10 | 
            +
              when 'timer'
         | 
| 11 | 
            +
                puts LightWaveRF.new.timer ARGV[1], ARGV[2]
         | 
| 8 12 | 
             
              else
         | 
| 9 13 | 
             
                LightWaveRF.new.send ARGV[0], ARGV[1], ARGV[2], ARGV[4]
         | 
| 10 14 | 
             
            end
         | 
    
        data/bin/lightwaverf-config-json
    CHANGED
    
    
    
        data/lib/lightwaverf.rb
    CHANGED
    
    | @@ -21,12 +21,6 @@ class LightWaveRF | |
| 21 21 | 
             
                help += "\n\nso to turn on " + room + " " + device + " type \"lightwaverf " + room + " " + device + " on\"\n"
         | 
| 22 22 | 
             
              end
         | 
| 23 23 |  | 
| 24 | 
            -
              def config_json
         | 
| 25 | 
            -
                require 'json'
         | 
| 26 | 
            -
                require 'pp'
         | 
| 27 | 
            -
                JSON.generate self.get_config
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
                
         | 
| 30 24 | 
             
              def set_config_file file
         | 
| 31 25 | 
             
                @config_file = file
         | 
| 32 26 | 
             
              end
         | 
| @@ -63,6 +57,14 @@ class LightWaveRF | |
| 63 57 | 
             
                rooms
         | 
| 64 58 | 
             
              end
         | 
| 65 59 |  | 
| 60 | 
            +
              # Translate the "state" we pass in to one the wifi link understands
         | 
| 61 | 
            +
              #
         | 
| 62 | 
            +
              # Example:
         | 
| 63 | 
            +
              #   >> LightWaveRF.new.state 'on' # 'F1'
         | 
| 64 | 
            +
              #   >> LightWaveRF.new.state 'off' # 'F0'
         | 
| 65 | 
            +
              #
         | 
| 66 | 
            +
              # Arguments:
         | 
| 67 | 
            +
              #   state: (String)
         | 
| 66 68 | 
             
              def self.get_state state = 'on'
         | 
| 67 69 | 
             
                case state
         | 
| 68 70 | 
             
                  when 'off'
         | 
| @@ -103,7 +105,7 @@ class LightWaveRF | |
| 103 105 | 
             
              #   device: (String)
         | 
| 104 106 | 
             
              #   state: (String)
         | 
| 105 107 | 
             
              def send room = nil, device = nil, state = 'on', debug = false
         | 
| 106 | 
            -
                debug && (  | 
| 108 | 
            +
                debug && ( puts 'config is ' + self.get_config.to_s )
         | 
| 107 109 | 
             
                rooms = self.class.get_rooms self.get_config
         | 
| 108 110 | 
             
                state = self.class.get_state state
         | 
| 109 111 | 
             
                if rooms[room] && device && state && rooms[room]['device'][device]
         | 
| @@ -135,10 +137,9 @@ class LightWaveRF | |
| 135 137 |  | 
| 136 138 | 
             
              def energy
         | 
| 137 139 | 
             
                data = self.raw '666,@?'
         | 
| 138 | 
            -
                 | 
| 139 | 
            -
                 | 
| 140 | 
            -
                match  | 
| 141 | 
            -
                { 'usage' => match[0], 'max' => match[1], 'today' => match[2], 'yesterday' => match[3] }
         | 
| 140 | 
            +
                # /W=(?<usage>\d+),(?<max>\d+),(?<today>\d+),(?<yesterday>\d+)/.match data # ruby 1.9 only?
         | 
| 141 | 
            +
                match = /W=(\d+),(\d+),(\d+),(\d+)/.match data
         | 
| 142 | 
            +
                match and { 'usage' => match[1], 'max' => match[2], 'today' => match[3], 'yesterday' => match[4] }
         | 
| 142 143 | 
             
              end
         | 
| 143 144 |  | 
| 144 145 | 
             
              def raw command
         | 
| @@ -157,4 +158,67 @@ class LightWaveRF | |
| 157 158 | 
             
                response
         | 
| 158 159 | 
             
              end
         | 
| 159 160 |  | 
| 161 | 
            +
              # Use a google calendar as a timer?
         | 
| 162 | 
            +
              # Needs a google calendar, with its url in your config file, with events like "lounge light on" etc
         | 
| 163 | 
            +
              # Only the start time of the event is used right now.
         | 
| 164 | 
            +
              # 
         | 
| 165 | 
            +
              # Run this as a cron job every 5 mins, ie
         | 
| 166 | 
            +
              # */5 * * * * /usr/local/bin/lightwaverf timer 5 > /tmp/timer.out 2>&1
         | 
| 167 | 
            +
              # 
         | 
| 168 | 
            +
              # Example:
         | 
| 169 | 
            +
              #   >> LightWaveRF.new.timer
         | 
| 170 | 
            +
              #   >> LightWaveRF.new.state 10
         | 
| 171 | 
            +
              #
         | 
| 172 | 
            +
              # Sample calendar:
         | 
| 173 | 
            +
              #   https://www.google.com/calendar/feeds/aar79qh62fej54nprq6334s7ck%40group.calendar.google.com/public/basic
         | 
| 174 | 
            +
              #   https://www.google.com/calendar/embed?src=aar79qh62fej54nprq6334s7ck%40group.calendar.google.com&ctz=Europe/London 
         | 
| 175 | 
            +
              #
         | 
| 176 | 
            +
              # Arguments:
         | 
| 177 | 
            +
              #   interval: (Integer)
         | 
| 178 | 
            +
              #   debug: (Boolean)
         | 
| 179 | 
            +
              # 
         | 
| 180 | 
            +
              # @todo actually use the interval we said...
         | 
| 181 | 
            +
              def timer interval = 5, debug = false
         | 
| 182 | 
            +
                require 'net/http'
         | 
| 183 | 
            +
                require 'rexml/document'
         | 
| 184 | 
            +
                url = LightWaveRF.new.get_config['calendar'] + '?singleevents=true&start-min=' + Date.today.strftime( '%Y-%m-%d' ) + '&start-max=' + Date.today.next.strftime( '%Y-%m-%d' )
         | 
| 185 | 
            +
                debug && ( p url )
         | 
| 186 | 
            +
                parsed_url = URI.parse url
         | 
| 187 | 
            +
                http = Net::HTTP.new parsed_url.host, parsed_url.port
         | 
| 188 | 
            +
                http.use_ssl = true
         | 
| 189 | 
            +
                request = Net::HTTP::Get.new parsed_url.request_uri
         | 
| 190 | 
            +
                response = http.request request
         | 
| 191 | 
            +
                doc = REXML::Document.new response.body
         | 
| 192 | 
            +
                now = Time.now.strftime '%H:%M'
         | 
| 193 | 
            +
                interval_end_time = ( Time.now + interval.to_i * 60 ).strftime '%H:%M'
         | 
| 194 | 
            +
                triggered = 0
         | 
| 195 | 
            +
                doc.elements.each 'feed/entry' do | e |
         | 
| 196 | 
            +
                  command = /(\w+) (\w+)( (\w+))?/.match e.elements['title'].text # look for events with a title like 'lounge light on'
         | 
| 197 | 
            +
                  if command
         | 
| 198 | 
            +
                    room = command[1].to_s
         | 
| 199 | 
            +
                    device = command[2].to_s
         | 
| 200 | 
            +
                    status = command[4]
         | 
| 201 | 
            +
                    timer = /When: ([\w ]+) (\d\d:\d\d) to ([\w ]+)?(\d\d:\d\d)/.match e.elements['summary'].text
         | 
| 202 | 
            +
                    if timer
         | 
| 203 | 
            +
                      event_time = timer[2].to_s
         | 
| 204 | 
            +
                      event_end_time = timer[4]
         | 
| 205 | 
            +
                    else
         | 
| 206 | 
            +
                      STDERR.puts 'did not get When: in ' + e.elements['summary'].text
         | 
| 207 | 
            +
                    end
         | 
| 208 | 
            +
                    if ! status
         | 
| 209 | 
            +
                      event_time = event_end_time
         | 
| 210 | 
            +
                      status = 'off'
         | 
| 211 | 
            +
                    end
         | 
| 212 | 
            +
                    debug && ( p e.elements['title'].text + ' - ' + now + ' < ' + event_time + ' < ' + interval_end_time + ' ?' )
         | 
| 213 | 
            +
                    if event_time >= now && event_time < interval_end_time
         | 
| 214 | 
            +
                      debug && ( p 'so going to turn the ' + room + ' ' + device + ' ' + status.to_s + ' now!' )
         | 
| 215 | 
            +
                      self.send room, device, status.to_s
         | 
| 216 | 
            +
                      sleep 1
         | 
| 217 | 
            +
                      triggered += 1
         | 
| 218 | 
            +
                    end
         | 
| 219 | 
            +
                  end
         | 
| 220 | 
            +
                end
         | 
| 221 | 
            +
                triggered.to_s + " events triggered"
         | 
| 222 | 
            +
              end
         | 
| 160 223 | 
             
            end
         | 
| 224 | 
            +
             | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: lightwaverf
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,9 +9,10 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2013-01-04 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies: []
         | 
| 14 | 
            -
            description: Interact with lightwaverf wifi link from code or the command line
         | 
| 14 | 
            +
            description: Interact with lightwaverf wifi link from code or the command line. Control
         | 
| 15 | 
            +
              your lights, heating, sockets etc.
         | 
| 15 16 | 
             
            email: pauly@clarkeology.com
         | 
| 16 17 | 
             
            executables:
         | 
| 17 18 | 
             
            - lightwaverf
         |