diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 0000000..d214266 --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,18 @@ +name: translate + +on: + workflow_dispatch: + push: + branches: + - beta + +jobs: + auto-translate: + runs-on: ubuntu-latest + steps: + - uses: jeedom/jeetranslate@main + with: + deepl_api_key: ${{ secrets.DEEPL_API_KEY }} + include_empty_translation: false + target_languages: "en_US,es_ES,de_DE,it_IT,pt_PT" + use_core_translations: true \ No newline at end of file diff --git a/.github/workflows/work.yml b/.github/workflows/work.yml new file mode 100644 index 0000000..345021e --- /dev/null +++ b/.github/workflows/work.yml @@ -0,0 +1,15 @@ +on: + # Workflows check plugin Jeedom + push: + branches: + - beta + pull_request: + branches: + - beta + - master + +name : 'Full Workflows Plugin Jeedom' + +jobs: + plugin: + uses: jeedom/workflows/.github/workflows/plugin.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..722d5e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/core/._.DS_Store b/core/._.DS_Store deleted file mode 100644 index 5831c3b..0000000 Binary files a/core/._.DS_Store and /dev/null differ diff --git a/core/ajax/beagle.ajax.php b/core/ajax/beagle.ajax.php index 1a7c661..50e6f9d 100644 --- a/core/ajax/beagle.ajax.php +++ b/core/ajax/beagle.ajax.php @@ -17,51 +17,55 @@ */ try { - require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; - include_file('core', 'authentification', 'php'); + require_once __DIR__ . '/../../../../core/php/core.inc.php'; + include_file('core', 'authentification', 'php'); - if (!isConnect('admin')) { - throw new Exception(__('401 - Accès non autorisé', __FILE__)); - } - ajax::init(); + if (!isConnect('admin')) { + throw new Exception(__('401 - Accès non autorisé', __FILE__)); + } + ajax::init(); - if (init('action') == 'changeIncludeState') { - beagle::changeIncludeState(init('state'), init('mode')); - ajax::success(); - } + if (init('action') == 'changeIncludeState') { + beagle::changeIncludeState(init('state'), init('mode')); + ajax::success(); + } if (init('action') == 'getModelListParam') { ajax::success(beagle::getModelListParam(init('conf'))); } if (init('action') == 'pairing') { + /** @var beagle */ $beagle = beagle::byId(init('id')); if (!is_object($beagle)) { ajax::success(array()); } ajax::success($beagle->binding()); } - + if (init('action') == 'askscenes') { + /** @var beagle */ foreach (beagle::byType('beagle') as $eqLogic) { - $eqLogic->getscenes(init('type')); - } + $eqLogic->getscenes(init('type')); + } ajax::success(); } - + if (init('action') == 'askgroups') { + /** @var beagle */ foreach (beagle::byType('beagle') as $eqLogic) { - $eqLogic->getgroups(); - } + $eqLogic->getgroups(); + } ajax::success(); } - if (init('action') == 'autoDetectModule') { + if (init('action') == 'autoDetectModule') { + /** @var beagle */ $eqLogic = beagle::byId(init('id')); if (!is_object($eqLogic)) { throw new Exception(__('Beagle eqLogic non trouvé : ', __FILE__) . init('id')); } - if (init('createcommand') == 1){ + if (init('createcommand') == 1) { foreach ($eqLogic->getCmd() as $cmd) { $cmd->remove(); } @@ -72,8 +76,8 @@ - throw new Exception(__('Aucune méthode correspondante à : ', __FILE__) . init('action')); - /* * *********Catch exeption*************** */ + throw new Exception(__('Aucune méthode correspondante à : ', __FILE__) . init('action')); + /* * *********Catch exeption*************** */ } catch (Exception $e) { - ajax::error(displayException($e), $e->getCode()); + ajax::error(displayException($e), $e->getCode()); } diff --git a/core/class/beagle.class.php b/core/class/beagle.class.php index 1e0162c..d29e922 100644 --- a/core/class/beagle.class.php +++ b/core/class/beagle.class.php @@ -47,6 +47,7 @@ public static function createFromDef($_def) { )); return false; } + /** @var beagle */ $beagle = beagle::byLogicalId($_def['uuid'], 'beagle'); if (!is_object($beagle)) { $beagle = new beagle(); @@ -62,27 +63,17 @@ public static function createFromDef($_def) { event::add('jeedom::alert', array( 'level' => 'warning', 'page' => 'beagle', - 'message' => __('Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid'], __FILE__), + 'message' => __('Module inclu avec succès ' . $_def['model'] . ' ' . $_def['uuid'], __FILE__), )); - self::changeIncludeState(0,1); + self::changeIncludeState(0, 1); return $beagle; } public static function generateKey() { - $randHexStr = implode( array_map( function() { return dechex( mt_rand( 0, 15 ) ); }, array_fill( 0, 24, null ) ) ); - return $randHexStr; - } - - public static function dependancy_info() { - $return = array(); - $return['progress_file'] = jeedom::getTmpFolder('beagle') . '/dependance'; - $return['state'] = 'ok'; - return $return; - } - - public static function dependancy_install() { - log::remove(__CLASS__ . '_update'); - return array('script' => dirname(__FILE__) . '/../../resources/install_#stype#.sh ' . jeedom::getTmpFolder('beagle') . '/dependance', 'log' => log::getPathToLog(__CLASS__ . '_update')); + $randHexStr = implode(array_map(function () { + return dechex(mt_rand(0, 15)); + }, array_fill(0, 24, null))); + return $randHexStr; } public static function deamon_info() { @@ -104,22 +95,22 @@ public static function deamon_info() { public static function deamon_start() { self::deamon_stop(); $deamon_info = self::deamon_info(); - if (config::byKey('jeedomKey', 'beagle','') == ''){ + if (config::byKey('jeedomKey', 'beagle', '') == '') { config::save('jeedomKey', self::generateKey(), 'beagle'); } if ($deamon_info['launchable'] != 'ok') { throw new Exception(__('Veuillez vérifier la configuration', __FILE__)); } - $unlock = exec('sudo rfkill unblock all >/dev/null 2>&1'); - if (config::byKey('port', 'beagle','none') == 'none') { - foreach (jeedom::getBluetoothMapping() as $name => $value) { - config::save('port', $name ,'beagle'); - break; - } + $unlock = exec('sudo rfkill unblock all >/dev/null 2>&1'); + if (config::byKey('port', 'beagle', 'none') == 'none') { + foreach (jeedom::getBluetoothMapping() as $name => $value) { + config::save('port', $name, 'beagle'); + break; + } } $port = jeedom::getBluetoothMapping(config::byKey('port', 'beagle')); - $beagle_path = realpath(dirname(__FILE__) . '/../../resources/beagled'); - $cmd = 'sudo /usr/bin/python3 ' . $beagle_path . '/beagled.py'; + $beagle_path = realpath(__DIR__ . '/../../resources/beagled'); + $cmd = system::getCmdSudo() . system::getCmdPython3(__CLASS__) . "{$beagle_path}/beagled.py"; $cmd .= ' --device ' . $port; $cmd .= ' --loglevel ' . log::convertLogLevel(log::getLogLevel('beagle')); $cmd .= ' --socketport ' . config::byKey('socketport', 'beagle'); @@ -128,8 +119,9 @@ public static function deamon_start() { $cmd .= ' --apikey ' . jeedom::getApiKey('beagle'); $cmd .= ' --cycle ' . config::byKey('cycle', 'beagle'); $cmd .= ' --jeedomkey ' . config::byKey('jeedomKey', 'beagle'); + log::add('beagle', 'debug', 'Lancement démon beagle : ' . $cmd); - $result = exec($cmd . ' >> ' . log::getPathToLog('beagle') . ' 2>&1 &'); + $result = exec($cmd . ' >> ' . log::getPathToLog('beagle_daemon') . ' 2>&1 &'); $i = 0; while ($i < 5) { $deamon_info = self::deamon_info(); @@ -146,7 +138,7 @@ public static function deamon_start() { message::removeAll('beagle', 'unableStartDeamon'); config::save('include_mode', 0, 'beagle'); sleep(2); - self::sendIdToDeamon(); + self::sendIdToDeamon(); $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'ready')); self::socket_connection($value); return true; @@ -164,6 +156,7 @@ public static function deamon_stop() { } public static function sendIdToDeamon() { + /** @var beagle */ foreach (self::byType('beagle') as $eqLogic) { $eqLogic->allowDevice(); usleep(500); @@ -172,8 +165,8 @@ public static function sendIdToDeamon() { public static function devicesParameters($_device = '') { $return = array(); - foreach (ls(dirname(__FILE__) . '/../config/devices', '*') as $dir) { - $path = dirname(__FILE__) . '/../config/devices/' . $dir; + foreach (ls(__DIR__ . '/../config/devices', '*') as $dir) { + $path = __DIR__ . '/../config/devices/' . $dir; if (!is_dir($path)) { continue; } @@ -185,7 +178,6 @@ public static function devicesParameters($_device = '') { $return += json_decode($content, true); } } catch (Exception $e) { - } } } @@ -211,25 +203,25 @@ public static function changeIncludeState($_state, $_mode) { } } - public function getModelListParam($_conf = '') { - $json = self::devicesParameters($_conf); - $haspairing = false; - $hasFirmMac = false; - if (isset($json['configuration'])) { - if (isset($json['configuration']['haspairing']) && $json['configuration']['haspairing'] == 1) { - $haspairing = true; - } - } - if (!in_array(substr($_conf,0,5),array('scene','group'))){ - $hasFirmMac = True; - } - return [$haspairing,$hasFirmMac]; - } + public static function getModelListParam($_conf = '') { + $json = self::devicesParameters($_conf); + $haspairing = false; + $hasFirmMac = false; + if (isset($json['configuration'])) { + if (isset($json['configuration']['haspairing']) && $json['configuration']['haspairing'] == 1) { + $haspairing = true; + } + } + if (!in_array(substr($_conf, 0, 5), array('scene', 'group'))) { + $hasFirmMac = True; + } + return [$haspairing, $hasFirmMac]; + } public static function socket_connection($_value) { $deamon_info = self::deamon_info(); if ($deamon_info['state'] != 'ok') { - log::add('beagle','debug','Daemon is not launched, please launch daemon'); + log::add('beagle', 'debug', 'Daemon is not launched, please launch daemon'); return; } if (config::byKey('port', 'beagle', 'none') != 'none') { @@ -241,12 +233,12 @@ public static function socket_connection($_value) { } public function postSave() { - if ($this->getConfiguration('applyDevice','') != $this->getConfiguration('device')) { - $this->applyModuleConfiguration(); - } else { - $this->allowDevice(); - } - } + if ($this->getConfiguration('applyDevice', '') != $this->getConfiguration('device')) { + $this->applyModuleConfiguration(); + } else { + $this->allowDevice(); + } + } public function preRemove() { $this->disallowDevice(); @@ -257,9 +249,9 @@ public function allowDevice() { if ($this->getLogicalId() != '') { $value['device'] = array( 'uuid' => $this->getLogicalId(), - 'model' => $this->getConfiguration('device',''), - 'mac' => $this->getConfiguration('mac',''), - 'type' => $this->getConfiguration('type',''), + 'model' => $this->getConfiguration('device', ''), + 'mac' => $this->getConfiguration('mac', ''), + 'type' => $this->getConfiguration('type', ''), ); $value = json_encode($value); self::socket_connection($value); @@ -275,97 +267,97 @@ public function disallowDevice() { } public function applyModuleConfiguration() { - $this->setConfiguration('applyDevice', $this->getConfiguration('device')); - $this->save(); + $this->setConfiguration('applyDevice', $this->getConfiguration('device')); + $this->save(); if ($this->getConfiguration('device') == '') { - return true; - } - $device = self::devicesParameters($this->getConfiguration('device')); - if (!is_array($device)) { - return true; - } - event::add('jeedom::alert', array( - 'level' => 'warning', - 'page' => 'beagle', - 'message' => __('Périphérique reconnu, intégration en cours', __FILE__), - )); - $this->import($device); - sleep(2); - event::add('jeedom::alert', array( - 'level' => 'warning', - 'page' => 'beagle', - 'message' => '', - )); - } + return true; + } + $device = self::devicesParameters($this->getConfiguration('device')); + if (!is_array($device)) { + return true; + } + event::add('jeedom::alert', array( + 'level' => 'warning', + 'page' => 'beagle', + 'message' => __('Périphérique reconnu, intégration en cours', __FILE__), + )); + $this->import($device); + sleep(2); + event::add('jeedom::alert', array( + 'level' => 'warning', + 'page' => 'beagle', + 'message' => '', + )); + } - public function binding() { - if ($this->getLogicalId() == '') { - return; - } - if (!in_array($this->getConfiguration('device','switch'),array('shutter','dcl','plug','dimmer','generic'))) { - return; - } - $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'bind', 'uuid' => $this->getLogicalId())); - self::socket_connection($value); - } + public function binding() { + if ($this->getLogicalId() == '') { + return; + } + if (!in_array($this->getConfiguration('device', 'switch'), array('shutter', 'dcl', 'plug', 'dimmer', 'generic'))) { + return; + } + $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'bind', 'uuid' => $this->getLogicalId())); + self::socket_connection($value); + } - public function getgroups() { - if ($this->getLogicalId() == '') { - return; - } - if (!in_array($this->getConfiguration('device','switch'),array('shutter','dcl','plug','dimmer','generic'))) { - return; - } - $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $this->getLogicalId(), 'command' => array("ac" => "groups"))); - self::socket_connection($value); - sleep(1); - } + public function getgroups() { + if ($this->getLogicalId() == '') { + return; + } + if (!in_array($this->getConfiguration('device', 'switch'), array('shutter', 'dcl', 'plug', 'dimmer', 'generic'))) { + return; + } + $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $this->getLogicalId(), 'command' => array("ac" => "groups"))); + self::socket_connection($value); + sleep(1); + } - public function getscenes($_type) { - if ($this->getLogicalId() == '') { - return; - } - if (!in_array($this->getConfiguration('device','switch'),array('shutter','dcl','plug','dimmer','generic'))) { - return; - } - $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $this->getLogicalId(), 'command' => array("ac" => $_type))); - self::socket_connection($value); - sleep(1); - } + public function getscenes($_type) { + if ($this->getLogicalId() == '') { + return; + } + if (!in_array($this->getConfiguration('device', 'switch'), array('shutter', 'dcl', 'plug', 'dimmer', 'generic'))) { + return; + } + $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $this->getLogicalId(), 'command' => array("ac" => $_type))); + self::socket_connection($value); + sleep(1); + } } class beagleCmd extends cmd { - public function execute($_options = null) { - if ($this->getType() != 'action') { - return; - } - $data = array(); - $eqLogic = $this->getEqLogic(); - $values = explode(',', $this->getLogicalId()); - foreach ($values as $value) { - $value = explode(':', $value); - if (count($value) == 2) { - switch ($this->getSubType()) { - case 'slider': - $data[trim($value[0])] = trim(str_replace('#slider#', $_options['slider'], $value[1])); - break; - case 'color': - $data[trim($value[0])] = trim(str_replace('#color#', $_options['color'], $value[1])); - break; - case 'select': - $data[trim($value[0])] = trim(str_replace('#select#', $_options['select'], $value[1])); - break; - default: - $data[trim($value[0])] = trim($value[1]); - } - } - } - if (count($data) == 0) { - return; - } - $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $eqLogic->getLogicalId(), 'command' => $data)); - beagle::socket_connection($value); - } + public function execute($_options = null) { + if ($this->getType() != 'action') { + return; + } + $data = array(); + $eqLogic = $this->getEqLogic(); + $values = explode(',', $this->getLogicalId()); + foreach ($values as $value) { + $value = explode(':', $value); + if (count($value) == 2) { + switch ($this->getSubType()) { + case 'slider': + $data[trim($value[0])] = trim(str_replace('#slider#', $_options['slider'], $value[1])); + break; + case 'color': + $data[trim($value[0])] = trim(str_replace('#color#', $_options['color'], $value[1])); + break; + case 'select': + $data[trim($value[0])] = trim(str_replace('#select#', $_options['select'], $value[1])); + break; + default: + $data[trim($value[0])] = trim($value[1]); + } + } + } + if (count($data) == 0) { + return; + } + $value = json_encode(array('apikey' => jeedom::getApiKey('beagle'), 'cmd' => 'send', 'target' => $eqLogic->getLogicalId(), 'command' => $data)); + beagle::socket_connection($value); + } /* * **********************Getteur Setteur*************************** */ } diff --git a/core/config/devices/dcl/dcl.json b/core/config/devices/dcl/dcl.json index 85bfc1c..ef2089c 100644 --- a/core/config/devices/dcl/dcl.json +++ b/core/config/devices/dcl/dcl.json @@ -1,67 +1,72 @@ { - "dcl": { - "name": "DCL", - "category" : {"light" :1}, - "configuration": { - "haspairing": 1 - }, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value", + "dcl": { + "name": "DCL", + "category": { + "light": 1 + }, + "configuration": { + "haspairing": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value", "template": { "dashboard": "light", "mobile": "light" } - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - }, - { - "name": "On", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:on", - "display": { - "icon": "" - } - }, - { - "name": "Off", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:off", - "display": { - "icon": "" - } + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "On", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:on", + "display": { + "icon": "" }, - { - "name": "Toggle", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:toggle", - "display": { - "icon": "" - } + "value": "Etat" + }, + { + "name": "Off", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:off", + "display": { + "icon": "" + }, + "value": "Etat" + }, + { + "name": "Toggle", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:toggle", + "display": { + "icon": "" } - ] - } -} + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/dcl/dcl.png b/core/config/devices/dcl/dcl.png index 77b72e8..aa8bcf0 100644 Binary files a/core/config/devices/dcl/dcl.png and b/core/config/devices/dcl/dcl.png differ diff --git a/core/config/devices/generic/generic.json b/core/config/devices/generic/generic.json index 8afdd93..ee4a695 100644 --- a/core/config/devices/generic/generic.json +++ b/core/config/devices/generic/generic.json @@ -1,67 +1,72 @@ { - "generic": { - "name": "Generic", - "category" : {"light" :1}, - "configuration": { - "haspairing": 1 - }, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value", + "generic": { + "name": "Generic", + "category": { + "light": 1 + }, + "configuration": { + "haspairing": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value", "template": { "dashboard": "light", "mobile": "light" } - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - }, - { - "name": "On", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:on", - "display": { - "icon": "" - } - }, - { - "name": "Off", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:off", - "display": { - "icon": "" - } + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "On", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:on", + "display": { + "icon": "" }, - { - "name": "Toggle", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:toggle", - "display": { - "icon": "" - } + "value": "Etat" + }, + { + "name": "Off", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:off", + "display": { + "icon": "" + }, + "value": "Etat" + }, + { + "name": "Toggle", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:toggle", + "display": { + "icon": "" } - ] - } -} + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/generic/generic.png b/core/config/devices/generic/generic.png index b757567..bebedd0 100644 Binary files a/core/config/devices/generic/generic.png and b/core/config/devices/generic/generic.png differ diff --git a/core/config/devices/groupdcl/groupdcl.json b/core/config/devices/groupdcl/groupdcl.json index b241f44..d9d4448 100644 --- a/core/config/devices/groupdcl/groupdcl.json +++ b/core/config/devices/groupdcl/groupdcl.json @@ -1,64 +1,69 @@ { - "groupdcl": { - "name": "Groupe DCLs", - "category" : {"light" :1}, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value", + "groupdcl": { + "name": "Groupe DCLs", + "category": { + "light": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value", "template": { "dashboard": "light", "mobile": "light" } - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - }, - { - "name": "On", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:on", - "display": { - "icon": "" - } - }, - { - "name": "Off", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:off", - "display": { - "icon": "" - } + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "On", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:on", + "display": { + "icon": "" }, - { - "name": "Toggle", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:toggle", - "display": { - "icon": "" - } + "value": "Etat" + }, + { + "name": "Off", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:off", + "display": { + "icon": "" + }, + "value": "Etat" + }, + { + "name": "Toggle", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:toggle", + "display": { + "icon": "" } - ] - } -} + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/groupdcl/groupdcl.png b/core/config/devices/groupdcl/groupdcl.png index 77b72e8..aa8bcf0 100644 Binary files a/core/config/devices/groupdcl/groupdcl.png and b/core/config/devices/groupdcl/groupdcl.png differ diff --git a/core/config/devices/groupgeneric/groupgeneric.json b/core/config/devices/groupgeneric/groupgeneric.json index bcb7ce8..989bc57 100644 --- a/core/config/devices/groupgeneric/groupgeneric.json +++ b/core/config/devices/groupgeneric/groupgeneric.json @@ -1,64 +1,69 @@ { - "groupgeneric": { - "name": "Groupe Generics", - "category" : {"light" :1}, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value", + "groupgeneric": { + "name": "Groupe Generics", + "category": { + "light": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value", "template": { "dashboard": "light", "mobile": "light" } - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - }, - { - "name": "On", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:on", - "display": { - "icon": "" - } - }, - { - "name": "Off", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:off", - "display": { - "icon": "" - } + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "On", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:on", + "display": { + "icon": "" }, - { - "name": "Toggle", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:toggle", - "display": { - "icon": "" - } + "value": "Etat" + }, + { + "name": "Off", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:off", + "display": { + "icon": "" + }, + "value": "Etat" + }, + { + "name": "Toggle", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:toggle", + "display": { + "icon": "" } - ] - } -} + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/groupgeneric/groupgeneric.png b/core/config/devices/groupgeneric/groupgeneric.png index b757567..bebedd0 100644 Binary files a/core/config/devices/groupgeneric/groupgeneric.png and b/core/config/devices/groupgeneric/groupgeneric.png differ diff --git a/core/config/devices/groupplug/groupplug.json b/core/config/devices/groupplug/groupplug.json index e4ecd6a..20e3225 100644 --- a/core/config/devices/groupplug/groupplug.json +++ b/core/config/devices/groupplug/groupplug.json @@ -1,24 +1,27 @@ { - "groupplug": { - "name": "Groupe Prises", - "category" : {"automatism" :1}, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value" - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - } - ] - } -} + "groupplug": { + "name": "Groupe Prises", + "category": { + "automatism": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value" + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/groupplug/groupplug.png b/core/config/devices/groupplug/groupplug.png index a3c99af..7e37b6b 100644 Binary files a/core/config/devices/groupplug/groupplug.png and b/core/config/devices/groupplug/groupplug.png differ diff --git a/core/config/devices/groupshutter/groupshutter.json b/core/config/devices/groupshutter/groupshutter.json index c333fb9..80195fd 100644 --- a/core/config/devices/groupshutter/groupshutter.json +++ b/core/config/devices/groupshutter/groupshutter.json @@ -1,68 +1,71 @@ { - "groupshutter": { - "name": "Groupe Volets", - "category" : {"automatism" :1}, - "commands": [{ - "name": "Position", - "type": "info", - "subtype": "numeric", - "isVisible": 1, - "isHistorized": 1, - "unite": "%", - "logicalId": "data::value", + "groupshutter": { + "name": "Groupe Volets", + "category": { + "automatism": 1 + }, + "commands": [ + { + "name": "Position", + "type": "info", + "subtype": "numeric", + "isVisible": 1, + "isHistorized": 1, + "unite": "%", + "logicalId": "data::value", "template": { "dashboard": "shutter", "mobile": "shutter" } - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - }, - { - "name": "Haut", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:up", - "display": { - "icon": "", - "generic_type": "FLAP_UP" - } - }, - { - "name": "Bas", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:down", - "display": { - "icon": "", - "generic_type": "FLAP_DOWN" - } - }, - { - "name": "Stop", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:stop", - "display": { - "icon": "", - "generic_type": "FLAP_STOP" - } - } - ] - } -} + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "Haut", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:up", + "display": { + "icon": "", + "generic_type": "FLAP_UP" + } + }, + { + "name": "Bas", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:down", + "display": { + "icon": "", + "generic_type": "FLAP_DOWN" + } + }, + { + "name": "Stop", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:stop", + "display": { + "icon": "", + "generic_type": "FLAP_STOP" + } + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/groupshutter/groupshutter.png b/core/config/devices/groupshutter/groupshutter.png index b757567..bebedd0 100644 Binary files a/core/config/devices/groupshutter/groupshutter.png and b/core/config/devices/groupshutter/groupshutter.png differ diff --git a/core/config/devices/plug/plug.json b/core/config/devices/plug/plug.json index 44c5184..b0e08bd 100644 --- a/core/config/devices/plug/plug.json +++ b/core/config/devices/plug/plug.json @@ -1,27 +1,30 @@ { - "plug": { - "name": "Prise", - "category" : {"automatism" :1}, - "configuration": { - "haspairing": 1 - }, - "commands": [{ - "name": "Etat", - "type": "info", - "subtype": "binary", - "isVisible": 1, - "isHistorized": 1, - "logicalId": "data::value" - }, - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - } - ] - } -} + "plug": { + "name": "Prise", + "category": { + "automatism": 1 + }, + "configuration": { + "haspairing": 1 + }, + "commands": [ + { + "name": "Etat", + "type": "info", + "subtype": "binary", + "isVisible": 1, + "isHistorized": 1, + "logicalId": "data::value" + }, + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/plug/plug.png b/core/config/devices/plug/plug.png index a3c99af..7e37b6b 100644 Binary files a/core/config/devices/plug/plug.png and b/core/config/devices/plug/plug.png differ diff --git a/core/config/devices/scene/scene.json b/core/config/devices/scene/scene.json index b92df54..9a5822c 100644 --- a/core/config/devices/scene/scene.json +++ b/core/config/devices/scene/scene.json @@ -1,20 +1,22 @@ { - "scene": { - "name": "Scene", - "category" : {"automatism" :1}, - "commands": [ - { - "name": "Lancer", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:on", - "display": { - "icon": "" - } - } - ] - } + "scene": { + "name": "Scene", + "category": { + "automatism": 1 + }, + "commands": [ + { + "name": "Lancer", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:on", + "display": { + "icon": "" + } + } + ] + } } \ No newline at end of file diff --git a/core/config/devices/scene/scene.png b/core/config/devices/scene/scene.png index 36a7fdc..595df53 100644 Binary files a/core/config/devices/scene/scene.png and b/core/config/devices/scene/scene.png differ diff --git a/core/config/devices/shutter/shutter.json b/core/config/devices/shutter/shutter.json index e82ca6c..5318117 100644 --- a/core/config/devices/shutter/shutter.json +++ b/core/config/devices/shutter/shutter.json @@ -1,85 +1,88 @@ { - "shutter": { - "name": "Volet", - "category" : {"automatism" :1}, - "configuration": { - "haspairing": 1 - }, - "commands": [ - { - "name": "Statut", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label" - },{ - "name": "Position", - "type": "info", - "subtype": "numeric", - "isVisible": 0, - "isHistorized": 1, - "unite": "%", - "logicalId": "data::value", + "shutter": { + "name": "Volet", + "category": { + "automatism": 1 + }, + "configuration": { + "haspairing": 1 + }, + "commands": [ + { + "name": "Statut", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label" + }, + { + "name": "Position", + "type": "info", + "subtype": "numeric", + "isVisible": 0, + "isHistorized": 1, + "unite": "%", + "logicalId": "data::value", "template": { "dashboard": "shutter", "mobile": "shutter" } - }, - { - "name": "Positionnement", - "type": "action", - "subtype": "slider", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "value": "Position", - "logicalId": "ac:goto,options:#slider#", - "template": { - "dashboard": "timeShutter", - "mobile": "timeShutter" - } - }, - { - "name": "Haut", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:up", - "display": { - "icon": "", - "generic_type": "FLAP_UP" - } - }, - { - "name": "Bas", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:down", - "display": { - "icon": "", - "generic_type": "FLAP_DOWN" - } - }, - { - "name": "Stop", - "type": "action", - "subtype": "other", - "isVisible": 1, - "isHistorized": 0, - "unite": "", - "logicalId": "ac:stop", - "display": { - "icon": "", - "generic_type": "FLAP_STOP" - } - } - ] - } -} + }, + { + "name": "Positionnement", + "type": "action", + "subtype": "slider", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "value": "Position", + "logicalId": "ac:goto,options:#slider#", + "template": { + "dashboard": "timeShutter", + "mobile": "timeShutter" + } + }, + { + "name": "Haut", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:up", + "display": { + "icon": "", + "generic_type": "FLAP_UP" + } + }, + { + "name": "Bas", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:down", + "display": { + "icon": "", + "generic_type": "FLAP_DOWN" + } + }, + { + "name": "Stop", + "type": "action", + "subtype": "other", + "isVisible": 1, + "isHistorized": 0, + "unite": "", + "logicalId": "ac:stop", + "display": { + "icon": "", + "generic_type": "FLAP_STOP" + } + } + ] + } +} \ No newline at end of file diff --git a/core/config/devices/shutter/shutter.png b/core/config/devices/shutter/shutter.png index b757567..bebedd0 100644 Binary files a/core/config/devices/shutter/shutter.png and b/core/config/devices/shutter/shutter.png differ diff --git a/core/config/devices/switch/switch.json b/core/config/devices/switch/switch.json index 929b5ee..2d170c5 100644 --- a/core/config/devices/switch/switch.json +++ b/core/config/devices/switch/switch.json @@ -1,36 +1,38 @@ { - "switch": { - "name": "Interrupteur", - "category" : {"automatism" :1}, - "commands": [ - { - "name": "Bouton", - "type": "info", - "subtype": "numeric", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::value", + "switch": { + "name": "Interrupteur", + "category": { + "automatism": 1 + }, + "commands": [ + { + "name": "Bouton", + "type": "info", + "subtype": "numeric", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::value", "template": { "dashboard": "badge", "mobile": "badge" }, - "configuration": { - "repeatEventManagement" : "always" - } - }, - { - "name": "Label", - "type": "info", - "subtype": "string", - "isVisible": 1, - "isHistorized": 1, - "unite": "", - "logicalId": "data::label", - "configuration": { - "repeatEventManagement" : "always" - } - } - ] - } + "configuration": { + "repeatEventManagement": "always" + } + }, + { + "name": "Label", + "type": "info", + "subtype": "string", + "isVisible": 1, + "isHistorized": 1, + "unite": "", + "logicalId": "data::label", + "configuration": { + "repeatEventManagement": "always" + } + } + ] + } } \ No newline at end of file diff --git a/core/config/devices/switch/switch.png b/core/config/devices/switch/switch.png index 36a7fdc..595df53 100644 Binary files a/core/config/devices/switch/switch.png and b/core/config/devices/switch/switch.png differ diff --git a/core/i18n/de_DE.json b/core/i18n/de_DE.json index e4fd09e..c383bba 100644 --- a/core/i18n/de_DE.json +++ b/core/i18n/de_DE.json @@ -1,116 +1,117 @@ { - "plugins\/beagle\/plugin_info\/configuration.php": { + "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { "401 - Accès non autorisé": "401 - Nicht autorisierter Zugriff", - "Démon": "Dämon", - "Port clef bluetooth": "Bluetooth Port Schlüssel", - "Aucun": "Ohne", - "Port socket interne": "Interner Socket-Port", - "55556": "55556", - "Cycle (s)": "Zyklus (e)", - "0.1": "0.1" + "Aucune méthode correspondante à : ": "Keine Methode entsprechend:", + "Beagle eqLogic non trouvé : ": "Beagle eqLogic nicht gefunden: " + }, + "plugins\/beagle\/core\/class\/beagle.class.php": { + "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Fehlende Informationen zum Hinzufügen von Geräten. Unmöglich einzuschließen", + "Pas de configuration pour ce modèle": "Für dieses Modell ist keine Konfiguration erforderlich", + "Périphérique reconnu, intégration en cours": "Erkanntes Gerät, Integration läuft", + "Veuillez vérifier la configuration": "Bitte überprüfen Sie die Konfiguration" + }, + "plugins\/beagle\/core\/php\/jeeBeagle.php": { + "Aucun équipement trouvé pour : ": "Keine Ausrüstung gefunden für:", + "Vous n\\'etes pas autorisé à effectuer cette action": "Sie sind nicht berechtigt, diese Aktion auszuführen" + }, + "plugins\/beagle\/desktop\/js\/beagle.js": { + " ? Cela peut durer un petit moment.": " ? Das kann eine Weile dauern.", + " en cours ...": " in Bearbeitung ...", + "Afficher": "Anzeige", + "Annuler": "Abbrechen", + "Arrêter Scan": "Scan beenden", + "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Bitte beachten Sie, dass durch \"Löschen und Neuerstellen\" vorhandene Befehle gelöscht werden", + "Aucune": "Irgendein", + "Choisir une icône": "Wählen Sie ein Symbol", + "Commande info liée": "Verwandte Informationen", + "Demande de groupes en cours ...": "Gruppenanfrage wird bearbeitet ...", + "Demande de scènes ": "Anfrage nach Szenarien ", + "Démarrer": "Start", + "En supprimant et recréant les commandes": "Durch Löschen und Neuerstellen von Bestellungen", + "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Sind Sie sicher, dass Sie alle Module nach ihren Gruppen abfragen möchten? Das kann eine Weile dauern.", + "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Möchten Sie wirklich alle Module nach ihren Szenen fragen? ", + "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Möchten Sie wirklich alle Befehle neu erstellen? Dadurch werden vorhandene Bestellungen gelöscht", + "Historiser": "Chronik", + "Inverser": "Umgekehrt", + "Lancer Scan": "Starten Sie den Scan", + "Les scènes Customers": "Kundenszenarien", + "Les scènes Schneider": "Die Schneider-Szenarien", + "Liste": "Auflistung", + "Liste de valeur|texte séparé par ;": "Werteliste | Text getrennt durch;", + "Max": "Max", + "Min": "Niedrig", + "Nom de la commande": "Befehlsname", + "Opération réalisée avec succès": "Vorgang erfolgreich abgeschlossen", + "Recharge configuration": "Konfiguration aufladen", + "Recharger la configuration": "Konfiguration neu laden", + "Sans supprimer les commandes": "Ohne Bestellungen zu löschen", + "Santé Odace SFSP": "Gesundheit Odace SFSP", + "Supprimer la commande": "Bestellung stornieren", + "Sélectionner le mode de rechargement de la configuration ?": "Wählen Sie den Konfigurations-Reload-Modus?", + "Sélectionner le type de scènes que vous voulez rafraichir !": "Wählen Sie die Art der Szenen aus, die Sie aktualisieren möchten!", + "Tester": "Test", + "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Ein Gerät wurde gerade hinzugefügt. Bitte aktualisieren Sie die Seite", + "Unité": "Unit", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sie befinden sich im Scanmodus. Klicken Sie erneut auf die Scan-Schaltfläche, um diesen Modus zu verlassen (andernfalls bleibt der Modus eine Minute lang aktiv)" }, "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Bild", - "Odace SFSP": "Odace SFSP", - "ID": "Identifikation", - "Modèle": "Modell", + "Date création": "Erstellungsdatum", + "Dernière communication": "Letzte Mitteilung", "Firmware": "Firmware", - "Uuid": "Uuid", + "ID": "Identifikation", + "Image": "Bild", "Mac": "MAC", - "Dernière communication": "Letzte Mitteilung", - "Date création": "Erstellungsdatum", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" + "Mes devices Odace SFSP": "Meine Odace SFSP-Geräte", + "Mes groupes Odace SFSP": "Meine Gruppen Odace SFSP", + "Mes scènes Odace SFSP": "Meine Odace SFSP-Szenen", + "Modèle": "Modell", + "Odace SFSP": "Odace SFSP", + "Uuid": "Uuid" }, "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sie befinden sich im Scanmodus. Klicken Sie erneut auf die Scan-Schaltfläche, um diesen Modus zu verlassen (andernfalls bleibt der Modus eine Minute lang aktiv)", - "Gestion": "Verwaltung", - "Arrêter Scan": "Scan beenden", - "Lancer Scan": "Starten Sie den Scan", + "Actions": "Actions", + "Activer": "Aktivieren", + "Ajouter une commande": "Kommando hinzufügen", + "Arrêter scan": "Scan beenden", + "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer": "Es wurden keine Geräte gefunden. Klicken Sie auf „Scan starten“, um zu beginnen.", + "Catégorie": "Kategorie", + "Commandes": "Befehle", "Configuration": "Konfiguration", - "Santé": "Gesundheit", - "Scènes": "Szenen", + "Configuration avancée": "Erweiterte Konfiguration", + "Equipement": "Gerät", + "Etat": "Zustand", + "Firmware": "Firmware", + "Gestion": "Verwaltung", "Groupes": "Gruppen", + "Lancer scan": "Starten Sie den Scan", + "Mac": "MAC", + "Mes devices Odace SFSP": "Meine Odace SFSP-Geräte", + "Mes groupes Odace SFSP": "Meine Gruppen Odace SFSP", + "Mes scènes Odace SFSP": "Meine Odace SFSP-Szenen", + "Modèle": "Modell", + "Nom": "Name", + "Nom du device": "Gerätename", + "Objet parent": "Übergeordnetes Objekt", + "Options": "Options", + "Pairé": "Paar", "Rechercher": "Suchen nach", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", "Recréer les commandes": "Befehle neu erstellen", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Erweiterte Konfiguration", + "Santé": "Gesundheit", "Sauvegarder": "Speichern", + "Scènes": "Szenen", "Supprimer": "Löschen", - "Equipement": "Gerät", - "Commandes": "Befehle", - "Nom du device": "Gerätename", - "Activer": "Aktivieren", - "Visible": "Sichtbar", - "Objet parent": "Übergeordnetes Objekt", - "Catégorie": "Kategorie", - "Modèle": "Modell", + "Trame pairing": "Trame pairing", + "Type": "Type", "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "MAC", - "Pairé": "Paar", - "Ajouter une commande": "Kommando hinzufügen", - "Nom": "Name", - "Paramètres": "Einstellungen" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "Name", - "Min": "Niedrig", - "Max": "Max", - "Unité": "Unit", - "Liste de valeur|texte séparé par ;": "Werteliste | Text getrennt durch;", - "Liste": "Auflistung", - "Afficher": "Anzeige", - "Historiser": "Chronik", - "Inverser": "Umgekehrt", - "Tester": "Test", - "Arrêter Scan": "Scan beenden", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sie befinden sich im Scanmodus. Klicken Sie erneut auf die Scan-Schaltfläche, um diesen Modus zu verlassen (andernfalls bleibt der Modus eine Minute lang aktiv)", - "Lancer Scan": "Starten Sie den Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Konfiguration aufladen", - "Recharger la configuration": "Konfiguration neu laden", - "Sélectionner le mode de rechargement de la configuration ?": "Wählen Sie den Konfigurations-Reload-Modus?", - "Sans supprimer les commandes": "Ohne Bestellungen zu löschen", - "En supprimant et recréant les commandes": "Durch Löschen und Neuerstellen von Bestellungen", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Bitte beachten Sie, dass durch \"Löschen und Neuerstellen\" vorhandene Befehle gelöscht werden", - "Annuler": "Abbrechen", - "Démarrer": "Start", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Möchten Sie wirklich alle Befehle neu erstellen? Dadurch werden vorhandene Bestellungen gelöscht", - "Opération réalisée avec succès": "Vorgang erfolgreich abgeschlossen", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Sie sind nicht berechtigt, diese Aktion auszuführen", - "Aucun équipement trouvé pour : ": "Keine Ausrüstung gefunden für:" + "Visible": "Sichtbar", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sie befinden sich im Scanmodus. Klicken Sie erneut auf die Scan-Schaltfläche, um diesen Modus zu verlassen (andernfalls bleibt der Modus eine Minute lang aktiv)" }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { + "plugins\/beagle\/plugin_info\/configuration.php": { "401 - Accès non autorisé": "401 - Nicht autorisierter Zugriff", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "Keine Methode entsprechend:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Fehlende Informationen zum Hinzufügen von Geräten. Unmöglich einzuschließen", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Bitte überprüfen Sie die Konfiguration", - "Périphérique reconnu, intégration en cours": "Erkanntes Gerät, Integration läuft" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" + "Aucun": "Ohne", + "Cycle (s)": "Zyklus (e)", + "Démon": "Dämon", + "Port clef bluetooth": "Bluetooth Port Schlüssel", + "Port socket interne": "Interner Socket-Port" } } \ No newline at end of file diff --git a/core/i18n/en_US.json b/core/i18n/en_US.json index 09bb47d..be6ff22 100644 --- a/core/i18n/en_US.json +++ b/core/i18n/en_US.json @@ -1,116 +1,117 @@ { - "plugins\/beagle\/plugin_info\/configuration.php": { + "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { "401 - Accès non autorisé": "401 - Unauthorized access", - "Démon": "Daemon", - "Port clef bluetooth": "Bluetooth keychain", - "Aucun": "None", - "Port socket interne": "Internal socket port", - "55556": "55556", - "Cycle (s)": "Cycle (s)", - "0.1": "0.1" + "Aucune méthode correspondante à : ": "No method corresponding to:", + "Beagle eqLogic non trouvé : ": "Beagle EqLogic not found :" + }, + "plugins\/beagle\/core\/class\/beagle.class.php": { + "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Missing information to add equipment. Impossible to include", + "Pas de configuration pour ce modèle": "No configuration for this model", + "Périphérique reconnu, intégration en cours": "Recognized device, integration in progress", + "Veuillez vérifier la configuration": "Please check the configuration" + }, + "plugins\/beagle\/core\/php\/jeeBeagle.php": { + "Aucun équipement trouvé pour : ": "No equipment found for:", + "Vous n\\'etes pas autorisé à effectuer cette action": "You are not authorized to perform this action" + }, + "plugins\/beagle\/desktop\/js\/beagle.js": { + " ? Cela peut durer un petit moment.": "? It may take a while", + " en cours ...": "In progress", + "Afficher": "Show", + "Annuler": "Cancel", + "Arrêter Scan": "Stop Scan", + "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Please note, \"By deleting and recreating\" will delete existing commands", + "Aucune": "None", + "Choisir une icône": "Choose an icon", + "Commande info liée": "Related command", + "Demande de groupes en cours ...": "Groups request in progress", + "Demande de scènes ": "Ask for the scenes", + "Démarrer": "Start", + "En supprimant et recréant les commandes": "By deleting and recreating orders", + "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Are you sure you want to ask all modules for their groups? It may take a while", + "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Are you sure you want to ask all modules for their scenes", + "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Are you sure you want to recreate all the commands? This will delete existing orders", + "Historiser": "Historize", + "Inverser": "Invert", + "Lancer Scan": "Start Scan", + "Les scènes Customers": "Customers Scenes", + "Les scènes Schneider": "Schneider Scenes", + "Liste": "List", + "Liste de valeur|texte séparé par ;": "List of values | text separated by;", + "Max": "Max", + "Min": "Min", + "Nom de la commande": "Command name", + "Opération réalisée avec succès": "Operation successfully completed", + "Recharge configuration": "Recharge configuration", + "Recharger la configuration": "Reload configuration", + "Sans supprimer les commandes": "Without deleting orders", + "Santé Odace SFSP": "Odace SFSP Health", + "Supprimer la commande": "Supprimer la commande", + "Sélectionner le mode de rechargement de la configuration ?": "Select the configuration reload mode?", + "Sélectionner le type de scènes que vous voulez rafraichir !": "Select the type of scenes you want to refresh!", + "Tester": "Test", + "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "A device has just been included. Please refresh the page", + "Unité": "Unit", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "You are in scan mode. Click again on the scan button to exit this mode (otherwise the mode will remain active for one minute)" }, "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "My Odace SFSP devices", - "Image": "Picture", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "Model", + "Date création": "Creation Date", + "Dernière communication": "Last communication", "Firmware": "Firmware", - "Uuid": "Uuid", + "ID": "ID", + "Image": "Picture", "Mac": "Mac", - "Dernière communication": "Last communication", - "Date création": "Creation Date", + "Mes devices Odace SFSP": "My Odace SFSP devices", + "Mes groupes Odace SFSP": "My Odace SFSP groups", "Mes scènes Odace SFSP": "My Odace SFSP scenes", - "Mes groupes Odace SFSP": "My Odace SFSP groups" + "Modèle": "Model", + "Odace SFSP": "Odace SFSP", + "Uuid": "Uuid" }, "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "You are in scan mode. Click again on the scan button to exit this mode (otherwise the mode will remain active for one minute)", - "Gestion": "Management", - "Arrêter Scan": "Stop Scan", - "Lancer Scan": "Start Scan", + "Actions": "Actions", + "Activer": "Activate", + "Ajouter une commande": "Add a command", + "Arrêter scan": "Stop Scan", + "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer": "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer", + "Catégorie": "Category", + "Commandes": "Commands", "Configuration": "Setup", - "Santé": "Health", - "Scènes": "Scenes", + "Configuration avancée": "Advanced configuration", + "Equipement": "Equipment", + "Etat": "Etat", + "Firmware": "Firmware", + "Gestion": "Management", "Groupes": "Groups", - "Rechercher": "Search", + "Lancer scan": "Start Scan", + "Mac": "Mac", "Mes devices Odace SFSP": "My Odace SFSP devices", - "Mes scènes Odace SFSP": "My Odace SFSP scenes", "Mes groupes Odace SFSP": "My Odace SFSP groups", + "Mes scènes Odace SFSP": "My Odace SFSP scenes", + "Modèle": "Model", + "Nom": "Name", + "Nom du device": "Device name", + "Objet parent": "Parent object", + "Options": "Options", + "Pairé": "Paired", + "Rechercher": "Search", "Recréer les commandes": "Recreate commands", - "Trame pairing": "Frame pairing", - "Configuration avancée": "Advanced configuration", + "Santé": "Health", "Sauvegarder": "Save", + "Scènes": "Scenes", "Supprimer": "Delete", - "Equipement": "Equipment", - "Commandes": "Commands", - "Nom du device": "Device name", - "Activer": "Activate", - "Visible": "Visible", - "Objet parent": "Parent object", - "Catégorie": "Category", - "Modèle": "Model", + "Trame pairing": "Frame pairing", + "Type": "Type", "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "Mac", - "Pairé": "Paired", - "Ajouter une commande": "Add a command", - "Nom": "Name", - "Paramètres": "Settings" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Odace SFSP Health", - "Nom": "Name", - "Min": "Min", - "Max": "Max", - "Unité": "Unit", - "Liste de valeur|texte séparé par ;": "List of values | text separated by;", - "Liste": "List", - "Afficher": "Show", - "Historiser": "Historize", - "Inverser": "Invert", - "Tester": "Test", - "Arrêter Scan": "Stop Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "You are in scan mode. Click again on the scan button to exit this mode (otherwise the mode will remain active for one minute)", - "Lancer Scan": "Start Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "A device has just been included. Please refresh the page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Reload configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Select the configuration reload mode?", - "Sans supprimer les commandes": "Without deleting orders", - "En supprimant et recréant les commandes": "By deleting and recreating orders", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Please note, \"By deleting and recreating\" will delete existing commands", - "Annuler": "Cancel", - "Démarrer": "Start", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Are you sure you want to recreate all the commands? This will delete existing orders", - "Opération réalisée avec succès": "Operation successfully completed", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Select the type of scenes you want to refresh!", - "Les scènes Schneider": "Schneider Scenes", - "Les scènes Customers": "Customers Scenes", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Are you sure you want to ask all modules for their scenes", - " ? Cela peut durer un petit moment.": "? It may take a while", - "Demande de scènes ": "Ask for the scenes", - " en cours ...": "In progress", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Are you sure you want to ask all modules for their groups? It may take a while", - "Demande de groupes en cours ...": "Groups request in progress" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "You are not authorized to perform this action", - "Aucun équipement trouvé pour : ": "No equipment found for:" + "Visible": "Visible", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "You are in scan mode. Click again on the scan button to exit this mode (otherwise the mode will remain active for one minute)" }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { + "plugins\/beagle\/plugin_info\/configuration.php": { "401 - Accès non autorisé": "401 - Unauthorized access", - "Beagle eqLogic non trouvé : ": "Beagle EqLogic not found :", - "Aucune méthode correspondante à : ": "No method corresponding to:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "New module found' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Missing information to add equipment. Impossible to include", - "Pas de configuration pour ce modèle": "No configuration for this model", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module succesfully included ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Please check the configuration", - "Périphérique reconnu, intégration en cours": "Recognized device, integration in progress" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin adding support for the Odace SFSP range (wireless without battery) Schneider to Jeedom. It is used to obtain information from the switches (shutters \/ scenes \/ single \/ double). It is used to control the actuators (shutter \/ dcl). It also allows you to use scenes and groups" + "Aucun": "None", + "Cycle (s)": "Cycle (s)", + "Démon": "Daemon", + "Port clef bluetooth": "Bluetooth keychain", + "Port socket interne": "Internal socket port" } } \ No newline at end of file diff --git a/core/i18n/es_ES.json b/core/i18n/es_ES.json index 657b671..6465e44 100644 --- a/core/i18n/es_ES.json +++ b/core/i18n/es_ES.json @@ -1,116 +1,117 @@ { - "plugins\/beagle\/plugin_info\/configuration.php": { + "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Démon": "Demonio", - "Port clef bluetooth": "Puerto de llave Bluetooth", - "Aucun": "Ninguna", - "Port socket interne": "Puerto de enchufe interno", - "55556": "55556", - "Cycle (s)": "Ciclo (s)", - "0.1": "0.1" + "Aucune méthode correspondante à : ": "Ningún método correspondiente a:", + "Beagle eqLogic non trouvé : ": "Beagle eqLogic not found :" + }, + "plugins\/beagle\/core\/class\/beagle.class.php": { + "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Falta información para agregar equipo. Imposible incluir", + "Pas de configuration pour ce modèle": "No hay configuración para este modelo", + "Périphérique reconnu, intégration en cours": "Dispositivo reconocido, integración en progreso", + "Veuillez vérifier la configuration": "Por favor verifique la configuración" + }, + "plugins\/beagle\/core\/php\/jeeBeagle.php": { + "Aucun équipement trouvé pour : ": "No se encontraron equipos para:", + "Vous n\\'etes pas autorisé à effectuer cette action": "No tiene autorización para realizar esta acción" + }, + "plugins\/beagle\/desktop\/js\/beagle.js": { + " ? Cela peut durer un petit moment.": "? Esto puede durar un poco", + " en cours ...": "en curso", + "Afficher": "Mostrar", + "Annuler": "Cancelar", + "Arrêter Scan": "Stop Scan", + "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Tenga en cuenta que \"Al eliminar y volver a crear\" eliminará los comandos existentes", + "Aucune": "Alguna", + "Choisir une icône": "Elija el icono", + "Commande info liée": "Solicitar información relacionada", + "Demande de groupes en cours ...": "Solicitud de grupo en curso", + "Demande de scènes ": "Solicitud de escenas", + "Démarrer": "Comienzo", + "En supprimant et recréant les commandes": "Al eliminar y volver a crear pedidos", + "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "¿Estás seguro de que quieres preguntar a todos los módulos por sus grupos? Esto puede durar un poco", + "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "¿Estás seguro de que quieres preguntar a todos los módulos por sus escenas?", + "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "¿Seguro que quieres recrear todos los comandos? Esto eliminará los pedidos existentes", + "Historiser": "Guardar historial", + "Inverser": "Invertir", + "Lancer Scan": "Iniciar escaneo", + "Les scènes Customers": "Escenas de Customers", + "Les scènes Schneider": "Las escenas de Schneider", + "Liste": "Lista", + "Liste de valeur|texte séparé par ;": "Lista de valores | texto separado por;", + "Max": "Máx.", + "Min": "Bajo", + "Nom de la commande": "Nombre del comando", + "Opération réalisée avec succès": "Operación completada con éxito", + "Recharge configuration": "Configuración de recarga", + "Recharger la configuration": "Recargar configuración", + "Sans supprimer les commandes": "Sin borrar pedidos", + "Santé Odace SFSP": "Salud Odace SFSP", + "Supprimer la commande": "Eliminar el pedido", + "Sélectionner le mode de rechargement de la configuration ?": "Seleccione el modo de recarga de configuración?", + "Sélectionner le type de scènes que vous voulez rafraichir !": "¡Selecciona el tipo de escenas que deseas actualizar!", + "Tester": "Probar", + "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Se acaba de incluir un dispositivo. Por favor actualiza la página", + "Unité": "Unidad", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Estás en modo de escaneo. Haga clic nuevamente en el botón de escaneo para salir de este modo (de lo contrario, el modo permanecerá activo durante un minuto)" }, "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Imagen", - "Odace SFSP": "Odace SFSP", - "ID": "Identificación", - "Modèle": "Modelo", + "Date création": "Fecha de creación", + "Dernière communication": "Última comunicación", "Firmware": "Firmware", - "Uuid": "Uuid", + "ID": "Identificación", + "Image": "Imagen", "Mac": "Mac", - "Dernière communication": "Última comunicación", - "Date création": "Fecha de creación", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" + "Mes devices Odace SFSP": "Mis dispositivos Odace SFSP", + "Mes groupes Odace SFSP": "Mis grupos Odace SFSP", + "Mes scènes Odace SFSP": "Mis escenas Odace SFSP", + "Modèle": "Modelo", + "Odace SFSP": "Odace SFSP", + "Uuid": "Uuid" }, "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Estás en modo de escaneo. Haga clic nuevamente en el botón de escaneo para salir de este modo (de lo contrario, el modo permanecerá activo durante un minuto)", - "Gestion": "Gestión", - "Arrêter Scan": "Stop Scan", - "Lancer Scan": "Iniciar escaneo", + "Actions": "Acciones", + "Activer": "Activar", + "Ajouter une commande": "Añadir una orden", + "Arrêter scan": "Stop Scan", + "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer": "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer", + "Catégorie": "Categoría", + "Commandes": "Comandos", "Configuration": "Configuración", - "Santé": "Salud", - "Scènes": "Escenas", + "Configuration avancée": "Configuración avanzada", + "Equipement": "Dispositivos", + "Etat": "Estado", + "Firmware": "Firmware", + "Gestion": "Gestión", "Groupes": "Grupos", + "Lancer scan": "Iniciar escaneo", + "Mac": "Mac", + "Mes devices Odace SFSP": "Mis dispositivos Odace SFSP", + "Mes groupes Odace SFSP": "Mis grupos Odace SFSP", + "Mes scènes Odace SFSP": "Mis escenas Odace SFSP", + "Modèle": "Modelo", + "Nom": "Nombre", + "Nom du device": "Nombre del dispositivo", + "Objet parent": "Objeto padre", + "Options": "Opciones", + "Pairé": "Par", "Rechercher": "Buscar", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", "Recréer les commandes": "Recrea comandos", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Configuración avanzada", + "Santé": "Salud", "Sauvegarder": "Guardar", + "Scènes": "Escenas", "Supprimer": "Borrar", - "Equipement": "Dispositivos", - "Commandes": "Comandos", - "Nom du device": "Nombre del dispositivo", - "Activer": "Activar", - "Visible": "Visible", - "Objet parent": "Objeto padre", - "Catégorie": "Categoría", - "Modèle": "Modelo", + "Trame pairing": "Emparejamiento de trama", + "Type": "Tipo", "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "Mac", - "Pairé": "Par", - "Ajouter une commande": "Añadir una orden", - "Nom": "Nombre", - "Paramètres": "Configuraciones" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "Nombre", - "Min": "Bajo", - "Max": "Max", - "Unité": "Unidad", - "Liste de valeur|texte séparé par ;": "Lista de valores | texto separado por;", - "Liste": "Lista", - "Afficher": "Mostrar", - "Historiser": "Guardar historial", - "Inverser": "Invertir", - "Tester": "Probar", - "Arrêter Scan": "Stop Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Estás en modo de escaneo. Haga clic nuevamente en el botón de escaneo para salir de este modo (de lo contrario, el modo permanecerá activo durante un minuto)", - "Lancer Scan": "Iniciar escaneo", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Configuración de recarga", - "Recharger la configuration": "Recargar configuración", - "Sélectionner le mode de rechargement de la configuration ?": "Seleccione el modo de recarga de configuración?", - "Sans supprimer les commandes": "Sin borrar pedidos", - "En supprimant et recréant les commandes": "Al eliminar y volver a crear pedidos", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Tenga en cuenta que \"Al eliminar y volver a crear\" eliminará los comandos existentes", - "Annuler": "Cancelar", - "Démarrer": "Comienzo", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "¿Seguro que quieres recrear todos los comandos? Esto eliminará los pedidos existentes", - "Opération réalisée avec succès": "Operación completada con éxito", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "No tiene autorización para realizar esta acción", - "Aucun équipement trouvé pour : ": "No se encontraron equipos para:" + "Visible": "Visible", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Estás en modo de escaneo. Haga clic nuevamente en el botón de escaneo para salir de este modo (de lo contrario, el modo permanecerá activo durante un minuto)" }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { + "plugins\/beagle\/plugin_info\/configuration.php": { "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic not found :", - "Aucune méthode correspondante à : ": "Ningún método correspondiente a:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Falta información para agregar equipo. Imposible incluir", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Por favor verifique la configuración", - "Périphérique reconnu, intégration en cours": "Dispositivo reconocido, integración en progreso" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" + "Aucun": "Ninguna", + "Cycle (s)": "Ciclo (s)", + "Démon": "Demonio", + "Port clef bluetooth": "Puerto de llave Bluetooth", + "Port socket interne": "Puerto de enchufe interno" } } \ No newline at end of file diff --git a/core/i18n/fr_FR.json b/core/i18n/fr_FR.json deleted file mode 100644 index 25beae3..0000000 --- a/core/i18n/fr_FR.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "plugins\/beagle\/plugin_info\/configuration.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Démon": "Démon", - "Port clef bluetooth": "Port clef bluetooth", - "Aucun": "Aucun", - "Port socket interne": "Port socket interne", - "55556": "55556", - "Cycle (s)": "Cycle (s)", - "0.1": "0.1" - }, - "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Image", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "Modèle", - "Firmware": "Firmware", - "Uuid": "Uuid", - "Mac": "Mac", - "Dernière communication": "Dernière communication", - "Date création": "Date création", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" - }, - "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "Gestion", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", - "Configuration": "Configuration", - "Santé": "Santé", - "Scènes": "Scènes", - "Groupes": "Groupes", - "Rechercher": "Rechercher", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Recréer les commandes", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Configuration avancée", - "Sauvegarder": "Sauvegarder", - "Supprimer": "Supprimer", - "Equipement": "Equipement", - "Commandes": "Commandes", - "Nom du device": "Nom du device", - "Activer": "Activer", - "Visible": "Visible", - "Objet parent": "Objet parent", - "Catégorie": "Catégorie", - "Modèle": "Modèle", - "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "Mac", - "Pairé": "Pairé", - "Ajouter une commande": "Ajouter une commande", - "Nom": "Nom", - "Paramètres": "Paramètres" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "Nom", - "Min": "Min", - "Max": "Max", - "Unité": "Unité", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "Afficher", - "Historiser": "Historiser", - "Inverser": "Inverser", - "Tester": "Tester", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.", - "Annuler": "Annuler", - "Démarrer": "Démarrer", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes", - "Opération réalisée avec succès": "Opération réalisée avec succès", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ", - " ? Cela peut durer un petit moment.": " ? Cela peut durer un petit moment.", - "Demande de scènes ": "Demande de scènes ", - " en cours ...": " en cours ...", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.", - "Demande de groupes en cours ...": "Demande de groupes en cours ..." - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Vous n\\'etes pas autorisé à effectuer cette action", - "Aucun équipement trouvé pour : ": "Aucun équipement trouvé pour : " - }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé : ", - "Aucune méthode correspondante à : ": "Aucune méthode correspondante à : " - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Périphérique reconnu, intégration en cours" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes." - } -} \ No newline at end of file diff --git a/core/i18n/id_ID.json b/core/i18n/id_ID.json deleted file mode 100644 index 9904ea6..0000000 --- a/core/i18n/id_ID.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "plugins\/beagle\/plugin_info\/configuration.php": { - "401 - Accès non autorisé": "401 - Akses tidak sah", - "Démon": "Setan", - "Port clef bluetooth": "Port clef bluetooth", - "Aucun": "Tak ada", - "Port socket interne": "Socket batin pelabuhan", - "55556": "55556", - "Cycle (s)": "Siklus (s)", - "0.1": "0.1" - }, - "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Gambar", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "Model", - "Firmware": "Firmware", - "Uuid": "Uuid", - "Mac": "Mac", - "Dernière communication": "Pesan terakhir", - "Date création": "Tanggal pembuatan", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" - }, - "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "Manajemen", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", - "Configuration": "Konfigurasi", - "Santé": "Bidang Kesehatan", - "Scènes": "Scènes", - "Groupes": "Groupes", - "Rechercher": "Pencarian", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Recréer les commandes", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Konfigurasi lanjutan", - "Sauvegarder": "Menyimpan", - "Supprimer": "Menghapus", - "Equipement": "Peralatan", - "Commandes": "Perintah", - "Nom du device": "Nom du device", - "Activer": "Mengaktifkan", - "Visible": "Terlihat", - "Objet parent": "Objek induk", - "Catégorie": "Kategori", - "Modèle": "Model", - "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "Mac", - "Pairé": "Pairé", - "Ajouter une commande": "Tambahan pesanan", - "Nom": "Nama", - "Paramètres": "Parameter²" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "Nama", - "Min": "Min", - "Max": "Max", - "Unité": "Satuan", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "Memenitikan", - "Historiser": "Historicize", - "Inverser": "Membalikkan", - "Tester": "Coba", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes", - "Annuler": "Tidak jadi", - "Démarrer": "Awal", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Apakah Anda yakin ingin menciptakan semua kontrol? Ini akan menghapus perintah yang ada", - "Opération réalisée avec succès": "Operasi berhasil diselesaikan", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Vous n\\'etes pas autorisé à effectuer cette action", - "Aucun équipement trouvé pour : ": "Aucun équipement trouvé pour :" - }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { - "401 - Accès non autorisé": "401 - Akses tidak sah", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "Aucune methode correspondante à :" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Périphérique reconnu, intégration en cours" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" - } -} \ No newline at end of file diff --git a/core/i18n/it_IT.json b/core/i18n/it_IT.json index e5cbd33..56da0a0 100644 --- a/core/i18n/it_IT.json +++ b/core/i18n/it_IT.json @@ -1,116 +1,117 @@ { - "plugins\/beagle\/plugin_info\/configuration.php": { + "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { "401 - Accès non autorisé": "401 - Accesso non autorizzato", - "Démon": "Demone", - "Port clef bluetooth": "Port clef bluetooth", - "Aucun": "Nessuno", - "Port socket interne": "Presa interna Port", - "55556": "55556", - "Cycle (s)": "Ciclo (s)", - "0.1": "0.1" + "Aucune méthode correspondante à : ": "Nessun metodo corrispondente a:", + "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trovato: " + }, + "plugins\/beagle\/core\/class\/beagle.class.php": { + "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Informazioni mancanti per aggiungere l'apparecchiatura. Impossibile includere", + "Pas de configuration pour ce modèle": "Nessuna configurazione per questo modello", + "Périphérique reconnu, intégration en cours": "Dispositivo riconosciuto, integrazione in corso", + "Veuillez vérifier la configuration": "Si prega di verificare la configurazione" + }, + "plugins\/beagle\/core\/php\/jeeBeagle.php": { + "Aucun équipement trouvé pour : ": "Nessun dispositivo trovato per: ", + "Vous n\\'etes pas autorisé à effectuer cette action": "Non sei autorizzato a eseguire questa azione" + }, + "plugins\/beagle\/desktop\/js\/beagle.js": { + " ? Cela peut durer un petit moment.": " ? Potrebbe volerci un po' di tempo.", + " en cours ...": "en cours", + "Afficher": "Mostra", + "Annuler": "Cancella", + "Arrêter Scan": "Interrompi la scansione", + "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attenzione: \"Eliminando e ricreando\" verranno eliminati i comandi esistenti.", + "Aucune": "Aucune", + "Choisir une icône": "Seleziona un\\'icona", + "Commande info liée": "Comando informazioni correlate", + "Demande de groupes en cours ...": "Richiesta di gruppi in corso...", + "Demande de scènes ": "Richiesta di scenari ", + "Démarrer": "Avvio", + "En supprimant et recréant les commandes": "Eliminando e ricreando i comandi", + "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Sei sicuro di voler chiedere a tutti i moduli quali sono i loro gruppi? Potrebbe volerci un po' di tempo.", + "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Sei sicuro di voler chiedere a tutti i moduli le loro scene? ", + "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Sei sicuro di voler ricreare tutti i comandi? Questo eliminerà i comandi esistenti", + "Historiser": "Storicizza", + "Inverser": "Inverti", + "Lancer Scan": "Avvia scansione", + "Les scènes Customers": "Scenari dei clienti", + "Les scènes Schneider": "Le scene Schneider", + "Liste": "Liste", + "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", + "Max": "Max", + "Min": "Min", + "Nom de la commande": "Nome del comando", + "Opération réalisée avec succès": "Operazione completata con successo", + "Recharge configuration": "Ricarica configurazione", + "Recharger la configuration": "Ricarica la configurazione", + "Sans supprimer les commandes": "Senza eliminare i comandi", + "Santé Odace SFSP": "Salute Odace SFSP", + "Supprimer la commande": "Elimina l'ordine", + "Sélectionner le mode de rechargement de la configuration ?": "Selezionare la modalità di ricarica della configurazione?", + "Sélectionner le type de scènes que vous voulez rafraichir !": "Seleziona il tipo di scene che desideri aggiornare!", + "Tester": "Prova", + "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "È stato appena aggiunto un dispositivo. Aggiorna la pagina", + "Unité": "Unità", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sei in modalità scansione. Clicca nuovamente sul pulsante di scansione per uscire da questa modalità (altrimenti la modalità rimarrà attiva per un minuto)" }, "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Immagine", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "Modello", + "Date création": "Data di creazione", + "Dernière communication": "Dernière communication", "Firmware": "Firmware", - "Uuid": "Uuid", + "ID": "ID", + "Image": "Immagine", "Mac": "Mac", - "Dernière communication": "Dernière communication", - "Date création": "Data di creazione", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" + "Mes devices Odace SFSP": "I miei dispositivi Odace SFSP", + "Mes groupes Odace SFSP": "I miei gruppi Odace SFSP", + "Mes scènes Odace SFSP": "Le mie scene Odace SFSP", + "Modèle": "Modello", + "Odace SFSP": "Odace SFSP", + "Uuid": "Uuid" }, "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "Gestione", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", + "Actions": "Stock", + "Activer": "Attivare", + "Ajouter une commande": "Aggiungi un comando", + "Arrêter scan": "Interrompi la scansione", + "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer": "Nessuna apparecchiatura trovata, clicca su \"Avvia scansione\" per iniziare", + "Catégorie": "Categoria", + "Commandes": "Comandi", "Configuration": "Configurazione", - "Santé": "Salute", - "Scènes": "Scènes", - "Groupes": "Groupes", - "Rechercher": "Ricercare", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Recréer les commandes", - "Trame pairing": "Trame pairing", "Configuration avancée": "Configurazione avanzata", - "Sauvegarder": "Salva", - "Supprimer": "Rimuovere", "Equipement": "Dispositivo", - "Commandes": "Comandi", - "Nom du device": "Nom du device", - "Activer": "Attivare", - "Visible": "Visibile", - "Objet parent": "Oggetto padre", - "Catégorie": "Categoria", - "Modèle": "Modello", - "Uuid": "Uuid", + "Etat": "Stato", "Firmware": "Firmware", + "Gestion": "Gestione", + "Groupes": "Gruppi", + "Lancer scan": "Avvia scansione", "Mac": "Mac", - "Pairé": "Pairé", - "Ajouter une commande": "Aggiungi un comando", - "Nom": "Nome", - "Paramètres": "Impostazioni" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", + "Mes devices Odace SFSP": "I miei dispositivi Odace SFSP", + "Mes groupes Odace SFSP": "I miei gruppi Odace SFSP", + "Mes scènes Odace SFSP": "Le mie scene Odace SFSP", + "Modèle": "Modello", "Nom": "Nome", - "Min": "Min", - "Max": "Max", - "Unité": "Unità", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "Mostra", - "Historiser": "Storicizza", - "Inverser": "Inverti", - "Tester": "Prova", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes", - "Annuler": "Cancella", - "Démarrer": "Avvio", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes", - "Opération réalisée avec succès": "Opération réalisée avec succès", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Non sei autorizzato a eseguire questa azione", - "Aucun équipement trouvé pour : ": "Aucun équipement trouvé pour :" + "Nom du device": "Nome del dispositivo", + "Objet parent": "Oggetto padre", + "Options": "Opzioni", + "Pairé": "Abbinato", + "Rechercher": "Ricercare", + "Recréer les commandes": "Ricreare i comandi", + "Santé": "Salute", + "Sauvegarder": "Salva", + "Scènes": "Scenari", + "Supprimer": "Rimuovere", + "Trame pairing": "Trame di accoppiamento", + "Type": "Tipo", + "Uuid": "Uuid", + "Visible": "Visibile", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Sei in modalità scansione. Clicca nuovamente sul pulsante di scansione per uscire da questa modalità (altrimenti la modalità rimarrà attiva per un minuto)" }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { + "plugins\/beagle\/plugin_info\/configuration.php": { "401 - Accès non autorisé": "401 - Accesso non autorizzato", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "Nessun metodo corrispondente a:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Périphérique reconnu, intégration en cours" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" + "Aucun": "Nessuno", + "Cycle (s)": "Ciclo (s)", + "Démon": "Demone", + "Port clef bluetooth": "Portachiavi Bluetooth", + "Port socket interne": "Presa interna Port" } } \ No newline at end of file diff --git a/core/i18n/ja_JP.json b/core/i18n/ja_JP.json deleted file mode 100644 index 67c48c7..0000000 --- a/core/i18n/ja_JP.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "plugins\/beagle\/plugin_info\/configuration.php": { - "401 - Accès non autorisé": "401-不正アクセス", - "Démon": "悪魔", - "Port clef bluetooth": "Port clef bluetooth", - "Aucun": "何でもありません", - "Port socket interne": "ポートインナーソケット", - "55556": "55556", - "Cycle (s)": "サイクル(S)", - "0.1": "0.1" - }, - "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "画像", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "モデル", - "Firmware": "ファームウェア", - "Uuid": "Uuid", - "Mac": "マック", - "Dernière communication": "最後の通信", - "Date création": "作成日", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" - }, - "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "管理", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", - "Configuration": "コンフィギュレーション", - "Santé": "健康", - "Scènes": "Scènes", - "Groupes": "Groupes", - "Rechercher": "検索", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Recréer les commandes", - "Trame pairing": "Trame pairing", - "Configuration avancée": "高度な構成", - "Sauvegarder": "セーブ", - "Supprimer": "取り除きます", - "Equipement": "設備", - "Commandes": "コマンド", - "Nom du device": "Nom du device", - "Activer": "アクティブ", - "Visible": "目に見えます", - "Objet parent": "親オブジェクト", - "Catégorie": "カテゴリ", - "Modèle": "モデル", - "Uuid": "Uuid", - "Firmware": "ファームウェア", - "Mac": "マック", - "Pairé": "Pairé", - "Ajouter une commande": "コマンドの追加", - "Nom": "表題", - "Paramètres": "設定" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "表題", - "Min": "低いです", - "Max": "マックス", - "Unité": "団結", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "ディスプレイ", - "Historiser": "Historicize", - "Inverser": "逆", - "Tester": "テスト", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes", - "Annuler": "キャンセル", - "Démarrer": "スタート", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "あなたはすべてのコントロールを再作成してもよろしいですか?これは、既存の注文を削除します", - "Opération réalisée avec succès": "操作は正常に完了しました", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "このアクションを実行する権限がありません", - "Aucun équipement trouvé pour : ": "Aucun équipement trouvé pour :" - }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { - "401 - Accès non autorisé": "401-不正アクセス", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "以下に対応するメソッドはありません:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Périphérique reconnu, intégration en cours" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" - } -} \ No newline at end of file diff --git a/core/i18n/pt_PT.json b/core/i18n/pt_PT.json index f651593..608c641 100644 --- a/core/i18n/pt_PT.json +++ b/core/i18n/pt_PT.json @@ -1,116 +1,117 @@ { - "plugins\/beagle\/plugin_info\/configuration.php": { + "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Démon": "Demônio", - "Port clef bluetooth": "Porta chave Bluetooth", - "Aucun": "Nenhum", - "Port socket interne": "Socket interno", - "55556": "55556", - "Cycle (s)": "Ciclo (s)", - "0.1": "0.1" + "Aucune méthode correspondante à : ": "Nenhum método correspondente a:", + "Beagle eqLogic non trouvé : ": "Beagle eqLogic não encontrado:" + }, + "plugins\/beagle\/core\/class\/beagle.class.php": { + "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Faltam informações para adicionar equipamento. Impossível incluir", + "Pas de configuration pour ce modèle": "Nenhuma configuração para este modelo", + "Périphérique reconnu, intégration en cours": "Dispositivo reconhecido, integração em andamento", + "Veuillez vérifier la configuration": "Por favor, verifique a configuração" + }, + "plugins\/beagle\/core\/php\/jeeBeagle.php": { + "Aucun équipement trouvé pour : ": "Nenhum equipamento encontrado para:", + "Vous n\\'etes pas autorisé à effectuer cette action": "Não está autorizado a executar esta ação" + }, + "plugins\/beagle\/desktop\/js\/beagle.js": { + " ? Cela peut durer un petit moment.": "? Pode demorar um pouco", + " en cours ...": "em andamento…", + "Afficher": "Mostrar", + "Annuler": "Cancelar", + "Arrêter Scan": "Parar procura", + "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Atenção, \"A excluir e recriar\" irá apagar os comandos existentes", + "Aucune": "Nenhuma", + "Choisir une icône": "Escolha um ícone", + "Commande info liée": "Comando de informação relacionada", + "Demande de groupes en cours ...": "Pedido de grupos em andamento…", + "Demande de scènes ": "Pedir cenários", + "Démarrer": "Começar", + "En supprimant et recréant les commandes": "A excluir e recriar os comandos", + "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Tem certeza de que quer pedir os grupos a todos os módulos? Pode demorar um pouco", + "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Tem certeza de que deseja pedir os cenários a todos os módulos", + "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Tem certeza de que deseja recriar todos os comandos? Isso excluirá os comandos existentes", + "Historiser": "Guardar histórico", + "Inverser": "Inverter", + "Lancer Scan": "Procurar equipamentos", + "Les scènes Customers": "Cenários do utilizador", + "Les scènes Schneider": "Cenários Schneider", + "Liste": "Lista", + "Liste de valeur|texte séparé par ;": "Lista de valores | texto separado por ;", + "Max": "Máx.", + "Min": "Min.", + "Nom de la commande": "Nome do comando", + "Opération réalisée avec succès": "Operação concluída com êxito", + "Recharge configuration": "Recarregar configuração", + "Recharger la configuration": "Recarregar a configuração", + "Sans supprimer les commandes": "Sem excluir os comandos", + "Santé Odace SFSP": "Saúde Odace SFSP", + "Supprimer la commande": "Eliminar o pedido", + "Sélectionner le mode de rechargement de la configuration ?": "Selecione o modo de recarregamento da configuração?", + "Sélectionner le type de scènes que vous voulez rafraichir !": "Selecione o tipo de cenários que deseja atualizar!", + "Tester": "Testar", + "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Um dispositivo acaba de ser incluído. Atualize a página", + "Unité": "Unidade", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Está no modo de procura. Clique novamente no botão Procurar para sair (caso contrário, o modo permanecerá ativo por um minuto)" }, "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Os meus dispositivos Odace SFSP", - "Image": "Imagem", - "Odace SFSP": "Odace SFSP", - "ID": "ID", - "Modèle": "Modelo", + "Date création": "Data de criação", + "Dernière communication": "última mensagem", "Firmware": "Firmware", - "Uuid": "Uuid", + "ID": "EU IRIA", + "Image": "Imagem", "Mac": "MAC", - "Dernière communication": "última mensagem", - "Date création": "Data de criação", + "Mes devices Odace SFSP": "Os meus dispositivos Odace SFSP", + "Mes groupes Odace SFSP": "Os meus grupos Odace SFSP", "Mes scènes Odace SFSP": "Os meus cenários Odace SFSP", - "Mes groupes Odace SFSP": "Os meus grupos Odace SFSP" + "Modèle": "Modelo", + "Odace SFSP": "Odace SFSP", + "Uuid": "Uuid" }, "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Está no modo de procura. Clique novamente no botão Procurar para sair (caso contrário, o modo permanecerá ativo por um minuto)", - "Gestion": "Gestão", - "Arrêter Scan": "Parar procura", - "Lancer Scan": "Começar procura", + "Actions": "Ações", + "Activer": "Ativar", + "Ajouter une commande": "Adicionar comando", + "Arrêter scan": "Parar procura", + "Aucun équipement trouvé, cliquer sur \"Lancer le scan\" pour commencer": "Não foram encontrados equipamentos. Clique em «Iniciar a verificação» para começar", + "Catégorie": "Categoria", + "Commandes": "Comandos", "Configuration": "Configuração", - "Santé": "Saúde", - "Scènes": "Cenários", + "Configuration avancée": "Configuração avançada", + "Equipement": "Equipamento", + "Etat": "Estado", + "Firmware": "Firmware", + "Gestion": "Gestão", "Groupes": "Grupos", - "Rechercher": "Pesquisar", + "Lancer scan": "Começar procura", + "Mac": "MAC", "Mes devices Odace SFSP": "Os meus dispositivos Odace SFSP", - "Mes scènes Odace SFSP": "Os meus cenários Odace SFSP", "Mes groupes Odace SFSP": "Os meus grupos Odace SFSP", + "Mes scènes Odace SFSP": "Os meus cenários Odace SFSP", + "Modèle": "Modelo", + "Nom": "Nome", + "Nom du device": "Nome do dispositivo", + "Objet parent": "Objeto pai", + "Options": "Opções", + "Pairé": "Emparelhado", + "Rechercher": "Pesquisar", "Recréer les commandes": "Recriar os comandos", - "Trame pairing": "Emparelhamento", - "Configuration avancée": "Configuração avançada", + "Santé": "Saúde", "Sauvegarder": "Guardar", + "Scènes": "Cenários", "Supprimer": "Remover", - "Equipement": "Equipamento", - "Commandes": "Comandos", - "Nom du device": "Nome do dispositivo", - "Activer": "Ativar", - "Visible": "Visível", - "Objet parent": "Objeto pai", - "Catégorie": "Categoria", - "Modèle": "Modelo", + "Trame pairing": "Emparelhamento", + "Type": "Tipo", "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "MAC", - "Pairé": "Emparelhado", - "Ajouter une commande": "Adicionar comando", - "Nom": "Nome", - "Paramètres": "Configurações" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Saúde Odace SFSP", - "Nom": "Nome", - "Min": "Min.", - "Max": "Máx.", - "Unité": "Unidade", - "Liste de valeur|texte séparé par ;": "Lista de valores | texto separado por ;", - "Liste": "Lista", - "Afficher": "Mostrar", - "Historiser": "Guardar histórico", - "Inverser": "Inverter", - "Tester": "Testar", - "Arrêter Scan": "Parar procura", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Está no modo de digitalização. Clique novamente no botão digitalizar para sair deste modo (caso contrário, o modo permanecerá ativo por um minuto)", - "Lancer Scan": "Procurar equipamentos", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Um dispositivo acaba de ser incluído. Atualize a página", - "Recharge configuration": "Recarregar configuração", - "Recharger la configuration": "Recarregar a configuração", - "Sélectionner le mode de rechargement de la configuration ?": "Selecione o modo de recarregamento da configuração?", - "Sans supprimer les commandes": "Sem excluir os comandos", - "En supprimant et recréant les commandes": "A excluir e recriar os comandos", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Atenção, \"A excluir e recriar\" irá apagar os comandos existentes", - "Annuler": "Cancelar", - "Démarrer": "Começar", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Tem certeza de que deseja recriar todos os comandos? Isso excluirá os comandos existentes", - "Opération réalisée avec succès": "Operação concluída com êxito", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Selecione o tipo de cenários que deseja atualizar!", - "Les scènes Schneider": "Cenários Schneider", - "Les scènes Customers": "Cenários do utilizador", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Tem certeza de que deseja pedir os cenários a todos os módulos", - " ? Cela peut durer un petit moment.": "? Pode demorar um pouco", - "Demande de scènes ": "Pedir cenários", - " en cours ...": "em andamento…", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Tem certeza de que quer pedir os grupos a todos os módulos? Pode demorar um pouco", - "Demande de groupes en cours ...": "Pedido de grupos em andamento…" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Não está autorizado a executar esta ação", - "Aucun équipement trouvé pour : ": "Nenhum equipamento encontrado para:" + "Visible": "Visível", + "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Está no modo de procura. Clique novamente no botão Procurar para sair (caso contrário, o modo permanecerá ativo por um minuto)" }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { + "plugins\/beagle\/plugin_info\/configuration.php": { "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic não encontrado:", - "Aucune méthode correspondante à : ": "Nenhum método correspondente a:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Novo módulo detectado ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Faltam informações para adicionar equipamento. Impossível incluir", - "Pas de configuration pour ce modèle": "Nenhuma configuração para este modelo", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Módulo incluído com sucesso ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Por favor, verifique a configuração", - "Périphérique reconnu, intégration en cours": "Dispositivo reconhecido, integração em andamento" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin adicionando suporte para a gama Odace SFSP (sem fio sem bateria) Schneider para Jeedom. É usado para obter informações dos interruptores (persianas \/ cenas \/ simples \/ duplas). É usado para controlar os atuadores (obturador \/ dcl). Também permite usar cenas e grupos" + "Aucun": "Nenhum", + "Cycle (s)": "Ciclo (s)", + "Démon": "Demônio", + "Port clef bluetooth": "Porta chave Bluetooth", + "Port socket interne": "Socket interno" } } \ No newline at end of file diff --git a/core/i18n/ru_RU.json b/core/i18n/ru_RU.json deleted file mode 100644 index 2a7b1c5..0000000 --- a/core/i18n/ru_RU.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "plugins\/beagle\/plugin_info\/configuration.php": { - "401 - Accès non autorisé": "401 - Несанкционированный доступ", - "Démon": "Демон", - "Port clef bluetooth": "Port clef bluetooth", - "Aucun": "Нет", - "Port socket interne": "Порт внутренний разъем", - "55556": "55556", - "Cycle (s)": "Цикл (ы)", - "0.1": "0.1" - }, - "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Изображение", - "Odace SFSP": "Odace SFSP", - "ID": "Идентификатор", - "Modèle": "Модель", - "Firmware": "прошивки", - "Uuid": "Uuid", - "Mac": "макинтош", - "Dernière communication": "Последнее сообщение", - "Date création": "дата создания", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" - }, - "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "Управление", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", - "Configuration": "Конфигурация", - "Santé": "Здоровье", - "Scènes": "Scènes", - "Groupes": "Groupes", - "Rechercher": "поиск", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Recréer les commandes", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Расширенные настройки", - "Sauvegarder": "Сохранить", - "Supprimer": "удаление", - "Equipement": "Оборудование", - "Commandes": "Команды", - "Nom du device": "Nom du device", - "Activer": "активировать", - "Visible": "Видимый", - "Objet parent": "Родительский объект", - "Catégorie": "категория", - "Modèle": "Модель", - "Uuid": "Uuid", - "Firmware": "прошивки", - "Mac": "макинтош", - "Pairé": "Pairé", - "Ajouter une commande": "Добавить команду", - "Nom": "Имя", - "Paramètres": "настройки" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "Имя", - "Min": "Мин", - "Max": "Макс", - "Unité": "Устройство", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "дисплей", - "Historiser": "История", - "Inverser": "Обратный", - "Tester": "Тест", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes", - "Annuler": "Отменить", - "Démarrer": "Démarrer", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes", - "Opération réalisée avec succès": "Opération réalisée avec succès", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Vous n\\'etes pas autorisé à effectuer cette action", - "Aucun équipement trouvé pour : ": "Aucun équipement trouvé pour :" - }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { - "401 - Accès non autorisé": "401 - Несанкционированный доступ", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "Aucune methode correspondante à :" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Périphérique reconnu, intégration en cours" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" - } -} \ No newline at end of file diff --git a/core/i18n/tr.json b/core/i18n/tr.json deleted file mode 100644 index 40c895b..0000000 --- a/core/i18n/tr.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "plugins\/beagle\/plugin_info\/configuration.php": { - "401 - Accès non autorisé": "401 - Yetkisiz erişim", - "Démon": "Daemon", - "Port clef bluetooth": "Bluetooth anahtarın port u", - "Aucun": "Hiçbir", - "Port socket interne": "İç socket port", - "55556": "55556", - "Cycle (s)": "Devir", - "0.1": "0.1" - }, - "plugins\/beagle\/desktop\/modal\/health.php": { - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Image": "Fotoğraf", - "Odace SFSP": "Odace SFSP", - "ID": "Kimlik", - "Modèle": "Model", - "Firmware": "Firmware", - "Uuid": "Uuid", - "Mac": "Mac", - "Dernière communication": "Son konuşma", - "Date création": "Oluşturma tarihi", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP" - }, - "plugins\/beagle\/desktop\/php\/beagle.php": { - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Gestion": "Idare", - "Arrêter Scan": "Arrêter Scan", - "Lancer Scan": "Lancer Scan", - "Configuration": "Ayar", - "Santé": "Sağlık", - "Scènes": "Scènes", - "Groupes": "Gruplar", - "Rechercher": "Arayın", - "Mes devices Odace SFSP": "Mes devices Odace SFSP", - "Mes scènes Odace SFSP": "Mes scènes Odace SFSP", - "Mes groupes Odace SFSP": "Mes groupes Odace SFSP", - "Recréer les commandes": "Komutlari yeniden oluşturmak", - "Trame pairing": "Trame pairing", - "Configuration avancée": "Gelişmiş ayarlar", - "Sauvegarder": "Kaydet", - "Supprimer": "Sil", - "Equipement": "Cihaz", - "Commandes": "Komutalar", - "Nom du device": "Cihazın ismi", - "Activer": "Etkinleştir", - "Visible": "Görülebilir", - "Objet parent": "Üst nesne", - "Catégorie": "Kategori", - "Modèle": "Model", - "Uuid": "Uuid", - "Firmware": "Firmware", - "Mac": "Mac", - "Pairé": "Pairé", - "Ajouter une commande": "Komuta ekle", - "Nom": "İsim", - "Paramètres": "Ayarlar ( Séçenekler )" - }, - "plugins\/beagle\/desktop\/js\/beagle.js": { - "Santé Odace SFSP": "Santé Odace SFSP", - "Nom": "İsim", - "Min": "Minimum", - "Max": "Maximum", - "Unité": "Ünite", - "Liste de valeur|texte séparé par ;": "Liste de valeur|texte séparé par ;", - "Liste": "Liste", - "Afficher": "Göster", - "Historiser": "Tarihe göre sırala", - "Inverser": "Ters çevir", - "Tester": "Test et", - "Arrêter Scan": "Arrêter Scan", - "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)": "Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)", - "Lancer Scan": "Lancer Scan", - "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page": "Un périphérique vient d\\'être inclu. Veuillez réactualiser la page", - "Recharge configuration": "Recharge configuration", - "Recharger la configuration": "Recharger la configuration", - "Sélectionner le mode de rechargement de la configuration ?": "Sélectionner le mode de rechargement de la configuration ?", - "Sans supprimer les commandes": "Sans supprimer les commandes", - "En supprimant et recréant les commandes": "En supprimant et recréant les commandes", - "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes.": "Attention, \"En supprimant et recréant\" va supprimer les commandes existantes", - "Annuler": "Iptal et", - "Démarrer": "Başlangıç", - "Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes": "Tüm komutları yeniden oluşturmak istediğinizden emin misiniz? Bu mevcut komutları silecek", - "Opération réalisée avec succès": "Operasyon başarıyla tamamlandı", - "Sélectionner le type de scènes que vous voulez rafraichir !": "Sélectionner le type de scènes que vous voulez rafraichir !", - "Les scènes Schneider": "Les scènes Schneider", - "Les scènes Customers": "Les scènes Customers", - "Etes-vous sûr de vouloir demander à tous les modules leurs scènes ": "Etes-vous sûr de vouloir demander à tous les modules leurs scènes", - " ? Cela peut durer un petit moment.": "? Cela peut durer un petit moment", - "Demande de scènes ": "Demande de scènes", - " en cours ...": "en cours", - "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.": "Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment", - "Demande de groupes en cours ...": "Demande de groupes en cours" - }, - "plugins\/beagle\/core\/php\/jeeBeagle.php": { - "Vous n\\'etes pas autorisé à effectuer cette action": "Bu işlemi gerçekleştirme yetkiniz yok", - "Aucun équipement trouvé pour : ": "Herhangi bir ekipman bulunmadi" - }, - "plugins\/beagle\/core\/ajax\/beagle.ajax.php": { - "401 - Accès non autorisé": "401 - Yetkisiz erişim", - "Beagle eqLogic non trouvé : ": "Beagle eqLogic non trouvé :", - "Aucune méthode correspondante à : ": "Aşağıdakilere karşılık gelen bir yöntem yok:" - }, - "plugins\/beagle\/core\/class\/beagle.class.php": { - "Nouveau module detecté ' . $_def['data']['uuid']": "Nouveau module detecté ' . $_def['data']['uuid']", - "Information manquante pour ajouter l\\'équipement. Inclusion impossible": "Information manquante pour ajouter l\\'équipement. Inclusion impossible", - "Pas de configuration pour ce modèle": "Pas de configuration pour ce modèle", - "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']": "Module inclu avec succès ' .$_def['model'].' ' . $_def['uuid']", - "Veuillez vérifier la configuration": "Veuillez vérifier la configuration", - "Périphérique reconnu, intégration en cours": "Tanınan cihaz, entegrasyon işlemde" - }, - "info.json": { - "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" - } -} \ No newline at end of file diff --git a/core/php/jeeBeagle.php b/core/php/jeeBeagle.php index 921b5a1..cebce40 100644 --- a/core/php/jeeBeagle.php +++ b/core/php/jeeBeagle.php @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with Jeedom. If not, see . */ -require_once dirname(__FILE__) . "/../../../../core/php/core.inc.php"; +require_once __DIR__ . "/../../../../core/php/core.inc.php"; if (!jeedom::apiAccess(init('apikey'), 'beagle')) { echo __('Vous n\'etes pas autorisé à effectuer cette action', __FILE__); @@ -35,15 +35,21 @@ if (isset($result['learn_mode'])) { if ($result['learn_mode'] == 1) { config::save('include_mode', 1, 'beagle'); - event::add('beagle::includeState', array( - 'mode' => 'learn', - 'state' => 1) + event::add( + 'beagle::includeState', + array( + 'mode' => 'learn', + 'state' => 1 + ) ); } else { config::save('include_mode', 0, 'beagle'); - event::add('beagle::includeState', array( - 'mode' => 'learn', - 'state' => 0) + event::add( + 'beagle::includeState', + array( + 'mode' => 'learn', + 'state' => 0 + ) ); } } @@ -53,76 +59,77 @@ if (!isset($datas['uuid'])) { continue; } - if ($datas['data']['type'] == 'scene'){ - log::add('beagle','debug','This is a scene add'); - foreach ($datas['data']['scenes'] as $sceneUuid){ - if ($sceneUuid != 'ffffffff') { - $scene = beagle::byLogicalId($sceneUuid, 'beagle'); - if (!is_object($scene)) { - $scene = new beagle(); - $scene->setLogicalId($sceneUuid); - $scene->setName('Scene ' .$sceneUuid); - $scene->setIsEnable(1); - $scene->setIsVisible(1); - $scene->setConfiguration('device','scene'); - $scene->setConfiguration('type',$datas['data']['subtype']); - $scene->setEqType_name('beagle'); - $scene->save(); - event::add('beagle::includeDevice',''); + if ($datas['data']['type'] == 'scene') { + log::add('beagle', 'debug', 'This is a scene add'); + foreach ($datas['data']['scenes'] as $sceneUuid) { + if ($sceneUuid != 'ffffffff') { + $scene = beagle::byLogicalId($sceneUuid, 'beagle'); + if (!is_object($scene)) { + $scene = new beagle(); + $scene->setLogicalId($sceneUuid); + $scene->setName('Scene ' . $sceneUuid); + $scene->setIsEnable(1); + $scene->setIsVisible(1); + $scene->setConfiguration('device', 'scene'); + $scene->setConfiguration('type', $datas['data']['subtype']); + $scene->setEqType_name('beagle'); + $scene->save(); + event::add('beagle::includeDevice', ''); + } } } - } - continue; + continue; } - if ($datas['data']['type'] == 'group'){ - log::add('beagle','debug','This is a group add'); - foreach ($datas['data']['groups'] as $groupUuid){ - if ($groupUuid != 'ffffffff') { - $group = beagle::byLogicalId($groupUuid, 'beagle'); - if (!is_object($group)) { - $group = new beagle(); - $group->setLogicalId($groupUuid); - $group->setName('Groupe ' .$groupUuid); - $group->setIsEnable(1); - $group->setIsVisible(1); - $group->setConfiguration('device','group'.$datas['model']); - $group->setEqType_name('beagle'); - $group->save(); - event::add('beagle::includeDevice',''); + if ($datas['data']['type'] == 'group') { + log::add('beagle', 'debug', 'This is a group add'); + foreach ($datas['data']['groups'] as $groupUuid) { + if ($groupUuid != 'ffffffff') { + $group = beagle::byLogicalId($groupUuid, 'beagle'); + if (!is_object($group)) { + $group = new beagle(); + $group->setLogicalId($groupUuid); + $group->setName('Groupe ' . $groupUuid); + $group->setIsEnable(1); + $group->setIsVisible(1); + $group->setConfiguration('device', 'group' . $datas['model']); + $group->setEqType_name('beagle'); + $group->save(); + event::add('beagle::includeDevice', ''); + } } } - } - continue; + continue; } $beagle = beagle::byLogicalId($datas['uuid'], 'beagle'); if (!is_object($beagle)) { if ($datas['data']['type'] != 'binding') { continue; } - log::add('beagle','debug','This is a learn for ' . $key); + log::add('beagle', 'debug', 'This is a learn for ' . $key); + $beagle = beagle::createFromDef($datas); if (!is_object($beagle)) { log::add('beagle', 'debug', __('Aucun équipement trouvé pour : ', __FILE__) . secureXSS($datas['uuid'])); continue; } sleep(1); - log::add('beagle','debug','Answer learn if needed'); + log::add('beagle', 'debug', 'Answer learn if needed'); $beagle->binding(); event::add('jeedom::alert', array( 'level' => 'warning', 'page' => 'beagle', 'message' => '', )); - event::add('beagle::includeDevice',''); + event::add('beagle::includeDevice', ''); } - if (isset($datas['data']['paired'])){ - $beagle->setConfiguration('paired',$datas['data']['paired']); + if (isset($datas['data']['paired'])) { + $beagle->setConfiguration('paired', $datas['data']['paired']); $beagle->save(); event::add('beagle::includeDevice', $beagle->getId()); } - if (isset($datas['data']['firmware'])){ - if ($beagle->getConfiguration('firmware','') != $datas['data']['firmware']){ - $beagle->setConfiguration('firmware',$datas['data']['firmware']); + if (isset($datas['data']['firmware'])) { + if ($beagle->getConfiguration('firmware', '') != $datas['data']['firmware']) { + $beagle->setConfiguration('firmware', $datas['data']['firmware']); $beagle->save(); } } @@ -150,39 +157,38 @@ } } if (isset($datas['data']['groups'])) { - foreach ($datas['data']['groups'] as $key => $dataGroup){ - if ($key != 'ffffffff'){ - log::add('beagle','debug', 'Group info received for ' . $key); - $group = beagle::byLogicalId($key, 'beagle'); - if (!is_object($group)) { - continue; + foreach ($datas['data']['groups'] as $key => $dataGroup) { + if ($key != 'ffffffff') { + log::add('beagle', 'debug', 'Group info received for ' . $key); + $group = beagle::byLogicalId($key, 'beagle'); + if (!is_object($group)) { + continue; + } + if (!$group->getIsEnable()) { + continue; + } + foreach ($group->getCmd('info') as $cmd) { + $logicalId = $cmd->getLogicalId(); + if ($logicalId == '') { + continue; + } + $path = explode('::', $logicalId); + $value = $dataGroup; + foreach ($path as $key) { + if (!isset($value[$key])) { + continue (2); + } + $value = $value[$key]; + } + if (!is_array($value)) { + if ($cmd->getSubType() == 'numeric') { + $value = round($value, 2); + } + $cmd->event($value); + } + } } - if (!$group->getIsEnable()) { - continue; - } - foreach ($group->getCmd('info') as $cmd) { - $logicalId = $cmd->getLogicalId(); - if ($logicalId == '') { - continue; - } - $path = explode('::', $logicalId); - $value = $dataGroup; - foreach ($path as $key) { - if (!isset($value[$key])) { - continue (2); - } - $value = $value[$key]; - } - if (!is_array($value)) { - if ($cmd->getSubType() == 'numeric') { - $value = round($value, 2); - } - $cmd->event($value); - } - } } - } - } } } diff --git a/desktop/js/beagle.js b/desktop/js/beagle.js index 7ed4bb6..485df70 100644 --- a/desktop/js/beagle.js +++ b/desktop/js/beagle.js @@ -14,67 +14,75 @@ * You should have received a copy of the GNU General Public License * along with Jeedom. If not, see . */ - $('#bt_resetSearch').off('click').on('click', function () { - $('#in_searchEqlogic').val('') - $('#in_searchEqlogic').keyup(); - }) - - $('#bt_healthbeagle').on('click', function () { - $('#md_modal').dialog({title: "{{Santé Odace SFSP}}"}); - $('#md_modal').load('index.php?v=d&plugin=beagle&modal=health').dialog('open'); +$('#bt_resetSearch').off('click').on('click', function () { + $('#in_searchEqlogic').val('') + $('#in_searchEqlogic').keyup(); +}) + +$('#bt_healthbeagle').on('click', function () { + $('#md_modal').dialog({ title: "{{Santé Odace SFSP}}" }); + $('#md_modal').load('index.php?v=d&plugin=beagle&modal=health').dialog('open'); }); - $('.eqLogicAttr[data-l1key=configuration][data-l2key=device]').on('change', function () { - if($('.eqLogicAttr[data-l1key=id]').value() != ''){ - $('#img_device').attr("src",'plugins/beagle/core/config/devices/'+ $(this).value() + '/'+ $(this).value() + '.png'); - }else{ - $('#img_device').attr("src",'plugins/beagle/plugin_info/beagle_icon.png'); +$('.eqLogicAttr[data-l1key=configuration][data-l2key=device]').on('change', function () { + if ($('.eqLogicAttr[data-l1key=id]').value() != '') { + $('#img_device').attr("src", 'plugins/beagle/core/config/devices/' + $(this).value() + '/' + $(this).value() + '.png'); + } else { + $('#img_device').attr("src", 'plugins/beagle/plugin_info/beagle_icon.png'); } getModelListParam($(this).value()); }); $('#bt_pairing').on('click', function () { - $.ajax({// fonction permettant de faire de l'ajax - type: "POST", // méthode de transmission des données au fichier php - url: "plugins/beagle/core/ajax/beagle.ajax.php", // url du fichier php - data: { - action: "pairing", - id : $('.eqLogicAttr[data-l1key=id]').value(), - }, - dataType: 'json', - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { // si l'appel a bien fonctionné - } - }); + $.ajax({// fonction permettant de faire de l'ajax + type: "POST", // méthode de transmission des données au fichier php + url: "plugins/beagle/core/ajax/beagle.ajax.php", // url du fichier php + data: { + action: "pairing", + id: $('.eqLogicAttr[data-l1key=id]').value(), + }, + dataType: 'json', + error: function (request, status, error) { + handleAjaxError(request, status, error); + }, + success: function (data) { // si l'appel a bien fonctionné + } + }); }); - $('.changeIncludeState').on('click', function () { - var mode = $(this).attr('data-mode'); - var state = $(this).attr('data-state'); - changeIncludeState(state, mode); +$('.changeIncludeState').on('click', function () { + var mode = $(this).attr('data-mode'); + var state = $(this).attr('data-state'); + changeIncludeState(state, mode); }); -$("#table_cmd").sortable({axis: "y", cursor: "move", items: ".cmd", placeholder: "ui-state-highlight", tolerance: "intersect", forcePlaceholderSize: true}); +$("#table_cmd").sortable({ axis: "y", cursor: "move", items: ".cmd", placeholder: "ui-state-highlight", tolerance: "intersect", forcePlaceholderSize: true }); function addCmdToTable(_cmd) { - if (!isset(_cmd)) { - var _cmd = {configuration: {}}; - } - if (!isset(_cmd.configuration)) { - _cmd.configuration = {}; - } - var tr = ''; - tr += ''; - tr += ''; - tr += ''; - tr += ''; - tr += ''; - tr += '' + jeedom.cmd.availableType() + ''; - tr += ''; - tr += ''; - + if (!isset(_cmd)) { + var _cmd = { configuration: {} }; + } + if (!isset(_cmd.configuration)) { + _cmd.configuration = {}; + } + var tr = ''; + tr += ''; + tr += ''; + tr += '
'; + tr += ''; + tr += ''; + tr += ''; + tr += '
'; + tr += ''; + tr += ''; + + tr += ''; + tr += '' + jeedom.cmd.availableType() + ''; + tr += ''; + tr += ''; + tr += ''; tr += ''; tr += ''; @@ -84,46 +92,60 @@ function addCmdToTable(_cmd) { tr += ' '; tr += ' '; tr += ''; - tr += ''; - if (is_numeric(_cmd.id)) { - tr += ' '; - tr += ' {{Tester}}'; - } - tr += ''; - tr += ''; - tr += ''; - $('#table_cmd tbody').append(tr); - $('#table_cmd tbody tr:last').setValues(_cmd, '.cmdAttr'); - if (isset(_cmd.type)) { - $('#table_cmd tbody tr:last .cmdAttr[data-l1key=type]').value(init(_cmd.type)); + + tr += ''; + tr += ''; + tr += ''; + + tr += ''; + if (is_numeric(_cmd.id)) { + tr += ' '; + tr += ' {{Tester}}'; + } + tr += '' + tr += ''; + tr += ''; + + $('#table_cmd tbody').append(tr); + var tr = $('#table_cmd tbody tr').last(); + jeedom.eqLogic.buildSelectCmd({ + id: $('.eqLogicAttr[data-l1key=id]').value(), + filter: { type: 'info' }, + error: function (error) { + $('#div_alert').showAlert({ message: error.message, level: 'danger' }) + }, + success: function (result) { + tr.find('.cmdAttr[data-l1key=value]').append(result); + tr.setValues(_cmd, '.cmdAttr'); + jeedom.cmd.changeType(tr, init(_cmd.subType)); } - jeedom.cmd.changeType($('#table_cmd tbody tr:last'), init(_cmd.subType)); + }) } -$('body').on('beagle::includeState', function (_event,_options) { - if (_options['mode'] == 'learn') { - if (_options['state'] == 1) { - if($('.include').attr('data-state') != 0){ - $.hideAlert(); - $('.include:not(.card)').removeClass('btn-default').addClass('btn-success'); - $('.include').attr('data-state', 0); - $('.include').empty().append('
{{Arrêter Scan}}'); - $('#div_inclusionAlert').showAlert({message: '{{Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)}}', level: 'warning'}); - } - } else { - if($('.include').attr('data-state') != 1){ - $.hideAlert(); - $('.include:not(.card)').addClass('btn-default').removeClass('btn-success btn-danger'); - $('.include').attr('data-state', 1); - $('.include').empty().append('
{{Lancer Scan}}'); - } - } - } +$('body').on('beagle::includeState', function (_event, _options) { + if (_options['mode'] == 'learn') { + if (_options['state'] == 1) { + if ($('.include').attr('data-state') != 0) { + $.hideAlert(); + $('.include:not(.card)').removeClass('btn-default').addClass('btn-success'); + $('.include').attr('data-state', 0); + $('.include').empty().append('
{{Arrêter Scan}}'); + $('#div_inclusionAlert').showAlert({ message: '{{Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)}}', level: 'warning' }); + } + } else { + if ($('.include').attr('data-state') != 1) { + $.hideAlert(); + $('.include:not(.card)').addClass('btn-default').removeClass('btn-success btn-danger'); + $('.include').attr('data-state', 1); + $('.include').empty().append('
{{Lancer Scan}}'); + } + } + } }); -$('body').off('beagle::includeDevice').on('beagle::includeDevice', function (_event,_options) { +$('body').off('beagle::includeDevice').on('beagle::includeDevice', function (_event, _options) { if (modifyWithoutSave) { - $('#div_inclusionAlert').showAlert({message: '{{Un périphérique vient d\'être inclu. Veuillez réactualiser la page}}', level: 'warning'}); + $('#div_inclusionAlert').showAlert({ message: '{{Un périphérique vient d\'être inclu. Veuillez réactualiser la page}}', level: 'warning' }); } else { if (_options == '') { window.location.reload(); @@ -138,13 +160,13 @@ $('#bt_autoDetectModule').on('click', function () { var dialog_message = '
'; dialog_title = '{{Recharger la configuration}}'; dialog_message += ' ' + - '
' + - '
' + - '
' + - '

