-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdecoder.js
128 lines (110 loc) · 3.68 KB
/
decoder.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
const Config = require('./config');
const debug = Config.debug
module.exports.decodeDisplay = (dataArray) => {
// Pass in a 76-bit binary array and get back a status object
dataString = dataArray.join('')
let displayBits = dataString.substring(1,29) // 4x 7-bit digits, with first bit ignored
let display = _decodeDigits(displayBits)
let temperature = _convertTemp(display)
const displayStatus = {
bits: dataString,
display: display.join('').trim(),
inverted: _getBit(dataArray, 29), // 0 = normal, 1 = inverted
setHeat: _getBit(dataArray, 41),
mode: _getBit(dataArray, 60), // 0 = Economy, 1 = Standard (61 is inverse)
heating: _getBit(dataArray, 40),
tempUp: _getBit(dataArray, 30), // display is in temp Up mode
tempDown: _getBit(dataArray, 39), // display is in temp Down mode
blower: _getBit(dataArray, 43),
pump: _getBit(dataArray, 49),
jets: _getBit(dataArray, 50),
light: _getBit(dataArray, 48),
temperature: temperature,
thirtyOne: _getBit(dataArray, 31),
thirtyTwo: _getBit(dataArray, 32),
thirtyThree: _getBit(dataArray, 33),
thirtyFour: _getBit(dataArray, 34),
thirtyFive: _getBit(dataArray, 35),
thirtySix: _getBit(dataArray, 36),
thirtySeven: _getBit(dataArray, 37),
thirtyEight: _getBit(dataArray, 38),
fortyTwo: _getBit(dataArray, 42),
fortyFour: _getBit(dataArray, 44),
fortySix: _getBit(dataArray, 46),
fiftyFive: _getBit(dataArray, 55)
}
return displayStatus
}
function _getBit(array, bit) {
return parseInt(array[bit-1]);
}
function _decodeDigits(bits) {
// look up all 4 display digits in the table, for both normal and inverted orientation
// in at least one case (F, C, L, 1) it will return a ? when inverted - this is the 'wrong' orientation
// Whichever one has ?s is the 'wrong' one
// Least-significant digit comes first (when display not inverted)
let display = [
_digitMap[bits.slice(21,28)] || "?",
_digitMap[bits.slice(14,21)] || "?",
_digitMap[bits.slice(7,14)] || "?",
_digitMap[bits.slice(0,7)] || "?"
]
let inverted = [
_invertedDigitMap[bits.slice(0,7)] || "?",
_invertedDigitMap[bits.slice(7,14)] || "?",
_invertedDigitMap[bits.slice(14,21)] || "?",
_invertedDigitMap[bits.slice(21,28)] || "?"
]
if (debug) {
console.log(`digit1: ${bits.slice(0,7)} digit2: ${bits.slice(7,14)} digit3: ${bits.slice(14,21)} digit4: ${bits.slice(21,28)}`)
console.log(`display:${display} inverted:${inverted}`)
}
if (display.includes("?")) {
return inverted
} else return display
}
function _convertTemp(display) {
let digits = display.slice(0,3).join('')
let tempString = parseInt(digits)
if (tempString == NaN) { // Likely 'C00L' or '0n'
return 60
} else return tempString
}
const _digitMap = {
"0000000":" ",
"1111110":"0", // as string to prevent evaluation to 'false'
"0110000":1,
"1101101":2,
"1111001":3,
"0110011":4,
"1011011":5,
"1011111":6,
"1110000":7,
"1111111":8,
"1110011":9,
"1000111":"F",
"1001110":"C",
"0001110":"L",
"0010101":"n",
"0110111":"H",
"1001111":"E"
}
const _invertedDigitMap = {
"0000000":" ",
"1111110":"0", // as string to prevent evaluation to 'false'
"0000110":1,
"1101101":2,
"1001111":3,
"0010111":4,
"1011011":5,
"1111011":6,
"0001110":7,
"1111111":8,
"0011111":9,
"0111001":"F",
"1111000":"C",
"1110000":"L",
"0100011":"n",
"0110111":"H",
"1111001":"E"
}