@signalk/n2k-signalk
Version:
NMEA 2000 to SignalK conversion library
119 lines (106 loc) • 3.43 kB
JavaScript
// ALERT
const debug = require('debug')('n2k-signalk-126983')
const alertTypes = [
{
nmea: 'Emergency Alarm',
sk: 'emergency'
},
{
nmea: 'Alarm',
sk: 'alarm'
},
{
nmea: 'Warning',
sk: 'warn'
},
{
nmea: 'Caution',
sk: 'alert'
}
]
// Devices in the wild emit non-spec ALERT_TYPE values (e.g. 4) that
// canboatjs returns as raw integers. Default those to Caution → 'alert'
// so the notification still surfaces at the lowest severity.
const defaultAlertType = alertTypes[alertTypes.length - 1]
function resolveAlertType (rawAlertType) {
if (typeof rawAlertType === 'string') {
for (var i = 0; i < alertTypes.length; i++) {
if (alertTypes[i].nmea === rawAlertType) return alertTypes[i]
}
}
return defaultAlertType
}
module.exports = [
{
node: function (n2k, state) {
var resolved = resolveAlertType(n2k.fields.alertType)
var alertType = resolved.nmea.replace(/ /g, '').toLowerCase()
var alertCategory =
typeof n2k.fields.alertCategory === 'string'
? n2k.fields.alertCategory.toLowerCase()
: ''
var path =
'notifications.nmea.' +
alertType +
'.' +
alertCategory +
'.' +
n2k.fields.alertSystem +
'.' +
n2k.fields.alertId
debug('126983 path: ' + path)
return path
},
value: function (n2k, state) {
debug('126983 value')
var resolved = resolveAlertType(n2k.fields.alertType)
debug('126983 skstate: ' + resolved.sk)
var alertId = n2k.fields.alertId
var value = {
state: resolved.sk,
method: ['visual', 'sound'],
message: state.alerts[alertId].textDescription,
alertType: n2k.fields.alertType,
alertCategory: n2k.fields.alertCategory,
alertSystem: n2k.fields.alertSystem,
alertId: n2k.fields.alertId,
dataSourceNetworkIDNAME: n2k.fields.dataSourceNetworkIdName,
dataSourceInstance: n2k.fields.dataSourceInstance,
'dataSourceIndex-Source': n2k.fields.dataSourceIndexSource,
occurrence: n2k.fields.alertOccurrenceNumber,
temporarySilenceStatus: n2k.fields.temporarySilenceStatus,
acknowledgeStatus: n2k.fields.acknowledgeStatus,
escalationStatus: n2k.fields.escalationStatus,
temporarySilenceSupport: n2k.fields.temporarySilenceSupport,
acknowledgeSupport: n2k.fields.acknowledgeSupport,
escalationSupport: n2k.fields.escalationSupport,
acknowledgeSourceNetworkIDNAME:
n2k.fields.acknowledgeSourceNetworkIdName,
triggerCondition: n2k.fields.triggerCondition,
thresholdStatus: n2k.fields.thresholdStatus,
alertPriority: n2k.fields.alertPriority,
alertState: n2k.fields.alertState
}
//if the alert is silenced or acknowledged then dont alert in SK
if (
n2k.fields.temporarySilenceStatus == 'Yes' ||
n2k.fields.acknowledgeStatus == 'Yes'
) {
value.method = []
}
if (debug.enabled) {
debug('126983 value: ' + JSON.stringify(value, null, 2))
}
return value
},
filter: function (n2k, state) {
return (
n2k.fields.alertType !== undefined &&
n2k.fields.alertType !== null &&
typeof state === 'object' &&
state.alerts &&
state.alerts[n2k.fields.alertId]
)
}
}
]