-
Notifications
You must be signed in to change notification settings - Fork 0
/
MMM-TeslaStatus.js
131 lines (122 loc) · 3.81 KB
/
MMM-TeslaStatus.js
1
2
3
4
5
6
7
8
9
10
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* global _, moment */
Module.register('MMM-TeslaStatus', {
defaults: {
firebaseDatabaseRootRef: '/vehicles/131100342',
title: 'Tesla Status',
},
getScripts: function() {
return [
'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js',
];
},
getStyles: function() {
return [
'https://cdnjs.cloudflare.com/ajax/libs/material-design-iconic-font/2.2.0/css/material-design-iconic-font.min.css',
'MMM-TeslaStatus.css',
];
},
getTranslations: function() {
return false;
},
start: function() {
this.sendConfig();
},
sendConfig: function() {
Log.info(`[${this.name}]: SEND_CONFIG`, this.config);
this.sendSocketNotification('SEND_CONFIG', this.config);
},
getDom: function() {
const wrapper = document.createElement('div');
if (this.tesla === null) {
wrapper.innerHTML =
'<div class="loading"><span class="zmdi zmdi-rotate-right zmdi-hc-spin"></span> Loading...</div>';
return wrapper;
}
const batteryLevel = _.get(this.tesla, 'charging.batteryLevel', 'N/A');
const getBatteryLevelClass = function(bl) {
if (bl < 30) {
return 'danger';
}
if (bl < 50) {
return 'warning';
}
if (bl >= 50) {
return 'ok';
}
return '';
};
const sentryMode = _.get(this.tesla, 'vehicleState.sentryMode');
wrapper.innerHTML = `
<h2 class="title"><span class="zmdi zmdi-car zmdi-hc-2x icon"></span> ${_.get(
this.tesla,
'displayName',
this.config.title,
)}</h2>
<ul class="attributes">
<li class="attribute battery-level battery-level-${getBatteryLevelClass(
batteryLevel,
)}">
<span class="icon zmdi zmdi-battery zmdi-hc-fw"></span>
<span class="name">Battery Level</span>
<span class="value">${batteryLevel}%</span>
</li>
<li class="attribute">
<span class="icon zmdi zmdi-car zmdi-hc-fw"></span>
<span class="name">Battery Range</span>
<span class="value">${_.get(
this.tesla,
'charging.batteryRange',
'N/A',
)}m</span>
</li>
<li class="attribute">
<span class="icon zmdi zmdi-cloud-outline-alt zmdi-hc-fw"></span>
<span class="name">Inside</span>
<span class="value">${_.get(
this.tesla,
'climate.insideTemp',
'N/A',
)}°F</span>
</li>
<li class="attribute">
<span class="icon zmdi zmdi-cloud-outline zmdi-hc-fw"></span>
<span class="name">Outside</span>
<span class="value">${_.get(
this.tesla,
'climate.outsideTemp',
'N/A',
)}°F</span>
</li>
<li class="attribute sentry-mode ${
sentryMode ? 'sentry-mode-active' : ''
}">
<span class="icon zmdi zmdi-shield-security zmdi-hc-fw"></span>
<span class="name">Sentry Mode</span>
<span class="value">${
sentryMode
? '<span class="zmdi zmdi-play-circle"></span> On'
: 'Off'
}</span>
</li>
<li class="attribute">
<span class="icon zmdi zmdi-time zmdi-hc-fw"></span>
<span class="name">Updated</span>
<span class="value">${moment(this.tesla.updatedAt).fromNow()}</span>
</li>
</ul>
`;
return wrapper;
},
socketNotificationReceived: function(notification, payload) {
Log.info(
`[${this.name}] socketNotificationReceived notification ${notification}`,
payload,
);
if (notification === 'STATUS_CHANGED') {
this.tesla = payload;
return this.updateDom();
}
return false;
},
});