Sha256: 8440ee2cf63f5bd33a9b35a909f1dfe9e1582d3c3f95a3ee6465088874a65419

Contents?: true

Size: 1.86 KB

Versions: 1

Compression:

Stored size: 1.86 KB

Contents

module TeslaApi
  module Stream
    def stream(&receiver)
      Async do |task|
        Async::WebSocket::Client.connect(endpoint) do |connection|
          on_timeout = ->(subtask) do
            subtask.sleep TIMEOUT
            task.stop
          end

          connection.write(stream_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

    private

    TIMEOUT = 30

    def endpoint
      Async::HTTP::Endpoint.parse(streaming_endpoint)
    end

    def streaming_endpoint
      'wss://streaming.vn.teslamotors.com/streaming/'
    end

    def stream_connect_message
      {
        msg_type: 'data:subscribe',
        token: Base64.strict_encode64("#{email}:#{self['tokens'].first}"),
        value: 'speed,odometer,soc,elevation,est_heading,est_lat,est_lng,power,shift_state,range,est_range,heading',
        tag: self['vehicle_id'].to_s,
      }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
tesla_api-3.0.3 lib/tesla_api/stream.rb