iobroker.device-watcher
Version:
1,169 lines (1,089 loc) • 84.5 kB
JavaScript
const translations = require("./translations");
const tools = require("./tools");
/**
* @param {object} adptName - Adaptername of devices
*/
async function createDPsForEachAdapter(adaptr, adptName) {
await adaptr.setObjectNotExistsAsync(`devices.${adptName}`, {
type: 'channel',
common: {
name: adptName,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.offlineCount`, {
type: 'state',
common: {
name: {
en: 'Number of devices offline',
de: 'Anzahl der Geräte offline',
ru: 'Количество устройств оффлайн',
pt: 'Número de dispositivos offline',
nl: 'Aantal offline apparaten',
fr: 'Nombre de dispositifs hors ligne',
it: 'Numero di dispositivi offline',
es: 'Número de dispositivos sin conexión',
pl: 'Liczba urządzeń offline',
'zh-cn': '离线设备数量',
},
type: 'number',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.offlineList`, {
type: 'state',
common: {
name: {
en: 'List of offline devices',
de: 'Liste der Offline-Geräte',
ru: 'Список оффлайн устройств',
pt: 'Lista de dispositivos offline',
nl: 'Lijst van offline apparaten',
fr: 'Liste des dispositifs hors ligne',
it: 'Elenco dei dispositivi offline',
es: 'Lista de dispositivos sin conexión',
pl: 'Lista urządzeń offline',
'zh-cn': '离线设备列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceOffline`, {
type: 'state',
common: {
name: {
en: 'Is one device offline',
de: 'Ist ein Gerät offline',
ru: 'Есть ли одно устройство оффлайн',
pt: 'Há um dispositivo offline',
nl: 'Is er een apparaat offline',
fr: 'Y a-t-il un appareil hors ligne',
it: 'C\'è un dispositivo offline',
es: '¿Hay un dispositivo sin conexión?',
pl: 'Czy jedno urządzenie jest offline',
uk: 'Чи є один пристрій офлайн',
'zh-cn': '是否有一台设备离线',
},
type: 'boolean',
role: 'state',
read: true,
write: false,
def: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.listAllRawJSON`, {
type: 'state',
common: {
name: {
en: 'JSON RAW List of all devices',
de: 'JSON RAW Liste aller Geräte',
ru: 'JSON RAW Список всех устройств',
pt: 'JSON RAW Lista de todos os dispositivos',
nl: 'JSON RAW Lijst van alle apparaten',
fr: 'JSON RAW Liste de tous les dispositifs',
it: 'JSON RAW Elenco di tutti i dispositivi',
es: 'JSON RAW Lista de todos los dispositivos',
pl: 'JSON RAW Lista wszystkich urządzeń',
uk: 'JSON RAW Список усіх пристроїв',
'zh-cn': 'JSON RAW 所有设备列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.listAll`, {
type: 'state',
common: {
name: {
en: 'List of all devices',
de: 'Liste aller Geräte',
ru: 'Список всех устройств',
pt: 'Lista de todos os dispositivos',
nl: 'Lijst van alle apparaten',
fr: 'Liste de tous les dispositifs',
it: 'Elenco di tutti i dispositivi',
es: 'Lista de todos los dispositivos',
pl: 'Lista wszystkich urządzeń',
'zh-cn': '所有设备的列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.linkQualityList`, {
type: 'state',
common: {
name: {
en: 'List of devices with signal strength',
de: 'Liste der Geräte mit Signalstärke',
ru: 'Список устройств с уровнем сигнала',
pt: 'Lista de dispositivos com força de sinal',
nl: 'Lijst van apparaten met signaalkracht',
fr: 'Liste des dispositifs avec force de signal',
it: 'Elenco dei dispositivi con forza del segnale',
es: 'Lista de dispositivos con fuerza de señal',
pl: 'Lista urządzeń z siłą sygnału',
'zh-cn': '具有信号强度的设备列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.countAll`, {
type: 'state',
common: {
name: {
en: 'Number of all devices',
de: 'Anzahl aller Geräte',
ru: 'Количество всех устройств',
pt: 'Número de todos os dispositivos',
nl: 'Aantal van alle apparaten',
fr: 'Nombre de tous les appareils',
it: 'Numero di tutti i dispositivi',
es: 'Número de todos los dispositivos',
pl: 'Liczba wszystkich urządzeń',
'zh-cn': '所有设备的数量',
},
type: 'number',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.batteryList`, {
type: 'state',
common: {
name: {
en: 'List of devices with battery state',
de: 'Liste der Geräte mit Batteriezustand',
ru: 'Список устройств с состоянием батареи',
pt: 'Lista de dispositivos com estado da bateria',
nl: 'Lijst van apparaten met batterijstatus',
fr: 'Liste des appareils avec état de batterie',
it: 'Elenco dei dispositivi con stato della batteria',
es: 'Lista de dispositivos con estado de batería',
pl: 'Lista urządzeń ze stanem baterii',
'zh-cn': '具有电池状态的设备列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.lowBatteryList`, {
type: 'state',
common: {
name: {
en: 'List of devices with low battery state',
de: 'Liste der Geräte mit niedrigem Batteriezustand',
ru: 'Список устройств с низким уровнем заряда батареи',
pt: 'Lista de dispositivos com baixo estado da bateria',
nl: 'Lijst van apparaten met lage batterijstatus',
fr: 'Liste des appareils à faible état de batterie',
it: 'Elenco di dispositivi con stato di batteria basso',
es: 'Lista de dispositivos con estado de batería bajo',
pl: 'Lista urządzeń o niskim stanie baterii',
'zh-cn': '低电量设备列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.lowBatteryCount`, {
type: 'state',
common: {
name: {
en: 'Number of devices with low battery',
de: 'Anzahl der Geräte mit niedriger Batterie',
ru: 'Количество устройств с низким зарядом батареи',
pt: 'Número de dispositivos com bateria baixa',
nl: 'Aantal apparaten met lage batterij',
fr: 'Nombre de dispositifs avec batterie faible',
it: 'Numero di dispositivi con batteria scarica',
es: 'Número de dispositivos con batería baja',
pl: 'Liczba urządzeń z niskim poziomem baterii',
'zh-cn': '低电量设备的数量',
},
type: 'number',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceLowBat`, {
type: 'state',
common: {
name: {
en: 'Is one device with low battery',
de: 'Ist ein Gerät mit niedrigem Akku',
ru: 'Есть ли устройство с низким зарядом батареи',
pt: 'É um dispositivo com bateria baixa',
nl: 'Is er een apparaat met lage batterij',
fr: 'Y a-t-il un appareil avec batterie faible',
it: 'C\'è un dispositivo con batteria scarica',
es: '¿Hay un dispositivo con batería baja?',
pl: 'Czy jest jedno urządzenie z niskim poziomem baterii',
uk: 'Чи є пристрій з низьким зарядом батареї',
'zh-cn': '是否有设备电量低',
},
type: 'boolean',
role: 'state',
read: true,
write: false,
def: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.batteryCount`, {
type: 'state',
common: {
name: {
en: 'Number of devices with battery',
de: 'Anzahl der Geräte mit Batterie',
ru: 'Количество устройств с батареей',
pt: 'Número de dispositivos com bateria',
nl: 'Aantal apparaten met batterij',
fr: 'Nombre de dispositifs avec batterie',
it: 'Numero di dispositivi con batteria',
es: 'Número de dispositivos con batería',
pl: 'Liczba urządzeń z baterią',
'zh-cn': '带电池的设备数量',
},
type: 'number',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.upgradableCount`, {
type: 'state',
common: {
name: {
en: 'Number of devices with available updates',
de: 'Anzahl der Geräte mit verfügbaren Updates',
ru: 'Количество устройств с доступными обновлениями',
pt: 'Número de dispositivos com atualizações disponíveis',
nl: 'Aantal apparaten met beschikbare updates',
fr: 'Nombre de dispositifs avec mises à jour disponibles',
it: 'Numero di dispositivi con aggiornamenti disponibili',
es: 'Número de dispositivos con actualizaciones disponibles',
pl: 'Liczba urządzeń z dostępnymi aktualizacjami',
uk: 'Кількість пристроїв з доступними оновленнями',
'zh-cn': '具有可用更新的设备数量',
},
type: 'number',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.upgradableList`, {
type: 'state',
common: {
name: {
en: 'JSON List of devices with available updates',
de: 'JSON Liste der Geräte mit verfügbaren Updates',
ru: 'JSON список устройств с доступными обновлениями',
pt: 'JSON Lista de dispositivos com atualizações disponíveis',
nl: 'JSON Lijst van apparaten met beschikbare updates',
fr: 'JSON Liste des appareils avec mises à jour disponibles',
it: 'JSON Elenco dei dispositivi con aggiornamenti disponibili',
es: 'JSON Lista de dispositivos con actualizaciones disponibles',
pl: 'JSON Lista urządzeń z dostępnymi aktualizacjami',
uk: 'JSON список пристроїв з доступними оновленнями',
'zh-cn': '具有可用更新的设备的 JSON 列表',
},
type: 'array',
role: 'json',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${adptName}.oneDeviceUpdatable`, {
type: 'state',
common: {
name: {
en: 'Is one device updatable',
de: 'Ist ein Gerät aktualisierbar',
ru: 'Можно ли обновить одно устройство',
pt: 'É um dispositivo atualizável',
nl: 'Is er een apparaat dat kan worden bijgewerkt',
fr: "Y a-t-il un appareil qui peut être mis à jour",
it: 'C\'è un dispositivo aggiornabile',
es: '¿Hay un dispositivo actualizable?',
pl: 'Czy jest jedno urządzenie do zaktualizowania',
uk: 'Чи є пристрій, який можна оновити',
'zh-cn': '是否有设备可更新',
},
type: 'boolean',
role: 'state',
read: true,
write: false,
def: false,
},
native: {},
});
}
/**
* delete datapoints for each adapter
* @param {object} adptName - Adaptername of devices
*/
async function deleteDPsForEachAdapter(adaptr, adptName) {
await adaptr.delObjectAsync(`devices.${adptName}`);
await adaptr.delObjectAsync(`devices.${adptName}.offlineCount`);
await adaptr.delObjectAsync(`devices.${adptName}.offlineList`);
await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceOffline`);
await adaptr.delObjectAsync(`devices.${adptName}.listAllRawJSON`);
await adaptr.delObjectAsync(`devices.${adptName}.listAll`);
await adaptr.delObjectAsync(`devices.${adptName}.linkQualityList`);
await adaptr.delObjectAsync(`devices.${adptName}.countAll`);
await adaptr.delObjectAsync(`devices.${adptName}.batteryList`);
await adaptr.delObjectAsync(`devices.${adptName}.lowBatteryList`);
await adaptr.delObjectAsync(`devices.${adptName}.lowBatteryCount`);
await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceLowBat`);
await adaptr.delObjectAsync(`devices.${adptName}.batteryCount`);
await adaptr.delObjectAsync(`devices.${adptName}.upgradableCount`);
await adaptr.delObjectAsync(`devices.${adptName}.upgradableList`);
await adaptr.delObjectAsync(`devices.${adptName}.oneDeviceUpdatable`);
}
/**
* create HTML list datapoints
* @param {object} [adptName] - Adaptername of devices
**/
async function createHtmlListDatapoints(adaptr, adptName) {
let dpSubFolder;
//write the datapoints in subfolders with the adaptername otherwise write the dP's in the root folder
if (adptName) {
dpSubFolder = `${adptName}.`;
} else {
dpSubFolder = '';
}
await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}offlineListHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of offline devices',
de: 'HTML Liste der Offline-Geräte',
ru: 'HTML список оффлайн устройств',
pt: 'HTML Lista de dispositivos offline',
nl: 'HTML Lijst van offline apparaten',
fr: 'HTML Liste des dispositifs hors ligne',
it: 'HTML Elenco dei dispositivi offline',
es: 'HTML Lista de dispositivos sin conexión',
pl: 'HTML Lista urządzeń offline',
'zh-cn': 'HTML 离线设备列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}linkQualityListHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of devices with signal strength',
de: 'HTML Liste der Geräte mit Signalstärke',
ru: 'HTML список устройств с уровнем сигнала',
pt: 'HTML Lista de dispositivos com força de sinal',
nl: 'HTML Lijst van apparaten met signaalkracht',
fr: 'HTML Liste des dispositifs avec force de signal',
it: 'HTML Elenco dei dispositivi con forza del segnale',
es: 'HTML Lista de dispositivos con fuerza de señal',
pl: 'HTML Lista urządzeń z siłą sygnału',
'zh-cn': 'HTML 具有信号强度的设备列表',
},
type: 'string',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}batteryListHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of devices with battery state',
de: 'HTML Liste der Geräte mit Batteriezustand',
ru: 'HTML список устройств с состоянием батареи',
pt: 'HTML Lista de dispositivos com estado da bateria',
nl: 'HTML Lijst van apparaten met batterijstatus',
fr: 'HTML Liste des appareils avec état de batterie',
it: 'HTML Elenco dei dispositivi con stato della batteria',
es: 'HTML Lista de dispositivos con estado de batería',
pl: 'HTML Lista urządzeń ze stanem baterii',
'zh-cn': 'HTML 具有电池状态的设备列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`devices.${dpSubFolder}lowBatteryListHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of devices with low battery state',
de: 'HTML Liste der Geräte mit niedrigem Batteriezustand',
ru: 'HTML список устройств с низким уровнем заряда батареи',
pt: 'HTML Lista de dispositivos com baixo estado da bateria',
nl: 'HTML Lijst van apparaten met lage batterijstatus',
fr: 'HTML Liste des appareils à faible état de batterie',
it: 'HTML Elenco di dispositivi con stato di batteria basso',
es: 'HTML Lista de dispositivos con estado de batería bajo',
pl: 'HTML Lista urządzeń o niskim stanie baterii',
'zh-cn': 'HTML 低电量设备列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
}
/**
* delete html datapoints
* @param {object} [adptName] - Adaptername of devices
**/
async function deleteHtmlListDatapoints(adaptr, adptName) {
// delete the datapoints in subfolders with the adaptername otherwise delete the dP's in the root folder
let dpSubFolder;
if (adptName) {
dpSubFolder = `${adptName}.`;
} else {
dpSubFolder = '';
}
await adaptr.delObjectAsync(`devices.${dpSubFolder}offlineListHTML`);
await adaptr.delObjectAsync(`devices.${dpSubFolder}linkQualityListHTML`);
await adaptr.delObjectAsync(`devices.${dpSubFolder}batteryListHTML`);
await adaptr.delObjectAsync(`devices.${dpSubFolder}lowBatteryListHTML`);
}
/**
* create HTML list datapoints for instances
**/
async function createHtmlListDatapointsInstances(adaptr) {
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists`, {
type: 'channel',
common: {
name: {
en: 'HTML lists for adapter and instances',
de: 'HTML-Listen für Adapter und Instanzen',
ru: 'HTML списки для адаптера и экземпляров',
pt: 'Listas HTML para adaptador e instâncias',
nl: 'HTML lijsten voor adapter en instanties',
fr: "Listes HTML pour l'adaptateur et les instances",
it: 'Elenchi HTML per adattatore e istanze',
es: 'Listas HTML para adaptador e instancias',
pl: 'Listy HTML dla adaptera i instancji',
uk: 'HTML списки для адаптера та екземплярів',
'zh-cn': '适配器和实例的 HTML 列表',
},
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAllInstancesHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of all instances',
de: 'HTML Liste aller Instanzen',
ru: 'HTML список всех экземпляров',
pt: 'HTML Lista de todas as instâncias',
nl: 'HTML Lijst van alle instanties',
fr: 'HTML Liste de toutes les instances',
it: 'HTML Elenco di tutte le istanze',
es: 'HTML Lista de todas las instancias',
pl: 'HTML Lista wszystkich instancji',
uk: 'HTML список усіх екземплярів',
'zh-cn': 'HTML 所有实例的列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAllActiveInstancesHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of all active instances',
de: 'HTML Liste aller aktiven Instanzen',
ru: 'HTML список всех активных экземпляров',
pt: 'HTML Lista de todas as instâncias ativas',
nl: 'HTML Lijst van alle actieve instanties',
fr: 'HTML Liste de toutes les instances actives',
it: 'HTML Elenco di tutte le istanze attive',
es: 'HTML Lista de todas las instancias activas',
pl: 'HTML Lista wszystkich aktywnych instancji',
uk: 'HTML список усіх активних екземплярів',
'zh-cn': 'HTML 所有活动实例的列表',
},
type: 'string',
role: 'value',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listDeactivatedInstancesHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of all deactivated instances',
de: 'HTML Liste aller deaktivierten Instanzen',
ru: 'HTML список всех деактивированных экземпляров',
pt: 'HTML Lista de todas as instâncias desativadas',
nl: 'HTML Lijst van alle gedeactiveerde instanties',
fr: 'HTML Liste de toutes les instances désactivées',
it: 'HTML Elenco di tutte le istanze disattivate',
es: 'HTML Lista de todas las instancias desactivadas',
pl: 'HTML Lista wszystkich dezaktywowanych instancji',
uk: 'HTML список усіх деактивованих екземплярів',
'zh-cn': 'HTML 所有已停用实例的列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listInstancesErrorHTML`, {
type: 'state',
common: {
name: {
en: 'HTML List of instances with error',
de: 'HTML Liste der Instanzen mit Fehler',
ru: 'HTML список экземпляров с ошибкой',
pt: 'HTML Lista de instâncias com erro',
nl: 'HTML Lijst van instanties met fouten',
fr: 'HTML Liste des instances avec erreur',
it: 'HTML Elenco delle istanze con errore',
es: 'HTML Lista de instancias con error',
pl: 'HTML Lista instancji z błędem',
uk: 'HTML список екземплярів з помилкою',
'zh-cn': 'HTML 含错误实例的列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
await adaptr.setObjectNotExistsAsync(`adapterAndInstances.HTML_Lists.listAdapterUpdatesHTML`, {
type: 'state',
common: {
name: {
en: 'HTML list of adapters with available updates',
de: 'HTML-Liste der Adapter mit verfügbaren Updates',
ru: 'HTML список адаптеров с доступными обновлениями',
pt: 'Lista HTML de adaptadores com atualizações disponíveis',
nl: 'HTML lijst van adapters met beschikbare updates',
fr: 'Liste HTML des adaptateurs avec mises à jour disponibles',
it: 'Elenco HTML degli adattatori con aggiornamenti disponibili',
es: 'Lista HTML de adaptadores con actualizaciones disponibles',
pl: 'Lista adapterów HTML z dostępnymi aktualizacjami',
uk: 'HTML список адаптерів з доступними оновленнями',
'zh-cn': 'HTML 具有可用更新的适配器列表',
},
type: 'string',
role: 'html',
read: true,
write: false,
},
native: {},
});
}
/**
* delete html datapoints for instances
**/
async function deleteHtmlListDatapointsInstances(adaptr) {
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAllInstancesHTML`);
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAllActiveInstancesHTML`);
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listDeactivatedInstancesHTML`);
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listInstancesErrorHTML`);
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists.listAdapterUpdatesHTML`);
await adaptr.delObjectAsync(`adapterAndInstances.HTML_Lists`);
}
/*=============================================
= functions to create html lists =
=============================================*/
/**
* @param {string} type - type of list
* @param {object} devices - Device
* @param {number} deviceCount - Counted devices
* @param {object} isLowBatteryList - list Low Battery Devices
*/
async function createListHTML(adaptr, type, devices, deviceCount, isLowBatteryList) {
let html;
switch (type) {
case 'linkQualityList':
devices = devices.sort((a, b) => {
a = a.Device || '';
b = b.Device || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.Link_quality_devices[adaptr.config.userSelectedLanguage]]}:<font> ${deviceCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=right>${[translations.Signal_strength[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const device of devices) {
html += `<tr>
<td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=right><font>${device[translations.Signal_strength[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
html += '</table>';
break;
case 'offlineList':
devices = devices.sort((a, b) => {
a = a.Device || '';
b = b.Device || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.offline_devices[adaptr.config.userSelectedLanguage]]}: <font color=${deviceCount === 0 ? '#3bcf0e' : 'orange'}>${deviceCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Last_Contact[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const device of devices) {
html += `<tr>
<td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font color=orange>${device[translations.Last_Contact[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
html += '</table>';
break;
case 'batteryList':
devices = devices.sort((a, b) => {
a = a.Device || '';
b = b.Device || '';
return a.localeCompare(b);
});
html = `<center>
<b>${isLowBatteryList === true ? `${[translations.low[adaptr.config.userSelectedLanguage]]} ` : ''}${[translations.battery_devices[adaptr.config.userSelectedLanguage]]}:
<font color=${isLowBatteryList === true ? (deviceCount > 0 ? 'orange' : '#3bcf0e') : ''}>${deviceCount}</b></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Device[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=120>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=${isLowBatteryList ? 'center' : 'right'}>${[translations.Battery[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const device of devices) {
html += `<tr>
<td><font>${device[translations.Device[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${device[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>`;
if (isLowBatteryList) {
html += `<td align=center><font color=orange>${device[translations.Battery[adaptr.config.userSelectedLanguage]]}</font></td>`;
} else {
html += `<td align=right><font color=#3bcf0e>${device[translations.Battery[adaptr.config.userSelectedLanguage]]}</font></td>`;
}
html += `</tr>`;
}
html += '</table>';
break;
}
return html;
}
/**
* @param {string} type - type of list
* @param {object} instances - Instance
* @param {number} instancesCount - Counted devices
*/
async function createListHTMLInstances(adaptr, type, instances, instancesCount) {
let html;
switch (type) {
case 'allInstancesList':
instances = instances.sort((a, b) => {
a = a.Instance || '';
b = b.Instance || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.All_Instances[adaptr.config.userSelectedLanguage]]}:<font> ${instancesCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const instanceData of instances) {
html += `<tr>
<td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
html += '</table>';
break;
case 'allActiveInstancesList':
instances = instances.sort((a, b) => {
a = a.Instance || '';
b = b.Instances || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.Active_Instances[adaptr.config.userSelectedLanguage]]}: <font> ${instancesCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const instanceData of instances) {
html += `<tr>
<td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
html += '</table>';
break;
case 'errorInstanceList':
instances = instances.sort((a, b) => {
a = a.Instance || '';
b = b.Instances || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.Error_Instances[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const instanceData of instances) {
html += `<tr>
<td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
html += '</table>';
break;
case 'deactivatedInstanceList':
instances = instances.sort((a, b) => {
a = a.Instance || '';
b = b.Instances || '';
return a.localeCompare(b);
});
html = `<center>
<b>${[translations.Deactivated_Instances[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Instance[adaptr.config.userSelectedLanguage]]}</th>
<th align=center width=180>${[translations.Status[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const instanceData of instances) {
if (!instanceData.isAlive) {
html += `<tr>
<td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Instance[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font color=orange>${instanceData[translations.Status[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
}
html += '</table>';
break;
case 'updateAdapterList':
html = `<center>
<b>${[translations.Updatable_adapters[adaptr.config.userSelectedLanguage]]}: <font color=${instancesCount === 0 ? '#3bcf0e' : 'orange'}>${instancesCount}</b><small></small></font>
<p></p>
</center>
<table width=100%>
<tr>
<th align=left>${[translations.Adapter[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Installed_Version[adaptr.config.userSelectedLanguage]]}</th>
<th align=center>${[translations.Available_Version[adaptr.config.userSelectedLanguage]]}</th>
</tr>
<tr>
<td colspan="5"><hr></td>
</tr>`;
for (const instanceData of instances.values()) {
if (instanceData.updateAvailable !== ' - ') {
html += `<tr>
<td><font>${instanceData[translations.Adapter[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font>${instanceData[translations.Installed_Version[adaptr.config.userSelectedLanguage]]}</font></td>
<td align=center><font color=orange>${instanceData[translations.Available_Version[adaptr.config.userSelectedLanguage]]}</font></td>
</tr>`;
}
}
html += '</table>';
break;
}
return html;
}
/**
* create blacklist
*/
async function createBlacklist(adaptr) {
adaptr.log.debug(`Start the function createBlacklist`);
// DEVICES
const myBlacklist = adaptr.config.tableBlacklist;
if (myBlacklist.length >= 1) {
for (const i in myBlacklist) {
try {
const blacklistParse = tools.parseData(myBlacklist[i].devices);
// push devices in list to ignor device in lists
if (myBlacklist[i].checkIgnorLists) {
adaptr.blacklistLists.push(blacklistParse.path);
}
if (myBlacklist[i].checkIgnorAdapterLists) {
adaptr.blacklistAdapterLists.push(blacklistParse.path);
}
// push devices in list to ignor device in notifications
if (myBlacklist[i].checkIgnorNotify) {
adaptr.blacklistNotify.push(blacklistParse.path);
}
} catch (error) {
adaptr.log.error(`[createBlacklist] - ${error}`);
}
if (adaptr.blacklistLists.length >= 1) adaptr.log.info(`Found devices/services on blacklist for lists: ${adaptr.blacklistLists}`);
if (adaptr.blacklistAdapterLists.length >= 1) adaptr.log.info(`Found devices/services on blacklist for own adapter lists: ${adaptr.blacklistAdapterLists}`);
if (adaptr.blacklistNotify.length >= 1) adaptr.log.info(`Found devices/services on blacklist for notifications: ${adaptr.blacklistNotify}`);
}
}
// INSTANCES
const myBlacklistInstances = adaptr.config.tableBlacklistInstances;
if (myBlacklistInstances.length >= 1) {
for (const i in myBlacklistInstances) {
try {
const blacklistParse = tools.parseData(myBlacklistInstances[i].instances);
// push devices in list to ignor device in lists
if (myBlacklistInstances[i].checkIgnorLists) {
adaptr.blacklistInstancesLists.push(blacklistParse.instanceID);
}
// push devices in list to ignor device in notifications
if (myBlacklistInstances[i].checkIgnorNotify) {
adaptr.blacklistInstancesNotify.push(blacklistParse.instanceID);
}
} catch (error) {
adaptr.log.error(`[createBlacklist] - ${error}`);
}
}
if (adaptr.blacklistInstancesLists.length >= 1) adaptr.log.info(`Found instances items on blacklist for lists: ${adaptr.blacklistInstancesLists}`);
if (adaptr.blacklistInstancesNotify.length >= 1) adaptr.log.info(`Found instances items on blacklist for notifications: ${adaptr.blacklistInstancesNotify}`);
}
}
/**
* create list with time for instances
*/
async function createTimeListInstances(adaptr) {
// INSTANCES
const userTimeListInstances = adaptr.config.tableTimeInstance;
if (userTimeListInstances.length >= 1) {
for (const i in userTimeListInstances) {
try {
const userTimeListparse = tools.parseData(userTimeListInstances[i].instancesTime);
// push devices in list to ignor device in lists
adaptr.userTimeInstancesList.set(userTimeListparse.instanceName, {
deactivationTime: userTimeListInstances[i].deactivationTime,
errorTime: userTimeListInstances[i].errorTime,
});
} catch (error) {
adaptr.log.error(`[createTimeListInstances] - ${error}`);
}
}
if (adaptr.userTimeInstancesList.size >= 1) adaptr.log.info(`Found instances items on lists for timesettings: ${Array.from(adaptr.userTimeInstancesList.keys())}`);
}
}
/**
* @param {object} i - Device Object
*/
async function createData(adaptr, i) {
try {
const devices = await adaptr.getForeignStatesAsync(adaptr.selAdapter[i].Selektor);
const adapterID = adaptr.selAdapter[i].adapterID;
/*---------- Start of loop ----------*/
for (const [id] of Object.entries(devices)) {
if (id.endsWith('.')) continue;
const mainSelector = id;
/*=============================================
= get Instanz =
=============================================*/
const instance = id.slice(0, id.indexOf('.') + 2);
const instanceDeviceConnectionDP = `${instance}.info.connection`;
const instancedeviceConnected = await tools.getInitValue(adaptr, instanceDeviceConnectionDP);
adaptr.subscribeForeignStates(instanceDeviceConnectionDP);
adaptr.subscribeForeignObjects(`${adaptr.selAdapter[i].Selektor}`);
// adaptr.subscribeForeignObjects('*');
//adaptr.subscribeForeignStates('*');
/*=============================================
= Get device name =
=============================================*/
const deviceName = await adaptr.getDeviceName(id, i);
/*=============================================
= Get adapter name =
=============================================*/
const adapter = adaptr.selAdapter[i].adapter;
/*=============================================
= Get path to datapoints =
=============================================*/
const currDeviceString = id.slice(0, id.lastIndexOf('.') + 1 - 1);
const shortCurrDeviceString = currDeviceString.slice(0, currDeviceString.lastIndexOf('.') + 1 - 1);
// subscribe to object device path
adaptr.subscribeForeignStates(currDeviceString);
/*=============================================
= Get signal strength =
=============================================*/
let deviceQualityDP = currDeviceString + adaptr.selAdapter[i].rssiState;
let deviceQualityState;
switch (adapterID) {
case 'mihomeVacuum':
deviceQualityDP = shortCurrDeviceString + adaptr.selAdapter[i].rssiState;
deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
break;
case 'netatmo':
deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
if (!deviceQualityState) {
deviceQualityDP = currDeviceString + adaptr.selAdapter[i].rfState;
deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
}
break;
default:
deviceQualityState = await adaptr.getForeignStateAsync(deviceQualityDP);
break;
}
//subscribe to states
adaptr.subscribeForeignStates(deviceQualityDP);
const signalData = await adaptr.calculateSignalStrength(deviceQualityState, adapterID);
let linkQuality = signalData[0];
const linkQualityRaw = signalData[1];
/*=============================================
= Get battery data =
=============================================*/
let deviceBatteryStateDP;
let deviceBatteryState;
let batteryHealth;
let batteryHealthRaw;
let batteryUnitRaw;
let lowBatIndicator;
let isBatteryDevice;
let isLowBatDP;
let faultReportingDP;
let faultReportingState;
const deviceChargerStateDP = currDeviceString + adaptr.selAdapter[i].charger;
const deviceChargerState = await tools.getInitValue(adaptr, deviceChargerStateDP);
if (deviceChargerState === undefined || deviceChargerState === false) {
// Get battery states
switch (adapterID) {
case 'hmrpc':
deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
if (deviceBatteryState === undefined) {
deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].hmDNBattery;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
}
break;
case 'hueExt':
case 'mihomeVacuum':
case 'mqttNuki':
case 'loqedSmartLock':
deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].battery;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
if (deviceBatteryState === undefined) {
deviceBatteryStateDP = shortCurrDeviceString + adaptr.selAdapter[i].battery2;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
}
break;
default:
deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
if (deviceBatteryState === undefined) {
deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery2;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
if (deviceBatteryState === undefined) {
deviceBatteryStateDP = currDeviceString + adaptr.selAdapter[i].battery3;
deviceBatteryState = await tools.getInitValue(adaptr, deviceBatteryStateDP);
}
}
break;
}
// Get low bat states
isLowBatDP = currDeviceString + adaptr.selAdapter[i].isLowBat;
let deviceLowBatState = await tools.getInitValue(adaptr, isLowBatDP);
if (deviceLowBatState === undefined) {
isLowBatDP = currDeviceString + adaptr.selAdapter[i].isLowBat2;
d