teslams
Version:
Utilities for the Tesla Model S
147 lines (135 loc) • 5.8 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: climatemon.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.on('^D', function () {
// toggle climate control on/off
teslams.vehicles( { email: creds.username, password: creds.password }, function ( vehicles ) {
if (vehicles.id == undefined) {
// console.log("Error: Undefined vehicle id");
} else {
teslams.get_climate_state( vehicles.id, function ( cs ) {
teslams.auto_conditioning( { id: vehicles.id, climate: !(cs.is_auto_conditioning_on) } );
});
}
});
});
multi.charm.cursor(false); // turn off cursor during bar updating
multi.charm
.erase('screen')
.position(0,0)
.write('Tesla Model S Climate Monitor\n')
.position(0,6);
var bars = [];
var bar0 = multi.rel(0,1, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'white'},
empty : { text : ' ' }
});
var bar1 = multi.rel(0,2, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'green'},
empty : { text : ' ' }
});
var bar2 = multi.rel(0,3, {
width: 60,
solid: { text : ' ', foreground : 'white', background: 'white'},
empty : { text : ' ' }
});
bars.push(bar0);
bars.push(bar1);
bars.push(bar2);
var msg;
bars[0].ratio( 0, 140, msg='Initializing...' );
bars[1].ratio( 0, 140, msg='Initializing...' );
bars[2].ratio( 0, 140, 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].ratio( 60, 140, msg='Initializing...' );
bars[1].ratio( 60, 140, msg='Initializing...' );
bars[2].ratio( 60, 140, msg='Initializing...' );
teslams.get_gui_settings( vehicles.id, function( gs ) {
bars[0].ratio( 140, 140, msg='Initializing...' );
bars[1].ratio( 140, 140, msg='Initializing...' );
bars[2].ratio( 140, 140, msg='Initializing...' );
get_csdata( gs, vehicles );
var iv = setInterval( function () {
get_csdata( gs, vehicles );
}, 10000); // Poll every 10 sec for climate state data
});
}
});
function get_csdata( gs, vehicles) {
teslams.get_climate_state( vehicles.id, function ( cs ) {
var u, ratio;
var itemp = cs.inside_temp;
var otemp = cs.outside_temp;
var dtemp = cs.driver_temp_setting;
var ptemp = cs.passenger_temp_setting;
var fs = (cs.fan_status > 0)?'Fan Speed: '+cs.fan_status:'Climate Control: OFF';
var fd = (cs.is_front_defronster_on == true)?'ON':'OFF';
var rd = (cs.is_rear_defronster_on == true)?'ON':'OFF';
var ac = (cs.is_auto_conditioning_on == true)?'ON':'OFF';
if ( cs.is_auto_conditioning_on ) {
bar1.solid = { text : ' ', foreground : 'white', background: 'green'};
bar2.solid = { text : ' ', foreground : 'white', background: 'blue'};
} else if ( cs.fan_status > 0 ) {
bar1.solid = { text : ' ', foreground : 'white', background: 'green'};
bar2.solid = { text : ' ', foreground : 'white', background: 'red'};
} else {
bar1.solid = { text : ' ', foreground : 'white', background: 'green'};
bar2.solid = { text : ' ', foreground : 'white', background: 'white'};
}
if (gs.gui_temperature_units == 'F') {
u = ' F';
ratio = 140;
if (cs.inside_temp == null ) {
itemp = null;
} else {
itemp = (itemp * 9/5 + 32).toFixed(1);
}
if (cs.outside_temp == null ) {
otemp = null;
} else {
otemp = (otemp * 9/5 + 32).toFixed(1);
}
dtemp = (dtemp * 9/5 + 32).toFixed(1);
ptemp = (ptemp * 9/5 + 32).toFixed(1);
} else {
//display in Celcius;
u = ' C';
ratio = 50;
}
bars[2].ratio( itemp, ratio, msg=' Interior Temp: ' + itemp + u + ' ');
bars[1].ratio( dtemp, ratio, msg=' Climate Setting: ' + dtemp + u + ' ');
bars[0].ratio( otemp, ratio, msg=' Exterior Temp: ' + otemp + u + ' ');
multi.charm
.down(1)
.write(fs + ' \n')
.write('Air Conditioning : ' + ac + ' \n')
.write('Defroster: Front (' + fd + '), Rear (' + rd + ') \n')
.up(4);
});
}