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的DeviceID
var 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);
});