11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/tesla_api/stream.rb', line 11
def stream(endpoint: Stream.streaming_endpoint, &receiver)
Async do |task|
Async::WebSocket::Client.connect(endpoint) do |connection|
on_timeout = ->(subtask) do
subtask.sleep TIMEOUT
task.stop
end
connection.write(streaming_connect_message)
timeout = task.async(&on_timeout)
while message = connection.read
timeout.stop
timeout = task.async(&on_timeout)
case message[:msg_type]
when 'data:update'
attributes = message[:value].split(',')
receiver.call({
time: DateTime.strptime((attributes[0].to_i/1000).to_s, '%s'),
speed: attributes[1].to_f,
odometer: attributes[2].to_f,
soc: attributes[3].to_f,
elevation: attributes[4].to_f,
est_heading: attributes[5].to_f,
est_lat: attributes[6].to_f,
est_lng: attributes[7].to_f,
power: attributes[8].to_f,
shift_state: attributes[9].to_s,
range: attributes[10].to_f,
est_range: attributes[11].to_f,
heading: attributes[12].to_f
})
when 'data:error'
task.stop
end
end
end
end
end
|