teslams
Version:
Utilities for the Tesla Model S
123 lines (110 loc) • 4.68 kB
JavaScript
var teslams = require('../teslams');
var argv = require('optimist')
.usage('Usage: $0 -u username -p password ')
.alias('u', 'username')
.describe('u', 'Teslamotors.com login')
.alias('p', 'password')
.describe('p', 'Teslamotors.com password');
// get credentials either from command line or config.json in ~/.teslams/config.js
var creds = require('./config.js').config(argv);
argv = argv.argv;
if ( argv.help == true ) {
console.log( 'Usage: chargebar.js -u <username> -p <password>');
process.exit(1);
}
var multimeter = require('multimeter-hj');
var multi = multimeter(process);
// exit nicely and turn cursor back on
multi.charm.removeAllListeners('^C');
multi.charm.on('^C', function () {
multi.charm.cursor(true);
multi.write('\n\n\n').destroy();
process.exit();
});
multi.charm.cursor(false); // turn off cursor during bar updating
multi.charm
.erase('screen')
.position(0,0)
.write('Tesla Model S Charge Monitor\n')
.position(0,6);
var bars = [];
var bar0 = multi.rel(0,1, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'red'},
empty : { text : ' ' }
});
bars.push(bar0);
var bar1 = multi.rel(0,2, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'blue'},
empty : { text : ' ' }
});
bars.push(bar1);
var bar2 = multi.rel(0,3, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'yellow'},
empty : { text : ' ' }
});
bars.push(bar2);
var msg;
bars[0].percent( 0, msg='Initializing...' );
bars[1].percent( 0, msg='Initializing...' );
bars[2].percent( 0, msg='Initializing...' );
teslams.vehicles( { email: creds.username, password: creds.password }, function ( vehicles ) {
if (vehicles.id == undefined) {
// console.log("Error: Undefined vehicle id");
} else {
bars[0].percent( 50, msg='Initializing...' );
bars[1].percent( 50, msg='Initializing...' );
bars[2].percent( 50, msg='Initializing...' );
teslams.get_gui_settings( vehicles.id, function( gs ) {
bars[0].percent( 100, msg='Initializing...' );
bars[1].percent( 100, msg='Initializing...' );
bars[2].percent( 100, msg='Initializing...' );
get_info( gs, vehicles ); // inital request for data to display
var iv = setInterval( function () {
get_info( gs, vehicles );
}, 10000); // Poll every 10 sec for refreshed data and update of bars
});
}
});
function get_info( gs, vehicles ) {
teslams.get_charge_state( vehicles.id, function ( cs ) {
var p = cs.charger_power;
var v = cs.charger_voltage;
var i = cs.charger_actual_current + '/' + cs.charger_pilot_current;
var ttfc = "";
if (cs.time_to_full_charge > 1) {
ttfc = cs.time_to_full_charge + ' hours';
} else if (cs.time_to_full_charge <= 0) {
ttfc = 'N/A';
} else {
ttfc = (cs.time_to_full_charge*60).toPrecision(3) + ' minutes';
}
var r = (cs.charge_to_max_range == false)?'STANDARD':'MAX RANGE';
if ( cs.charge_limit_soc != null ) {
r = cs.charge_limit_soc + '% limit set';
}
if ( cs.fast_charger_present ) {
bars[2].percent( p, msg=' Supercharger: ' + Math.abs(p) + 'kW, ' + v + ' V, ' + cs.battery_current + ' A ');
} else {
bars[2].percent( p, msg=' Charger: ' + p + 'kW, ' + v + ' V, ' + i + ' A ');
}
bars[1].percent( cs.battery_level, msg=' Level: ' + cs.battery_level + '% (' + cs.battery_range + ' ' + gs.gui_range_display + ' miles) ');
bars[0].percent( (cs.charge_rate<0)?0:cs.charge_rate, msg=' Charge Rate: ' + cs.charge_rate + ' ' + gs.gui_distance_units + ' ');
multi.charm
.down(1)
.write('Charging State: ' + cs.charging_state + ' \n')
.write('Range: ' + r + ' \n')
.write('Time to full : ' + ttfc + ' \n')
.up(4);
if (cs.charging_state == 'Complete') {
multi.charm
.cursor(true)
.position(0,10);
multi.write('\n').destroy();
process.exit();
}
});
}