Skip to content

Commit 9b2970e

Browse files
committed
Initial autopark client support.
See #16 for more details.
1 parent c7f8e54 commit 9b2970e

File tree

5 files changed

+91
-29
lines changed

5 files changed

+91
-29
lines changed

lib/tesla_api.rb

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
require "httparty"
2-
require "em-http-request"
1+
require 'httparty'
2+
require 'em-http-request'
33

4-
require "tesla_api/version"
5-
require "tesla_api/client"
6-
require "tesla_api/stream"
7-
require "tesla_api/vehicle"
4+
require 'tesla_api/version'
5+
require 'tesla_api/client'
6+
require 'tesla_api/stream'
7+
require 'tesla_api/autopark'
8+
require 'tesla_api/vehicle'

lib/tesla_api/autopark.rb

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
require 'faye/websocket'
2+
3+
module TeslaApi
4+
module Autopark
5+
def start_autopark(&handler)
6+
EventMachine.run do
7+
socket.on(:message) do |event|
8+
message = if event.data.is_a?(Array)
9+
JSON.parse(event.data.map(&:chr).join)
10+
else
11+
JSON.parse(event.data)
12+
end
13+
14+
default_handler(message)
15+
handler.call(message.delete('msg_type'), message)
16+
end
17+
18+
socket.on(:close) do |_|
19+
@socket = nil
20+
@heartbeat && @heartbeat.cancel
21+
EventMachine.stop
22+
end
23+
end
24+
end
25+
26+
private
27+
28+
def default_handler(message)
29+
case message['msg_type']
30+
when 'control:hello'
31+
interval = message['autopark']['heartbeat_frequency'] / 1000.0
32+
@heartbeat = EventMachine::Timer.new(interval) do
33+
beat = {
34+
msg_type: 'autopark:heartbeat_app',
35+
timestamp: Time.now.to_i
36+
}
37+
socket.send(beat.to_json)
38+
end
39+
end
40+
end
41+
42+
def socket
43+
@socket ||= Faye::WebSocket::Client.new(
44+
socket_endpoint,
45+
nil,
46+
{
47+
headers: {
48+
'Authorization' => "Basic #{socket_auth}"
49+
}
50+
}
51+
)
52+
end
53+
54+
def socket_auth
55+
Base64.strict_encode64("#{email}:#{self['tokens'].first}")
56+
end
57+
58+
def socket_endpoint
59+
"wss://streaming.vn.teslamotors.com/connect/#{self['vehicle_id']}"
60+
end
61+
end
62+
end

lib/tesla_api/vehicle.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module TeslaApi
22
class Vehicle
33
include Stream
4+
include Autopark
45
attr_reader :api, :email, :id, :vehicle
56

67
def initialize(api, email, id, vehicle)

lib/tesla_api/version.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module TeslaApi
2-
VERSION = "1.2.0"
2+
VERSION = '1.2.0'
33
end

tesla_api.gemspec

+20-22
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
1-
lib = File.expand_path('../lib', __FILE__)
2-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3-
require 'tesla_api/version'
1+
require File.expand_path('../lib/tesla_api/version', __FILE__)
42

53
Gem::Specification.new do |spec|
6-
spec.name = "tesla_api"
4+
spec.name = 'tesla_api'
75
spec.version = TeslaApi::VERSION
8-
spec.authors = ["Tim Dorr"]
9-
spec.email = ["[email protected]"]
6+
spec.authors = ['Tim Dorr']
7+
spec.email = ['[email protected]']
108
spec.summary = %q{A wrapper for the Tesla API}
119
spec.description = %q{Check the state of your Tesla Model S and issue basic commands. Stream data from the car's telematics system.}
12-
spec.homepage = "https://github.com/timdorr/model-s-api"
13-
spec.license = "MIT"
10+
spec.homepage = 'https://github.com/timdorr/model-s-api'
11+
spec.license = 'MIT'
1412

15-
spec.files = `git ls-files -z`.split("\x0")
16-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
13+
spec.files = `git ls-files -z`.split("\0")
1714
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18-
spec.require_paths = ["lib"]
15+
spec.require_paths = ['lib']
1916

20-
spec.add_dependency "httparty"
21-
spec.add_dependency "em-http-request"
17+
spec.add_dependency 'httparty'
18+
spec.add_dependency 'faye-websocket'
19+
spec.add_dependency 'em-http-request'
2220

23-
spec.add_development_dependency "bundler", "~> 1.7"
24-
spec.add_development_dependency "rake", "~> 10.0"
25-
spec.add_development_dependency "rspec", "~> 3.1"
26-
spec.add_development_dependency "faker", "~> 1.4"
27-
spec.add_development_dependency "vcr", "~> 2.9"
28-
spec.add_development_dependency "webmock", "~> 1.20"
29-
spec.add_development_dependency "dotenv", "~> 1.0"
30-
spec.add_development_dependency "simplecov", "~> 0.9"
31-
spec.add_development_dependency "coveralls"
21+
spec.add_development_dependency 'bundler', '~> 1.7'
22+
spec.add_development_dependency 'rake', '~> 10.0'
23+
spec.add_development_dependency 'rspec', '~> 3.1'
24+
spec.add_development_dependency 'faker', '~> 1.4'
25+
spec.add_development_dependency 'vcr', '~> 2.9'
26+
spec.add_development_dependency 'webmock', '~> 1.20'
27+
spec.add_development_dependency 'dotenv', '~> 1.0'
28+
spec.add_development_dependency 'simplecov', '~> 0.9'
29+
spec.add_development_dependency 'coveralls'
3230
end

0 commit comments

Comments
 (0)