-
Notifications
You must be signed in to change notification settings - Fork 0
/
io-to-mqtt-hub.js
100 lines (96 loc) · 3.09 KB
/
io-to-mqtt-hub.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
require('dotenv').config()
const parkingRepo = require('./parking-repo')
const {
occupyParkingLot,
unoccupyParkingLot,
getActiveOccupationForLot
} = require('./domain/parking')
const host = process.env.MQTT_HOST || 'localhost'
const mqttPort = process.env.MQTT_PORT || '1883'
function setup (socketIO, mqttClient) {
mqttClient.on('connect', () => {
console.log(`Now connected to ${host}:${mqttPort}`)
mqttClient.subscribe('parkingLot/status-change')
mqttClient.subscribe('parkingLot/getInitialState')
mqttClient.subscribe('parkingLot/occupy')
mqttClient.subscribe('parkingLot/unoccupy')
console.log('Subscribing to topic: parkingLot/status-change')
})
mqttClient.on('message', (topic, message) => {
const payload = JSON.parse(message)
console.log(`Recevied topic: ${topic} ,message: ${message}`)
switch (topic) {
case 'parkingLot/status-change':
parkingRepo
.updateStatusByName(payload.status, payload.lotName)
.map(res => res.toJSON())
.map(res => ({
parkingLot: {
id: res.id,
parking_area_id: res.parking_area_id,
name: res.name,
status: res.status
}
}))
.fork(
err => console.error(err),
payload => socketIO.emit('status-changed', payload)
)
break
case 'parkingLot/getInitialState':
getActiveOccupationForLot(payload.lotName).fork(
err => {
console.error(err)
const response = {
lotName: payload.lotName,
status: 'UNOCCUPIED'
}
mqttClient.publish(
'parkingLot/initialState',
JSON.stringify(response)
)
},
success => {
mqttClient.publish(
'parkingLot/initialState',
JSON.stringify(success)
)
}
)
break
case 'parkingLot/occupy':
occupyParkingLot(payload.lotName, payload.idNumber)
.chain(() => getActiveOccupationForLot(payload.lotName))
.fork(
err => {
console.error(err)
mqttClient.publish(
'parkingLot/occupyError',
JSON.stringify({ lotName: payload.lotName, reason: err })
)
},
success => {
mqttClient.publish('parkingLot/occupied', JSON.stringify(success))
socketIO.emit('parkingLot/occupied', success)
}
)
break
case 'parkingLot/unoccupy':
unoccupyParkingLot(payload.lotName, payload.idNumber).fork(
err => {
console.error(err)
mqttClient.publish(
'parkingLot/unoccupyError',
JSON.stringify({ lotName: payload.lotName, reason: err })
)
},
success => {
mqttClient.publish('parkingLot/unoccupied', JSON.stringify(success))
socketIO.emit('parkingLot/unoccupied', success)
}
)
break
}
})
}
module.exports.setup = setup