2024-12-02 17:06:49 +01:00
exports . id = 'thermometer' ;
exports . title = 'Thermometer' ;
exports . group = 'Worksys' ;
exports . color = '#5CB36D' ;
exports . input = 1 ;
exports . version = '1.0.3' ;
exports . output = [ "red" , "white" , "blue" ] ;
exports . icon = 'thermometer-three-quarters' ;
exports . readme = ` # Getting temperature values for RVO. In case of LM, you need device address. In case of unipi, evok sends values, in case thermometer is installed ` ;
const { errLogger , logger , monitor } = require ( './helper/logger' ) ;
const SEND _TO = {
debug : 0 ,
tb : 1 ,
dido _controller : 2
}
//read temperature - frequency
let timeoutMin = 5 ; //minutes
let NUMBER _OF _FAILURES _TO _SEND _ERROR = 13 ;
exports . install = function ( instance ) {
const { exec } = require ( 'child_process' ) ;
const { sendNotification } = require ( './helper/notification_reporter' ) ;
let startRead ;
let counter = 0 ;
let rvoTbName = "" ;
let temperatureAddress = "" ;
logger . debug ( exports . title , "installed" ) ;
instance . on ( "close" , function ( ) {
clearInterval ( startRead ) ;
} )
const main = function ( ) {
try {
if ( temperatureAddress === "" ) throw "Thermometer: temperatureAddress is not defined" ;
exec ( ` owread -C ${ temperatureAddress } /temperature ` , ( error , stdout , stderr ) => {
if ( ! error )
{
parseData ( stdout )
return ;
}
counter ++ ;
if ( counter == NUMBER _OF _FAILURES _TO _SEND _ERROR ) sendNotification ( "Thermometer_main" , rvoTbName , "thermometer_is_not_responding" , { } , { "Error" : error } , SEND _TO . tb , instance , "thermometer" ) ;
monitor . info ( "Thermometer is not responding" , error ) ;
instance . send ( SEND _TO . dido _controller , { status : "NOK-thermometer" } ) ;
} ) ;
}
catch ( err ) {
errLogger . error ( exports . title , err ) ;
clearInterval ( startRead ) ;
}
}
const parseData = function ( data ) {
data = parseFloat ( data ) ;
logger . debug ( "Thermometer" , data ) ;
if ( isNaN ( data ) ) {
errLogger . error ( "Thermometer sends invalid data" ) ;
return ;
}
if ( counter > NUMBER _OF _FAILURES _TO _SEND _ERROR ) //1 hour
{
instance . send ( SEND _TO . debug , "Thermometer - temperature data are comming again" ) ;
sendNotification ( "Thermometer_parseData" , rvoTbName , "thermometer_is_responding_again" , { } , "" , SEND _TO . tb , instance , "thermometer" ) ;
}
const values = {
"temperature" : Number ( data . toFixed ( 2 ) ) ,
}
instance . send ( SEND _TO . dido _controller , { values : values } ) ;
counter = 0 ;
}
instance . on ( "data" , _ => {
temperatureAddress = FLOW . GLOBALS . settings . temperature _address ;
rvoTbName = FLOW . GLOBALS . settings . rvoTbName ;
startRead = setInterval ( main , timeoutMin * 1000 * 60 ) ;
setTimeout ( main , 20000 ) ;
} )
} ;