' + - ' '; + '
' + + '
' + + '
' + + '

' + + ' '; dialog_message += '
'; bootbox.dialog({ title: dialog_title, @@ -159,7 +181,7 @@ $('#bt_autoDetectModule').on('click', function () { label: "{{Démarrer}}", className: "btn-success", callback: function () { - if ($("input[name='command']:checked").val() == "1"){ + if ($("input[name='command']:checked").val() == "1") { bootbox.confirm('{{Etes-vous sûr de vouloir récréer toutes les commandes ? Cela va supprimer les commandes existantes}}', function (result) { if (result) { $.ajax({ @@ -177,10 +199,10 @@ $('#bt_autoDetectModule').on('click', function () { }, success: function (data) { if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); return; } - $('#div_alert').showAlert({message: '{{Opération réalisée avec succès}}', level: 'success'}); + $('#div_alert').showAlert({ message: '{{Opération réalisée avec succès}}', level: 'success' }); $('.li_eqLogic[data-eqLogic_id=' + $('.eqLogicAttr[data-l1key=id]').value() + ']').click(); } }); @@ -202,10 +224,10 @@ $('#bt_autoDetectModule').on('click', function () { }, success: function (data) { if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); return; } - $('#div_alert').showAlert({message: '{{Opération réalisée avec succès}}', level: 'success'}); + $('#div_alert').showAlert({ message: '{{Opération réalisée avec succès}}', level: 'success' }); $('.li_eqLogic[data-eqLogic_id=' + $('.eqLogicAttr[data-l1key=id]').value() + ']').click(); } }); @@ -218,93 +240,93 @@ $('#bt_autoDetectModule').on('click', function () { }); $('#bt_askscenes').on('click', function () { - var dialog_title = '{{Recharge configuration}}'; - var dialog_message = '
'; - dialog_title = '{{Recharger la configuration}}'; - dialog_message += ' ' + - '
' + - '
' + - '
' + - '

