class BWA::Client
Constants
- HEATING_MODES
Attributes
last_control_configuration[R]
last_control_configuration2[R]
last_filter_configuration[R]
last_status[R]
Public Class Methods
new(uri)
click to toggle source
# File lib/bwa/client.rb, line 7 def initialize(uri) uri = URI.parse(uri) if uri.scheme == 'tcp' require 'socket' @io = TCPSocket.new(uri.host, uri.port || 4217) elsif uri.scheme == 'telnet' || uri.scheme == 'rfc2217' require 'net/telnet/rfc2217' @io = Net::Telnet::RFC2217.new("Host" => uri.host, "Port" => uri.port || 23, "baud" => 115200) @queue = [] else require 'ccutrer-serialport' @io = CCutrer::SerialPort.new(uri.path, baud: 115200) @queue = [] end @buffer = "" end
Public Instance Methods
drain_message_queue()
click to toggle source
# File lib/bwa/client.rb, line 58 def drain_message_queue poll while messages_pending? end
messages_pending?()
click to toggle source
# File lib/bwa/client.rb, line 54 def messages_pending? !!IO.select([@io], nil, nil, 0) end
poll()
click to toggle source
# File lib/bwa/client.rb, line 24 def poll message = bytes_read = nil loop do message, bytes_read = Message.parse(@buffer) # discard how much we read @buffer = @buffer[bytes_read..-1] if bytes_read method = @io.respond_to?(:readpartial) ? :readpartial : :read unless message begin @buffer.concat(@io.__send__(method, 64 * 1024)) rescue EOFError @io.wait_readable retry end next end break end if message.is_a?(Messages::Ready) && (msg = @queue&.shift) puts "wrote #{msg.unpack('H*').first}" @io.write(msg) end @last_status = message.dup if message.is_a?(Messages::Status) @last_filter_configuration = message.dup if message.is_a?(Messages::FilterCycles) @last_control_configuration = message.dup if message.is_a?(Messages::ControlConfiguration) @last_control_configuration2 = message.dup if message.is_a?(Messages::ControlConfiguration2) message end
request_configuration()
click to toggle source
# File lib/bwa/client.rb, line 74 def request_configuration send_message("\x0a\xbf\x04") end
request_control_info()
click to toggle source
# File lib/bwa/client.rb, line 82 def request_control_info send_message("\x0a\xbf\x22\x02\x00\x00") end
request_control_info2()
click to toggle source
# File lib/bwa/client.rb, line 78 def request_control_info2 send_message("\x0a\xbf\x22\x00\x00\x01") end
request_filter_configuration()
click to toggle source
# File lib/bwa/client.rb, line 86 def request_filter_configuration send_message("\x0a\xbf\x22\x01\x00\x00") end
send_message(message)
click to toggle source
# File lib/bwa/client.rb, line 62 def send_message(message) length = message.length + 2 full_message = "#{length.chr}#{message}".force_encoding(Encoding::ASCII_8BIT) checksum = CRC.checksum(full_message) full_message = "\x7e#{full_message}#{checksum.chr}\x7e".force_encoding(Encoding::ASCII_8BIT) if @queue @queue.push(full_message) else @io.write(full_message) end end
set_blower(desired)
click to toggle source
# File lib/bwa/client.rb, line 135 def set_blower(desired) return unless last_status && last_control_configuration2 times = (desired - last_status.blower) % (last_control_configuration2.blower + 1) times.times do toggle_blower sleep(0.1) end end
set_heating_mode(desired)
click to toggle source
# File lib/bwa/client.rb, line 177 def set_heating_mode(desired) raise ArgumentError, "heating_mode must be :ready or :rest" unless %I{ready rest}.include?(desired) return unless last_status times = if last_status.heating_mode == :ready && desired == :rest || last_status.heating_mode == :rest && desired == :ready || last_status.heating_mode == :ready_in_rest && desired == :rest 1 elsif last_status.heating_mode == :ready_in_rest && desired == :ready 2 else 0 end times.times { toggle_heating_mode } end
set_mister(desired)
click to toggle source
# File lib/bwa/client.rb, line 129 def set_mister(desired) return unless last_status return if last_status.mister == desired toggle_mister end
set_pump(i, desired)
click to toggle source
# File lib/bwa/client.rb, line 110 def set_pump(i, desired) return unless last_status && last_control_configuration2 times = (desired - last_status.pumps[i - 1]) % (last_control_configuration2.pumps[i - 1] + 1) times.times do toggle_pump(i) sleep(0.1) end end
set_temperature(desired)
click to toggle source
high range is 80-104 for F, 26-40 for C (by 0.5) low range is 50-80 for F, 10-26 for C (by 0.5)
# File lib/bwa/client.rb, line 146 def set_temperature(desired) desired *= 2 if last_status && last_status.temperature_scale == :celsius || desired < 50 send_message("\x0a\xbf\x20#{desired.round.chr}") end
set_temperature_range(desired)
click to toggle source
# File lib/bwa/client.rb, line 166 def set_temperature_range(desired) return unless last_status return if last_status.temperature_range == desired toggle_temperature_range end
set_temperature_scale(scale)
click to toggle source
# File lib/bwa/client.rb, line 156 def set_temperature_scale(scale) raise ArgumentError, "scale must be :fahrenheit or :celsius" unless %I{fahrenheit :celsius}.include?(scale) arg = scale == :fahrenheit ? 0 : 1 send_message("\x0a\xbf\x27\x01".force_encoding(Encoding::ASCII_8BIT) + arg.chr) end
set_time(hour, minute, twenty_four_hour_time = false)
click to toggle source
# File lib/bwa/client.rb, line 151 def set_time(hour, minute, twenty_four_hour_time = false) hour |= 0x80 if twenty_four_hour_time send_message("\x0a\xbf\x21".force_encoding(Encoding::ASCII_8BIT) + hour.chr + minute.chr) end
toggle_blower()
click to toggle source
# File lib/bwa/client.rb, line 106 def toggle_blower toggle_item(0x0c) end
toggle_heating_mode()
click to toggle source
# File lib/bwa/client.rb, line 172 def toggle_heating_mode toggle_item(0x51) end
toggle_item(item)
click to toggle source
# File lib/bwa/client.rb, line 90 def toggle_item(item) send_message("\x0a\xbf\x11#{item.chr}\x00") end
toggle_light(i)
click to toggle source
# File lib/bwa/client.rb, line 98 def toggle_light(i) toggle_item(i + 0x10) end
toggle_mister()
click to toggle source
# File lib/bwa/client.rb, line 102 def toggle_mister toggle_item(0x0e) end
toggle_pump(i)
click to toggle source
# File lib/bwa/client.rb, line 94 def toggle_pump(i) toggle_item(i + 3) end
toggle_temperature_range()
click to toggle source
# File lib/bwa/client.rb, line 162 def toggle_temperature_range toggle_item(0x50) end