Shinobi/libs/control/zwave.js

135 lines
4.6 KiB
JavaScript
Raw Normal View History

2022-06-17 07:29:57 +00:00
const zWaveAPI = require('shinobi-zwave')
module.exports = async (s,config,lang,app,io) => {
const addCredentialsToHostLink = (url,username,password) => {
if(url.indexOf('@') > -1){
return url
}else if(username){
const urlParts = url.split('://')
return [urlParts[0],'://',`${username}:${password || ''}@`,urlParts[1]].join('')
}else{
return url
}
}
function loadApplicationForGroup(user){
const userDetails = s.parseJSON(user.details);
s.debugLog('Z-Wave','Loading API',user.ke)
if(
!s.group[user.ke].zwave &&
userDetails.zwave === '1' &&
userDetails.zwave_host
){
const zWaveHost = addCredentialsToHostLink(
userDetails.zwave_host || config.zWaveHost,
userDetails.zwave_user,
userDetails.zwave_pass
).replace(/\/$/, '');
s.group[user.ke].zwave = zWaveAPI(zWaveHost,config.debugLogZwave || false)
s.debugLog('Z-Wave','Loaded API',zWaveHost)
}
}
function unloadApplicationForGroup(user){
s.group[user.ke].zwave = null
}
/**
* API : Z-Wave HTTP Handler
*/
function httpApiHandler(req,res){
s.auth(req.params,async (user) => {
const endData = {ok: true}
const actionFunction = req.params.action
const arguments = s.getPostData(req) || []
try{
const groupKey = req.params.ke
endData.response = await s.group[groupKey].zwave[actionFunction](...arguments)
}catch(err){
endData.ok = false
endData.err = err
s.debugLog(err)
}
s.closeJsonResponse(res,endData)
},res,req);
}
app.get(config.webPaths.apiPrefix+':auth/zwave/:ke/:action',httpApiHandler)
app.post(config.webPaths.apiPrefix+':auth/zwave/:ke/:action',httpApiHandler)
app.get(config.webPaths.apiPrefix+':auth/zwaveRaw/:ke',(req,res) => {
s.auth(req.params,async (user) => {
const groupKey = req.params.ke
const pathString = s.getPostData(req,'path')
if(!pathString){
res.end(lang['Not Found'])
return
}
s.group[groupKey].zwave.httpRequest(pathString).pipe(res)
},res,req);
})
s.definitions["Account Settings"].blocks["Z-Wave"] = {
"evaluation": "$user.details.use_zwave !== '0'",
"name": lang['Z-Wave'],
"id":"accSectionZwave",
"isSection": true,
"color": "blue",
"info": [
{
"name": "detail=zwave",
"selector":"u_zwave_bot",
"field": lang.Enabled,
"default": "0",
"example": "",
"fieldType": "select",
"possible": [
{
"name": lang.No,
"value": "0"
},
{
"name": lang.Yes,
"value": "1"
}
]
},
{
hidden: true,
"name": "detail=zwave_host",
"placeholder": "https://localhost:8083",
"field": lang.Host,
"form-group-class":"u_zwave_bot_input u_zwave_bot_1",
},
{
hidden: true,
"name": "detail=zwave_user",
"placeholder": lang["Username"],
"field": lang["Username"],
"form-group-class":"u_zwave_bot_input u_zwave_bot_1",
},
{
hidden: true,
"name": "detail=zwave_pass",
"placeholder": lang["Password"],
"fieldType": "password",
"field": lang["Password"],
"form-group-class":"u_zwave_bot_input u_zwave_bot_1",
}
]
}
s.definitions["Z-Wave Manager"] = {
"name": lang["Z-Wave Manager"],
blocks: {
"Container1": {
"evaluation": "$user.details.use_zwave !== '0'",
noHeader: true,
noDefaultSectionClasses: true,
"color": "green",
"section-pre-class": "col-md-8 search-parent",
"info": [
{
"id": "zwaveDevices",
"fieldType": "div",
},
]
}
}
}
s.loadGroupAppExtender(loadApplicationForGroup)
s.unloadGroupAppExtender(unloadApplicationForGroup)
}