'; - dialog_message += '
'; - bootbox.dialog({ - title: dialog_title, - message: dialog_message, - buttons: { - "{{Annuler}}": { - className: "btn-danger", - callback: function () { - } - }, - success: { - label: "{{Démarrer}}", - className: "btn-success", - callback: function () { - if ($("input[name='command']:checked").val() == "0"){ - var name = 'Schneider'; - var type = 'schneiderScenes'; - } else { - var name = 'Customers'; - var type = 'customerScenes'; - } - bootbox.confirm('{{Etes-vous sûr de vouloir demander à tous les modules leurs scènes }}' + name + '{{ ? Cela peut durer un petit moment.}}', function (result) { - if (result) { - $('#div_alert').showAlert({message: '{{Demande de scènes }}' + name + '{{ en cours ...}}', level: 'warning'}); - $.ajax({ - type: "POST", - url: "plugins/beagle/core/ajax/beagle.ajax.php", - data: { - action: "askscenes", - type : type - }, - dataType: 'json', - global: false, - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { - if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); - return; - } - $('#div_alert').showAlert({message: '{{Opération réalisée avec succès}}', level: 'success'}); - } - }); - } - }); - } - } - } - }); + var dialog_title = '{{Recharge configuration}}'; + var dialog_message = '
'; + dialog_title = '{{Recharger la configuration}}'; + dialog_message += ' ' + + '
' + + '
' + + '
' + + '

