#define sensorsCount 2 int sensorTypes[sensorsCount] = {SENSOR_DHT22, SENSOR_DHT22}; int sensorPins[sensorsCount] = {2, 0}; SensorEntity** sensorEntities; SensorOutputData* outputDatas;
DisplayEntity display = DisplayEntity(DISPLAY_LCD_I2C);
void setupSensors() { outputDatas = new SensorOutputData[sensorsCount]; sensorEntities = new SensorEntity*[sensorsCount]; for (int i = 0; i < sensorsCount; i++) { int sensorType = sensorTypes[i]; int pin = sensorPins[i]; SensorEntity* entity = new SensorEntity(sensorType); entity->setup(pin); sensorEntities[i] = entity; } } void setupDisplay() { DisplayConfig displayConfig = DisplayConfig(); displayConfig.address = 0x27; displayConfig.rows = 2; displayConfig.cols = 16; displayConfig.sda = 4; displayConfig.scl = 5; displayConfig.printSensorTitle = false; display.setup(displayConfig); display.clear(); }
void requestSensorValues() { for (int i = 0; i < sensorsCount; i++) { SensorEntity* entity = sensorEntities[i]; SensorOutputData sensorData = entity->getData(); sensorData.sensorOrder = i; outputDatas[i] = sensorData; } } void renderSensorValues() { for (int i = 0; i < sensorsCount; i++) { SensorOutputData sensorData = outputDatas[i]; display.printData(sensorData); } }
var request = require("request"); var config = require('./config'); const dgram = require('dgram'); const serverPort = config.serverPort; const serverSocket = dgram.createSocket('udp4'); const multicastAddress = config.multicastAddress; const multicastPort = config.multicastPort; const sensorDelay = config.sensorDelay; var sidToAddress = {}; var sidToPort = {}; var gatewayAddress; function sendSensorData(sensorId, temperature, humidity, gatewayAddress) { request({ url: config.addDataUrl, method: 'GET', qs: { isaqara: 1, moduleid: sensorId, modulename: sensorId, code: config.validationCode, temperature1: temperature, humidity1: humidity, ip: gatewayAddress, mac: sensorId, delay: sensorDelay } }, function (error, response, body) { if (error) { console.log(error); } } ); } serverSocket.on('message', function (msg, rinfo) { console.log('Received \x1b[33m%s\x1b[0m (%d bytes) from client \x1b[36m%s:%d\x1b[0m.', msg, msg.length, rinfo.address, rinfo.port); var json; try { json = JSON.parse(msg); } catch (e) { console.log('\x1b[31mUnexpected message: %s\x1b[0m.', msg); return; } var cmd = json['cmd']; if (cmd === 'iam') { var address = json['ip']; var port = json['port']; gatewayAddress = address; var command = { cmd: "get_id_list" }; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, port, address); console.log('Requesting devices list...'); } else if (cmd === 'get_id_list_ack') { var data = JSON.parse(json['data']); console.log('Received devices list: %d device(s) connected.', data.length); for (var index in data) { var sid = data[index]; var command = { cmd: "read", sid: new String(sid) }; sidToAddress[sid] = rinfo.address; sidToPort[sid] = rinfo.port; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, rinfo.port, rinfo.address); console.log('Sending \x1b[33m%s\x1b[0m to \x1b[36m%s:%d\x1b[0m.', cmdString, rinfo.address, rinfo.port); } } else if (cmd === 'read_ack' || cmd === 'report' || cmd === 'heartbeat') { var model = json['model']; var data = JSON.parse(json['data']); if (model === 'sensor_ht') { var temperature = data['temperature'] ? data['temperature'] / 100.0 : 100; var humidity = data['humidity'] ? data['humidity'] / 100.0 : 0; var sensorId = json["short_id"]; console.log("Received data from sensor \x1b[31m%s\x1b[0m (sensorId: %s) data: temperature %d, humidity %d.", json['sid'], sensorId, temperature, humidity); sendSensorData(sensorId, temperature, humidity, gatewayAddress); console.log('Sending sensor data to \x1b[36m%s\x1b[0m.', config.addDataUrl); } } }); // err - Error object, https://nodejs.org/api/errors.html serverSocket.on('error', function (err) { console.log('Error, message - %s, stack - %s.', err.message, err.stack); }); serverSocket.on('listening', function () { console.log('Starting a UDP server, listening on port %d.', serverPort); serverSocket.addMembership(multicastAddress); }) console.log('Starting Aqara daemon...'); serverSocket.bind(serverPort); function sendWhois() { var command = { cmd: "whois" }; var cmdString = JSON.stringify(command); var message = new Buffer(cmdString); serverSocket.send(message, 0, cmdString.length, multicastPort, multicastAddress); console.log('Sending WhoIs request to a multicast address \x1b[36m%s:%d\x1b[0m.', multicastAddress, multicastPort); } sendWhois(); setInterval(function () { console.log('Requesting data...'); sendWhois(); }, sensorDelay * 1000);
var config = { validationCode: "0000000000000000", addDataUrl: "http://weatherhub.ru/aqara.php", serverPort: 9898, multicastAddress: '224.0.0.50', multicastPort: 4321, sensorDelay: 30 }; module.exports = config;
root@raspberrypi:/home/nodejs# nodejs sensor.js Starting Aqara daemon... Sending WhoIs request to a multicast address 224.0.0.50:4321. Starting a UDP server, listening on port 9898. Received {"cmd":"iam","port":"9898","sid":"f0b429cc178e","model":"gateway","ip":"192.168.1.112"} (87 bytes) from client 192.168.1.112:4321. Requesting devices list... Received {"cmd":"get_id_list_ack","sid":"f0b429cc178e","token":"GVke0tYsRZ5zlXWc","data":"[\"158d00015b2f98\",\"158d0001560c23\",\"158d00013eccc6\",\"158d000153db73\",\"158d000127883b\",\"158d0001581523\",\"158d0001101d54\"]"} (217 bytes) from client 192.168.1.112:9898. Received devices list: 7 device(s) connected. Sending {"cmd":"read","sid":"158d00015b2f98"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001560c23"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d00013eccc6"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d000153db73"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d000127883b"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001581523"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001101d54"} to 192.168.1.112:9898. Received {"cmd":"read_ack","model":"sensor_ht","sid":"158d00015b2f98","short_id":20046,"data":"{\"voltage\":2975,\"temperature\":\"2297\",\"humidity\":\"4190\"}"} (153 bytes) from client 192.168.1.112:9898. Received data from sensor 158d00015b2f98 (sensorId: 20046) data: temperature 22.97, humidity 41.9. Sending sensor data to http://weatherhub.ru/aqara.php. Received {"cmd":"read_ack","model":"motion","sid":"158d0001560c23","short_id":41212,"data":"{\"voltage\":3075}"} (103 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"switch","sid":"158d00013eccc6","short_id":4019,"data":"{\"voltage\":3042}"} (102 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"magnet","sid":"158d000153db73","short_id":4914,"data":"{\"voltage\":3015,\"status\":\"unknown\"}"} (125 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"plug","sid":"158d000127883b","short_id":52305,"data":"{\"voltage\":3600,\"status\":\"unknown\",\"inuse\":\"0\"}"} (140 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"sensor_ht","sid":"158d0001581523","short_id":52585,"data":"{\"voltage\":3035,\"temperature\":\"2287\",\"humidity\":\"4340\"}"} (153 bytes) from client 192.168.1.112:9898. Received data from sensor 158d0001581523 (sensorId: 52585) data: temperature 22.87, humidity 43.4. Sending sensor data to http://weatherhub.ru/aqara.php. Received {"cmd":"read_ack","model":"switch","sid":"158d0001101d54","short_id":3344,"data":"{\"voltage\":3032}"} (102 bytes) from client 192.168.1.112:9898. Received {"cmd":"heartbeat","model":"gateway","sid":"f0b429cc178e","short_id":"0","token":"oypMd4l87xHIR6oP","data":"{\"ip\":\"192.168.1.112\"}"} (136 bytes) from client 192.168.1.112:4321.
", "sid": "f0b429cc178e", "token": "GVke0tYsRZ5zlXWc", "data": "[\" 158d00015b2f98 \ ", \" 158d0001560c23 \ ", \" 158d00013eccc6 \ ", root@raspberrypi:/home/nodejs# nodejs sensor.js Starting Aqara daemon... Sending WhoIs request to a multicast address 224.0.0.50:4321. Starting a UDP server, listening on port 9898. Received {"cmd":"iam","port":"9898","sid":"f0b429cc178e","model":"gateway","ip":"192.168.1.112"} (87 bytes) from client 192.168.1.112:4321. Requesting devices list... Received {"cmd":"get_id_list_ack","sid":"f0b429cc178e","token":"GVke0tYsRZ5zlXWc","data":"[\"158d00015b2f98\",\"158d0001560c23\",\"158d00013eccc6\",\"158d000153db73\",\"158d000127883b\",\"158d0001581523\",\"158d0001101d54\"]"} (217 bytes) from client 192.168.1.112:9898. Received devices list: 7 device(s) connected. Sending {"cmd":"read","sid":"158d00015b2f98"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001560c23"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d00013eccc6"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d000153db73"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d000127883b"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001581523"} to 192.168.1.112:9898. Sending {"cmd":"read","sid":"158d0001101d54"} to 192.168.1.112:9898. Received {"cmd":"read_ack","model":"sensor_ht","sid":"158d00015b2f98","short_id":20046,"data":"{\"voltage\":2975,\"temperature\":\"2297\",\"humidity\":\"4190\"}"} (153 bytes) from client 192.168.1.112:9898. Received data from sensor 158d00015b2f98 (sensorId: 20046) data: temperature 22.97, humidity 41.9. Sending sensor data to http://weatherhub.ru/aqara.php. Received {"cmd":"read_ack","model":"motion","sid":"158d0001560c23","short_id":41212,"data":"{\"voltage\":3075}"} (103 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"switch","sid":"158d00013eccc6","short_id":4019,"data":"{\"voltage\":3042}"} (102 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"magnet","sid":"158d000153db73","short_id":4914,"data":"{\"voltage\":3015,\"status\":\"unknown\"}"} (125 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"plug","sid":"158d000127883b","short_id":52305,"data":"{\"voltage\":3600,\"status\":\"unknown\",\"inuse\":\"0\"}"} (140 bytes) from client 192.168.1.112:9898. Received {"cmd":"read_ack","model":"sensor_ht","sid":"158d0001581523","short_id":52585,"data":"{\"voltage\":3035,\"temperature\":\"2287\",\"humidity\":\"4340\"}"} (153 bytes) from client 192.168.1.112:9898. Received data from sensor 158d0001581523 (sensorId: 52585) data: temperature 22.87, humidity 43.4. Sending sensor data to http://weatherhub.ru/aqara.php. Received {"cmd":"read_ack","model":"switch","sid":"158d0001101d54","short_id":3344,"data":"{\"voltage\":3032}"} (102 bytes) from client 192.168.1.112:9898. Received {"cmd":"heartbeat","model":"gateway","sid":"f0b429cc178e","short_id":"0","token":"oypMd4l87xHIR6oP","data":"{\"ip\":\"192.168.1.112\"}"} (136 bytes) from client 192.168.1.112:4321.
Source: https://habr.com/ru/post/370999/
All Articles