-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
116 lines (101 loc) · 2.99 KB
/
index.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
const path = require('path')
const fs = require('fs')
const mqtt = require('mqtt')
const bunyan = require('bunyan')
const RotatingFileStream = require('bunyan-rotating-file-stream')
const dotenv = require('dotenv')
dotenv.config()
const bformat = require('bunyan-format')
const formatOut = bformat({ outputMode: 'short', levelInString: true })
//init logger
const basePath = path.resolve(__dirname, 'logs')
if (!fs.existsSync(basePath)){
fs.mkdirSync(basePath);
}
const bunyanOpts = {
name: 'app',
streams: [
{
type: 'stream',
stream: formatOut,
},
{
type: 'raw',
stream: new RotatingFileStream({
path: `${basePath}/alarm.log`,
period: '1d',
totalFiles: 365,
rotateExisting: false,
threshold: '10m',
totalSize: '200m',
gzip: true,
})
}
],
}
const log = bunyan.createLogger(bunyanOpts)
const parseZoneStatus = (status) => {
const statuses = {
0: 'Secure',
1: 'active',
}
return statuses[status] || status;
}
const storeAreaMessage = (payload) => {
try {
const message = JSON.parse(payload);
log.info(`AREA event, ID: ${message.id}, Number: ${message.number}, Name: ${message.name}, Status: ${message.status}`)
} catch(error) {
log.error('Unable to parse AREA MQTT payload.', payload, error)
}
}
const storeZoneMessage = (payload) => {
try {
const message = JSON.parse(payload);
const areas = message.areas.join(', ')
log.info(`ZONE event, Number: ${message.number}, Name: ${message.name} (${message.type}), Areas: ${areas}, Status: ${parseZoneStatus(message.status)}`)
} catch(error) {
log.error('Unable to parse ZONE MQTT payload.', payload, error)
}
}
//check mandatory params
if (!process.env.MQTT_PROTOCOL ||
!process.env.MQTT_HOST ||
!process.env.MQTT_PORT ||
!process.env.MQTT_TOPIC_PREFIX) {
log.error('Mandatory MQTT params missing. Please set at least MQTT_PROTOCOL MQTT_HOST MQTT_PORT in .env')
process.exit()
}
const topics = [
`${process.env.MQTT_TOPIC_PREFIX}/zone/#`,
`${process.env.MQTT_TOPIC_PREFIX}/area/#`,
]
const clientId = `texeLogger_${Math.random().toString(16).slice(3)}`
const connectUrl = `${process.env.MQTT_PROTOCOL}://${process.env.MQTT_HOST}:${process.env.MQTT_PORT}`
const mqttOpts = {
clientId,
clean: true,
connectTimeout: 4000,
reconnectPeriod: 1000,
}
if (process.env.MQTT_USER && process.env.MQTT_PASS) {
mqttOpts.username = process.env.MQTT_USER
mqttOpts.password = process.env.MQTT_PASS
}
const mqttClient = mqtt.connect(connectUrl, mqttOpts)
mqttClient.on('connect', () => {
log.info(`Connected to ${connectUrl} with client id ${clientId}`)
mqttClient.subscribe(topics, () => {
log.info('Subscribe to topics')
})
})
mqttClient.on('message', (topic, payload) => {
if (topic.startsWith(`${process.env.MQTT_TOPIC_PREFIX}/zone`)) {
storeZoneMessage(payload.toString())
return
}
if (topic.startsWith(`${process.env.MQTT_TOPIC_PREFIX}/area`)) {
storeAreaMessage(payload.toString())
return
}
})