'; + dialog_message += '
'; + bootbox.dialog({ + title: dialog_title, + message: dialog_message, + buttons: { + "{{Annuler}}": { + className: "btn-danger", + callback: function () { + } + }, + success: { + label: "{{Démarrer}}", + className: "btn-success", + callback: function () { + if ($("input[name='command']:checked").val() == "0") { + var name = 'Schneider'; + var type = 'schneiderScenes'; + } else { + var name = 'Customers'; + var type = 'customerScenes'; + } + bootbox.confirm('{{Etes-vous sûr de vouloir demander à tous les modules leurs scènes }}' + name + '{{ ? Cela peut durer un petit moment.}}', function (result) { + if (result) { + $('#div_alert').showAlert({ message: '{{Demande de scènes }}' + name + '{{ en cours ...}}', level: 'warning' }); + $.ajax({ + type: "POST", + url: "plugins/beagle/core/ajax/beagle.ajax.php", + data: { + action: "askscenes", + type: type + }, + dataType: 'json', + global: false, + error: function (request, status, error) { + handleAjaxError(request, status, error); + }, + success: function (data) { + if (data.state != 'ok') { + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); + return; + } + $('#div_alert').showAlert({ message: '{{Opération réalisée avec succès}}', level: 'success' }); + } + }); + } + }); + } + } + } + }); }); $('#bt_askgroups').on('click', function () { - bootbox.confirm('{{Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.}}', function (result) { - if (result) { - $('#div_alert').showAlert({message: '{{Demande de groupes en cours ...}}', level: 'warning'}); - $.ajax({ - type: "POST", - url: "plugins/beagle/core/ajax/beagle.ajax.php", - data: { - action: "askgroups" - }, - dataType: 'json', - global: false, - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { - if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); - return; - } - $('#div_alert').showAlert({message: '{{Opération réalisée avec succès}}', level: 'success'}); - } - }); + bootbox.confirm('{{Etes-vous sûr de vouloir demander à tous les modules leurs groupes ? Cela peut durer un petit moment.}}', function (result) { + if (result) { + $('#div_alert').showAlert({ message: '{{Demande de groupes en cours ...}}', level: 'warning' }); + $.ajax({ + type: "POST", + url: "plugins/beagle/core/ajax/beagle.ajax.php", + data: { + action: "askgroups" + }, + dataType: 'json', + global: false, + error: function (request, status, error) { + handleAjaxError(request, status, error); + }, + success: function (data) { + if (data.state != 'ok') { + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); + return; + } + $('#div_alert').showAlert({ message: '{{Opération réalisée avec succès}}', level: 'success' }); } - }); + }); + } + }); }); function getModelListParam(_conf) { @@ -322,15 +344,15 @@ function getModelListParam(_conf) { }, success: function (data) { if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); return; } - if (data.result[0] == true){ + if (data.result[0] == true) { $(".haspairing").show(); } else { $(".haspairing").hide(); } - if (data.result[1] == true){ + if (data.result[1] == true) { $(".hasFirmMac").show(); } else { $(".hasFirmMac").hide(); @@ -339,24 +361,24 @@ function getModelListParam(_conf) { }); } -function changeIncludeState(_state,_mode,_type='') { - $.ajax({// fonction permettant de faire de l'ajax - type: "POST", // methode de transmission des données au fichier php - url: "plugins/beagle/core/ajax/beagle.ajax.php", // url du fichier php - data: { - action: "changeIncludeState", - state: _state, - mode: _mode, - }, - dataType: 'json', - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { // si l'appel a bien fonctionné - if (data.state != 'ok') { - $('#div_alert').showAlert({message: data.result, level: 'danger'}); - return; - } +function changeIncludeState(_state, _mode, _type = '') { + $.ajax({// fonction permettant de faire de l'ajax + type: "POST", // methode de transmission des données au fichier php + url: "plugins/beagle/core/ajax/beagle.ajax.php", // url du fichier php + data: { + action: "changeIncludeState", + state: _state, + mode: _mode, + }, + dataType: 'json', + error: function (request, status, error) { + handleAjaxError(request, status, error); + }, + success: function (data) { // si l'appel a bien fonctionné + if (data.state != 'ok') { + $('#div_alert').showAlert({ message: data.result, level: 'danger' }); + return; + } } -}); + }); } diff --git a/desktop/modal/health.php b/desktop/modal/health.php index e1be12f..76e8f16 100644 --- a/desktop/modal/health.php +++ b/desktop/modal/health.php @@ -21,7 +21,7 @@ $eqLogics = beagle::byType('beagle'); $plugin = plugin::byId('beagle'); ?> - {{Mes devices Odace SFSP}} + {{Mes devices Odace SFSP}} @@ -37,30 +37,30 @@ - getConfiguration('device',''),0,5),array('scene','group'))){ - $image = $plugin->getPathImgIcon(); - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; - } - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; -} -} -?> + getConfiguration('device', ''), 0, 5), array('scene', 'group'))) { + $image = $plugin->getPathImgIcon(); + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + } + ?>
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getConfiguration('firmware') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('mac') . '' . $eqLogic->getStatus('lastCommunication') . '' . $eqLogic->getConfiguration('createtime') . '
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getConfiguration('firmware') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('mac') . '' . $eqLogic->getStatus('lastCommunication') . '' . $eqLogic->getConfiguration('createtime') . '
- {{Mes scènes Odace SFSP}} + {{Mes scènes Odace SFSP}} @@ -73,27 +73,27 @@ - getConfiguration('device',''),array('scene'))){ - $image = $plugin->getPathImgIcon(); - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; - } - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; -} -} -?> + getConfiguration('device', ''), array('scene'))) { + $image = $plugin->getPathImgIcon(); + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + } + ?>
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('createtime') . '
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('createtime') . '
- {{Mes groupes Odace SFSP}} + {{Mes groupes Odace SFSP}} @@ -106,22 +106,22 @@ - getConfiguration('device',''),0,5),array('group'))){ - $image = $plugin->getPathImgIcon(); - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; - } - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; -} -} -?> + getConfiguration('device', ''), 0, 5), array('group'))) { + $image = $plugin->getPathImgIcon(); + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + $image = 'plugins/beagle/core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png'; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + } + ?> -
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('createtime') . '
' . $eqLogic->getHumanName(true) . '' . $eqLogic->getId() . '' . $eqLogic->getConfiguration('device') . '' . $eqLogic->getLogicalId() . '' . $eqLogic->getConfiguration('createtime') . '
+ \ No newline at end of file diff --git a/desktop/php/beagle.php b/desktop/php/beagle.php index 02f4e59..83894f5 100644 --- a/desktop/php/beagle.php +++ b/desktop/php/beagle.php @@ -1,251 +1,253 @@ getId()); $eqLogics = eqLogic::byType($plugin->getId()); -function sortByOption($a, $b) { - return strcmp($a['name'], $b['name']); -} + if (config::byKey('include_mode', 'beagle', 0) == 1) { - echo '
{{Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)}}
'; + echo '
{{Vous êtes en mode scan. Recliquez sur le bouton scan pour sortir de ce mode (sinon le mode restera actif une minute)}}
'; } else { - echo '
'; + echo '
'; } ?> -
- {{Gestion}} -
+
+
+ {{Gestion}} +
+ '; + echo ''; + echo '
'; + echo '{{Arrêter scan}}'; + echo '
'; + } else { + echo '
'; + echo ''; + echo '
'; + echo '{{Lancer scan}}'; + echo '
'; + } + ?> +
+ +
+ {{Configuration}} +
+
+ +
+ {{Santé}} +
+
+ +
+ {{Scènes}} +
+
+ +
+ {{Groupes}} +
+
'; - echo ''; - echo '
'; - echo '{{Arrêter Scan}}'; - echo '
'; -} else { - echo '
'; - echo ''; - echo '
'; - echo '{{Lancer Scan}}'; - echo '
'; -} -?> -
- -
- {{Configuration}} -
-
- -
- {{Santé}} -
-
- -
- {{Scènes}} -
-
- -
- {{Groupes}} + if (count($eqLogics) == 0) { + echo '
{{Aucun équipement trouvé, cliquer sur "Lancer le scan" pour commencer}}
'; + } else { + // Champ de recherche + echo '
'; + echo ''; + echo '
'; + echo ''; + echo ''; + echo '
'; + echo '
'; + ?> + {{Mes devices Odace SFSP}} +
+ getConfiguration('device', ''), 0, 5), array('scene', 'group'))) { + $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; + echo '
'; + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + echo ''; + } else { + echo ''; + } + echo '
'; + echo '' . $eqLogic->getHumanName(true, true) . ''; + echo '
'; + } + } + ?> +
+ {{Mes scènes Odace SFSP}} +
+ getConfiguration('device', ''), array('scene'))) { + $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; + echo '
'; + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + echo ''; + } else { + echo ''; + } + echo '
'; + echo '' . $eqLogic->getHumanName(true, true) . ''; + echo '
'; + } + } + ?> +
+ {{Mes groupes Odace SFSP}} +
+ getConfiguration('device', ''), 0, 5), array('group'))) { + $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; + echo '
'; + if (file_exists(__DIR__ . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { + echo ''; + } else { + echo ''; + } + echo '
'; + echo '' . $eqLogic->getHumanName(true, true) . ''; + echo '
'; + } + } + ?> +
+
-
-
- -
- -
-
- {{Mes devices Odace SFSP}} -
- getConfiguration('device',''),0,5),array('scene','group'))){ - $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; - echo '
'; - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - echo ''; - } else { - echo ''; - } - echo '
'; - echo '' . $eqLogic->getHumanName(true, true) . ''; - echo '
'; - } -} -?> -
- {{Mes scènes Odace SFSP}} -
- getConfiguration('device',''),array('scene'))){ - $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; - echo '
'; - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - echo ''; - } else { - echo ''; - } - echo '
'; - echo '' . $eqLogic->getHumanName(true, true) . ''; - echo '
'; - } -} -?> -
- {{Mes groupes Odace SFSP}} -
- getConfiguration('device',''),0,5),array('group'))){ - $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; - echo '
'; - if (file_exists(dirname(__FILE__) . '/../../core/config/devices/' . $eqLogic->getConfiguration('device') . '/' . $eqLogic->getConfiguration('device') . '.png')) { - echo ''; - } else { - echo ''; - } - echo '
'; - echo '' . $eqLogic->getHumanName(true, true) . ''; - echo '
'; - } -} -?> -
-
- - - + + \ No newline at end of file diff --git a/docs/de_DE/changelog.md b/docs/de_DE/changelog.md index 6161cba..d412b8b 100644 --- a/docs/de_DE/changelog.md +++ b/docs/de_DE/changelog.md @@ -6,6 +6,12 @@ > >Zur Erinnerung: Wenn keine Informationen zum Update vorhanden sind, bedeutet dies, dass es sich nur um die Aktualisierung von Dokumentation, Übersetzung oder Text handelt +- Fix une fuite de mémoire sur le démon +- Corrections mineures +- Adapatations interface "Liste des commandes" +- Jeedom 4.4 ou plus requis +- Debian 11 ou plus requis + # 03/11/2021 - Aktualisierung des Abhängigkeitsskripts nach der Kryptografieänderung @@ -20,7 +26,6 @@ - Neue Darstellung der Objektliste - Hinzufügung des Tags "V4-Kompatibilität" - # 02/06/2020 Erste Version diff --git a/docs/en_US/changelog.md b/docs/en_US/changelog.md index 06562eb..ff137cd 100644 --- a/docs/en_US/changelog.md +++ b/docs/en_US/changelog.md @@ -6,6 +6,12 @@ > >As a reminder if there is no information on the update, it means that it only concerns the updating of documentation, translation or text +- Fix une fuite de mémoire sur le démon +- Corrections mineures +- Adapatations interface "Liste des commandes" +- Jeedom 4.4 ou plus requis +- Debian 11 ou plus requis + # 03/11/2021 - Update of the dependency script following the cryptography change @@ -20,7 +26,6 @@ - New presentation of the list of objects - Addition of the tag "V4 compatibility" - # 06/02/2020 First Version diff --git a/docs/es_ES/changelog.md b/docs/es_ES/changelog.md index 6ad99ad..8c8186a 100644 --- a/docs/es_ES/changelog.md +++ b/docs/es_ES/changelog.md @@ -6,13 +6,19 @@ > >Como recordatorio si no hay información sobre la actualización, significa que solo se refiere a la actualización de documentación, traducción o texto +- Fix une fuite de mémoire sur le démon +- Corrections mineures +- Adapatations interface "Liste des commandes" +- Jeedom 4.4 ou plus requis +- Debian 11 ou plus requis + # 11/03/2021 - Actualización del script de dependencia tras el cambio de criptografía # 04/01/2021 -- Bugfix envoie de commande si hci différent de 0 +- La corrección de errores envía un comando si hci es diferente de 0 # 27/11/2020 @@ -20,7 +26,6 @@ - Nueva presentación de la lista de objetos - Adición de la etiqueta "compatibilidad V4" - # 02/02/2020 Primera versión diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md index 682fec2..3829896 100644 --- a/docs/fr_FR/changelog.md +++ b/docs/fr_FR/changelog.md @@ -6,6 +6,15 @@ > >Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte +# 07/05/2026 + +- Fix une fuite de mémoire sur le démon +- Corrections mineures +- Adapatations interface "Liste des commandes" +- Corrections des traductions +- Jeedom 4.4 ou plus requis +- Debian 11 ou plus requis + # 11/03/2021 - Mise à jour du script de dépendances suite au changement cryptography @@ -20,7 +29,6 @@ - Nouvelle présentation de la liste des objets - Ajout du tag "Compatibilité V4" - # 06/02/2020 Première version diff --git a/docs/i18n/de_DE.json b/docs/i18n/de_DE.json index 0ed3554..8a630a3 100644 --- a/docs/i18n/de_DE.json +++ b/docs/i18n/de_DE.json @@ -3,6 +3,12 @@ "Changelog Odace SFSP": "Changelog Odace SFSP", "Plugin Beagle": "Beagle Plugin", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Zur Erinnerung: Wenn keine Informationen zum Update vorhanden sind, bedeutet dies, dass es sich nur um die Aktualisierung von Dokumentation, Übersetzung oder Text handelt", + "Fix une fuite de mémoire sur le démon": "Fix une fuite de mémoire sur le démon", + "Corrections mineures": "Corrections mineures", + "Adapatations interface \"Liste des commandes": "Adapatations interface \"Liste des commandes", + "Jeedom 4": "Jeedom 4", + "4 ou plus requis": "4 ou plus requis", + "Debian 11 ou plus requis": "Debian 11 ou plus requis", "11\/03\/2021": "03\/11\/2021", "Mise à jour du script de dépendances suite au changement cryptography": "Aktualisierung des Abhängigkeitsskripts nach der Kryptografieänderung", "04\/01\/2021": "04\/01\/2021", diff --git a/docs/i18n/en_US.json b/docs/i18n/en_US.json index 7e1e358..fb5f79d 100644 --- a/docs/i18n/en_US.json +++ b/docs/i18n/en_US.json @@ -3,6 +3,12 @@ "Changelog Odace SFSP": "Changelog Odace SFSP", "Plugin Beagle": "Beagle plugin", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "As a reminder if there is no information on the update, it means that it only concerns the updating of documentation, translation or text", + "Fix une fuite de mémoire sur le démon": "Fix une fuite de mémoire sur le démon", + "Corrections mineures": "Corrections mineures", + "Adapatations interface \"Liste des commandes": "Adapatations interface \"Liste des commandes", + "Jeedom 4": "Jeedom 4", + "4 ou plus requis": "4 ou plus requis", + "Debian 11 ou plus requis": "Debian 11 ou plus requis", "11\/03\/2021": "03\/11\/2021", "Mise à jour du script de dépendances suite au changement cryptography": "Update of the dependency script following the cryptography change", "04\/01\/2021": "04\/01\/2021", diff --git a/docs/i18n/es_ES.json b/docs/i18n/es_ES.json index 7a359eb..f13f329 100644 --- a/docs/i18n/es_ES.json +++ b/docs/i18n/es_ES.json @@ -3,10 +3,16 @@ "Changelog Odace SFSP": "Registro de cambios Odace SFSP", "Plugin Beagle": "Complemento Beagle", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Como recordatorio si no hay información sobre la actualización, significa que solo se refiere a la actualización de documentación, traducción o texto", + "Fix une fuite de mémoire sur le démon": "Fix une fuite de mémoire sur le démon", + "Corrections mineures": "Corrections mineures", + "Adapatations interface \"Liste des commandes": "Adapatations interface \"Liste des commandes", + "Jeedom 4": "Jeedom 4", + "4 ou plus requis": "4 ou plus requis", + "Debian 11 ou plus requis": "Debian 11 ou plus requis", "11\/03\/2021": "11\/03\/2021", "Mise à jour du script de dépendances suite au changement cryptography": "Actualización del script de dependencia tras el cambio de criptografía", "04\/01\/2021": "04\/01\/2021", - "Bugfix envoie de commande si hci différent de 0": "Bugfix envoie de commande si hci différent de 0", + "Bugfix envoie de commande si hci différent de 0": "La corrección de errores envía un comando si hci es diferente de 0", "27\/11\/2020": "27\/11\/2020", "Optimisations générales": "Optimizaciones generales", "Nouvelle présentation de la liste des objets": "Nueva presentación de la lista de objetos", diff --git a/docs/i18n/fr_FR.json b/docs/i18n/fr_FR.json index fa3d1a8..362747c 100644 --- a/docs/i18n/fr_FR.json +++ b/docs/i18n/fr_FR.json @@ -4,6 +4,12 @@ "Plugin Beagle": "Plugin Beagle", "IMPORTANT": "IMPORTANT", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte", + "Fix une fuite de mémoire sur le démon": "Fix une fuite de mémoire sur le démon", + "Corrections mineures": "Corrections mineures", + "Adapatations interface \"Liste des commandes": "Adapatations interface \"Liste des commandes", + "Jeedom 4": "Jeedom 4", + "4 ou plus requis": "4 ou plus requis", + "Debian 11 ou plus requis": "Debian 11 ou plus requis", "11\/03\/2021": "11\/03\/2021", "Mise à jour du script de dépendances suite au changement cryptography": "Mise à jour du script de dépendances suite au changement cryptography", "04\/01\/2021": "04\/01\/2021", diff --git a/docs/i18n/pt_PT.json b/docs/i18n/pt_PT.json index e26d251..9feb906 100644 --- a/docs/i18n/pt_PT.json +++ b/docs/i18n/pt_PT.json @@ -3,6 +3,12 @@ "Changelog Odace SFSP": "Changelog Odace SFSP", "Plugin Beagle": "Plug-in do Beagle", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Como lembrete, se não houver informações sobre a atualização, isso significa que se trata apenas da atualização da documentação, tradução ou texto", + "Fix une fuite de mémoire sur le démon": "Fix une fuite de mémoire sur le démon", + "Corrections mineures": "Corrections mineures", + "Adapatations interface \"Liste des commandes": "Adapatations interface \"Liste des commandes", + "Jeedom 4": "Jeedom 4", + "4 ou plus requis": "4 ou plus requis", + "Debian 11 ou plus requis": "Debian 11 ou plus requis", "11\/03\/2021": "11\/03\/2021", "Mise à jour du script de dépendances suite au changement cryptography": "Atualização do script de dependência seguindo a mudança de criptografia", "04\/01\/2021": "04\/01\/2021", diff --git a/docs/pt_PT/changelog.md b/docs/pt_PT/changelog.md index 2d11fc7..fe46f50 100644 --- a/docs/pt_PT/changelog.md +++ b/docs/pt_PT/changelog.md @@ -6,6 +6,12 @@ > >Como lembrete, se não houver informações sobre a atualização, isso significa que se trata apenas da atualização da documentação, tradução ou texto +- Fix une fuite de mémoire sur le démon +- Corrections mineures +- Adapatations interface "Liste des commandes" +- Jeedom 4.4 ou plus requis +- Debian 11 ou plus requis + # 11/03/2021 - Atualização do script de dependência seguindo a mudança de criptografia @@ -20,7 +26,6 @@ - Nova apresentação da lista de objetos - Adição da tag "compatibilidade V4" - # 02/06/2020 Primeira versão diff --git a/plugin_info/._info.json b/plugin_info/._info.json deleted file mode 100644 index 4a3e1c4..0000000 Binary files a/plugin_info/._info.json and /dev/null differ diff --git a/plugin_info/configuration.php b/plugin_info/configuration.php index 0d0b8ba..ceae585 100644 --- a/plugin_info/configuration.php +++ b/plugin_info/configuration.php @@ -15,46 +15,46 @@ * along with Jeedom. If not, see . */ -require_once dirname(__FILE__) . '/../../../core/php/core.inc.php'; +require_once __DIR__ . '/../../../core/php/core.inc.php'; include_file('core', 'authentification', 'php'); if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); + throw new Exception('{{401 - Accès non autorisé}}'); } ?>
- {{Démon}} -
- -
-
- -
- -
-
-
- -
- -
-
+ {{Démon}} +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
-
- -
- -
-
-
+
+ +
+ +
+
+
+ \ No newline at end of file diff --git a/plugin_info/info.json b/plugin_info/info.json index 484fa3c..8421e31 100644 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -1,45 +1,43 @@ { - "id": "beagle", - "name": "Odace SFSP", - "description": { - "fr_FR": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.", - "en_US": "Plugin adding support for the Odace SFSP range (wireless without battery) Schneider to Jeedom. It is used to obtain information from the switches (shutters \/ scenes \/ single \/ double). It is used to control the actuators (shutter \/ dcl). It also allows you to use scenes and groups", - "pt_PT": "Plugin adicionando suporte para a gama Odace SFSP (sem fio sem bateria) Schneider para Jeedom. É usado para obter informações dos interruptores (persianas \/ cenas \/ simples \/ duplas). É usado para controlar os atuadores (obturador \/ dcl). Também permite usar cenas e grupos", - "es_ES": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "de_DE": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "ru_RU": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "id_ID": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "it_IT": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "ja_JP": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes", - "tr": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets\/ scènes \/ simple \/ double). Il permet de contrôler les actionneurs (volet\/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes" - }, - "licence": "AGPL", - "author": "Jeedom SAS", - "require": "3.2.12", - "category": "automation protocol", - "hasDependency": true, - "hasOwnDeamon": true, - "changelog": "https:\/\/doc.jeedom.com\/#language#\/plugins\/automation protocol\/beagle\/changelog", - "documentation": "https:\/\/doc.jeedom.com\/#language#\/plugins\/automation protocol\/beagle\/", - "language": [ - "fr_FR", - "en_US", - "es_ES", - "de_DE", - "ru_RU", - "id_ID", - "it_IT", - "ja_JP", - "pt_PT", - "tr" - ], - "compatibility": [ - "miniplus", - "smart", - "rpi", - "docker", - "diy", - "mobile", - "v4" - ] + "id": "beagle", + "name": "Odace SFSP", + "description": { + "fr_FR": "Plugin ajoutant le support de la gamme Odace SFSP (sans fil sans pile) Schneider à Jeedom. Il permet d'obtenir les informations des interrupteurs (volets/ scènes / simple / double). Il permet de contrôler les actionneurs (volet/dcl). Il permet aussi de pouvoir utiliser les scènes et les groupes.", + "en_US": "Plugin adding support for the Odace SFSP range (wireless without battery) Schneider to Jeedom. It is used to obtain information from the switches (shutters / scenes / single / double). It is used to control the actuators (shutter / dcl). It also allows you to use scenes and groups", + "pt_PT": "Plugin adicionando suporte para a gama Odace SFSP (sem fio sem bateria) Schneider para Jeedom. É usado para obter informações dos interruptores (persianas / cenas / simples / duplas). É usado para controlar os atuadores (obturador / dcl). Também permite usar cenas e grupos", + "es_ES": "Complemento que agrega soporte para la gama Schneider Odace SFSP (inalámbrica sin batería) a Jeedom. Permite obtener información de los interruptores (persianas/escenas/simples/dobles). Permite controlar los actuadores (persiana/dcl). También te permite utilizar escenas y grupos", + "de_DE": "Plugin, das die Unterstützung der Odace SFSP-Reihe (drahtlos und batterielos) von Schneider in Jeedom integriert. Es ermöglicht den Abruf von Informationen zu Schaltern (Rollläden/Szenen/Einfach/Doppel). Es ermöglicht die Steuerung von Aktoren (Rollläden/DCL). Außerdem ermöglicht es die Verwendung von Szenen und Gruppen.", + "it_IT": "Plugin che aggiunge il supporto della gamma Odace SFSP (wireless senza batteria) di Schneider a Jeedom. Consente di ottenere le informazioni relative agli interruttori (tapparelle/scenari/singolo/doppio). Permette di controllare gli attuatori (tapparelle/dcl). Consente inoltre di utilizzare gli scenari e i gruppi." + }, + "licence": "AGPL", + "author": "Jeedom SAS", + "require": "4.4", + "os": { + "min": 11 + }, + "category": "automation protocol", + "hasDependency": true, + "hasOwnDeamon": true, + "changelog": "https://doc.jeedom.com/#language#/plugins/automation protocol/beagle/changelog", + "documentation": "https://doc.jeedom.com/#language#/plugins/automation protocol/beagle/", + "language": [ + "de_DE", + "en_US", + "es_ES", + "fr_FR", + "it_IT", + "pt_PT" + ], + "compatibility": [ + "smart", + "atlas", + "luna", + "rpi", + "docker", + "diy", + "mobile", + "v4" + ], + "changelog_beta": "https://doc.jeedom.com/#language#/plugins/automation protocol/beagle/beta/changelog", + "documentation_beta": "https://doc.jeedom.com/#language#/plugins/automation protocol/beagle/beta" } \ No newline at end of file diff --git a/plugin_info/install.php b/plugin_info/install.php index f8fb6f1..5ba7400 100644 --- a/plugin_info/install.php +++ b/plugin_info/install.php @@ -16,7 +16,7 @@ * along with Jeedom. If not, see . */ -require_once dirname(__FILE__) . '/../../../core/php/core.inc.php'; +require_once __DIR__ . '/../../../core/php/core.inc.php'; function beagle_install() { if (config::byKey('api::beagle::mode') == '') { @@ -31,7 +31,4 @@ function beagle_update() { } function beagle_remove() { - } - -?> diff --git a/plugin_info/packages.json b/plugin_info/packages.json new file mode 100644 index 0000000..c456738 --- /dev/null +++ b/plugin_info/packages.json @@ -0,0 +1,26 @@ +{ + "apt": { + "python3-setuptools": {}, + "rfkill": {}, + "python3-dev": {}, + "libffi-dev": {}, + "libssl-dev": {}, + "libbluetooth-dev": {}, + "bluetooth": {}, + "build-essential": {} + }, + "pip3": { + "wheel": {}, + "requests": {}, + "setuptools": { + "version": "58.0.0" + }, + "cryptography": { + "version": "38.0.0" + }, + "pybluez": {} + }, + "post-install": { + "script": "plugins/beagle/resources/post_install.sh" + } +} \ No newline at end of file diff --git a/resources/beagled/beagle.py b/resources/beagled/beagle.py index 1edcff6..93f30dc 100644 --- a/resources/beagled/beagle.py +++ b/resources/beagled/beagle.py @@ -1,15 +1,9 @@ -import os -import sys -import struct -import bluetooth._bluetooth as bluez import globals import logging -import binascii -import _thread as thread -import time + class Beagle(): - def __init__(self,trame,mac): + def __init__(self, trame, mac): self.trame = trame self.mac = mac self.string = '' @@ -18,7 +12,7 @@ def __init__(self,trame,mac): self.type = '' self.datatrame = '' self.data = {} - self.result={} + self.result = {} self.ignore = 0 self.repeat = 0 self.repeateruuid = '' @@ -26,27 +20,27 @@ def __init__(self,trame,mac): def parse(self): try: - if self.trame[0:14] in ['0201041bffb602','0201061bffb602']: + if self.trame[0:14] in ['0201041bffb602', '0201061bffb602']: self.datatrame = self.trame[22:] - self.uuid=self.datatrame[2:8] + self.uuid = self.datatrame[2:8] cleanedtrame = self.trame[0:30]+'00'+self.trame[32:] if self.uuid in globals.lastevent and globals.lastevent[self.uuid] == cleanedtrame: - self.ignore=1 + self.ignore = 1 globals.lastevent[self.uuid] = cleanedtrame self.result['mac'] = self.mac - self.string ='' + self.string = '' self.string += 'Beagle found ' self.type = self.trame[14:18] - self.cf= self.datatrame[:2] - self.uuid=self.datatrame[2:8] + self.cf = self.datatrame[:2] + self.uuid = self.datatrame[2:8] self.result['uuid'] = self.uuid self.data['type'] = '' - repetitionData = str(bin(int(self.trame[30:32],16)))[2:].ljust(8,'0') - if (repetitionData[1:2] == '0' and repetitionData[2:4]!= '00') : + repetitionData = str(bin(int(self.trame[30:32], 16)))[2:].ljust(8, '0') + if (repetitionData[1:2] == '0' and repetitionData[2:4] != '00'): self.repeat = 1 - elif (repetitionData[1:2] == '1' and repetitionData[2:4]!= '11') : + elif (repetitionData[1:2] == '1' and repetitionData[2:4] != '11'): self.repeat = 1 - if (self.repeat == 1) : + if (self.repeat == 1): if (self.uuid in globals.KNOWN_DEVICES): self.type = globals.types[globals.KNOWN_DEVICES[self.uuid]['model']] self.string += ' (repeated data) ' @@ -76,16 +70,16 @@ def parse(self): if self.data['type'] == 'binding': if self.uuid not in globals.KNOWN_DEVICES: if not globals.LEARN_MODE: - logging.debug('It\'s a beagle device but this device is not Included and I\'am not in learn mode ' +str(self.uuid)) + logging.debug('It\'s a beagle device but this device is not Included and I\'am not in learn mode %s', self.uuid) return else: - logging.debug('It\'s a beagle device but this device is not Included. I\'am learning it ' +str(self.uuid)) + logging.debug('It\'s a beagle device but this device is not Included. I\'am learning it %s', self.uuid) globals.LEARN_MODE = False else: if self.uuid not in globals.KNOWN_DEVICES: - logging.debug('It\'s a beagle device but this device is not Included and its not a binding data ' +str(self.uuid)) + logging.debug('It\'s a beagle device but this device is not Included and its not a binding data %s', self.uuid) return - globals.JEEDOM_COM.add_changes('devices::'+self.uuid,self.result) + globals.JEEDOM_COM.add_changes('devices::' + self.uuid, self.result) except Exception as e: logging.debug(str(e)) @@ -147,7 +141,7 @@ def switch(self): def dcl(self): self.result['model'] = 'dcl' - self.string += 'This is a DCL with UUID '+ self.uuid + self.string += 'This is a DCL with UUID ' + self.uuid if self.cf == '10': self.data['type'] = 'advertisement' self.string += ' advertisement' @@ -172,10 +166,10 @@ def dcl(self): elif self.trame[32:34] == '13': self.data['paired'] = 'unpaired' self.string += ' unpaired' - self.data['groups'] ={} + self.data['groups'] = {} group1uuid = self.trame[36:44] - self.data['groups'][group1uuid]={'data':{}} - self.string += ' group1 : ' +group1uuid + self.data['groups'][group1uuid] = {'data': {}} + self.string += ' group1 : ' + group1uuid if self.trame[44:46] == '01': self.data['groups'][group1uuid]['data']['value'] = '1' self.data['groups'][group1uuid]['data']['label'] = 'Allumé' @@ -185,8 +179,8 @@ def dcl(self): self.data['groups'][group1uuid]['data']['label'] = 'Eteint' self.string += ' state is OFF' group2uuid = self.trame[46:54] - self.data['groups'][group2uuid]={'data':{}} - self.string += ' group2 : ' +group2uuid + self.data['groups'][group2uuid] = {'data': {}} + self.string += ' group2 : ' + group2uuid if self.trame[54:56] == '01': self.data['groups'][group2uuid]['data']['value'] = '1' self.data['groups'][group2uuid]['data']['label'] = 'Allumé' @@ -201,25 +195,25 @@ def dcl(self): elif self.cf == '1b': self.data['type'] = 'group' self.string += ' group' - self.data['groups'] = [self.trame[38:46],self.trame[46:54]] + self.data['groups'] = [self.trame[38:46], self.trame[46:54]] self.string += ' ' + str(self.data['groups']) elif self.cf == '1c': self.data['type'] = 'scene' self.data['subtype'] = 'custom' self.string += ' customerscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) elif self.cf == '1d': self.data['type'] = 'scene' self.data['subtype'] = 'schneider' self.string += ' schneiderscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) return - + def generic(self): self.result['model'] = 'generic' - self.string += 'This is a Generic with UUID '+ self.uuid + self.string += 'This is a Generic with UUID ' + self.uuid if self.cf == '20': self.data['type'] = 'advertisement' self.string += ' advertisement' @@ -244,10 +238,10 @@ def generic(self): elif self.trame[32:34] == '13': self.data['paired'] = 'unpaired' self.string += ' unpaired' - self.data['groups'] ={} + self.data['groups'] = {} group1uuid = self.trame[36:44] - self.data['groups'][group1uuid]={'data':{}} - self.string += ' group1 : ' +group1uuid + self.data['groups'][group1uuid] = {'data': {}} + self.string += ' group1 : ' + group1uuid if self.trame[44:46] == '01': self.data['groups'][group1uuid]['data']['value'] = '1' self.data['groups'][group1uuid]['data']['label'] = 'Allumé' @@ -257,8 +251,8 @@ def generic(self): self.data['groups'][group1uuid]['data']['label'] = 'Eteint' self.string += ' state is OFF' group2uuid = self.trame[46:54] - self.data['groups'][group2uuid]={'data':{}} - self.string += ' group2 : ' +group2uuid + self.data['groups'][group2uuid] = {'data': {}} + self.string += ' group2 : ' + group2uuid if self.trame[54:56] == '01': self.data['groups'][group2uuid]['data']['value'] = '1' self.data['groups'][group2uuid]['data']['label'] = 'Allumé' @@ -273,25 +267,25 @@ def generic(self): elif self.cf == '2b': self.data['type'] = 'group' self.string += ' group' - self.data['groups'] = [self.trame[38:46],self.trame[46:54]] + self.data['groups'] = [self.trame[38:46], self.trame[46:54]] self.string += ' ' + str(self.data['groups']) elif self.cf == '2c': self.data['type'] = 'scene' self.data['subtype'] = 'custom' self.string += ' customerscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) elif self.cf == '2d': self.data['type'] = 'scene' self.data['subtype'] = 'schneider' self.string += ' schneiderscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) return def shutter(self): self.result['model'] = 'shutter' - self.string += 'This is a Shutter with UUID '+ self.uuid + self.string += 'This is a Shutter with UUID ' + self.uuid if self.cf == '30': self.data['type'] = 'advertisement' self.data['firmware'] = self.trame[58:62] @@ -306,17 +300,17 @@ def shutter(self): self.string += ' state is closed' elif self.trame[32:34] == '05': self.data['label'] = 'Ouverture' - position = 100-int(self.trame[44:46],16) + position = 100-int(self.trame[44:46], 16) self.data['value'] = position self.string += ' state is moving up' elif self.trame[32:34] == '06': self.data['label'] = 'Fermeture' - position = 100-int(self.trame[44:46],16) + position = 100-int(self.trame[44:46], 16) self.data['value'] = position self.string += ' state is moving down' elif self.trame[32:34] == '07': self.data['label'] = 'Arrêté' - position = 100-int(self.trame[44:46],16) + position = 100-int(self.trame[44:46], 16) self.data['value'] = position self.string += ' state is stopped with position ' + str(position) elif self.trame[32:34] == '10': @@ -331,10 +325,10 @@ def shutter(self): elif self.trame[32:34] == '13': self.data['paired'] = 'unpaired' self.string += ' unpaired' - self.data['groups'] ={} + self.data['groups'] = {} group1uuid = self.trame[36:44] - self.data['groups'][group1uuid]={'data':{}} - self.string += ' group1 : ' +group1uuid + self.data['groups'][group1uuid] = {'data': {}} + self.string += ' group1 : ' + group1uuid if self.trame[44:46] == '00': self.data['groups'][group1uuid]['data']['value'] = '100' self.data['groups'][group1uuid]['label'] = 'Ouvert' @@ -353,8 +347,8 @@ def shutter(self): self.data['groups'][group1uuid]['data']['label'] = 'Arrêté' self.string += ' state is stopped' group2uuid = self.trame[46:54] - self.data['groups'][group2uuid]={'data':{}} - self.string += ' group2 : ' +group2uuid + self.data['groups'][group2uuid] = {'data': {}} + self.string += ' group2 : ' + group2uuid if self.trame[54:56] == '00': self.data['groups'][group2uuid]['data']['value'] = '100' self.data['groups'][group2uuid]['data']['label'] = 'Ouvert' @@ -378,18 +372,18 @@ def shutter(self): elif self.cf == '3b': self.data['type'] = 'group' self.string += ' group' - self.data['groups'] = [self.trame[38:46],self.trame[46:54]] + self.data['groups'] = [self.trame[38:46], self.trame[46:54]] self.string += ' ' + str(self.data['groups']) elif self.cf == '3c': self.data['type'] = 'scene' self.data['subtype'] = 'custom' self.string += ' customerscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) elif self.cf == '3d': self.data['type'] = 'scene' self.data['subtype'] = 'schneider' self.string += ' schneiderscene' - self.data['scenes'] = [self.trame[38:46],self.trame[46:54],self.trame[54:62]] + self.data['scenes'] = [self.trame[38:46], self.trame[46:54], self.trame[54:62]] self.string += ' ' + str(self.data['scenes']) return diff --git a/resources/beagled/beagled.py b/resources/beagled/beagled.py index 382dae4..0e3fa7d 100644 --- a/resources/beagled/beagled.py +++ b/resources/beagled/beagled.py @@ -14,121 +14,116 @@ # along with Jeedom. If not, see . import logging -import string import sys import os import time -import datetime -import re import signal -from optparse import OptionParser -from os.path import join import json import argparse +import traceback import blescan -import sys -import time import subprocess import sendadv -import _thread as thread +from threading import Thread import bluetooth._bluetooth as bluez -try: - from jeedom.jeedom import * -except ImportError as e: - print("Error: importing module jeedom.jeedom " + str(e)) - sys.exit(1) +from jeedom.jeedom import jeedom_socket, jeedom_utils, jeedom_com, JEEDOM_SOCKET_MESSAGE +import globals + -def read_socket(name): +def read_socket(): while 1: try: - global JEEDOM_SOCKET_MESSAGE if not JEEDOM_SOCKET_MESSAGE.empty(): logging.debug("Message received in socket JEEDOM_SOCKET_MESSAGE") message = JEEDOM_SOCKET_MESSAGE.get().decode('utf-8') - message =json.loads(message) + message = json.loads(message) if message['apikey'] != _apikey: - logging.error("Invalid apikey from socket : " + str(message)) + logging.error("Invalid apikey from socket : %s", message) return - logging.debug('Received command from jeedom : '+str(message['cmd'])) + logging.debug('Received command from jeedom : %s', message['cmd']) if message['cmd'] == 'learnin': logging.debug('Enter in learn mode') globals.LEARN_MODE = True globals.LEARN_BEGIN = int(time.time()) - globals.JEEDOM_COM.send_change_immediate({'learn_mode' : 1}); + globals.JEEDOM_COM.send_change_immediate({'learn_mode': 1}) elif message['cmd'] == 'ready': logging.debug('Daemon is ready') globals.READY = True elif message['cmd'] == 'learnout': logging.debug('Leave learn mode') globals.LEARN_MODE = False - globals.JEEDOM_COM.send_change_immediate({'learn_mode' : 0}); + globals.JEEDOM_COM.send_change_immediate({'learn_mode': 0}) elif message['cmd'] == 'add': - logging.debug('Add device : '+str(message['device'])) + logging.debug('Add device : %s', message['device']) if 'uuid' in message['device']: globals.KNOWN_DEVICES[message['device']['uuid']] = message['device'] logging.debug('Known devices ' + str(globals.KNOWN_DEVICES)) elif message['cmd'] == 'remove': - logging.debug('Remove device : '+str(message['device'])) + logging.debug('Remove device : %s', message['device']) if 'uuid' in message['device']: del globals.KNOWN_DEVICES[message['device']['uuid']] logging.debug('Known devices ' + str(globals.KNOWN_DEVICES)) elif message['cmd'] == 'bind': - logging.debug('Binding device : '+str(message['uuid'])) - sendadv.sendCmd(globals.KNOWN_DEVICES[message['uuid']],'pair') + logging.debug('Binding device : %s', message['uuid']) + sendadv.sendCmd(globals.KNOWN_DEVICES[message['uuid']], 'pair') elif message['cmd'] == 'send': - logging.debug('Sending to device : '+str(message['target'])) - sendadv.sendCmd(globals.KNOWN_DEVICES[message['target']],'advertisement',message['command']) + logging.debug('Sending to device : %s', message['target']) + sendadv.sendCmd(globals.KNOWN_DEVICES[message['target']], 'advertisement', message['command']) except Exception as e: - logging.error('Exception on socket : '+str(e)) + logging.error('Exception on socket : %s', e) time.sleep(0.1) -def heartbeat_handler(delay): + +def heartbeat_handler(): while 1: - if globals.LEARN_MODE and (globals.LEARN_BEGIN + 60) < int(time.time()): + if globals.LEARN_MODE and (globals.LEARN_BEGIN + 60) < int(time.time()): globals.LEARN_MODE = False logging.debug('Quitting learn mode (60s elapsed)') - globals.JEEDOM_COM.send_change_immediate({'learn_mode' : 0}); + globals.JEEDOM_COM.send_change_immediate({'learn_mode': 0}) time.sleep(1) + def listen(): jeedom_socket.open() try: - thread.start_new_thread( read_socket, ('socket',)) + Thread(target=read_socket, daemon=True).start() logging.debug('Read Socket Thread Launched') - thread.start_new_thread( ble_scan, ('scanner',)) + Thread(target=ble_scan, daemon=True).start() logging.debug('Ble Scanner Thread Launched') - thread.start_new_thread( heartbeat_handler, (19,)) + Thread(target=heartbeat_handler, daemon=True).start() logging.debug('Heartbeat Thread Launched') except KeyboardInterrupt: shutdown() -def ble_scan(name): + +def ble_scan(): while not globals.READY: time.sleep(1) dev_id = globals.IFACE_DEVICE try: sock = bluez.hci_open_dev(dev_id) - logging.debug("Ble thread started on device " + str(dev_id)) + logging.debug("Ble thread started on device %s", dev_id) blescan.hci_le_set_scan_parameters(sock) blescan.hci_enable_le_scan(sock) while True: blescan.parse_events(sock, 10) - except: - print("Error accessing bluetooth device...") + except Exception as e: + logging.error("Error accessing bluetooth device...: %s", e) sys.exit(1) # ---------------------------------------------------------------------------- def handler(signum=None, frame=None): - logging.debug("Signal %i caught, exiting..." % int(signum)) + logging.debug("Signal %i caught, exiting...", signum) shutdown() + def shutdown(): logging.debug("Shutdown") - logging.debug("Removing PID file " + str(_pidfile)) + logging.debug("Removing PID file %s", _pidfile) try: os.remove(_pidfile) except: @@ -137,16 +132,13 @@ def shutdown(): jeedom_socket.close() except: pass - try: - jeedom_serial.close() - except: - pass logging.debug("Exit 0") sys.stdout.flush() - os._exit(0) + sys.exit(0) # ---------------------------------------------------------------------------- + _log_level = "error" _socket_port = 55556 _socket_host = 'localhost' @@ -156,18 +148,17 @@ def shutdown(): _callback = '' parser = argparse.ArgumentParser(description='Beagle Daemon for Jeedom plugin') -parser.add_argument("--socketport", help="Socketport for server", type=str) +parser.add_argument("--socketport", help="Socketport for server", type=int) parser.add_argument("--loglevel", help="Log Level for the daemon", type=str) parser.add_argument("--callback", help="Callback", type=str) parser.add_argument("--apikey", help="Apikey", type=str) -parser.add_argument("--cycle", help="Cycle to send event", type=str) +parser.add_argument("--cycle", help="Cycle to send event", type=float) parser.add_argument("--pid", help="Pid file", type=str) parser.add_argument("--device", help="Device", type=str) parser.add_argument("--sockethost", help="Socket Host", type=str) parser.add_argument("--jeedomkey", help="Jeedom Key", type=str) args = parser.parse_args() - if args.device: _device = args.device if args.socketport: @@ -183,21 +174,20 @@ def shutdown(): if args.cycle: _cycle = float(args.cycle) if args.sockethost: - _sockethost = args.sockethost + _sockethost = args.sockethost if args.jeedomkey: - globals.jeedomkey = args.jeedomkey + globals.jeedomkey = args.jeedomkey jeedom_utils.set_log_level(_log_level) logging.info('Start beagled') -logging.info('Log level : '+str(_log_level)) -logging.info('Socket port : '+str(_socket_port)) -logging.info('Socket host : '+str(_sockethost)) -logging.info('Device : '+str(_device)) -logging.info('PID file : '+str(_pidfile)) -logging.info('Apikey : '+str(_apikey)) -logging.info('Callback : '+str(_callback)) -logging.info('Cycle : '+str(_cycle)) -logging.info('JeedomKey : '+str(globals.jeedomkey)) +logging.info('Log level : %s', _log_level) +logging.debug('Socket port : %s', _socket_port) +logging.debug('Socket host : %s', _sockethost) +logging.info('Device : %s', _device) +logging.debug('PID file : %s', _pidfile) +logging.debug('Callback : %s', _callback) +logging.debug('Cycle : %s', _cycle) +logging.debug('JeedomKey : %s', globals.jeedomkey) signal.signal(signal.SIGINT, handler) signal.signal(signal.SIGTERM, handler) globals.IFACE_DEVICE = int(_device[-1:]) @@ -207,16 +197,16 @@ def shutdown(): device_id = _device status, output = subprocess.getstatusoutput(cmd) bt_mac = output.split("{}:".format(device_id))[1].split("BD Address: ")[1].split(" ")[0].strip() - logging.debug('Bluetooth Mac adress is ' + bt_mac) + logging.debug('Bluetooth Mac adress is %s', bt_mac) globals.donglemac = bt_mac - jeedom_utils.write_pid(str(_pidfile)) - globals.JEEDOM_COM = jeedom_com(apikey = _apikey,url = _callback,cycle=_cycle) + jeedom_utils.write_pid(_pidfile) + globals.JEEDOM_COM = jeedom_com(apikey=_apikey, url=_callback, cycle=_cycle) if not globals.JEEDOM_COM.test(): logging.error('Network communication issues. Please fixe your Jeedom network configuration.') shutdown() - jeedom_socket = jeedom_socket(port=_socket_port,address=_socket_host) + jeedom_socket = jeedom_socket(port=_socket_port, address=_socket_host) listen() except Exception as e: - logging.error('Fatal error : '+str(e)) + logging.error('Fatal error : %s', e) logging.debug(traceback.format_exc()) shutdown() diff --git a/resources/beagled/blescan.py b/resources/beagled/blescan.py index 0a62280..40577d6 100644 --- a/resources/beagled/blescan.py +++ b/resources/beagled/blescan.py @@ -15,57 +15,59 @@ # NOTE: Python's struct.pack() will add padding bytes unless you make the endianness explicit. Little endian # should be used for BLE. Always start a struct.pack() format string with "<" -import os import sys import struct +import time import bluetooth._bluetooth as bluez -import globals import logging from beagle import Beagle LE_META_EVENT = 0x3e -LE_PUBLIC_ADDRESS=0x00 -LE_RANDOM_ADDRESS=0x01 -LE_SET_SCAN_PARAMETERS_CP_SIZE=7 -OGF_LE_CTL=0x08 -OCF_LE_SET_SCAN_PARAMETERS=0x000B -OCF_LE_SET_SCAN_ENABLE=0x000C -OCF_LE_CREATE_CONN=0x000D +LE_PUBLIC_ADDRESS = 0x00 +LE_RANDOM_ADDRESS = 0x01 +LE_SET_SCAN_PARAMETERS_CP_SIZE = 7 +OGF_LE_CTL = 0x08 +OCF_LE_SET_SCAN_PARAMETERS = 0x000B +OCF_LE_SET_SCAN_ENABLE = 0x000C +OCF_LE_CREATE_CONN = 0x000D LE_ROLE_MASTER = 0x00 LE_ROLE_SLAVE = 0x01 # these are actually subevents of LE_META_EVENT -EVT_LE_CONN_COMPLETE=0x01 -EVT_LE_ADVERTISING_REPORT=0x02 -EVT_LE_CONN_UPDATE_COMPLETE=0x03 -EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE=0x04 +EVT_LE_CONN_COMPLETE = 0x01 +EVT_LE_ADVERTISING_REPORT = 0x02 +EVT_LE_CONN_UPDATE_COMPLETE = 0x03 +EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE = 0x04 # Advertisment event types -ADV_IND=0x00 -ADV_DIRECT_IND=0x01 -ADV_SCAN_IND=0x02 -ADV_NONCONN_IND=0x03 -ADV_SCAN_RSP=0x04 +ADV_IND = 0x00 +ADV_DIRECT_IND = 0x01 +ADV_SCAN_IND = 0x02 +ADV_NONCONN_IND = 0x03 +ADV_SCAN_RSP = 0x04 def returnnumberpacket(pkt): myInteger = 0 multiple = 256 for c in pkt: - myInteger += struct.unpack("B",bytes([c]))[0] * multiple + myInteger += struct.unpack("B", bytes([c]))[0] * multiple multiple = 1 return myInteger + def returnstringpacket(pkt): - myString = ""; + myString = "" for c in pkt: - myString += "%02x" %struct.unpack("B",bytes([c]))[0] + myString += "%02x" % struct.unpack("B", bytes([c]))[0] return myString + def printpacket(pkt): for c in pkt: - sys.stdout.write("%02x " % struct.unpack("B",bytes([c]))[0]) + sys.stdout.write("%02x " % struct.unpack("B", bytes([c]))[0]) + def get_packed_bdaddr(bdaddr_string): packable_addr = [] @@ -75,49 +77,48 @@ def get_packed_bdaddr(bdaddr_string): packable_addr.append(int(b, 16)) return struct.pack(" 0 : - self.send_changes_async() - logging.debug('Init request module v%s' % (str(requests.__version__),)) + def __init__(self, apikey='', url='', cycle=0.5, retry=3): + self._apikey = apikey + self._url = url + self._cycle = cycle + self._retry = retry + self._changes = {} + if self._cycle > 0: + Thread(target=self.__thread_changes_async, daemon=True).start() + logging.info('Init request module v%s', requests.__version__) + + def __thread_changes_async(self): + if self._cycle <= 0: + return + logging.info('Start changes async thread') + while True: + try: + time.sleep(self._cycle) + if len(self._changes) == 0: + continue + changes = self._changes + self._changes = {} + self.__post_change(changes) + except Exception as error: + logging.error('Critical error on send_changes_async %s', error) + + def add_changes(self, key: str, value): + if key.find('::') != -1: + tmp_changes = {} + changes = value + for k in reversed(key.split('::')): + if k not in tmp_changes: + tmp_changes[k] = {} + tmp_changes[k] = changes + changes = tmp_changes + tmp_changes = {} + if self._cycle <= 0: + self.send_change_immediate(changes) + else: + self.merge_dict(self._changes, changes) + else: + if self._cycle <= 0: + self.send_change_immediate({key: value}) + else: + self._changes[key] = value + + def send_change_immediate(self, change): + Thread(target=self.__post_change, args=(change,)).start() + + def __post_change(self, change): + logging.debug('Send to jeedom: %s', change) + for i in range(self._retry): + try: + r = requests.post(self._url + '?apikey=' + self._apikey, json=change, timeout=(0.5, 120), verify=False) + if r.status_code == requests.codes.ok: + return True + else: + logging.warning('Error on send request to jeedom, return code %s', r.status_code) + except Exception as error: + logging.error('Error on send request to jeedom "%s" retry: %i/%i', error, i, self._retry) + time.sleep(0.5) + return False + + def set_change(self, changes): + self._changes = changes + + def get_change(self): + return self._changes + + def merge_dict(self, d1, d2): + for k, v2 in d2.items(): + v1 = d1.get(k) # returns None if v1 has no value for this key + if isinstance(v1, Mapping) and isinstance(v2, Mapping): + self.merge_dict(v1, v2) + else: + d1[k] = v2 + + def test(self): + try: + response = requests.get(self._url + '?apikey=' + self._apikey, verify=False) + if response.status_code != requests.codes.ok: + logging.error('Callback error: %s %s. Please check your network configuration page', response.status_code, response.reason) + return False + except Exception as e: + logging.error('Callback result as a unknown error: %s. Please check your network configuration page', e) + return False + return True - def send_changes_async(self): - try: - if len(self.changes) == 0: - resend_changes = threading.Timer(self.cycle, self.send_changes_async) - resend_changes.start() - return - start_time = datetime.datetime.now() - changes = self.changes - self.changes = {} - logging.debug('Send to jeedom : '+str(changes)) - i=0 - while i < self.retry: - try: - r = requests.post(self.url + '?apikey=' + self.apikey, json=changes, timeout=(0.5, 120), verify=False) - if r.status_code == requests.codes.ok: - break - except Exception as error: - logging.error('Error on send request to jeedom ' + str(error)+' retry : '+str(i)+'/'+str(self.retry)) - i = i + 1 - if r.status_code != requests.codes.ok: - logging.error('Error on send request to jeedom, return code %s' % (str(r.status_code),)) - dt = datetime.datetime.now() - start_time - ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0 - timer_duration = self.cycle - ms - if timer_duration < 0.1: - timer_duration = 0.1 - if timer_duration > self.cycle: - timer_duration = self.cycle - resend_changes = threading.Timer(timer_duration, self.send_changes_async) - resend_changes.start() - except Exception as error: - logging.error('Critical error on send_changes_async %s' % (str(error),)) - resend_changes = threading.Timer(self.cycle, self.send_changes_async) - resend_changes.start() - - def add_changes(self,key,value): - if key.find('::') != -1: - tmp_changes = {} - changes = value - for k in reversed(key.split('::')): - if k not in tmp_changes: - tmp_changes[k] = {} - tmp_changes[k] = changes - changes = tmp_changes - tmp_changes = {} - if self.cycle <= 0: - self.send_change_immediate(changes) - else: - self.merge_dict(self.changes,changes) - else: - if self.cycle <= 0: - self.send_change_immediate({key:value}) - else: - self.changes[key] = value - - def send_change_immediate(self,change): - thread.start_new_thread( self.thread_change, (change,)) - - def thread_change(self,change): - logging.debug('Send to jeedom : %s' % (str(change),)) - i=0 - while i < self.retry: - try: - r = requests.post(self.url + '?apikey=' + self.apikey, json=change, timeout=(0.5, 120), verify=False) - if r.status_code == requests.codes.ok: - break - except Exception as error: - logging.error('Error on send request to jeedom ' + str(error)+' retry : '+str(i)+'/'+str(self.retry)) - i = i + 1 - - def set_change(self,changes): - self.changes = changes - - def get_change(self): - return self.changes - - def merge_dict(self,d1, d2): - for k,v2 in d2.items(): - v1 = d1.get(k) # returns None if v1 has no value for this key - if ( isinstance(v1, collections.Mapping) and - isinstance(v2, collections.Mapping) ): - self.merge_dict(v1, v2) - else: - d1[k] = v2 - - def test(self): - try: - response = requests.get(self.url + '?apikey=' + self.apikey, verify=False) - if response.status_code != requests.codes.ok: - logging.error('Callback error: %s %s. Please check your network configuration page'% ( response.status_code, response.text,)) - return False - except Exception as e: - logging.error('Callback result as a unknown error: %s. Please check your network configuration page ' % (str(e),)) - return False - return True - -# ------------------------------------------------------------------------------ class jeedom_utils(): - @staticmethod - def convert_log_level(level = 'error'): - LEVELS = {'debug': logging.DEBUG, - 'info': logging.INFO, - 'notice': logging.WARNING, - 'warning': logging.WARNING, - 'error': logging.ERROR, - 'critical': logging.CRITICAL, - 'none': logging.NOTSET} - return LEVELS.get(level, logging.NOTSET) - - @staticmethod - def set_log_level(level = 'error'): - FORMAT = '[%(asctime)s.%(msecs)03d][%(levelname)s] : %(message)s' - logging.basicConfig(level=jeedom_utils.convert_log_level(level),format=FORMAT,datefmt='%Y-%m-%d %H:%M:%S') - - @staticmethod - def find_tty_usb(idVendor, idProduct, product = None): - context = pyudev.Context() - for device in context.list_devices(subsystem='tty'): - if 'ID_VENDOR' not in device: - continue - if device['ID_VENDOR_ID'] != idVendor: - continue - if device['ID_MODEL_ID'] != idProduct: - continue - if product is not None: - if 'ID_VENDOR' not in device or device['ID_VENDOR'].lower().find(product.lower()) == -1 : - continue - return str(device.device_node) - return None - - @staticmethod - def stripped(str): - return "".join([i for i in str if i in range(32, 127)]) - - @staticmethod - def ByteToHex( byteStr ): - return ''.join( [ "%02X " % ord( x ) for x in str(byteStr) ] ).strip() - - @staticmethod - def dec2bin(x, width=8): - return ''.join(str((x>>i)&1) for i in xrange(width-1,-1,-1)) - - @staticmethod - def dec2hex(dec): - if dec is None: - return 0 - return hex(dec)[2:] - - @staticmethod - def testBit(int_type, offset): - mask = 1 << offset - return(int_type & mask) - - @staticmethod - def clearBit(int_type, offset): - mask = ~(1 << offset) - return(int_type & mask) - - @staticmethod - def split_len(seq, length): - return [seq[i:i+length] for i in range(0, len(seq), length)] - - @staticmethod - def write_pid(path): - pid = str(os.getpid()) - logging.debug("Writing PID " + pid + " to " + str(path)) - open(path, 'w').write("%s\n" % pid) + @staticmethod + def convert_log_level(level='error'): + LEVELS = { + 'debug': logging.DEBUG, + 'info': logging.INFO, + 'notice': logging.WARNING, + 'warning': logging.WARNING, + 'error': logging.ERROR, + 'critical': logging.CRITICAL, + 'none': logging.CRITICAL + } + return LEVELS.get(level, logging.CRITICAL) + + @staticmethod + def set_log_level(level='error'): + FORMAT = '[%(asctime)-15s][%(levelname)s] : %(message)s' + logging.basicConfig(level=jeedom_utils.convert_log_level(level), format=FORMAT, datefmt="%Y-%m-%d %H:%M:%S") + + @staticmethod + def write_pid(path): + pid = str(os.getpid()) + logging.info("Writing PID %s to %s", pid, path) + open(path, 'w').write("%s\n" % pid) - @staticmethod - def remove_accents(input_str): - nkfd_form = unicodedata.normalize('NFKD', unicode(input_str)) - return u"".join([c for c in nkfd_form if not unicodedata.combining(c)]) - -# ------------------------------------------------------------------------------ - -class jeedom_serial(): - - def __init__(self,device = '',rate = '',timeout = 1): - self.device = device - self.rate = rate - self.timeout = timeout - self.port = None - logging.debug('Init serial module v%s' % (str(serial.VERSION),)) - - def open(self): - if self.device: - logging.debug("Open serial port on device: " + str(self.device)+', rate '+str(self.rate)+', timeout : '+str(self.timeout)) - else: - logging.error("Device name missing.") - return False - logging.debug("Open Serialport") - try: - self.port = serial.Serial(self.device,self.rate,timeout=self.timeout) - except serial.SerialException as e: - logging.error("Error: Failed to connect on device " + self.device + " Details : " + str(e)) - return False - if not self.port.isOpen(): - self.port.open() - time.sleep(0.2) - self.flushOutput() - self.flushInput() - return True - - def close(self): - logging.debug("Close serial port") - try: - self.port.close() - logging.debug("Serial port closed") - return True - except: - logging.error("Failed to close the serial port (" + self.device + ")") - return False - - def write(self,data,fromqueue = False): - self.port.write(data) - if fromqueue: - globals.SENDQUEUE.task_done() - - def flushOutput(self,): - logging.debug("flushOutput serial port ") - self.port.flushOutput() - - def flushInput(self): - logging.debug("flushInput serial port ") - self.port.flushInput() - - def read(self): - if self.port.inWaiting() > 0: - return self.port.read() - return None - - def readbytes(self,number): - if self.port.inWaiting() > 0: - return self.port.read(number) - return None - -# ------------------------------------------------------------------------------ JEEDOM_SOCKET_MESSAGE = Queue() -class jeedom_socket_handler(StreamRequestHandler): - def handle(self): - global JEEDOM_SOCKET_MESSAGE - logging.debug("Client connected to [%s:%d]" % self.client_address) - lg = self.rfile.readline() - JEEDOM_SOCKET_MESSAGE.put(lg) - logging.debug("Message read from socket: " + str(lg.strip())) - self.netAdapterClientConnected = False - logging.debug("Client disconnected from [%s:%d]" % self.client_address) - -class jeedom_socket(): - def __init__(self,address='localhost', port=55000): - self.address = address - self.port = port - socketserver.TCPServer.allow_reuse_address = True - - def open(self): - self.netAdapter = TCPServer((self.address, self.port), jeedom_socket_handler) - if self.netAdapter: - logging.debug("Socket interface started") - threading.Thread(target=self.loopNetServer, args=()).start() - else: - logging.debug("Cannot start socket interface") - - def loopNetServer(self): - logging.debug("LoopNetServer Thread started") - logging.debug("Listening on: [%s:%d]" % (self.address, self.port)) - self.netAdapter.serve_forever() - logging.debug("LoopNetServer Thread stopped") +class jeedom_socket_handler(StreamRequestHandler): + def handle(self): + global JEEDOM_SOCKET_MESSAGE + logging.info("Client connected to [%s:%d]", self.client_address[0], self.client_address[1]) + lg = self.rfile.readline() + JEEDOM_SOCKET_MESSAGE.put(lg) + logging.info("Message read from socket: %s", str(lg.strip())) + self.netAdapterClientConnected = False + logging.info("Client disconnected from [%s:%d]", self.client_address[0], self.client_address[1]) - def close(self): - self.netAdapter.shutdown() - def getMessage(self): - return self.message +class jeedom_socket(): -# ------------------------------------------------------------------------------ -# END -# ------------------------------------------------------------------------------ + def __init__(self, address='localhost', port=55000): + self.address = address + self.port = port + socketserver.TCPServer.allow_reuse_address = True + + def open(self): + self.netAdapter = TCPServer((self.address, self.port), jeedom_socket_handler) + if self.netAdapter: + logging.info("Socket interface started") + Thread(target=self.loopNetServer).start() + else: + logging.error("Cannot start socket interface") + + def loopNetServer(self): + logging.info("LoopNetServer Thread started") + logging.info("Listening on: [%s:%d]", self.address, self.port) + self.netAdapter.serve_forever() + logging.info("LoopNetServer Thread stopped") + + def close(self): + self.netAdapter.shutdown() diff --git a/resources/beagled/sendadv.py b/resources/beagled/sendadv.py index 579ac0e..58bebaf 100644 --- a/resources/beagled/sendadv.py +++ b/resources/beagled/sendadv.py @@ -1,16 +1,15 @@ # coding: utf-8 import time -import struct import os import binascii -import base64 import globals import logging from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import cmac from cryptography.hazmat.primitives.ciphers import algorithms -def build_trame(device,type,data =''): + +def build_frame(device, type, data=''): Param = 'FF' targetUUID = device['uuid'] cfModel = globals.cftarget[device['model']] @@ -28,72 +27,82 @@ def build_trame(device,type,data =''): targetUUID = 'FF' + targetUUID if 'options' in data: Param = hex(100-int(data['options']))[2:] - data = globals.gateway['advertisement']+globals.uuidController+'01'+dataAc + cfModel +targetUUID+Param+'FFFF' - counter = str(random()) - data = data+counter - return header+data + data = globals.gateway['advertisement'] + globals.uuidController + '01' + dataAc + cfModel + targetUUID + Param + 'FFFF' + counter = random() + data = data + counter + return header + data + def random(): - counter = binascii.b2a_hex(os.urandom(1)) +binascii.b2a_hex(os.urandom(1)) + counter = binascii.b2a_hex(os.urandom(1)) + binascii.b2a_hex(os.urandom(1)) return counter.decode().upper() -def compute(macaddr,trame): - mac = "".join(reversed([macaddr.replace(':','')[i:i+2] for i in range(0, len(macaddr.replace(':','')), 2)])).lower() + +def compute(macaddr, trame): + mac = "".join(reversed([macaddr.replace(':', '')[i:i+2] for i in range(0, len(macaddr.replace(':', '')), 2)])).lower() replaced = trame[22:30]+'FF'+trame[32:] - payload = replaced.replace(' ','').lower() + payload = replaced.replace(' ', '').lower() s = mac + payload logging.debug('Mac payload is ' + str(s)) buffer = binascii.unhexlify(str(s)) return buffer -def hash(secret,buffer): + +def hash(secret: str, buffer: bytes): print(secret) c = cmac.CMAC(algorithms.AES(binascii.unhexlify(secret)), backend=default_backend()) c.update(buffer) - hash =binascii.hexlify(bytearray(c.finalize())) + hash = binascii.hexlify(bytearray(c.finalize())) return hash -def sendCmd(device,type,data=''): - logging.debug('Sending command for device ' + str(device)) - trame = str(build_trame(device,type,data)) - logging.debug('Command data is ' + str(trame)) - buffer = compute(globals.donglemac,trame) - key = (globals.gateway['binding']+globals.uuidController+str(globals.jeedomkey)).replace(' ','').lower() + +def sendCmd(device, type, data=''): + logging.debug('Sending command for device %s', device) + frame = str(build_frame(device, type, data)) + logging.debug('Command data is %s', frame) + buffer = compute(globals.donglemac, frame) + key = (globals.gateway['binding'] + globals.uuidController + str(globals.jeedomkey)).replace(' ', '').lower() if type == 'pair': - key = globals.uniquekey.replace(' ','').lower() - hashed = hash(key,buffer) - logging.debug('Hashed data is ' + str(hashed)) + key = globals.uniquekey.replace(' ', '').lower() + hashed = hash(key, buffer) + logging.debug('Hashed data is %s', hashed) cmac = hashed.decode()[0:8] - payload = (trame+cmac).upper() - logging.debug('Final payload is ' + str(payload)) + payload = (frame+cmac).upper() + logging.debug('Final payload is %s', payload) finalpayload = ' '.join(payload[i:i+2] for i in range(0, len(payload), 2)).upper() send(finalpayload) -def send(payload): + +def send(payload: str): valid = checkpayload(payload) if valid: - logging.debug('Payload is valid sending : ' + str(payload)) - #os.system('sudo hciconfig hci'+str(globals.IFACE_DEVICE) + ' up') - os.system('sudo hcitool -i hci'+str(globals.IFACE_DEVICE) + ' cmd 0x08 0x0008 1F '+ str(payload)) - os.system('sudo hcitool -i hci'+str(globals.IFACE_DEVICE) + ' cmd 0x08 0x0006 A0 00 A0 00 03 00 00 00 00 00 00 00 00 07 00') - os.system('sudo hcitool -i hci'+str(globals.IFACE_DEVICE) + ' cmd 0x08 0x000a 01') + logging.debug('Payload is valid sending : %s', payload) + # os.system('sudo hciconfig hci'+str(globals.IFACE_DEVICE) + ' up') + os.system('sudo hcitool -i hci' + str(globals.IFACE_DEVICE) + ' cmd 0x08 0x0008 1F ' + payload) + os.system('sudo hcitool -i hci' + str(globals.IFACE_DEVICE) + ' cmd 0x08 0x0006 A0 00 A0 00 03 00 00 00 00 00 00 00 00 07 00') + os.system('sudo hcitool -i hci' + str(globals.IFACE_DEVICE) + ' cmd 0x08 0x000a 01') time.sleep(0.5) - os.system('sudo hcitool -i hci'+str(globals.IFACE_DEVICE) + ' cmd 0x08 0x000a 00') + os.system('sudo hcitool -i hci' + str(globals.IFACE_DEVICE) + ' cmd 0x08 0x000a 00') else: - logging.debug('Invalid Payload : ' + str(payload)) + logging.debug('Invalid Payload : %s', payload) -def checkpayload(payload): + +def checkpayload(payload: str): result = True - logging.debug('Validating payload : ' + str(payload)) - length = len(payload.replace(' ','')) - if int(length) == 62: + logging.debug('Validating payload : %s', payload) + payload = payload.replace(' ', '') + length = len(payload) + if length == 62: logging.debug('Correct Length for payload') else: - logging.debug('Invalid Length for payload : ' + str(length) + ' we want 62') - result=False - if payload.replace(' ','')[0:22] == globals.uniqueHeader+globals.types['gateway']+globals.headerVV+globals.headerFS: + logging.debug('Invalid Length for payload : %i ; we want 62', length) + result = False + + header_received = payload[0:22] + header_expected = globals.uniqueHeader + globals.types['gateway'] + globals.headerVV + globals.headerFS + if header_received == header_expected: logging.debug('Correct header for payload') else: - logging.debug('Incorrect header for payload ' + payload.replace(' ','')[0:22] + ' we want ' + globals.uniqueHeader+globals.types['gateway']+globals.headerVV+globals.headerFS) - result=False - return result \ No newline at end of file + logging.debug('Incorrect header for payload %s ; we want %s', header_received, header_expected) + result = False + return result diff --git a/resources/install_apt.sh b/resources/install_apt.sh deleted file mode 100644 index 8e2a2d7..0000000 --- a/resources/install_apt.sh +++ /dev/null @@ -1,36 +0,0 @@ -PROGRESS_FILE=/tmp/dependancy_beagle_in_progress -if [ ! -z $1 ]; then - PROGRESS_FILE=$1 -fi -touch ${PROGRESS_FILE} -echo 0 > ${PROGRESS_FILE} -echo "********************************************************" -echo "* Installation des dépendances *" -echo "********************************************************" -sudo apt-get update -echo 10 > ${PROGRESS_FILE} -sudo apt-get -y install python3-pip python3-setuptools rfkill -echo 20 > ${PROGRESS_FILE} -sudo apt-get -y install python3-dev libffi-dev libssl-dev libbluetooth-dev bluetooth build-essential python3-pip -echo 25 > ${PROGRESS_FILE} -sudo pip3 install requests -echo 35 > ${PROGRESS_FILE} -sudo pip3 install pyserial -echo 45 > ${PROGRESS_FILE} -sudo pip3 install pyudev -echo 75 > ${PROGRESS_FILE} -sudo pip3 install wheel -echo 80 > ${PROGRESS_FILE} -sudo pip3 install cryptography==2.6.1 -echo 90 > ${PROGRESS_FILE} -sudo pip3 install pybluez -echo 99 > ${PROGRESS_FILE} -sudo rfkill unblock all >/dev/null 2>&1 -sudo hciconfig hci0 up >/dev/null 2>&1 -sudo hciconfig hci1 up >/dev/null 2>&1 -sudo hciconfig hci2 up >/dev/null 2>&1 -echo 100 > ${PROGRESS_FILE} -echo "********************************************************" -echo "* Installation terminée *" -echo "********************************************************" -rm ${PROGRESS_FILE} diff --git a/resources/post_install.sh b/resources/post_install.sh new file mode 100644 index 0000000..5ebd769 --- /dev/null +++ b/resources/post_install.sh @@ -0,0 +1,16 @@ +cd "$(dirname "$0")" +SCRIPT_DIR="$(pwd)" + +# this version of pybluez (0.30) doesn't work on debian 11 but version 0.23 doesn't work on debian 12 => block on 0.23 for now +# if [ -d "$SCRIPT_DIR/python_venv/bin" ]; then +# echo "patch pybluez on debian >= 12" +# sudo $SCRIPT_DIR/python_venv/bin/python3 -m pip install --force-reinstall --upgrade git+https://github.com/pybluez/pybluez.git#egg=pybluez +# else +# echo "patch pybluez on debian 11" +# sudo pip3 install git+https://github.com/pybluez/pybluez.git#egg=pybluez +# fi + +sudo rfkill unblock all >/dev/null 2>&1 +sudo hciconfig hci0 up >/dev/null 2>&1 +sudo hciconfig hci1 up >/dev/null 2>&1 +sudo hciconfig hci2 up >/dev/null 2>&1