LineBot溫濕度環控
200元可以搞定機房環控,電源就直接插在機房伺服器上的USB或是5V的USB充電器
可以在Line上動態設定高溫警示
除了溫濕度感應,也可搭配紅外線偵測,做機房人員入侵的偵測
也可以在Line上動態設定時間間隔回報機房溫濕度狀態
require('webduino-js');require('webduino-blockly');var linebot = require('linebot');var express = require('express');var bot = linebot({ channelId: '請輸入LineBot的channelId', channelSecret: '請輸入LineBot的channelSecret', channelAccessToken: '請輸入LineBot的channelAccessToken'});//以下的Webduino的device,請輸入自己webduino的DeviceIDvar myBoardVars={board: 'Smart', device: '這裡請輸入webduino的Device ID,前後引號不能去掉', transport: 'mqtt'};//注意:上面為連結Webduino Smart的連結語法,如果你的板子是webduino馬克一號或是Fly,請將上面的語法刪掉,並改成以下的連結語法。var myBoardVars={device: '這裡請輸入webduino的Device ID,前後引號不能去掉'};var dht;var myBoard;var reporting=false;//以下userId,可以把自己Line的userId,輸入上去,以確保這個LineBot只有您能夠使用,如果不知道自己Line的userId,在LineBot第一次執行時會顯示在Line上面。var userId;var interval_DHT=0;var temperatureWarning;var timeWarnig;var interval_DHT_str;//設定溫濕度感應器使用5號腳位var dht_pin=5;//設定警示溫度,預設35度var maxTemperature=35;//溫度過高警示,每10秒偵測一次var intervalCheck=10;bot.on('message', function(event) { var myReply=''; if (userId===undefined){ userId=event.source.userId; myReply='您在Line裡的userId為:'+userId+',您可以把它寫進程式裡,以確保本系統只有您可以使用!'; }else if (userId===event.source.userId){ if (event.message.type === 'text') { myReply=processText(event); } } else{ myReply='您並非這個環控系統的使用者!'; } event.reply(myReply).then(function(data) { // success console.log(myReply); }).catch(function(error) { // error console.log('error'); });});function processText(eve){ myMsg=eve.message.text; var myResult=''; if (myMsg==='溫度'){ if (!deviceIsConnected()) myResult='裝置未連接!'; else{ dht.read().then(function(){ myResult='溫度:'+dht.temperature+'度'; sendMessage(eve,myResult); }); } } else if (myMsg==='濕度'){ if (!deviceIsConnected()) myResult='裝置未連接!'; else{ dht.read().then(function(){ myResult='濕度:'+dht.humidity+'%'; sendMessage(eve,myResult); }); } } else if (myMsg==='停止時間回報'){ myResult='已停止時間回報'; clearInterval(timeWarnig); } else if (myMsg==='停止溫度警告'){ myResult='已停止溫度上限警告'; clearInterval(temperatureWarning); } else if (myMsg.indexOf('回報')>-1){ intervalDHT(myMsg); } else if (myMsg.indexOf('度警告')>-1){ setMaxTemperature(myMsg); } else myResult='您的指令我不能理解,我能夠了解的指令如下:\n溫度\n濕度\n每XX時回報\n每XX分回報\n每XX秒回報\n停止時間回報\nXX度警告\n停止溫度警告'; return myResult;}//傳送訊息的函式function sendMessage(eve,msg){ eve.reply(msg).then(function(data) { // success return true; }).catch(function(error) { // error return false; });}function intervalDHT(msg){ msg=msg.replace('回報',''); msg=msg.replace('每',''); var unitTime=1000; var unitStr=msg[msg.length-1]; if (!deviceIsConnected) bot.push(userId,'裝置未連接!'); else if (unitStr==='時' || unitStr==='分' || unitStr==='秒'){ if (unitStr==='秒') unitTime=1000; if (unitStr==='分') unitTime=60000; if (unitStr==='時') unitTime=3600000; msg=msg.substr(0,msg.length-1); if (isNaN(msg)){ bot.push(userId,'我看不懂這個時間設定,我能理解的命令是:每XX秒回報、每XX分回報、每XX時回報'); }else{ interval_DHT_str=msg+unitStr; interval_DHT=Number(msg)*unitTime; bot.push(userId,'時間回報已設定為每'+interval_DHT_str+'回報'); clearInterval(timeWarnig); timeWarnig=setInterval(setTimeWarnig,interval_DHT); } } else{ bot.push(userId,'我看不懂這個時間設定,我能理解的命令是:每XX秒回報、每XX分回報、每XX時回報'); }}boardReady(myBoardVars, true, function (board) { myBoard=board; board.systemReset(); board.samplingInterval = 50; dht = getDht(board, dht_pin);});function deviceIsConnected(){ if (myBoard===undefined){ return false; } else if (myBoard.isConnected===undefined){ return false; } else{ return myBoard.isConnected; }}function maxTemperatureCheck(){ var myMsg; if (userId!=undefined){ if (!deviceIsConnected()){ myMsg='裝置未連接!'; bot.push(userId,myMsg); }else{ dht.read().then(function(){ if (dht.temperature>=maxTemperature){ myMsg='溫度過高警示,警告溫度為'+maxTemperature+',現在溫度:'+dht.temperature; bot.push(userId,myMsg); } }); } }}function setMaxTemperature(msg){ msg=msg.replace('度警告',''); if (isNaN(msg)){ bot.push(userId,'我看不懂這個溫度設定,XX請指定為數字,指令為:XX度警告'); }else{ maxTemperature=Number(msg); bot.push(userId,'警告溫度已設為:'+msg+'度,超過時每'+intervalCheck+'秒警告'); clearInterval(temperatureWarning); temperatureWarning=setInterval(maxTemperatureCheck,intervalCheck*1000); }}function setTimeWarnig(){ var myMsg; if (userId!=undefined){ if (!deviceIsConnected()){ myMsg='裝置未連接!'; bot.push(userId,myMsg); }else{ dht.read().then(function(){ myMsg='目前溫度:'+dht.temperature+'度,濕度:'+dht.humidity+'%'; bot.push(userId,myMsg); }); } }}const app = express();const linebotParser = bot.parser();app.post('/', linebotParser);//因為 express 預設走 port 3000,而 heroku 上預設卻不是,要透過下列程式轉換var server = app.listen(process.env.PORT || 8080, function() { var port = server.address().port; console.log("App now running on port", port);});