Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
5cfd016
bump ZwaveJSUI to 11.11.0
Salvialf Feb 11, 2026
c830546
Add TCP remote gateway option in plugin configuration
Mips2648 Feb 11, 2026
e6db108
[Jenkins] Updated translation
Feb 12, 2026
8d193d4
bump ZwaveJSUI to 11.12.0
Salvialf Feb 21, 2026
423dbb0
[Jenkins] Updated translation
Feb 22, 2026
e413d6b
Chore: plugin requires jeedom 4.4 so no need to test version anymore
Mips2648 Feb 23, 2026
907bcf0
Refactor image handling and allow custom images if none exists alread…
Mips2648 Feb 23, 2026
8b37063
Add missing translations for messages in the notification center
Mips2648 Feb 23, 2026
7a389b2
[Jenkins] Updated translation
Feb 24, 2026
c0b445c
Update fgwpe.wall.plug.zw5.json
francoisd81 Feb 25, 2026
02769a6
Fix formatting in fibaro wall plug JSON file
Salvialf Feb 25, 2026
3e07be4
Merge pull request #32 from francoisd81/patch-1
Salvialf Feb 25, 2026
e360a91
[Jenkins] Updated translation
Feb 26, 2026
d8063e4
Fix minor issue on the statistics page
Mips2648 Mar 1, 2026
37c459a
Merge branch 'beta' of https://github.com/jeedom/plugin-zwavejs into …
Mips2648 Mar 1, 2026
888247b
[Jenkins] Updated translation
Mar 2, 2026
748d94a
- Ajout de la configuration *Shelly Qubino Wave Door/Window (QNDW-002…
Princeddn Mar 9, 2026
7fbdd16
[Jenkins] Updated translation
Mar 10, 2026
ff4bd32
Enhance getImage method to use user-uploaded custom images in priority
Mips2648 Mar 12, 2026
148fc8d
Merge branch 'beta' of https://github.com/jeedom/plugin-zwavejs into …
Mips2648 Mar 12, 2026
2dda005
adapt changelog
Mips2648 Mar 12, 2026
06c6355
adapt changelog
Salvialf Mar 12, 2026
5e0d0fb
[Jenkins] Updated translation
Mar 13, 2026
93de9d0
add specific config file for known boards
Salvialf Mar 16, 2026
064a332
Merge pull request #34 from jeedom/feat/add-specifig-config
Salvialf Mar 16, 2026
8f9f861
[Jenkins] Updated translation
Mar 17, 2026
0b07153
remove not needed anymore dependancy_info
Salvialf Mar 18, 2026
2aae19c
improve additionnal dependency check
Salvialf Mar 18, 2026
c044303
Merge pull request #35 from jeedom/fix/dependency-check
Salvialf Mar 20, 2026
fba1152
[Jenkins] Updated translation
Mar 21, 2026
16726d5
prepare stable changelog
Salvialf Mar 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 36 additions & 64 deletions core/class/zwavejs.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,13 @@ public static function configureSettings($_path) {
// $port = jeedom::getUsbMapping($port);
// exec(system::getCmdSudo() . 'chmod 777 ' . $port . ' > /dev/null 2>&1');
//}
$settings['zwave']['port'] = jeedom::getUsbMapping(config::byKey('port', __CLASS__));
$port = config::byKey('port', __CLASS__);
if ($port == 'tcp') {
$settings['zwave']['port'] = 'tcp://' . config::byKey('tcp_ip_port', __CLASS__);
} else {
$settings['zwave']['port'] = jeedom::getUsbMapping($port);
}

$settings['zwave']['commandsTimeout'] = 60;
$settings['zwave']['logLevel'] = 'error';
$settings['zwave']['logEnabled'] = true;
Expand Down Expand Up @@ -281,34 +287,11 @@ public static function postConfig_zwavejs_mode($_value) {
}

public static function additionnalDependancyCheck() {
if (config::byKey('zwavejs::mode', 'zwavejs') == 'distant') {
$return = array();
$return['state'] = 'ok';
return $return;
}
$return = array();
$return['state'] = 'ok';
if (config::byKey('lastDependancyInstallTime', __CLASS__) == '') {
$return['state'] = 'nok';
} else if (!file_exists(__DIR__ . '/../../resources/zwave-js-ui/node_modules')) {
$return['state'] = 'nok';
}
return $return;
}

public static function dependancy_info() {
if (config::byKey('zwavejs::mode', 'zwavejs') == 'distant') {
$return = array();
$return['state'] = 'ok';
return $return;
}
$return = array();
$return['progress_file'] = jeedom::getTmpFolder(__CLASS__) . '/dependance';
$return['state'] = 'ok';
if (config::byKey('lastDependancyInstallTime', __CLASS__) == '') {
$return['state'] = 'nok';
} else if (!file_exists(__DIR__ . '/../../resources/zwave-js-ui/node_modules')) {
$return['state'] = 'nok';
if (config::byKey('zwavejs::mode', __CLASS__) === 'local') {
if (!file_exists(__DIR__ . '/../../resources/zwave-js-ui/node_modules')) {
$return['state'] = 'nok';
}
}
return $return;
}
Expand All @@ -332,6 +315,16 @@ public static function deamon_info() {
if ($port == 'none') {
$return['launchable'] = 'nok';
$return['launchable_message'] = __("Le port n'est pas configuré", __FILE__);
} elseif ($port == 'tcp') {
if (config::byKey('tcp_ip_port', __CLASS__) == '') {
$return['launchable'] = 'nok';
$return['launchable_message'] = __("Le port TCP n'est pas configuré", __FILE__);
}
$parts = explode(':', config::byKey('tcp_ip_port', __CLASS__));
if (count($parts) != 2 || !is_numeric($parts[1])) {
$return['launchable'] = 'nok';
$return['launchable_message'] = __("Le port TCP n'est pas valide", __FILE__);
}
} else {
$port = jeedom::getUsbMapping($port);
if (is_array($port) || @!file_exists($port)) {
Expand Down Expand Up @@ -912,6 +905,7 @@ public static function handleNodeValueUpdate($_value_update) {
public static function handleNodeValueUpdateDirect($_nodeId, $_value_update) {
// log::add(__CLASS__, 'debug', '[' . __FUNCTION__ . '] ' . "Traitement d'un update de value d'un node direct");
//log::add(__CLASS__, 'debug', '[' . __FUNCTION__ . '] ' . $_nodeId . ' ' . json_encode($_value_update));
/** @var zwavejs */
$eqLogic = self::byLogicalId($_nodeId, __CLASS__);
$flatten = self::flatten_array($_value_update);
// log::add(__CLASS__, 'debug', json_encode($flatten, true));
Expand All @@ -927,11 +921,7 @@ public static function handleNodeValueUpdateDirect($_nodeId, $_value_update) {
if ($eqLogic->getConfiguration('missedWakeup', false)) {
$action = '<a href="/' . $eqLogic->getLinkToConfiguration() . '">' . __('Equipement', __FILE__) . '</a>';
if (config::byKey('notifyMissWakeup', __CLASS__, 1) == 1 && $eqLogic->getIsEnable() == 1) {
if (version_compare(jeedom::version(), '4.4.0', '>=')) {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de se réveiller après avoir raté au minimum 4 réveils.', $action, 'Awake-' . $eqLogic->getLogicalId(), true, 'alerting');
} else {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de se réveiller après avoir raté au minimum 4 réveils.', $action, 'Awake-' . $eqLogic->getLogicalId(), true);
}
message::add('zwavejs', sprintf(__("L'équipement : %s avec le nodeId : %s, vient de se réveiller après avoir raté au minimum 4 réveils.", __FILE__), $eqLogic->getHumanName(true), $eqLogic->getLogicalId()), $action, 'Awake-' . $eqLogic->getLogicalId(), true, 'alerting');
}
}
$eqLogic->setConfiguration('missedWakeup', false);
Expand All @@ -940,21 +930,13 @@ public static function handleNodeValueUpdateDirect($_nodeId, $_value_update) {
if ($data['status'] == 'Dead' && $currentValue == 'Alive') {
$action = '<a href="/' . $eqLogic->getLinkToConfiguration() . '">' . __('Equipement', __FILE__) . '</a>';
if (config::byKey('notifyDead', __CLASS__, 1) == 1 && $eqLogic->getIsEnable() == 1) {
if (version_compare(jeedom::version(), '4.4.0', '>=')) {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de passer au statut Dead.', $action, 'Dead-' . $eqLogic->getLogicalId(), true, 'alerting');
} else {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de passer au statut Dead.', $action, 'Dead-' . $eqLogic->getLogicalId(), true);
}
message::add('zwavejs', sprintf(__("L'équipement : %s avec le nodeId : %s, vient de passer au statut Dead.", __FILE__), $eqLogic->getHumanName(true), $eqLogic->getLogicalId()), $action, 'Dead-' . $eqLogic->getLogicalId(), true, 'alerting');
}
}
if ($data['status'] == 'Alive' && $currentValue == 'Dead') {
$action = '<a href="/' . $eqLogic->getLinkToConfiguration() . '">' . __('Equipement', __FILE__) . '</a>';
if (config::byKey('notifyDead', __CLASS__, 1) == 1 && $eqLogic->getIsEnable() == 1) {
if (version_compare(jeedom::version(), '4.4.0', '>=')) {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de passer au statut Alive.', $action, 'Alive-' . $eqLogic->getLogicalId(), true, 'alertingReturnBack');
} else {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ', vient de passer au statut Alive.', $action, 'Alive-' . $eqLogic->getLogicalId(), true);
}
message::add('zwavejs', sprintf(__("L'équipement : %s avec le nodeId : %s, vient de passer au statut Alive.", __FILE__), $eqLogic->getHumanName(true), $eqLogic->getLogicalId()), $action, 'Alive-' . $eqLogic->getLogicalId(), true, 'alertingReturnBack');
}
}
} else if (isset($data['value'])) {
Expand Down Expand Up @@ -1472,11 +1454,7 @@ public static function constructHealthPage($_values, $_mobile = False) {
$eqLogic = self::byLogicalId($values['id'], __CLASS__);
$productDetails = '<sup><i class="fas fa-question-circle tooltips" title="' . $values['manufacturer'] . ' ' . $values['productDescription'] . ' Firmware : ' . $values['firmwareVersion'] . '"></i><sup>';
if (is_object($eqLogic)) {
$image = 'plugins/zwavejs/core/config/devices/' . $eqLogic->getImgFilePath();
if (!is_file(dirname(__FILE__) . '/../config/devices/' . $eqLogic->getImgFilePath())) {
$image = 'plugins/zwavejs/plugin_info/zwavejs_icon.png';
}
$healthPage .= '<td><img src="' . $image . '" height="40"/> <a href="index.php?v=d&p=zwavejs&m=zwavejs&id=' . $eqLogic->getId() . '">' . $eqLogic->getHumanName(true) . '</a>' . ' ' . $productDetails . '</td>';
$healthPage .= '<td><img src="' . $eqLogic->getImage() . '" height="40"/> <a href="index.php?v=d&p=zwavejs&m=zwavejs&id=' . $eqLogic->getId() . '">' . $eqLogic->getHumanName(true) . '</a>' . ' ' . $productDetails . '</td>';
} else {
$healthPage .= '<td><img src="plugins/zwavejs/plugin_info/zwavejs_icon.png" height="40"/> ' . $values['productLabel'] . ' - ' . $values['productDescription'] . ' ' . $productDetails . '</td>';
}
Expand Down Expand Up @@ -1585,11 +1563,7 @@ public static function constructHealthPage($_values, $_mobile = False) {
if ($wakedup > 3 * $values['values']['132-0-wakeUpInterval']['value']) {
$action = '<a href="/' . $eqLogic->getLinkToConfiguration() . '">' . __('Equipement', __FILE__) . '</a>';
if (config::byKey('notifyMissWakeup', __CLASS__, 1) == 1 && $eqLogic->getIsEnable() == 1) {
if (version_compare(jeedom::version(), '4.4.0', '>=')) {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ", ne s'est pas reveillé au moins 4 fois. Il a peut être un problème (batterie ou autres).", $action, 'Wakeup-' . $eqLogic->getLogicalId(), true, 'alertingReturnBack');
} else {
message::add('zwavejs', "L'équipement : " . $eqLogic->getHumanName(true) . ' avec le nodeId : ' . $eqLogic->getLogicalId() . ", ne s'est pas reveillé au moins 4 fois. Il a peut être un problème (batterie ou autres).", $action, 'Wakeup-' . $eqLogic->getLogicalId(), true);
}
message::add('zwavejs', sprintf(__("L'équipement : %s avec le nodeId : %s, ne s'est pas reveillé au moins 4 fois. Il a peut être un problème (batterie ou autres).", __FILE__), $eqLogic->getHumanName(true), $eqLogic->getLogicalId()), $action, 'Wakeup-' . $eqLogic->getLogicalId(), true, 'alertingReturnBack');
}
$eqLogic->setConfiguration('missedWakeup', true);
$eqLogic->save();
Expand All @@ -1605,11 +1579,7 @@ public static function constructHealthPage($_values, $_mobile = False) {
$healthPage .= '<tr><td>' . $values['id'] . '</td>';
$eqLogic = self::byLogicalId($values['id'], __CLASS__);
if (is_object($eqLogic)) {
$image = 'plugins/zwavejs/core/config/devices/' . $eqLogic->getImgFilePath();
if (!is_file(dirname(__FILE__) . '/../config/devices/' . $eqLogic->getImgFilePath())) {
$image = 'plugins/zwavejs/plugin_info/zwavejs_icon.png';
}
$healthPage .= '<td><img src="' . $image . '" height="40"/>' . $eqLogic->getHumanName(true) . '</td>';
$healthPage .= '<td><img src="' . $eqLogic->getImage() . '" height="40"/>' . $eqLogic->getHumanName(true) . '</td>';
} else {
$healthPage .= '<td><img src="plugins/zwavejs/plugin_info/zwavejs_icon.png" height="40"/> ' . $values['productLabel'] . ' - ' . $values['productDescription'] . '</td>';
}
Expand Down Expand Up @@ -1757,15 +1727,11 @@ public static function getWaiting() {
foreach (self::byType(__CLASS__) as $eqLogic) {
$waitings = $eqLogic->getCache('waiting', array());
if (is_object($eqLogic)) {
$image = 'plugins/zwavejs/core/config/devices/' . $eqLogic->getImgFilePath();
if (!is_file(dirname(__FILE__) . '/../config/devices/' . $eqLogic->getImgFilePath())) {
$image = 'plugins/zwavejs/plugin_info/zwavejs_icon.png';
}
foreach ($waitings as $property => $data) {
$globWaiting[] = array(
'id' => $eqLogic->getLogicalId(),
'eqId' => $eqLogic->getId(),
'image' => $image,
'image' => $eqLogic->getImage(),
'name' => $eqLogic->getHumanName(true),
'property' => $property,
'value' => $data['value'],
Expand Down Expand Up @@ -2276,9 +2242,15 @@ public function getImgFilePath() {
}

public function getImage() {
$default = parent::getImage();
$plugin = plugin::byId(__CLASS__);
if ($default != $plugin->getPathImgIcon()) {
return $default; // this is a custom image uploaded by the user, we keep it
}

$file = 'plugins/zwavejs/core/config/devices/' . $this->getImgFilePath();
if (!is_file(__DIR__ . '/../../../../' . $file)) {
return 'plugins/zwavejs/plugin_info/zwavejs_icon.png';
return $default;
}
return $file;
}
Expand Down
2 changes: 1 addition & 1 deletion core/config/config/Aeotec_0x0371/zwa001.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"valueSize": 2,
"minValue": 5000,
"maxValue": 6500,
"defaultValue": 6500,
"defaultValue": 6500
}
]
}
5 changes: 3 additions & 2 deletions core/config/devices/fibaro_271/fgwpe.wall.plug.zw5.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"versions": {
"1538": [
"4099",
"4097"
"4097",
"4100"
]
},
"properties": {
Expand All @@ -19,4 +20,4 @@
"type": "multilevel"
}
}
}
}
45 changes: 45 additions & 0 deletions core/config/devices/shellyqubino_1120/qndw-002C.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"name": "QNDW-002C Shelly Wave Door/Window",
"type": "Ouverture",
"comlink": "",
"remark": "",
"versions": {
"256": [
"129"
]
},
"configuration": {
"battery_type": "CR2032"
},
"properties": {
"Opening": {},
"Luminance": {},
"Direction": {},
"Battery": {},
"Indicator": {},
"Notification|alarmLevel": {"type": "alarmLevel"}
},
"commands": [
{
"name": "Porte (simple)",
"type": "info",
"isVisible": 0,
"isHistorized": 1,
"configuration": {
"class": 113,
"endpoint": 0,
"property": "Access Control-Door state (simple)",
"calculValueOffset": "#value#==22"
},
"subtype": "binary",
"display": {
"invertBinary": "1",
"generic_type": "OPENING"
},
"template": {
"dashboard": "timeDoor",
"mobile": "timeDoor"
}
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
55 changes: 55 additions & 0 deletions core/config/devices/shellyqubino_1120/qnpl-0A112.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"name": "QLPL-0A112",
"type": "Prise",
"comlink": "",
"remark": "",
"versions": {
"2": [
"135"
]
},
"properties": {
"Switch": {"type": "prise"},
"Indicator": {},
"Power": {},
"Energy": {},
"Notification|heat-sensor": {"type": "heat-sensor"},
"Notification|over-current": {"type": "over-current"},
"Notification|over-voltage": {"type": "over-voltage"},
"Notification|alarmLevel": {"type": "alarmLevel"}
},
"commands": [
{
"name": "Reset consommation kWh",
"type": "action",
"isVisible": 0,
"isHistorized": 0,
"configuration": {
"class": 50,
"endpoint": 0,
"property": "reset-65537",
"value": "true"
},
"subtype": "other",
"display": {
"generic_type": "DONT"
}
},
{
"name": "Identify",
"type": "action",
"isVisible": 0,
"isHistorized": 0,
"configuration": {
"class": 135,
"endpoint": 0,
"property": "identify",
"value": "true"
},
"subtype": "other",
"display": {
"generic_type": "DONT"
}
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions core/config/devices/zooz_634/zen58.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "Zooz / Low Voltage XS Relay",
"ref": "ZEN58",
"manufacturer": "Zooz",
"type": "Relais",
"remark": "",
"versions": {
"4": [
"802"
]
},
"properties": {
"Switch": {"type": "switch"},
"Power": {},
"Energy": {},
"Voltage": {},
"Current": {},
"Indicator": {}
}
}
Binary file added core/config/devices/zooz_634/zen58.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions core/config/specific.config.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[atlas]
zwavejs[port] = Jeedom Atlas

[luna]
zwavejs[port] = Jeedom Luna Zwave

[smart]
zwavejs[port] = Jeedom Smart
2 changes: 1 addition & 1 deletion core/config/zwavejs.config.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[zwavejs]
wantedVersion=11.6.1
wantedVersion=11.12.0
prefix=zwave
auto_applyRecommended=1
autoRemoveExcludeDevice=1
Expand Down
8 changes: 8 additions & 0 deletions core/i18n/de_DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,9 @@
"Port du contrôleur Z-Wave": "Z-Wave-Controller-Port",
"Renseigner le port utilisé par le contrôleur Z-Wave": "Geben Sie den vom Z-Wave-Controller verwendeten Port ein",
"Aucun": "Nein",
"Passerelle TCP distante": "Passerelle TCP distante",
"Utile pour certains Raspberry (\/dev\/serial\/by-id\/usb-0658_0200-if00)": "Nützlich für einige Raspberry (\/dev\/serial\/by-id\/usb-0658_0200-if00)",
"Renseignez l'adresse de la passerelle distante": "Renseignez l'adresse de la passerelle distante",
"Préfixe MQTT": "MQTT-Präfix",
"Préfixe à utiliser dans MQTT": "In MQTT zu verwendendes Präfix",
"": "",
Expand Down Expand Up @@ -604,6 +606,8 @@
"Ouvert": "Offen",
"Informations reçues de MQTT Manager": "Von MQTT Manager erhaltene Informationen",
"Le port n'est pas configuré": "Port ist nicht konfiguriert",
"Le port TCP n'est pas configuré": "Le port TCP n'est pas configuré",
"Le port TCP n'est pas valide": "Le port TCP n'est pas valide",
"Le plugin MQTT Manager n'est pas installé": "Das MQTT Manager-Plugin ist nicht installiert",
"Le démon MQTT Manager n'est pas démarré": "Der MQTT-Manager-Daemon ist nicht gestartet",
"Le démon OpenZwave est démarré sur le même contrôleur, il doit être stoppé.": "Der OpenZwave-Daemon wird auf demselben Controller gestartet, er muss gestoppt werden",
Expand Down Expand Up @@ -633,6 +637,9 @@
"Nœud inclus": "Bogen enthalten",
"Nouveau module Z-Wave détecté. L'équipement sera créé lorsque l'interview sera terminé.": "Neues Z-Wave-Modul erkannt. Die Ausrüstung wird erstellt, wenn das Interview abgeschlossen ist",
"Equipement": "Ausrüstung",
"L'équipement : %s avec le nodeId : %s, vient de se réveiller après avoir raté au minimum 4 réveils.": "L'équipement : %s avec le nodeId : %s, vient de se réveiller après avoir raté au minimum 4 réveils",
"L'équipement : %s avec le nodeId : %s, vient de passer au statut Dead.": "L'équipement : %s avec le nodeId : %s, vient de passer au statut Dead",
"L'équipement : %s avec le nodeId : %s, vient de passer au statut Alive.": "L'équipement : %s avec le nodeId : %s, vient de passer au statut Alive",
"Synchronisation en cours": "Synchronisierung läuft",
"Exécution d'une action sur le contrôleur de type": "Ausführen einer Aktion auf dem Typ Controller",
"Envoie des noms et locations pour le nœud": "Senden Sie Namen und Standorte für den Knoten",
Expand All @@ -653,6 +660,7 @@
"Créer la commande Info correspondante dans l'équipement Jeedom": "Erstellen Sie den entsprechenden Info-Befehl in der Jeedom-Ausrüstung",
"Créer la\/les commande(s) Action correspondantes dans l'équipement Jeedom": "Erstellen Sie die entsprechenden Aktionsbefehle in der Jeedom-Ausrüstung",
"Dernier réveil": "Letzter Wecker",
"L'équipement : %s avec le nodeId : %s, ne s'est pas reveillé au moins 4 fois. Il a peut être un problème (batterie ou autres).": "L'équipement : %s avec le nodeId : %s, ne s'est pas reveillé au moins 4 fois. Il a peut être un problème (batterie ou autres)",
"Prochain réveil estimé": "Nächstes geschätztes Erwachen",
"Intervalle de réveil": "Weckintervall",
"Création d'une commande info": "Création d'une commande info",
Expand Down
Loading
Loading