diff --git a/.travis.yml b/.travis.yml
index 5ebf6e5..d39d6f3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,19 +1,19 @@
matrix:
include:
- - language: php
- php: 5.6
+ - language: php
+ php: 7.2
before_script:
- - find . -type f -name *.php | xargs -n1 php -l
- script:
- - cd ${TRAVIS_BUILD_DIR}
- - pwd
+ - find . -type f -name *.php | xargs -n1 php -l
+ script:
+ - cd ${TRAVIS_BUILD_DIR}
+ - pwd
after_success:
- - cd ${TRAVIS_BUILD_DIR}
- - ls -latr
+ - cd ${TRAVIS_BUILD_DIR}
+ - ls -latr
after_failure:
- - cd ${TRAVIS_BUILD_DIR}
- - ls -latr
-
+ - cd ${TRAVIS_BUILD_DIR}
+ - ls -latr
+
- language: python
python: 2.7
install:
@@ -30,6 +30,5 @@ matrix:
script:
- gem install mdl
- cd ${TRAVIS_BUILD_DIR}
- - ./tests/tools/setCustomMDWarnings.sh
- mdl -r $MDLWAR *.md docs/fr_FR/*.md
- - ./tests/tools/spellCheckMD.sh
+ - ./tests/tools/spellCheckMD.sh
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9fadd3a..e8fa654 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,7 @@
{
- "python.linting.pylintEnabled": false,
- "python.linting.flake8Enabled": true,
- "python.linting.enabled": true
-}
\ No newline at end of file
+ "python.linting.pylintEnabled": false,
+ "python.linting.flake8Enabled": true,
+ "python.linting.enabled": true,
+
+ "phpcs.standard": null
+}
diff --git a/core/class/googlecast.class.php b/core/class/googlecast.class.php
index d867922..514df86 100644
--- a/core/class/googlecast.class.php
+++ b/core/class/googlecast.class.php
@@ -22,136 +22,148 @@
require_once dirname(__FILE__) . "/googlecast_utils.inc.php";
-class googlecast extends eqLogic {
- /* * *************************Attributs****************************** */
+class googlecast extends eqLogic
+{
+ /* * *************************Attributs****************************** */
- private $_collectDate = '';
- public static $_widgetPossibility = array('custom' => true);
+ private $_collectDate = '';
+ public static $_widgetPossibility = array('custom' => true);
private $_lightsave = false;
- const GCAST_MODELS = array(
- 'chromecast audio' =>
+ const GCAST_MODELS = array(
+ 'chromecast audio' =>
array('logo' => 'model_chromecast_audio.png', 'ga' => false),
'chromecast ultra' =>
array('logo' => 'model_chromecast_video_ultra.png', 'ga' => false),
- 'chromecast' =>
+ 'chromecast' =>
array('logo' => 'model_chromecast_video.png', 'ga' => false),
- 'google home mini' =>
+ 'google home mini' =>
array('logo' => 'model_googlehome_mini.png', 'ga' => true),
- 'google nest mini' =>
+ 'google nest mini' =>
array('logo' => 'model_googlehome_mini.png', 'ga' => true),
- 'google home hub' =>
+ 'google home hub' =>
array('logo' => 'model_googlehome_hub.png', 'ga' => true),
- 'google nest hub' =>
+ 'google nest hub' =>
array('logo' => 'model_googlehome_hub.png', 'ga' => true),
- 'google home' =>
+ 'google home' =>
array('logo' => 'model_googlehome.png', 'ga' => true),
- 'google home max' =>
+ 'google home max' =>
array('logo' => 'model_googlehome.png', 'ga' => true),
- 'google cast group' =>
+ 'google cast group' =>
array('logo' => 'model_castgroup.png', 'ga' => false),
- 'tv' =>
+ 'tv' =>
array('logo' => 'model_tv.png', 'ga' => false),
'shield' =>
array('logo' => 'model_androidtv.png', 'ga' => false),
'android' =>
array('logo' => 'model_androidtv.png', 'ga' => false)
- );
+ );
- /* * ***********************Methode static*************************** */
+ /* * ***********************Methode static*************************** */
- public static function cron15() {
+ public static function cron15()
+ {
foreach (googlecast::byType('googlecast') as $eqLogic) {
- $eqLogic->refreshChromecastConfig();
- usleep(500);
- }
+ $eqLogic->refreshChromecastConfig();
+ usleep(500);
+ }
}
- public static function cronDaily() {
+ public static function cronDaily()
+ {
try {
$nbdays = config::byKey('tts_cleancache_days', 'googlecast', '10');
if ($nbdays != '') {
googlecast::cleanTTScache(intval($nbdays));
}
- } catch (Exception $e) {}
+ } catch (Exception $e) {
+ }
}
- /* * *********************Methode d'instance************************* */
+ /* * *********************Methode d'instance************************* */
- public function preUpdate() {
- if ( $this->getIsEnable() == false ) {
- $this->disallowDevice();
- }
+ public function preUpdate()
+ {
+ if ($this->getIsEnable() == false) {
+ $this->disallowDevice();
+ }
try {
- if ( class_exists('gcastplayer') ) {
+ if (class_exists('gcastplayer')) {
gcastplayer::changeEnableState($this->getLogicalId(), null, $this->getIsEnable());
}
- } catch (Exception $e) {}
+ } catch (Exception $e) {
+ }
- // manage logo
- $found = False;
- $imgRoot = "plugins/googlecast/desktop/models/";
- $imgLogo = $imgRoot . 'model_default.png';
- $modelName = strtolower( $this->getConfiguration('model_name','UNKOWN') );
+ // manage logo
+ $found = false;
+ $imgRoot = "plugins/googlecast/desktop/models/";
+ $imgLogo = $imgRoot . 'model_default.png';
+ $modelName = strtolower($this->getConfiguration('model_name', 'UNKOWN'));
$has_gassistant = false;
- if ( array_key_exists($modelName, googlecast::GCAST_MODELS) ) {
- $imgLogo = $imgRoot . googlecast::GCAST_MODELS[$modelName]['logo'];
- $found = True;
+ if (array_key_exists($modelName, googlecast::GCAST_MODELS)) {
+ $imgLogo = $imgRoot . googlecast::GCAST_MODELS[$modelName]['logo'];
+ $found = true;
$has_gassistant = googlecast::GCAST_MODELS[$modelName]['ga'];
- }
- if (!$found) { // try to guess based on model name aproximation
- foreach (googlecast::GCAST_MODELS as $key => $data) {
- if (strpos($key, $modelName) !== false) {
- $imgLogo = $imgRoot . $data['logo'];
+ }
+ if (!$found) { // try to guess based on model name aproximation
+ foreach (googlecast::GCAST_MODELS as $key => $data) {
+ if (strpos($key, $modelName) !== false) {
+ $imgLogo = $imgRoot . $data['logo'];
$has_gassistant = $data['ga'];
- $found = True;
- break;
- }
- }
- }
- if (!$found) { // try to guess based on manufacturer
- $castType = $this->getConfiguration('cast_type');
- $manufName = strtolower( $this->getConfiguration('manufacturer','UNKOWN') );
- if (strpos($manufName, 'google') !== false) {
- if ($castType=='audio')
- $imgLogo = $imgRoot . 'model_googlehome.png';
- if ($castType=='cast')
- $imgLogo = $imgRoot . 'model_chromecast_video.png';
- if ($castType=='group')
- $imgLogo = $imgRoot . 'model_castgroup.png';
- }
- if (strpos($manufName, 'xiaomi') !== false) {
- $imgLogo = $imgRoot . 'model_androidtv.png';
- }
- if (strpos($manufName, 'nvidia') !== false) {
- $imgLogo = $imgRoot . 'model_androidtv.png';
- }
- }
- $this->setConfiguration('logoDevice', $imgLogo);
-
- if ( $this->getConfiguration('has_googleassistant', '')==='' ) {
+ $found = true;
+ break;
+ }
+ }
+ }
+ if (!$found) { // try to guess based on manufacturer
+ $castType = $this->getConfiguration('cast_type');
+ $manufName = strtolower($this->getConfiguration('manufacturer', 'UNKOWN'));
+ if (strpos($manufName, 'google') !== false) {
+ if ($castType=='audio') {
+ $imgLogo = $imgRoot . 'model_googlehome.png';
+ }
+ if ($castType=='cast') {
+ $imgLogo = $imgRoot . 'model_chromecast_video.png';
+ }
+ if ($castType=='group') {
+ $imgLogo = $imgRoot . 'model_castgroup.png';
+ }
+ }
+ if (strpos($manufName, 'xiaomi') !== false) {
+ $imgLogo = $imgRoot . 'model_androidtv.png';
+ }
+ if (strpos($manufName, 'nvidia') !== false) {
+ $imgLogo = $imgRoot . 'model_androidtv.png';
+ }
+ }
+ $this->setConfiguration('logoDevice', $imgLogo);
+
+ if ($this->getConfiguration('has_googleassistant', '')==='') {
// if not set
- if ($has_gassistant===true)
+ if ($has_gassistant===true) {
$this->setConfiguration('has_googleassistant', '1');
- else
+ } else {
$this->setConfiguration('has_googleassistant', '0');
+ }
}
+ }
- }
-
- public function preRemove() {
- $this->disallowDevice();
+ public function preRemove()
+ {
+ $this->disallowDevice();
try {
- if ( class_exists('gcastplayer') ) {
+ if (class_exists('gcastplayer')) {
gcastplayer::changeEnableState($this->getLogicalId(), null, false);
}
- } catch (Exception $e) {}
- }
+ } catch (Exception $e) {
+ }
+ }
- public function lightSave() {
+ public function lightSave()
+ {
$this->_lightsave = true;
$this->save();
$this->_lightsave = false;
@@ -168,362 +180,363 @@ public function postSave() {
}
*/
- //public function postInsert() {
- public function postSave() {
+ //public function postInsert() {
+ public function postSave()
+ {
if ($this->_lightsave == true) {
return true;
}
- $order = 1;
-
- $cmd = $this->getCmd(null, 'refresh');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('refresh');
- $cmd->setName(__('Rafraîchir', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $order = 1;
+
+ $cmd = $this->getCmd(null, 'refresh');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('refresh');
+ $cmd->setName(__('Rafraîchir', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'refreshconfig');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('refreshconfig');
- $cmd->setName(__('Rafraîchir Config', __FILE__));
- $cmd->setIsVisible(0);
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'online');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('online');
- $cmd->setIsVisible(1);
- $cmd->setName(__('Online', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setTemplate('dashboard', 'googlecast_status');
- $cmd->setType('info');
- $cmd->setSubType('binary');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'ENERGY_STATE');
- $cmd->save();
-
- // $cmd = $this->getCmd(null, 'reboot');
- // if (!is_object($cmd)) {
- // $cmd = new googlecastCmd();
- // $cmd->setLogicalId('reboot');
- // $cmd->setName(__('Restart', __FILE__));
- // $cmd->setIsVisible(1);
- // $cmd->setDisplay('icon', '');
- // $cmd->setConfiguration('googlecast_cmd', true);
- // }
- // $cmd->setTemplate('dashboard', 'googlecast_reboot');
- // $cmd->setType('action');
- // $cmd->setSubType('other');
- // $cmd->setEqLogic_id($this->getId());
- // $cmd->save();
-
- // hide reboot button if exists as it's not available anymore in latest googlecast versions
- $cmd = $this->getCmd(null, 'reboot');
- if (is_object($cmd)) {
- // $cmd->remove();
- $cmd->setIsVisible(0);
- $cmd->save();
- }
-
- $cmd = $this->getCmd(null, 'is_busy');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('is_busy');
- $cmd->setIsVisible(1);
- $cmd->setName(__('Occupé', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setTemplate('dashboard', 'googlecast_busy');
- $cmd->setType('info');
- $cmd->setSubType('binary');
-
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'ENERGY_STATE');
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'volume_level');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('volume_level');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Volume', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('numeric');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setUnite('%');
- $cmd->setDisplay('generic_type', 'LIGHT_STATE');
- $cmd->save();
- $volume_id = $cmd->getId();
-
- $cmd = $this->getCmd(null, 'volume_set');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('volume_set');
- $cmd->setName(__('Volume niveau', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('slider');
- $cmd->setConfiguration('minValue', 0);
- $cmd->setConfiguration('maxValue', 100);
- $cmd->setValue($volume_id);
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'volume_muted');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('volume_muted');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Mute', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('binary');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'SIREN_STATE');
- $cmd->save();
- $mute_id = $cmd->getId();
-
- $cmd = $this->getCmd(null, 'volume_down');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('volume_down');
- $cmd->setName(__('Volume -', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'volume_up');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('volume_up');
- $cmd->setName(__('Volume +', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'mute_on');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('mute_on');
- $cmd->setName(__('Muet ON', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setTemplate('dashboard', 'btnCircle');
- $cmd->setTemplate('mobile', 'circle');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'SIREN_ON');
- $cmd->setValue($mute_id);
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'mute_off');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('mute_off');
- $cmd->setName(__('Muet OFF', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setTemplate('dashboard', 'btnCircle');
- $cmd->setTemplate('mobile', 'circle');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'SIREN_OFF');
- $cmd->setValue($mute_id);
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'status_text');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('status_text');
- $cmd->setIsVisible(1);
- $cmd->setName(__('Statut', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setDisplay('showNameOndashboard', false);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('refreshconfig');
+ $cmd->setName(__('Rafraîchir Config', __FILE__));
+ $cmd->setIsVisible(0);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'online');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('online');
+ $cmd->setIsVisible(1);
+ $cmd->setName(__('Online', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setTemplate('dashboard', 'googlecast_status');
+ $cmd->setType('info');
+ $cmd->setSubType('binary');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'ENERGY_STATE');
+ $cmd->save();
+
+ // $cmd = $this->getCmd(null, 'reboot');
+ // if (!is_object($cmd)) {
+ // $cmd = new googlecastCmd();
+ // $cmd->setLogicalId('reboot');
+ // $cmd->setName(__('Restart', __FILE__));
+ // $cmd->setIsVisible(1);
+ // $cmd->setDisplay('icon', '');
+ // $cmd->setConfiguration('googlecast_cmd', true);
+ // }
+ // $cmd->setTemplate('dashboard', 'googlecast_reboot');
+ // $cmd->setType('action');
+ // $cmd->setSubType('other');
+ // $cmd->setEqLogic_id($this->getId());
+ // $cmd->save();
+
+ // hide reboot button if exists as it's not available anymore in latest googlecast versions
+ $cmd = $this->getCmd(null, 'reboot');
+ if (is_object($cmd)) {
+ // $cmd->remove();
+ $cmd->setIsVisible(0);
+ $cmd->save();
+ }
+
+ $cmd = $this->getCmd(null, 'is_busy');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('is_busy');
+ $cmd->setIsVisible(1);
+ $cmd->setName(__('Occupé', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setTemplate('dashboard', 'googlecast_busy');
+ $cmd->setType('info');
+ $cmd->setSubType('binary');
+
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'ENERGY_STATE');
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'volume_level');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('volume_level');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Volume', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('numeric');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setUnite('%');
+ $cmd->setDisplay('generic_type', 'LIGHT_STATE');
+ $cmd->save();
+ $volume_id = $cmd->getId();
+
+ $cmd = $this->getCmd(null, 'volume_set');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('volume_set');
+ $cmd->setName(__('Volume niveau', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('slider');
+ $cmd->setConfiguration('minValue', 0);
+ $cmd->setConfiguration('maxValue', 100);
+ $cmd->setValue($volume_id);
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'volume_muted');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('volume_muted');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Mute', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('binary');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'SIREN_STATE');
+ $cmd->save();
+ $mute_id = $cmd->getId();
+
+ $cmd = $this->getCmd(null, 'volume_down');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('volume_down');
+ $cmd->setName(__('Volume -', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'volume_up');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('volume_up');
+ $cmd->setName(__('Volume +', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'mute_on');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('mute_on');
+ $cmd->setName(__('Muet ON', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setTemplate('dashboard', 'btnCircle');
+ $cmd->setTemplate('mobile', 'circle');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'SIREN_ON');
+ $cmd->setValue($mute_id);
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'mute_off');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('mute_off');
+ $cmd->setName(__('Muet OFF', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setTemplate('dashboard', 'btnCircle');
+ $cmd->setTemplate('mobile', 'circle');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'SIREN_OFF');
+ $cmd->setValue($mute_id);
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'status_text');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('status_text');
+ $cmd->setIsVisible(1);
+ $cmd->setName(__('Statut', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setDisplay('showNameOndashboard', false);
//$cmd->setDisplay('icon', '');
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'GENERIC');
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'display_name');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('display_name');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Statut Name', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setDisplay('showNameOndashboard', false);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'GENERIC');
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'player_state');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('player_state');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Statut Player', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'GENERIC');
- $cmd->save();
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'GENERIC');
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'display_name');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('display_name');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Statut Name', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setDisplay('showNameOndashboard', false);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'GENERIC');
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'player_state');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('player_state');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Statut Player', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'GENERIC');
+ $cmd->save();
$cmd = $this->getCmd(null, 'title');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('title');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Titre', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'GENERIC');
- $cmd->save();
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('title');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Titre', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'GENERIC');
+ $cmd->save();
$cmd = $this->getCmd(null, 'artist');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('artist');
- $cmd->setIsVisible(0);
- $cmd->setName(__('Artiste', __FILE__));
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->setDisplay('generic_type', 'GENERIC');
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'quit_app');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('quit_app');
- $cmd->setName(__('Quitter', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- #$cmd->setDisplay('forceReturnLineBefore', 1);
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'stop');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('stop');
- $cmd->setName(__('Stop', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'pause');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('pause');
- $cmd->setName(__('Pause', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('artist');
+ $cmd->setIsVisible(0);
+ $cmd->setName(__('Artiste', __FILE__));
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->setDisplay('generic_type', 'GENERIC');
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'quit_app');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('quit_app');
+ $cmd->setName(__('Quitter', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ #$cmd->setDisplay('forceReturnLineBefore', 1);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'stop');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('stop');
+ $cmd->setName(__('Stop', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'pause');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('pause');
+ $cmd->setName(__('Pause', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'prev');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('prev');
- $cmd->setName(__('Previous', __FILE__));
- $cmd->setIsVisible(1);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('prev');
+ $cmd->setName(__('Previous', __FILE__));
+ $cmd->setIsVisible(1);
$cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'skip');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('skip');
- $cmd->setName(__('Next', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'skip');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('skip');
+ $cmd->setName(__('Next', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'rewind');
if (!is_object($cmd)) {
@@ -540,36 +553,36 @@ public function postSave() {
$cmd->setEqLogic_id($this->getId());
$cmd->save();
- $cmd = $this->getCmd(null, 'play');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('play');
- $cmd->setName(__('Play', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setDisplay('icon', '');
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $cmd = $this->getCmd(null, 'nowplaying');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('nowplaying');
- $cmd->setName(__('Playing Widget', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setConfiguration('googlecast_cmd', true);
- $cmd->setOrder($order++);
- }
- $cmd->setTemplate('dashboard','googlecast_playing');
- $cmd->setTemplate('mobile','googlecast_playing');
- $cmd->setType('info');
- $cmd->setSubType('string');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $cmd = $this->getCmd(null, 'play');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('play');
+ $cmd->setName(__('Play', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setDisplay('icon', '');
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $cmd = $this->getCmd(null, 'nowplaying');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('nowplaying');
+ $cmd->setName(__('Playing Widget', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setTemplate('dashboard', 'googlecast_playing');
+ $cmd->setTemplate('mobile', 'googlecast_playing');
+ $cmd->setType('info');
+ $cmd->setSubType('string');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'castversion');
if (!is_object($cmd)) {
@@ -585,35 +598,35 @@ public function postSave() {
$cmd->setEqLogic_id($this->getId());
$cmd->save();
- $cmd = $this->getCmd(null, 'speak');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('speak');
- $cmd->setName(__('Parle !', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setTemplate('dashboard','googlecast_speak');
- $cmd->setTemplate('mobile','googlecast_speak');
- $cmd->setType('action');
- $cmd->setSubType('message');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $cmd = $this->getCmd(null, 'speak');
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('speak');
+ $cmd->setName(__('Parle !', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setTemplate('dashboard', 'googlecast_speak');
+ $cmd->setTemplate('mobile', 'googlecast_speak');
+ $cmd->setType('action');
+ $cmd->setSubType('message');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'customcmd');
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId('customcmd');
- $cmd->setName(__('Custom Cmd', __FILE__));
- $cmd->setIsVisible(0);
- $cmd->setOrder($order++);
- $cmd->setConfiguration('googlecast_cmd', true);
- }
- $cmd->setType('action');
- $cmd->setSubType('message');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId('customcmd');
+ $cmd->setName(__('Custom Cmd', __FILE__));
+ $cmd->setIsVisible(0);
+ $cmd->setOrder($order++);
+ $cmd->setConfiguration('googlecast_cmd', true);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('message');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$cmd = $this->getCmd(null, 'cmdlist_radiolist');
if (!is_object($cmd)) {
@@ -621,7 +634,9 @@ public function postSave() {
$cmd->setLogicalId('cmdlist_radiolist');
$cmd->setName(__('Radio', __FILE__));
$cmd->setIsVisible(1);
- if ($order<=3) $order=50;
+ if ($order<=3) {
+ $order=50;
+ }
$cmd->setOrder($order++);
$cmd->setEqLogic_id($this->getId());
$radiolist = googlecast_utils::buildRadioSelectlist();
@@ -632,155 +647,171 @@ public function postSave() {
$cmd->save();
$castType = $this->getConfiguration('cast_type');
- if ($this->getConfiguration('firstTimeCreation', True)) {
+ if ($this->getConfiguration('firstTimeCreation', true)) {
$order = 200;
if ($castType=='cast') {
- $logid = "app=backdrop";
- $cmd = $this->getCmd(null, $logid);
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId($logid);
- $cmd->setName(__('Backdrop', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
+ $logid = "app=backdrop";
+ $cmd = $this->getCmd(null, $logid);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId($logid);
+ $cmd->setName(__('Backdrop', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
$cmd->setType('action');
- $cmd->setSubType('other');
+ $cmd->setSubType('other');
$cmd->setEqLogic_id($this->getId());
- $cmd->save();
- }
-
- $logid = "app=youtube|cmd=play_video|value=fra4QBLF3GU";
- $cmd = $this->getCmd(null, $logid);
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId($logid);
- $cmd->setName(__('YouTube', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
+ $cmd->save();
+ }
+
+ $logid = "app=youtube|cmd=play_video|value=fra4QBLF3GU";
+ $cmd = $this->getCmd(null, $logid);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId($logid);
+ $cmd->setName(__('YouTube', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
$cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
- }
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+ }
}
- $logid = "app=media|cmd=play_media|value='http://bit.ly/2JzYtfX','video/mp4','Mon film'";
- $cmd = $this->getCmd(null, $logid);
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId($logid);
- $cmd->setName(__('Media', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
-
- $logid = "app=web|cmd=load_url|value='http://pictoplasma.sound-creatures.com',True,10";
- $cmd = $this->getCmd(null, $logid);
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId($logid);
- $cmd->setName(__('Web', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $logid = "app=media|cmd=play_media|value='http://bit.ly/2JzYtfX','video/mp4','Mon film'";
+ $cmd = $this->getCmd(null, $logid);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId($logid);
+ $cmd->setName(__('Media', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
+
+ $logid = "app=web|cmd=load_url|value='http://pictoplasma.sound-creatures.com',True,10";
+ $cmd = $this->getCmd(null, $logid);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId($logid);
+ $cmd->setName(__('Web', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
$logid = "cmd=notif|value=bigben1.mp3|vol=100";
- $cmd = $this->getCmd(null, $logid);
- if (!is_object($cmd)) {
- $cmd = new googlecastCmd();
- $cmd->setLogicalId($logid);
- $cmd->setName(__('Notif', __FILE__));
- $cmd->setIsVisible(1);
- $cmd->setOrder($order++);
- }
- $cmd->setType('action');
- $cmd->setSubType('other');
- $cmd->setEqLogic_id($this->getId());
- $cmd->save();
+ $cmd = $this->getCmd(null, $logid);
+ if (!is_object($cmd)) {
+ $cmd = new googlecastCmd();
+ $cmd->setLogicalId($logid);
+ $cmd->setName(__('Notif', __FILE__));
+ $cmd->setIsVisible(1);
+ $cmd->setOrder($order++);
+ }
+ $cmd->setType('action');
+ $cmd->setSubType('other');
+ $cmd->setEqLogic_id($this->getId());
+ $cmd->save();
// $cmd = $this->getCmd(null, 'cmd=getconfig|data=opencast_pin_code');
- // if (!is_object($cmd)) {
- // $cmd = new googlecastCmd();
- // $cmd->setLogicalId('cmd=getconfig|data=opencast_pin_code');
- // $cmd->setName(__('Pincode', __FILE__));
- // $cmd->setIsVisible(0);
- // $cmd->setOrder($order++);
- // }
- // $cmd->setType('info');
- // $cmd->setSubType('string');
- // $cmd->setEqLogic_id($this->getId());
+ // if (!is_object($cmd)) {
+ // $cmd = new googlecastCmd();
+ // $cmd->setLogicalId('cmd=getconfig|data=opencast_pin_code');
+ // $cmd->setName(__('Pincode', __FILE__));
+ // $cmd->setIsVisible(0);
+ // $cmd->setOrder($order++);
+ // }
+ // $cmd->setType('info');
+ // $cmd->setSubType('string');
+ // $cmd->setEqLogic_id($this->getId());
// $cmd->save();
- $this->setConfiguration('firstTimeCreation', False);
- $this->save();
- }
+ $this->setConfiguration('firstTimeCreation', false);
+ $this->save();
+ }
if (intval($this->getConfiguration('has_googleassistant', '0')) == 1) {
//$order = googlecast_utils::getCmdDefinition($this, 'googlehome', 210);
}
+
+ // fix to be able to remove old gh_* commands
+ $cmd = $this->getCmd(null, 'gh_get_alarm_date_0');
+ if (is_object($cmd)) {
+ $cmd->setConfiguration('googlecast_cmd', false);
+ $cmd->save();
+ }
+ $cmd = $this->getCmd(null, 'gh_get_alarm_status_0');
+ if (is_object($cmd)) {
+ $cmd->setConfiguration('googlecast_cmd', false);
+ $cmd->save();
+ }
+ // -- end fix
+
+ $this->checkAndUpdateCmd('nowplaying', $this->getLogicalId());
- $this->checkAndUpdateCmd('nowplaying', $this->getLogicalId());
-
- if ( $this->getIsEnable() ) {
+ if ($this->getIsEnable()) {
$this->allowDevice();
try {
$this->refreshChromecastConfig();
- } catch (Exception $e) {}
+ } catch (Exception $e) {
+ }
+ }
+ }
+
+ public static function createFromDef($_def)
+ {
+ event::add('jeedom::alert', array(
+ 'level' => 'warning',
+ 'page' => 'googlecast',
+ 'message' => __('Nouveau GoogleCast detecté', __FILE__),
+ ));
+ if (!isset($_def['uuid']) || !isset($_def['def'])) {
+ log::add('googlecast', 'error', 'Information manquante pour ajouter l\'équipement : ' . print_r($_def, true));
+ event::add('jeedom::alert', array(
+ 'level' => 'danger',
+ 'page' => 'googlecast',
+ 'message' => __('Information manquante pour ajouter l\'équipement. Inclusion impossible', __FILE__),
+ ));
+ return false;
+ }
+
+ $googlecast = googlecast::byLogicalId($_def['uuid'], 'googlecast');
+ if (!is_object($googlecast)) {
+ $eqLogic = new googlecast();
+ $eqLogic->setName($_def['friendly_name']);
}
- }
-
- public static function createFromDef($_def) {
- event::add('jeedom::alert', array(
- 'level' => 'warning',
- 'page' => 'googlecast',
- 'message' => __('Nouveau GoogleCast detecté', __FILE__),
- ));
- if (!isset($_def['uuid']) || !isset($_def['def'])) {
- log::add('googlecast', 'error', 'Information manquante pour ajouter l\'équipement : ' . print_r($_def, true));
- event::add('jeedom::alert', array(
- 'level' => 'danger',
- 'page' => 'googlecast',
- 'message' => __('Information manquante pour ajouter l\'équipement. Inclusion impossible', __FILE__),
- ));
- return false;
- }
-
- $googlecast = googlecast::byLogicalId($_def['uuid'], 'googlecast');
- if (!is_object($googlecast)) {
- $eqLogic = new googlecast();
- $eqLogic->setName($_def['friendly_name']);
- }
- $eqLogic->setLogicalId($_def['uuid']);
- $eqLogic->setEqType_name('googlecast');
- $eqLogic->setIsEnable(1);
- $eqLogic->setIsVisible(1);
- $eqLogic->setConfiguration('device', $_def['def']['cast_type']);
- $eqLogic->setConfiguration('friendly_name', $_def['friendly_name']);
- $eqLogic->setConfiguration('model_name', $_def['def']['model_name']);
- $eqLogic->setConfiguration('manufacturer', $_def['def']['manufacturer']);
- $eqLogic->setConfiguration('cast_type', $_def['def']['cast_type']);
+ $eqLogic->setLogicalId($_def['uuid']);
+ $eqLogic->setEqType_name('googlecast');
+ $eqLogic->setIsEnable(1);
+ $eqLogic->setIsVisible(1);
+ $eqLogic->setConfiguration('device', $_def['def']['cast_type']);
+ $eqLogic->setConfiguration('friendly_name', $_def['friendly_name']);
+ $eqLogic->setConfiguration('model_name', $_def['def']['model_name']);
+ $eqLogic->setConfiguration('manufacturer', $_def['def']['manufacturer']);
+ $eqLogic->setConfiguration('cast_type', $_def['def']['cast_type']);
$eqLogic->setConfiguration('uri', $_def['def']['uri']);
$eqLogic->setConfiguration('ip', $eqLogic->getChromecastIPfromURI());
- $eqLogic->save();
-
- event::add('jeedom::alert', array(
- 'level' => 'warning',
- 'page' => 'googlecast',
- 'message' => __('Module inclu avec succès ' .$_def['friendly_name'], __FILE__),
- ));
- return $eqLogic;
- }
+ $eqLogic->save();
+
+ event::add('jeedom::alert', array(
+ 'level' => 'warning',
+ 'page' => 'googlecast',
+ 'message' => __('Module inclu avec succès ' .$_def['friendly_name'], __FILE__),
+ ));
+ return $eqLogic;
+ }
- public function getChromecastIPfromURI() {
+ public function getChromecastIPfromURI()
+ {
$uri = $this->getConfiguration('uri', '');
if (strpos($uri, '[') === 0) { // ipv6
@@ -789,149 +820,183 @@ public function getChromecastIPfromURI() {
if (strrpos($ip, ']') + strlen(']') === strlen($ip)) {
$ip = substr($ip, -1);
}
- }
- else { // ipv4
+ } else { // ipv4
$exploded = explode(":", $uri);
$ip = $exploded[0];
}
return $ip;
}
- public function getChromecastIP() {
+ public function getChromecastIP()
+ {
return $this->getConfiguration('ip', '');
}
- public function getUUID() {
+ public function getUUID()
+ {
return $this->getConfiguration('uuid', '');
}
- public function getChromecastURI() {
- return $this->getConfiguration('uri', '');
- }
+ public function getChromecastURI()
+ {
+ return $this->getConfiguration('uri', '');
+ }
- public function refreshChromecastConfig() {
+ public function refreshChromecastConfig()
+ {
$cmd = $this->getCmd(null, 'refreshconfig');
- if (is_object($cmd)) {
+ if (is_object($cmd)) {
return $cmd->execute();
}
return false;
- }
-
- /* * **********************Getteur Setteur*************************** */
-
- public static function deamon_info() {
- $return = array();
- $return['log'] = 'googlecast';
- $return['state'] = 'nok';
- $pid_file = '/tmp/googlecast.pid';
- if (file_exists($pid_file)) {
- if (@posix_getsid(trim(file_get_contents($pid_file)))) {
- $return['state'] = 'ok';
- } else {
- shell_exec(system::getCmdSudo() . 'rm -rf ' . $pid_file . ' 2>&1 > /dev/null;rm -rf ' . $pid_file . ' 2>&1 > /dev/null;');
- }
- }
- $return['launchable'] = 'ok';
- $socketport = config::byKey('socketport', 'googlecast');
- if ($socketport == '') {
- $return['launchable'] = 'nok';
- $return['launchable_message'] = __('Le port n\'est pas configuré', __FILE__);
- }
- return $return;
- }
-
- public static function dependancy_info() {
- $return = array();
- $return['log'] = 'googlecast_update';
- $return['progress_file'] = '/tmp/dependancy_googlecast_in_progress';
- $cmd = system::getCmdSudo() . '/bin/bash ' . dirname(__FILE__) . '/../../resources/install_check.sh';
- if (exec($cmd) == "ok") {
- $return['state'] = 'ok';
- } else {
- $return['state'] = 'nok';
- }
- return $return;
- }
-
- public static function dependancy_install() {
- log::remove(__CLASS__ . '_update');
- return array('script' => dirname(__FILE__) . '/../../resources/install.sh', 'log' => log::getPathToLog(__CLASS__ . '_update'));
- }
-
- public static function deamon_start() {
- self::deamon_stop();
- $deamon_info = self::deamon_info();
- if ($deamon_info['launchable'] != 'ok') {
- throw new Exception(__('Veuillez vérifier la configuration', __FILE__));
- }
- $googlecast_path = realpath(dirname(__FILE__) . '/../../resources');
- $cmd = '/usr/bin/python3 ' . $googlecast_path . '/googlecast.py';
- #$cmd .= ' --scantimeout 10';
- $cmd .= ' --loglevel ' . log::convertLogLevel(log::getLogLevel('googlecast'));
- $cmd .= ' --socketport ' . config::byKey('socketport', 'googlecast');
- $cmd .= ' --sockethost 127.0.0.1';
+ }
+
+ /* * **********************Getteur Setteur*************************** */
+
+ public static function deamon_info()
+ {
+ $return = array();
+ $return['log'] = 'googlecast';
+ $return['state'] = 'nok';
+ $pid_file = '/tmp/googlecast.pid';
+ if (file_exists($pid_file)) {
+ if (@posix_getsid(trim(file_get_contents($pid_file)))) {
+ $return['state'] = 'ok';
+ } else {
+ shell_exec(system::getCmdSudo() . 'rm -rf ' . $pid_file . ' 2>&1 > /dev/null;rm -rf ' . $pid_file . ' 2>&1 > /dev/null;');
+ }
+ }
+ $return['launchable'] = 'ok';
+ $socketport = config::byKey('socketport', 'googlecast');
+ if ($socketport == '') {
+ $return['launchable'] = 'nok';
+ $return['launchable_message'] = __('Le port n\'est pas configuré', __FILE__);
+ }
+ return $return;
+ }
+
+ public static function dependancy_info()
+ {
+ $return = array();
+ $return['log'] = 'googlecast_update';
+ $return['progress_file'] = '/tmp/dependancy_googlecast_in_progress';
+ $cmd = system::getCmdSudo() . '/bin/bash ' . dirname(__FILE__) . '/../../resources/install_check.sh';
+ if (exec($cmd) == "ok") {
+ $return['state'] = 'ok';
+ } else {
+ $return['state'] = 'nok';
+ }
+ return $return;
+ }
+
+ public static function dependancy_install()
+ {
+ log::remove(__CLASS__ . '_update');
+ return array('script' => dirname(__FILE__) . '/../../resources/install.sh', 'log' => log::getPathToLog(__CLASS__ . '_update'));
+ }
+
+ public static function getVersion()
+ {
+ $pluginVersion = 'Error';
+ if (!file_exists(dirname(__FILE__) . '/../../plugin_info/info.json')) {
+ log::add('googlecast', 'warning', 'Pas de fichier info.json');
+ }
+ $data = json_decode(file_get_contents(dirname(__FILE__) . '/../../plugin_info/info.json'), true);
+ if (!is_array($data)) {
+ log::add('googlecast', 'warning', 'Impossible de décoder le fichier info.json');
+ }
+ try {
+ $pluginVersion = $data['version'];
+ } catch (\Exception $e) {
+ log::add('googlecast', 'warning', 'Impossible de récupérer la version.');
+ }
+
+ return $pluginVersion;
+ }
+
+ public static function dependancy_runlightinstall()
+ {
+ $shellret = shell_exec(system::getCmdSudo() . __DIR__ . '/../../resources/update.sh' . ' ' . __DIR__ . '/../../resources/requirements.txt 2>&1');
+ log::add('googlecast', 'debug', "Light dependency update script logs :\n" . $shellret);
+ }
+
+
+ public static function deamon_start()
+ {
+ self::deamon_stop();
+ $deamon_info = self::deamon_info();
+ if ($deamon_info['launchable'] != 'ok') {
+ throw new Exception(__('Veuillez vérifier la configuration', __FILE__));
+ }
+ $googlecast_path = realpath(dirname(__FILE__) . '/../../resources');
+ $cmd = '/usr/bin/python3 ' . $googlecast_path . '/googlecast.py';
+ #$cmd .= ' --scantimeout 10';
+ $cmd .= ' --loglevel ' . log::convertLogLevel(log::getLogLevel('googlecast'));
+ $cmd .= ' --socketport ' . config::byKey('socketport', 'googlecast');
+ $cmd .= ' --sockethost 127.0.0.1';
$jeedomurl = (config::byKey('fixdocker', 'googlecast')==0 ? network::getNetworkAccess('internal', 'proto:127.0.0.1:port:comp') : network::getNetworkAccess('internal'));
- $cmd .= ' --callback ' . $jeedomurl . '/plugins/googlecast/core/php/googlecast.api.php';
- $cmd .= ' --apikey ' . jeedom::getApiKey('googlecast');
+ $cmd .= ' --callback ' . $jeedomurl . '/plugins/googlecast/core/php/googlecast.api.php';
+ $cmd .= ' --apikey ' . jeedom::getApiKey('googlecast');
if (config::byKey('tts_externalweb', 'googlecast')==1) {
$cmd .= ' --ttsweb ' . network::getNetworkAccess('external');
- }
- else {
+ } else {
$cmd .= ' --ttsweb ' . network::getNetworkAccess('internal');
}
$cmd .= ' --ttslang ' . config::byKey('tts_language', 'googlecast', 'fr-FR');
- $cmd .= ' --ttsengine ' . config::byKey('tts_engine', 'googlecast', 'picotts');
+ $cmd .= ' --ttsengine ' . config::byKey('tts_engine', 'googlecast', 'picotts');
$cmd .= ' --ttsspeed ' . config::byKey('tts_speed', 'googlecast', '1.2');
if (config::byKey('tts_disablecache', 'googlecast')==1) {
$cmd .= ' --ttscache 0';
- }
- else {
+ } else {
$cmd .= ' --ttscache 1';
}
- $cmd .= ' --ttsgapikey ' . config::byKey('tts_gapikey', 'googlecast', 'none');
- $cmd .= ' --gcttsvoice ' . config::byKey('gctts_voice', 'googlecast', 'fr-FR-Standard-A');
- $cmd .= ' --daemonname local';
- $cmd .= ' --cyclefactor ' . config::byKey('cyclefactor', 'googlecast', '1');
+ $cmd .= ' --ttsgapikey ' . config::byKey('tts_gapikey', 'googlecast', 'none');
+ $cmd .= ' --gcttsvoice ' . config::byKey('gctts_voice', 'googlecast', 'fr-FR-Standard-A');
+ $cmd .= ' --daemonname local';
+ $cmd .= ' --cyclefactor ' . config::byKey('cyclefactor', 'googlecast', '1');
$cmd .= ' --defaultstatus ' . "'". config::byKey('defaultsatus', 'googlecast', " ") ."'";
- log::add('googlecast', 'info', 'Lancement démon googlecast : ' . $cmd);
- $result = exec($cmd . ' >> ' . log::getPathToLog('googlecast_local') . ' 2>&1 &');
- $i = 0;
- while ($i < 20) {
- $deamon_info = self::deamon_info();
- if ($deamon_info['state'] == 'ok') {
- break;
- }
- sleep(1);
- $i++;
- }
- if ($i >= 30) {
- log::add('googlecast', 'error', __('Impossible de lancer le démon googlecast, vérifiez la log',__FILE__), 'unableStartDeamon');
- return false;
- }
- message::removeAll('googlecast', 'unableStartDeamon');
- config::save('include_mode', 0, 'googlecast');
- return true;
- }
-
-
- public static function socket_connection($_value) {
+ log::add('googlecast', 'info', 'Lancement démon googlecast : ' . $cmd);
+ $result = exec($cmd . ' >> ' . log::getPathToLog('googlecast_local') . ' 2>&1 &');
+ $i = 0;
+ while ($i < 20) {
+ $deamon_info = self::deamon_info();
+ if ($deamon_info['state'] == 'ok') {
+ break;
+ }
+ sleep(1);
+ $i++;
+ }
+ if ($i >= 30) {
+ log::add('googlecast', 'error', __('Impossible de lancer le démon googlecast, vérifiez la log', __FILE__), 'unableStartDeamon');
+ return false;
+ }
+ message::removeAll('googlecast', 'unableStartDeamon');
+ config::save('include_mode', 0, 'googlecast');
+ return true;
+ }
+
+
+ public static function socket_connection($_value)
+ {
try {
- $socket = socket_create(AF_INET, SOCK_STREAM, 0);
- socket_connect($socket, '127.0.0.1', config::byKey('socketport', 'googlecast'));
- socket_write($socket, $_value, strlen($_value));
- socket_close($socket);
+ $socket = socket_create(AF_INET, SOCK_STREAM, 0);
+ @socket_connect($socket, '127.0.0.1', config::byKey('socketport', 'googlecast'));
+ @socket_write($socket, $_value, strlen($_value));
+ @socket_close($socket);
return true;
} catch (Exception $e) {
return false;
}
- }
+ }
- public static function cleanTTScache($days=0) {
+ public static function cleanTTScache($days=0)
+ {
$value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'cleanttscache', 'days' => $days));
- self::socket_connection($value);
- }
+ self::socket_connection($value);
+ }
- public static function testAddress($useExternal=null) {
+ public static function testAddress($useExternal=null)
+ {
if ($useExternal===null) {
$useExternal = config::byKey('tts_externalweb', 'googlecast');
}
@@ -939,110 +1004,120 @@ public static function testAddress($useExternal=null) {
$testAddress = '';
if ($useExternal===1 || $useExternal===true || $useExternal==='true') {
$testAddress .= network::getNetworkAccess('external');
- }
- else {
+ } else {
$testAddress .= network::getNetworkAccess('internal');
}
return $testAddress . "/plugins/googlecast/localmedia/bigben1.mp3";
- }
-
- public static function deamon_stop() {
- $pid_file = '/tmp/googlecast.pid';
- if (file_exists($pid_file)) {
- $pid = intval(trim(file_get_contents($pid_file)));
- system::kill($pid);
- }
- system::kill('googlecast.py');
- system::fuserk(config::byKey('socketport', 'googlecast'));
- sleep(1);
- }
-
- public static function changeIncludeState($_state, $_mode) {
- if ($_mode == 1) {
- if ($_state == 1) {
- $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'learnin'));
- self::socket_connection($value);
- } else {
- $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'learnout'));
- self::socket_connection($value);
- }
- }
- }
-
- public static function sendDisplayAction($_uuid, $_cmd, $_options = null) {
- if ( $_cmd == "customcmd" and !isset($_options['message']) ) {
- return false; // message is mandatory for customcmd
- }
- $eqLogic = eqLogic::byId($_uuid);
- if ($eqLogic) {
- $cmd = $eqLogic->getCmd(null, $_cmd);
- if (is_object($_cmd)) {
- $cmd->execute($_options);
- return true;
- }
- }
- return false;
- }
-
- public static function sendIdToDeamon() {
- foreach (self::byType('googlecast') as $eqLogic) {
- $eqLogic->allowDevice();
- usleep(500);
- }
- }
-
- public static function manageCallback($data) {
+ }
+
+ public static function deamon_stop()
+ {
+ $pid_file = '/tmp/googlecast.pid';
+ if (file_exists($pid_file)) {
+ $pid = intval(trim(file_get_contents($pid_file)));
+ system::kill($pid);
+ }
+ system::kill('googlecast.py');
+ system::fuserk(config::byKey('socketport', 'googlecast'));
+ sleep(1);
+ }
+
+ public static function changeIncludeState($_state, $_mode)
+ {
+ if ($_mode == 1) {
+ if ($_state == 1) {
+ $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'learnin'));
+ self::socket_connection($value);
+ } else {
+ $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'learnout'));
+ self::socket_connection($value);
+ }
+ }
+ }
+
+ public static function sendDisplayAction($_uuid, $_cmd, $_options = null)
+ {
+ if ($_cmd == "customcmd" and !isset($_options['message'])) {
+ return false; // message is mandatory for customcmd
+ }
+ $eqLogic = eqLogic::byId($_uuid);
+ if ($eqLogic) {
+ $cmd = $eqLogic->getCmd(null, $_cmd);
+ if (is_object($_cmd)) {
+ $cmd->execute($_options);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static function sendIdToDeamon()
+ {
+ foreach (self::byType('googlecast') as $eqLogic) {
+ $eqLogic->allowDevice();
+ usleep(500);
+ }
+ }
+
+ public static function manageCallback($data)
+ {
// TODO
- log::add('googlecast','debug','Received callcak command for ' . $data['uuid']);
+ log::add('googlecast', 'debug', 'Received callcak command for ' . $data['uuid']);
+ }
+
+ public static function registerNowPlayging($uuid)
+ {
+ $value = array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'nowplaying', 'uuid' => $uuid);
+ $value = json_encode($value);
+ self::socket_connection($value);
+ }
+
+
+ public function allowDevice()
+ {
+ $value = array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'add');
+
+ if ($this->getLogicalId() != '') {
+ $value['device'] = array(
+ 'uuid' => $this->getLogicalId(),
+ 'options' => array(
+ 'ignore_CEC' => $this->getConfiguration('ignore_CEC', '0')
+ )
+ );
+ $value = json_encode($value);
+ self::socket_connection($value);
+ }
+ }
+
+ public function disallowDevice()
+ {
+ if ($this->getLogicalId() == '') {
+ return;
+ }
+ $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'remove', 'device' => array('uuid' => $this->getLogicalId())));
+ self::socket_connection($value);
+ }
+
+
+ public function refreshStatusAll()
+ {
+ $value = array('apikey' => jeedom::getApiKey('googlecast'),
+ 'cmd' => 'refreshall');
+ $value = json_encode($value);
+ self::socket_connection($value);
}
- public static function registerNowPlayging($uuid) {
- $value = array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'nowplaying', 'uuid' => $uuid);
- $value = json_encode($value);
- self::socket_connection($value);
- }
-
-
- public function allowDevice() {
- $value = array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'add');
-
- if ($this->getLogicalId() != '') {
- $value['device'] = array(
- 'uuid' => $this->getLogicalId(),
- 'options' => array (
- 'ignore_CEC' => $this->getConfiguration('ignore_CEC','0')
- )
- );
- $value = json_encode($value);
- self::socket_connection($value);
- }
- }
-
- public function disallowDevice() {
- if ($this->getLogicalId() == '') {
- return;
- }
- $value = json_encode(array('apikey' => jeedom::getApiKey('googlecast'), 'cmd' => 'remove', 'device' => array('uuid' => $this->getLogicalId())));
- self::socket_connection($value);
- }
-
-
- public function refreshStatusAll() {
- $value = array('apikey' => jeedom::getApiKey('googlecast'),
- 'cmd' => 'refreshall');
- $value = json_encode($value);
- self::socket_connection($value);
- }
-
- public function refreshStatusByUUID($uuid) {
- $value = array('apikey' => jeedom::getApiKey('googlecast'),
- 'cmd' => 'refresh',
- 'uuid' => $uuid);
- $value = json_encode($value);
- self::socket_connection($value);
- }
-
- public function helperSendSimpleCmd($command_name, $value=null, $_callback=null, $_source='googlecast', $_app='media', $_appid='CC1AD845') {
+ public function refreshStatusByUUID($uuid)
+ {
+ $value = array('apikey' => jeedom::getApiKey('googlecast'),
+ 'cmd' => 'refresh',
+ 'uuid' => $uuid);
+ $value = json_encode($value);
+ self::socket_connection($value);
+ }
+
+ public function helperSendSimpleCmd($command_name, $value=null, $_callback=null, $_source='googlecast', $_app='media', $_appid='CC1AD845')
+ {
$command_name = googlecast_utils::getFullCmdTranslation($command_name);
$fulldata = array(
'apikey' => jeedom::getApiKey('googlecast'),
@@ -1060,34 +1135,34 @@ public function helperSendSimpleCmd($command_name, $value=null, $_callback=null,
),
);
- return self::socket_connection( json_encode($fulldata) );
+ return self::socket_connection(json_encode($fulldata));
}
- public static function helperSendNotifandWait_static($uuid, $_commands, $maxwait=30, $retrydelay=500, $initialdelay=2) {
+ public static function helperSendNotifandWait_static($uuid, $_commands, $maxwait=30, $retrydelay=500, $initialdelay=2)
+ {
$googlecast = googlecast::byLogicalId($uuid, 'googlecast');
- if ( !is_object($googlecast) ) {
+ if (!is_object($googlecast)) {
return false;
- }
- else {
+ } else {
return $googlecast->helperSendNotifandWait($_commands, $maxwait, $retrydelay, $initialdelay);
}
}
- public function helperSendNotifandWait($_commands, $maxwait=30, $retrydelay=500, $initialdelay=2) {
+ public function helperSendNotifandWait($_commands, $maxwait=30, $retrydelay=500, $initialdelay=2)
+ {
$retrydelay = $retrydelay*1000;
- if ( $this->getIsEnable()==false or $this->isOnline()==false ) {
+ if ($this->getIsEnable()==false or $this->isOnline()==false) {
return false;
- }
- else {
+ } else {
$this->helperSendCustomCmd($_commands);
sleep($initialdelay); // make sure command has started
$status = $this->getInfoValue('status_text');
$starttime = time();
- while ($status=='Casting: TTS' or $status=='Casting: NOTIF' ) {
+ while ($status=='Casting: TTS' or $status=='Casting: NOTIF') {
usleep($retrydelay); // or sleep(1); // 1 sec
$status = $this->getInfoValue('status_text');
- if ( (time()-$starttime)>$maxwait ) {
+ if ((time()-$starttime)>$maxwait) {
return false;
}
}
@@ -1096,10 +1171,11 @@ public function helperSendNotifandWait($_commands, $maxwait=30, $retrydelay=500,
}
// send commands as php array of by sequence (seperated by $$)
- public function helperSendCustomCmd($_commands, $_callback=null, $_source='googlecast', $_app='media', $_appid='CC1AD845') {
+ public function helperSendCustomCmd($_commands, $_callback=null, $_source='googlecast', $_app='media', $_appid='CC1AD845')
+ {
$datalist = array();
$commandlist = $_commands;
- if ( !is_array($_commands) ) {
+ if (!is_array($_commands)) {
$commandlist = explode('$$', $_commands);
}
foreach ($commandlist as $commandstring) {
@@ -1108,31 +1184,31 @@ public function helperSendCustomCmd($_commands, $_callback=null, $_source='googl
$data = array();
$splitcmd = explode('|', $commandstring);
$splitcount = count($splitcmd);
- foreach ($splitcmd as $value) {
- $value = explode('=', $value);
+ foreach ($splitcmd as $value) {
+ $value = explode('=', $value);
// ex: cmd=set_volume|value=10
- if (count($value) == 2) {
+ if (count($value) == 2) {
$data[trim($value[0])] = trim($value[1]);
- }
+ }
// ex: cmd=play (no value=X and single param)
- elseif (count($value) == 1 && $splitcount==1) {
- $data['cmd'] = trim($value[0]);
- $data['value'] = 0;
- }
+ elseif (count($value) == 1 && $splitcount==1) {
+ $data['cmd'] = trim($value[0]);
+ $data['value'] = 0;
+ }
// ex: cmd=set_volume|value=10|refresh (refresh is set to 1)
elseif (count($value) == 1 && $splitcount>1) {
- $data[trim($value[0])] = 1;
- }
- }
- if ( !isset($data['app']) && !is_null($_app) ) {
+ $data[trim($value[0])] = 1;
+ }
+ }
+ if (!isset($data['app']) && !is_null($_app)) {
$data['app'] = $_app;
}
- if ( !isset($data['appid']) && !is_null($_appid) ) {
+ if (!isset($data['appid']) && !is_null($_appid)) {
$data['appid'] = $_appid;
}
array_push($datalist, $data);
}
- log::add('googlecast','debug','helperSendCustomCmd : ' . print_r($datalist, true));
+ log::add('googlecast', 'debug', 'helperSendCustomCmd : ' . print_r($datalist, true));
$fulldata = array(
'apikey' => jeedom::getApiKey('googlecast'),
@@ -1145,20 +1221,21 @@ public function helperSendCustomCmd($_commands, $_callback=null, $_source='googl
'command' => $datalist,
);
- return self::socket_connection( json_encode($fulldata) );
- }
+ return self::socket_connection(json_encode($fulldata));
+ }
- public function helperSendConfigInfoCmd($_commands, $_destLogicalId, $setType=false, $_callback=null, $showError=false) {
+ public function helperSendConfigInfoCmd($_commands, $_destLogicalId, $setType=false, $_callback=null, $showError=false)
+ {
if ($setType==false) {
$ret = $this->getInfoHttp($_commands, $showError, false, 'json', ',', null, $_destLogicalId);
- }
- else {
+ } else {
$ret = $this->setInfoHttp($_commands, $showError, $_destLogicalId);
}
return $ret;
- }
+ }
- public function getInfoHttpSimple($cmdLogicalId, $destLogicalId=null) {
+ public function getInfoHttpSimple($cmdLogicalId, $destLogicalId=null)
+ {
$cmdLogicalIdTranslate = googlecast_utils::getFullCmdTranslation($cmdLogicalId);
if (is_null($destLogicalId)) {
$destLogicalId = ($cmdLogicalIdTranslate!=$cmdLogicalId ? $cmdLogicalId : null);
@@ -1166,12 +1243,13 @@ public function getInfoHttpSimple($cmdLogicalId, $destLogicalId=null) {
return $this->getInfoHttp($cmdLogicalIdTranslate, false, false, 'string', ',', null, $destLogicalId);
}
- public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $format='string', $sep=',', $fnc=null, $destLogicalId=null, $updatecmd=true) {
- log::add('googlecast','debug',"getInfoHttp : " . $cmdLogicalId);
+ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $format='string', $sep=',', $fnc=null, $destLogicalId=null, $updatecmd=true)
+ {
+ log::add('googlecast', 'debug', "getInfoHttp : " . $cmdLogicalId);
$uri = $this->getChromecastIP();
$cmd = $this->getCmd(null, (!is_null($destLogicalId)?$destLogicalId:$cmdLogicalId));
$has_cmd = false;
- if (is_object($cmd)) {
+ if (is_object($cmd)) {
$has_cmd = true;
}
$listCmd = $cmdLogicalId;
@@ -1195,7 +1273,7 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
foreach ($datalist as $data) {
if (isset($data['cmd']) && $data['cmd'] == 'getconfig') {
- if (isset($data['error']) && ($data['error']==1 or $data['error']=='true') ) {
+ if (isset($data['error']) && ($data['error']==1 or $data['error']=='true')) {
$showError = true;
}
if (isset($data['reterror'])) {
@@ -1211,39 +1289,38 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
$format = $data['format'];
}
$isPost = false;
- $isSSL = false;
- if ( isset($data['value']) && $data['value']!='eureka_info' ) {
+ $isSSL = false;
+ if (isset($data['value']) && $data['value']!='eureka_info') {
$uripath = $data['value'];
if (strpos($uripath, 'post:') === 0) {
- $isPost = true;
- $uripath = str_replace('post:', '', $uripath);
+ $isPost = true;
+ $uripath = str_replace('post:', '', $uripath);
}
- $isSSL = True;
+ $isSSL = true;
$url = 'https://' . $uri . ':8443/setup/' . $uripath. '?options=detail';
- }
- else {
+ } else {
$url = 'http://' . $uri . ':8008/setup/eureka_info?options=detail';
}
$request_http = new com_http($url);
$has_error = false;
- $headers = array();
- if ($isSSL) {
+ $headers = array();
+ if ($isSSL) {
$gatoken = $this->getConfiguration('ga_token', '');
- if ( $gatoken == '' ) {
- log::add('googlecast','error',__('Le jeton/token Google Home n\'est pas configuré!', __FILE__));
+ if ($gatoken == '') {
+ log::add('googlecast', 'warning', __('Le jeton Google Home n\'est pas configuré!', __FILE__));
$gatoken = 'none';
}
$request_http->setNoSslCheck(true);
- array_push($headers, 'cast-local-authorization-token: ' . $gatoken );
+ array_push($headers, 'cast-local-authorization-token: ' . $gatoken);
}
if ($isPost) {
$request_http->setPost('');
- array_push($headers, 'Connection: close', 'content-type: application/json');
+ array_push($headers, 'Connection: close', 'content-type: application/json');
+ }
+ if (count($headers)>0) {
+ $request_http->setHeader($headers);
}
- if ( count($headers)>0 ) {
- $request_http->setHeader($headers);
- }
try {
$httpret = $request_http->exec($_timeout=1, $_maxRetry=1);
$arrayret = json_decode($httpret, true);
@@ -1256,30 +1333,29 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
//$arrayret = json_decode($httpret, true);
if (isset($arrayret)) {
- log::add('googlecast','debug','Request response content : ' . print_r($arrayret,true));
+ log::add('googlecast', 'debug', 'Request response content : ' . print_r($arrayret, true));
}
if ($has_error===true or ($arrayret and count($arrayret)==0)) {
- if ( $showError==true) {
- log::add('googlecast','error',__('Configuration non accessible', __FILE__));
- }
- if ( $has_error===true) {
- log::add('googlecast','debug',"getInfoHttp : Error while accessing device (offline ?)");
+ if ($showError==true) {
+ log::add('googlecast', 'error', __('Configuration non accessible', __FILE__));
}
- else {
- log::add('googlecast','debug',"getInfoHttp : Result is empty (device compatible ?)");
+ if ($has_error===true) {
+ log::add('googlecast', 'debug', "getInfoHttp : Error while accessing device (offline ?)");
+ } else {
+ log::add('googlecast', 'debug', "getInfoHttp : Result is empty (device compatible ?)");
}
if ($has_cmd===true and $errorRet===false) {
$ret = $cmd->execCmd();
- log::add('googlecast','debug',"getInfoHttp : Result error (previous result) : " . $ret);
+ log::add('googlecast', 'debug', "getInfoHttp : Result error (previous result) : " . $ret);
}
if ($errorRet!==false) {
$ret = $errorRet;
}
$retSave = $ret;
$ret = googlecast_utils::getFncResult($ret, $fnc);
- log::add('googlecast','debug',"getInfoHttp : Result error (with default) : " . $retSave . " => " . $ret);
+ log::add('googlecast', 'debug', "getInfoHttp : Result error (with default) : " . $retSave . " => " . $ret);
- if ( $format=='json' ) {
+ if ($format=='json') {
$ret = json_encode($ret);
}
if ($has_cmd===true and $updatecmd===true) {
@@ -1294,31 +1370,26 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
//$arrayret = json_decode($httpret, true);
if (isset($data['data'])) {
-
- $dataItemList = explode (',',$data['data']);
+ $dataItemList = explode(',', $data['data']);
$retArray = array();
foreach ($dataItemList as $dataItem) {
- if ( strpos($dataItem, '$') === 0 ) { // jsonpath type
+ if (strpos($dataItem, '$') === 0) { // jsonpath type
array_push($retArray, googlecast_utils::getJsonPathResult($httpret, $dataItem));
- }
- else { // legacy using '/' as separator
- $pathList = explode ('/',$dataItem);
+ } else { // legacy using '/' as separator
+ $pathList = explode('/', $dataItem);
array_push($retArray, $this->recursePath($arrayret, $pathList, $errorRet));
}
}
- if ( $format=='json' ) {
+ if ($format=='json') {
$ret = json_encode($retArray);
- }
- elseif ( $format=='php' ) {
+ } elseif ($format=='php') {
return $retArray;
- }
- elseif ( $format=='string' ) {
+ } elseif ($format=='string') {
$flattenAr = $this->array_flatten($retArray);
//log::add('googlecast','debug',"getInfoHttp : Debug format string : " . print_r($flattenAr, true));
$ret = join($sep, $flattenAr);
- }
- else {
+ } else {
$ret = '';
foreach ($retArray as $retElem) {
$ret .= $sep . $this->formatString($retElem, $format, $errorRet);
@@ -1330,13 +1401,12 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
if ($ret=='' && $errorRet!==false) {
$ret = $errorRet;
}
- log::add('googlecast','debug',"getInfoHttp : Result success : " . $retsave . " => " . $ret);
+ log::add('googlecast', 'debug', "getInfoHttp : Result success : " . $retsave . " => " . $ret);
if ($has_cmd===true and $updatecmd===true) {
$cmd->event($ret);
}
- }
- else {
+ } else {
$ret = json_encode($arrayret);
if ($has_cmd===true) {
$cmd->event($ret);
@@ -1347,7 +1417,8 @@ public function getInfoHttp($cmdLogicalId, $showError=false, $errorRet=false, $f
}
}
- private function formatString($array, $format, $errorRet) {
+ private function formatString($array, $format, $errorRet)
+ {
if (!is_array($array) && ($array=='unknown' or $array==$errorRet)) {
return $array;
}
@@ -1357,49 +1428,51 @@ private function formatString($array, $format, $errorRet) {
return $ret;
}
- private function array_flatten($array) {
+ private function array_flatten($array)
+ {
$return = array();
foreach ($array as $key => $value) {
- if (is_array($value))
+ if (is_array($value)) {
$return = array_merge($return, $this->array_flatten($value));
- else
+ } else {
$return[$key] = $value;
+ }
}
return $return;
}
// old version using '/' as path sepearator
- private function recursePath($array, $pathList, $errorRet) {
+ private function recursePath($array, $pathList, $errorRet)
+ {
$pathItem = array_shift($pathList);
- if ( is_null($pathItem) ) {
+ if (is_null($pathItem)) {
if (is_array($array)) {
return json_encode($array);
- }
- else {
+ } else {
return $array;
}
}
- if ( is_null($array) ) {
+ if (is_null($array)) {
return $errorRet;
}
- if ( is_numeric($pathItem) && isset($array[intval($pathItem)]) ) {
+ if (is_numeric($pathItem) && isset($array[intval($pathItem)])) {
return $this->recursePath($array[intval($pathItem)], $pathList, $errorRet);
- }
- elseif (array_key_exists($pathItem, $array)) {
+ } elseif (array_key_exists($pathItem, $array)) {
return $this->recursePath($array[$pathItem], $pathList, $errorRet);
- }
- elseif ( isset($array[0]) && count($array)==1 ) {
+ } elseif (isset($array[0]) && count($array)==1) {
return $this->recursePath($array[0], $pathList, $errorRet);
}
return ($errorRet!=false?$errorRet:'unknown');
}
- public function setInfoHttpSimple($cmdLogicalId, $destLogicalId=null) {
+ public function setInfoHttpSimple($cmdLogicalId, $destLogicalId=null)
+ {
$cmdLogicalId = googlecast_utils::getFullCmdTranslation($cmdLogicalId);
return $this->setInfoHttp($cmdLogicalId, false, $destLogicalId);
}
- public function setInfoHttp($cmdLogicalId, $showError=false, $destLogicalId=null) {
+ public function setInfoHttp($cmdLogicalId, $showError=false, $destLogicalId=null)
+ {
$uri = $this->getChromecastIP();
$hasCmd = false;
if (!is_null($destLogicalId)) {
@@ -1430,24 +1503,37 @@ public function setInfoHttp($cmdLogicalId, $showError=false, $destLogicalId=null
foreach ($datalist as $data) {
if (isset($data['cmd']) && $data['cmd'] == 'setconfig') {
- if (isset($data['error']) && ($data['error']==1 or $data['error']=='true') ) {
+ if (isset($data['error']) && ($data['error']==1 or $data['error']=='true')) {
$showError = true;
}
- if (isset($data['value'])) {
- $url = 'http://' . $uri . ':8008/setup/' . $data['value'];
- }
- else {
- $url = 'http://' . $uri . ':8008/setup/' . 'set_eureka_info';
+ $isSSL = false;
+ if (isset($data['value']) && $data['value']!='set_eureka_info') {
+ $url = 'https://' . $uri . ':8443/setup/' . $data['value'];
+ $isSSL = true;
+ } else {
+ $url = 'http://' . $uri . ':8008/setup/set_eureka_info';
}
$request_http = new com_http($url);
- $request_http->setHeader(array('content-type: application/json'));
- $request_http->setPost( (isset($data['data']) ? $data['data'] : '') );
+
+ $headers = array('content-type: application/json');
+ if ($isSSL) {
+ $gatoken = $this->getConfiguration('ga_token', '');
+ if ($gatoken == '') {
+ log::add('googlecast', 'warning', __('Le jeton Google Home n\'est pas configuré!', __FILE__));
+ $gatoken = 'none';
+ }
+ $request_http->setNoSslCheck(true);
+ array_push($headers, 'cast-local-authorization-token: ' . $gatoken);
+ }
+
+ $request_http->setHeader($headers);
+ $request_http->setPost((isset($data['data']) ? $data['data'] : ''));
try {
$httpret = $request_http->exec();
- log::add('googlecast','debug','setInfoHttp : Result : ' . $httpret);
+ log::add('googlecast', 'debug', 'setInfoHttp : Result : ' . $httpret);
} catch (Exception $e) {
if ($showError==true) {
- log::add('googlecast','error',__('Configuration non accessible', __FILE__));
+ log::add('googlecast', 'error', __('Configuration non accessible', __FILE__));
}
return false;
}
@@ -1459,58 +1545,61 @@ public function setInfoHttp($cmdLogicalId, $showError=false, $destLogicalId=null
}
}
- public function getInfoValue($logicalID) {
+ public function getInfoValue($logicalID)
+ {
$cmd = $this->getCmd('info', $logicalID);
- if (!is_object($cmd) ) {
+ if (!is_object($cmd)) {
return null;
}
$ret = $cmd->execCmd();
- if ( is_null($ret) ) {
+ if (is_null($ret)) {
return '';
}
return $ret;
}
- public function isOnline() {
+ public function isOnline()
+ {
$ret = $this->getInfoValue('online');
- if ($ret==1 or $ret===true ) {
+ if ($ret==1 or $ret===true) {
return true;
}
return false;
}
-
}
-class googlecastcmd extends cmd {
- /* * *************************Attributs****************************** */
+class googlecastcmd extends cmd
+{
+ /* * *************************Attributs****************************** */
- /* * ***********************Methode static*************************** */
+ /* * ***********************Methode static*************************** */
- /* * *********************Methode d'instance************************* */
+ /* * *********************Methode d'instance************************* */
- public function execute($_options = null) {
+ public function execute($_options = null)
+ {
$originalLogicalId = $this->getLogicalId();
$translatedLogicalId = googlecast_utils::getFullCmdTranslation($originalLogicalId);
- if ( $this->getType() == 'action' ) {
+ if ($this->getType() == 'action') {
// special case of custom command
- if ($originalLogicalId == "customcmd") {
- $translatedLogicalId = trim($_options['message']);
- }
+ if ($originalLogicalId == "customcmd") {
+ $translatedLogicalId = trim($_options['message']);
+ }
// special case of 'action' command with subtype 'list' starting with 'cmdlist_'
- elseif ( strpos($originalLogicalId, 'cmdlist_')===0 ) {
+ elseif (strpos($originalLogicalId, 'cmdlist_')===0) {
$translatedLogicalId = str_replace('^', '|', trim($_options['select'])); // replace ^ by |
if ($translatedLogicalId=='') { // case of default value ('none' selected)
$translatedLogicalId='quit_app';
}
- }
+ }
- // if speak command is used in scenario
- if ( $originalLogicalId=='speak' && isset($_options['title']) && is_numeric($_options['title']) ) {
- $_options['volume'] = $_options['title'];
- }
+ // if speak command is used in scenario
+ if ($originalLogicalId=='speak' && isset($_options['title']) && is_numeric($_options['title'])) {
+ $_options['volume'] = $_options['title'];
+ }
if ($translatedLogicalId=='') {
return;
@@ -1525,17 +1614,17 @@ public function execute($_options = null) {
$listCmd = str_replace('#slider#', $_options['slider'], $listCmd);
break;
case 'color':
- $listCmd = str_replace('#','',str_replace('#color#', $_options['color'], $listCmd));
+ $listCmd = str_replace('#', '', str_replace('#color#', $_options['color'], $listCmd));
break;
case 'select':
$listCmd = str_replace('#listValue#', $_options['select'], $listCmd);
break;
case 'message':
$listCmd = str_replace('#message#', $_options['message'], $listCmd);
- if ( isset($_options['title']) ) {
+ if (isset($_options['title'])) {
$listCmd = str_replace('#title#', $_options['title'], $listCmd);
}
- if ( isset($_options['volume']) ) {
+ if (isset($_options['volume'])) {
$listCmd = str_replace('#volume#', $_options['volume'], $listCmd);
}
break;
@@ -1550,26 +1639,25 @@ public function execute($_options = null) {
$data = array();
// if this is a command 'info' to retrieve google cast device configuration using http
- if ($this->getType() != 'action') {
+ if ($this->getType() != 'action') {
// command must contains string 'cmd=getconfig'
if (stristr($listCmd, 'cmd=getconfig')!=false) {
$eqLogic->getInfoHttpSimple($listCmd, $originalListCmd);
- log::add('googlecast','debug',"Envoi d'une commande GoogleCast API http depuis Jeedom");
- }
- else {
+ log::add('googlecast', 'debug', "Envoi d'une commande GoogleCast API http depuis Jeedom");
+ } else {
continue;
}
- }
+ }
// 'refresh' type command
if ($listCmd == "refreshconfig" || $listCmd == "refresh") {
// both refresh commands require refreshing conifguration command refresh
foreach ($eqLogic->getCmd('info') as $cmd) {
- $logicalId = googlecast_utils::getFullCmdTranslation($cmd->getLogicalId());
+ $logicalId = googlecast_utils::getFullCmdTranslation($cmd->getLogicalId());
if (stristr($logicalId, 'cmd=getconfig')!=false) {
$eqLogic->getInfoHttpSimple($logicalId, $cmd->getLogicalId());
}
- }
+ }
if ($listCmd == "refreshconfig") {
continue; // do not need to go further in that case
@@ -1577,23 +1665,22 @@ public function execute($_options = null) {
}
// if this is a command 'action' to modify google cast device configuration using http
if (stristr($listCmd, 'cmd=setconfig')!=false) {
- log::add('googlecast','debug',"Envoi d'une commande GoogleCast API http depuis Jeedom (set)");
+ log::add('googlecast', 'debug', "Envoi d'une commande GoogleCast API http depuis Jeedom (set)");
$eqLogic->setInfoHttpSimple($listCmd, null);
continue;
}
- $values = explode('|', $listCmd); // split commands
- foreach ($values as $value) {
- $value = explode('=', $value);
- if (count($value) == 2) { // X=Y
- $data[trim($value[0])] = trim($value[1]);
- }
- elseif (count($value) == 1) { // // X only, then assume this is a command
- $data['cmd'] = trim($value[0]);
- switch ($this->getSubType()) {
- case 'slider':
- $data['value'] = $_options['slider'];
- break;
+ $values = explode('|', $listCmd); // split commands
+ foreach ($values as $value) {
+ $value = explode('=', $value);
+ if (count($value) == 2) { // X=Y
+ $data[trim($value[0])] = trim($value[1]);
+ } elseif (count($value) == 1) { // // X only, then assume this is a command
+ $data['cmd'] = trim($value[0]);
+ switch ($this->getSubType()) {
+ case 'slider':
+ $data['value'] = $_options['slider'];
+ break;
/*
case 'select':
$data['value'] = trim($_options['select']);
@@ -1602,31 +1689,31 @@ public function execute($_options = null) {
$data['value'] = trim($_options['message']);
break;
*/
- }
- }
- }
- if (count($data) == 0) { // something is wrong because no value
- continue;
- }
+ }
+ }
+ }
+ if (count($data) == 0) { // something is wrong because no value
+ continue;
+ }
array_push($datalist, $data); // push in the sequence array (even if only one command)
}
- if ( count($datalist)>0 ) {
- // generate the query to be sent
- $fulldata = array(
- 'apikey' => jeedom::getApiKey('googlecast'),
- 'cmd' => 'action',
- 'device' => array(
- 'uuid' => $eqLogic->getLogicalId(),
- 'source' => 'googlecast',
- ),
- 'command' => $datalist,
- );
- log::add('googlecast','debug',"Envoi de la commande [$originalLogicalId] depuis Jeedom");
- googlecast::socket_connection( json_encode($fulldata) );
- }
- }
-
-
- /* * **********************Getteur Setteur*************************** */
+ if (count($datalist)>0) {
+ // generate the query to be sent
+ $fulldata = array(
+ 'apikey' => jeedom::getApiKey('googlecast'),
+ 'cmd' => 'action',
+ 'device' => array(
+ 'uuid' => $eqLogic->getLogicalId(),
+ 'source' => 'googlecast',
+ ),
+ 'command' => $datalist,
+ );
+ log::add('googlecast', 'debug', "Envoi de la commande [$originalLogicalId] depuis Jeedom");
+ googlecast::socket_connection(json_encode($fulldata));
+ }
+ }
+
+
+ /* * **********************Getteur Setteur*************************** */
}
diff --git a/core/class/googlecast_utils.inc.php b/core/class/googlecast_utils.inc.php
index 8d4d631..e2e1c7a 100644
--- a/core/class/googlecast_utils.inc.php
+++ b/core/class/googlecast_utils.inc.php
@@ -2,186 +2,162 @@
require_once dirname(__FILE__) . "/../../3rdparty/JsonPath/JsonStore.php";
-class googlecast_utils {
-
- public static function getFullCmdTranslation($logicalId) {
+class googlecast_utils
+{
+ public static function getFullCmdTranslation($logicalId)
+ {
$ret = $logicalId;
- if ( $logicalId == 'speak' ) {
+ if ($logicalId == 'speak') {
$ret = 'cmd=tts|value=#message#|vol=#volume#';
- }
- elseif ( $logicalId == 'speak_noresume' ) {
+ } elseif ($logicalId == 'speak_noresume') {
$ret = 'cmd=tts|value=#message#|vol=#volume#|noresume=1';
- }
- elseif ( $logicalId == 'speak_forceresume' ) {
+ } elseif ($logicalId == 'speak_forceresume') {
$ret = 'cmd=tts|value=#message#|vol=#volume#|forceapplaunch=1';
- }
- elseif ( $logicalId == 'castversion' ) {
+ } elseif ($logicalId == 'castversion') {
$ret = 'cmd=getconfig|data=cast_build_revision';
- }
- elseif ( strpos($logicalId, 'radio_') === 0 ) {
+ } elseif (strpos($logicalId, 'radio_') === 0) {
try {
$streamtype='LIVE';
- if ( substr($logicalId, -1)=='*' ) {
+ if (substr($logicalId, -1)=='*') {
$streamtype = 'BUFFERED';
}
$radioname = str_replace("*", "", $logicalId);
- $radioname = substr( $radioname , 6) ; // remove start with "radio_"
- $radioname = strtolower( $radioname ); // to lower just in case of typo
+ $radioname = substr($radioname, 6) ; // remove start with "radio_"
+ $radioname = strtolower($radioname); // to lower just in case of typo
$radioArray = json_decode(file_get_contents(dirname(__FILE__) . "/../webradios/radiolist.json"), true);
- if ( isset($radioArray[$radioname]) ) {
+ if (isset($radioArray[$radioname])) {
$radio = $radioArray[$radioname];
$ret = "app=media|forceplay=2|live=1|value='".$radio['location']."','audio/mpeg',title:'".$radio['title']."',thumb:'".$radio['image']."',stream_type:'".$streamtype."'";
}
- if ( file_exists(dirname(__FILE__) . "/../webradios/custom.json") ) {
+ if (file_exists(dirname(__FILE__) . "/../webradios/custom.json")) {
$radioArray = json_decode(file_get_contents(dirname(__FILE__) . "/../webradios/custom.json"), true);
- if ( isset($radioArray[$radioname]) ) {
+ if (isset($radioArray[$radioname])) {
$radio = $radioArray[$radioname];
$ret = "app=media|forceplay=2|live=1|value='".$radio['location']."','audio/mpeg',title:'".$radio['title']."',thumb:'".$radio['image']."',stream_type:'".$streamtype."'";
}
}
- } catch (Exception $e) {}
- }
- elseif ( $logicalId == 'gh_get_alarms_date' ) {
+ } catch (Exception $e) {
+ }
+ } elseif ($logicalId == 'gh_get_alarms_date') {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.alarm..fire_time|fnc=ts2long|reterror=Undefined';
- }
- elseif ( $logicalId == 'gh_get_alarms_id' ) {
+ } elseif ($logicalId == 'gh_get_alarms_id') {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$..id|fnc=ts2long|reterror=Undefined';
- }
- elseif ( strpos($logicalId, 'gh_get_alarm_date_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_alarm_date_') === 0) {
$param = str_replace("gh_get_alarm_date_", "", $logicalId);
- if ( is_numeric($param) ) {
+ if (is_numeric($param)) {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.alarm.['.$param.'].fire_time|fnc=ts2long|reterror=Undefined';
- }
- else {
+ } else {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$..[?(@.id='.$param.')].fire_time|fnc=ts2long|reterror=Undefined';
}
- }
- elseif ( strpos($logicalId, 'gh_get_alarm_status_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_alarm_status_') === 0) {
$param = str_replace("gh_get_alarm_status_", "", $logicalId);
- if ( is_numeric($param) ) {
+ if (is_numeric($param)) {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.alarm.['.$param.'].status|reterror=0';
- }
- else {
+ } else {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$..[?(@.id='.$param.')].fire_time|fnc=ts2long|reterror=Undefined';
}
- }
- elseif ( strpos($logicalId, 'gh_get_alarm_datenice_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_alarm_datenice_') === 0) {
$param = str_replace("gh_get_alarm_datenice_", "", $logicalId);
- if ( is_numeric($param) ) {
+ if (is_numeric($param)) {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.alarm.['.$param.'].fire_time|fnc=ts2longnice|reterror=Undefined';
- }
- else {
+ } else {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$..[?(@.id='.$param.')].fire_time|fnc=ts2long|reterror=Undefined';
}
- }
- elseif ( strpos($logicalId, 'gh_get_alarm_timestamp_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_alarm_timestamp_') === 0) {
$param = str_replace("gh_get_alarm_timestamp_", "", $logicalId);
- if ( is_numeric($param) ) {
+ if (is_numeric($param)) {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.alarm.['.$param.'].fire_time|reterror=Undefined';
- }
- else {
+ } else {
$ret = 'cmd=getconfig|value=assistant/alarms|data=$..[?(@.id='.$param.')].fire_time|fnc=ts2long|reterror=Undefined';
}
- }
- elseif ( strpos($logicalId, 'gh_get_timer_timesec_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_timer_timesec_') === 0) {
$param = str_replace("gh_get_timer_time_", "", $logicalId);
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.timer.['.$param.'].fire_time|fnc=ts2sec|reterror=Undefined';
- }
- elseif ( strpos($logicalId, 'gh_get_timer_time_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_timer_time_') === 0) {
$param = str_replace("gh_get_timer_timenice_", "", $logicalId);
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.timer.['.$param.'].fire_time|fnc=ts2long|reterror=Undefined';
- }
- elseif ( strpos($logicalId, 'gh_get_timer_timestamp_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_timer_timestamp_') === 0) {
$param = str_replace("gh_get_timer_timestamp_", "", $logicalId);
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.timer.['.$param.'].fire_time|reterror=Undefined';
- }
- elseif ( strpos($logicalId, 'gh_get_timer_duration_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_timer_duration_') === 0) {
$param = str_replace("gh_get_timer_duration_", "", $logicalId);
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.timer.['.$param.'].original_duration|fnc=2sec|reterror=0';
- }
- elseif ( strpos($logicalId, 'gh_get_timer_status_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_get_timer_status_') === 0) {
$param = str_replace("gh_get_timer_status_", "", $logicalId);
$ret = 'cmd=getconfig|value=assistant/alarms|data=$.timer.['.$param.'].status|reterror=0';
- }
- elseif ($logicalId=='gh_get_donotdisturb') {
+ } elseif ($logicalId=='gh_get_donotdisturb') {
$ret = 'cmd=getconfig|value=post:assistant/notifications';
- }
- elseif ($logicalId=='gh_set_donotdisturb_on') {
+ } elseif ($logicalId=='gh_set_donotdisturb_on') {
$ret = 'cmd=setconfig|value=assistant/notifications|data={"notifications_enabled":true}';
- }
- elseif ($logicalId=='gh_set_donotdisturb_off') {
+ } elseif ($logicalId=='gh_set_donotdisturb_off') {
$ret = 'cmd=setconfig|value=assistant/notifications|data={"notifications_enabled":false}';
- }
- elseif ( strpos($logicalId, 'gh_set_donotdisturb_') === 0 ) {
+ } elseif (strpos($logicalId, 'gh_set_donotdisturb_') === 0) {
$param = str_replace("gh_set_alarms_volume_", "", $logicalId);
$ret = 'cmd=setconfig|value=assistant/notifications|data={"notifications_enabled":'.$param.'}';
- }
- elseif ( strpos($logicalId, 'gh_set_alarms_volume_') === 0 ) {
- $param = round ( floatval(str_replace("gh_set_alarms_volume_", "", $logicalId))/100 , 2);
+ } elseif (strpos($logicalId, 'gh_set_alarms_volume_') === 0) {
+ $param = round(floatval(str_replace("gh_set_alarms_volume_", "", $logicalId))/100, 2);
$ret = 'cmd=setconfig|value=assistant/alarms/volume|data={"volume": '.$param.'}';
- }
- elseif ( $logicalId=='gh_get_alarms_volume' ) {
+ } elseif ($logicalId=='gh_get_alarms_volume') {
$ret = 'cmd=getconfig|value=post:assistant/alarms/volume';
- }
- elseif ( $logicalId=='conf_pincode' ) {
+ } elseif ($logicalId=='conf_pincode') {
$ret = 'cmd=getconfig|data=$.opencast_pin_code|reterror=Undefined';
- }
- elseif ( $logicalId=='conf_getbonded_bluetooth' ) {
+ } elseif ($logicalId=='conf_getbonded_bluetooth') {
$ret = 'cmd=getconfig|value=bluetooth/get_bonded';
- }
- elseif ( $logicalId=='conf_getconnected_wifi' ) {
+ } elseif ($logicalId=='conf_getconnected_wifi') {
$ret = 'cmd=getconfig|value=configured_networks|data=0/ssid';
- }
- elseif ( $logicalId=='bt_connectdefault' ) {
+ } elseif ($logicalId=='bt_connectdefault') {
$ret = 'cmd=setconfig|value=bluetooth/connect|data={"connect":true}';
- }
- elseif ( strpos($logicalId, 'bt_connect_X') === 0 ) {
+ } elseif (strpos($logicalId, 'bt_connect_X') === 0) {
$param = str_replace("bt_connect_X", "", $logicalId);
$ret = 'cmd=setconfig|value=bluetooth/connect|data={"mac_address": "'.$param.'","profile": 2,"connect":true}';
- }
- elseif ( $logicalId=='bt_disconnectdefault' ) {
+ } elseif ($logicalId=='bt_disconnectdefault') {
$ret = 'cmd=setconfig|value=bluetooth/connect|data={"connect":false}';
}
return $ret;
}
- public static function buildRadioSelectlist() {
+ public static function buildRadioSelectlist()
+ {
$ret = '';
try {
$radioArray = array();
$radioFile = json_decode(file_get_contents(dirname(__FILE__) . "/../webradios/radiolist.json"), true);
- foreach ($radioFile as $radio_id => $radio_data){
+ foreach ($radioFile as $radio_id => $radio_data) {
$radioArray[$radio_id] = $radio_data['title'];
}
- if ( file_exists(dirname(__FILE__) . "/../webradios/custom.json") ) {
+ if (file_exists(dirname(__FILE__) . "/../webradios/custom.json")) {
$radioFile = json_decode(file_get_contents(dirname(__FILE__) . "/../webradios/custom.json"), true);
- foreach ($radioFile as $radio_id => $radio_data){
+ foreach ($radioFile as $radio_id => $radio_data) {
$radioArray[$radio_id] = $radio_data['title'];
}
}
ksort($radioArray);
- foreach ($radioArray as $radio_id => $radio_title){
+ foreach ($radioArray as $radio_id => $radio_title) {
$ret .= 'radio_' . $radio_id . '|' . $radio_title . ';';
}
- if ( strlen($ret)>0 ) { // remove last ';' that cause empty line in select
+ if (strlen($ret)>0) { // remove last ';' that cause empty line in select
$ret = substr($ret, 0, strlen($ret)-1);
}
- } catch (Exception $e) {}
+ } catch (Exception $e) {
+ }
return $ret;
}
- public static function getCmdTranslation($cmd) {
+ public static function getCmdTranslation($cmd)
+ {
return $cmd;
}
- public static function getJsonPathResult($json, $path) {
+ public static function getJsonPathResult($json, $path)
+ {
$store = new JsonStore($json);
return $store->get($path);
}
- public static function getFncResult($data, $fnc) {
+ public static function getFncResult($data, $fnc)
+ {
if (is_null($fnc)) {
return $data;
}
@@ -191,7 +167,7 @@ public static function getFncResult($data, $fnc) {
return $data;
}
try {
- $val = intval(substr(trim($data),0,10));
+ $val = intval(substr(trim($data), 0, 10));
} catch (Exception $e) {
return $data;
}
@@ -201,12 +177,12 @@ public static function getFncResult($data, $fnc) {
}
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));
$dateTmp = clone $date;
- $dateTmp->setTime( 0, 0, 0 );
+ $dateTmp->setTime(0, 0, 0);
$today = new DateTime("now", new DateTimeZone(date_default_timezone_get()));
- $today->setTime( 0, 0, 0 );
- $diff = $today->diff( $dateTmp );
- $diffDays = (integer)$diff->format( "%R%a" );
- switch( $diffDays ) {
+ $today->setTime(0, 0, 0);
+ $diff = $today->diff($dateTmp);
+ $diffDays = (integer)$diff->format("%R%a");
+ switch ($diffDays) {
case 0:
$ret = __("Aujourd'hui", __FILE__). ' ' . date_format($date, "H:i");
break;
@@ -217,14 +193,13 @@ public static function getFncResult($data, $fnc) {
$ret = date_format($date, "d-m-Y H:i");
}
return $ret;
- }
- elseif ($fnc=='ts2long') {
+ } elseif ($fnc=='ts2long') {
$ret = '';
if (!is_numeric($data)) {
return $data;
}
try {
- $val = intval(substr(trim($data),0,10));
+ $val = intval(substr(trim($data), 0, 10));
} catch (Exception $e) {
return $data;
}
@@ -235,30 +210,27 @@ public static function getFncResult($data, $fnc) {
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));
$ret = date_format($date, "d-m-Y H:i");
return $ret;
- }
- elseif ($fnc=='time') {
+ } elseif ($fnc=='time') {
$date = date_create_from_format('d-m-Y H:i', $data);
if (is_null($date) or $date===false) {
return $data;
}
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));
return date_format($date, "H:i");
- }
- elseif ($fnc=='2sec') {
+ } elseif ($fnc=='2sec') {
try {
- $ret = intval(substr(trim($data),0,10));
+ $ret = intval(substr(trim($data), 0, 10));
} catch (Exception $e) {
$ret = 0;
}
return $ret;
- }
- elseif ($fnc=='ts2sec') {
+ } elseif ($fnc=='ts2sec') {
$ret = '';
if (!is_numeric($data)) {
return $data;
}
try {
- $val = intval(substr(trim($data),0,10));
+ $val = intval(substr(trim($data), 0, 10));
} catch (Exception $e) {
return $data;
}
@@ -270,17 +242,15 @@ public static function getFncResult($data, $fnc) {
$today = new DateTime();
$diffsec = $date - $today;
return $diffsec;
- }
- elseif ($fnc=='binary') {
-
+ } elseif ($fnc=='binary') {
}
return $data;
}
- public static function getCmdDefinition($eqlogic, $type, $order) {
+ public static function getCmdDefinition($eqlogic, $type, $order)
+ {
if ($type=='googlehome') {
-
$cmd = $eqlogic->getCmd(null, 'gh_get_alarm_date_0');
if (!is_object($cmd)) {
$cmd = new googlecastCmd();
@@ -308,12 +278,8 @@ public static function getCmdDefinition($eqlogic, $type, $order) {
$cmd->setSubType('binary');
$cmd->setEqLogic_id($eqlogic->getId());
$cmd->save();
-
- }
- elseif ($type=='chromecast') {
-
+ } elseif ($type=='chromecast') {
}
return $order;
}
-
}
diff --git a/core/i18n/en_US.json b/core/i18n/en_US.json
index 5b6b65a..ab0311f 100644
--- a/core/i18n/en_US.json
+++ b/core/i18n/en_US.json
@@ -1,110 +1,111 @@
{
- "plugins\/googlecast\/desktop\/php\/googlecast.php": {
- "Rechercher": "Search",
- "Gestion": "Manage",
- "Lancer Scan": "Run Scan",
- "Configuration": "Configuration",
- "Santé": "Health",
- "Mes équipements GoogleCast": "My GoogleCast equipments",
- "Sauvegarder": "Save",
- "Supprimer": "Delete",
- "Configuration avancée": "Advanced configuration",
- "Dupliquer": "Duplicate",
- "Equipement": "Equipment",
- "Commandes": "Commands",
- "Nom de l'équipement": "Equipment name",
- "Objet parent": "Parent objet",
- "Aucun": "None",
- "Catégorie": "Category",
- "Activer": "Enable",
- "Visible": "Disable",
- "UUID": "UUID",
- "Nom diffusé": "Broadcast name",
- "Modèle": "Model",
- "Constructeur": "Manufacturer",
- "Type": "Type",
- "Ignorer contrôle CEC": "Ignore CEC control",
- "Si le statut 'Occupé' ne remonte pas bien": "Is status doesn't work well",
- "Ajouter une commande": "Add a new command",
- "Nom": "Name",
- "Liste de commandes": "Command list",
- "Paramètres": "Parameters",
- "Options": "Options",
- "IP": "IP"
- },
- "plugins\/googlecast\/core\/class\/googlecast.class.php": {
- "Statut Name": "Status Name"
- },
- "plugins\/googlecast\/core\/class\/googlecast_utils.inc.php": {
- "Alarme 1": "Alarm 1",
- "Statut Alarme 1": "Statut Alarm 1",
- "Aujourd'hui": "Today",
- "Demain": "Tomorrow"
- },
- "plugins\/googlecast\/desktop\/modal\/googlecast.health.php": {
- "Nom": "Name",
- "Nom diffusé": "Broadcast name",
- "UUID": "UUID",
- "Modèle": "Model",
- "Type": "Type",
- "Online": "Online",
- "Occupé": "Busy",
- "Dernière com": "Last com",
- "Date création": "Creation date",
- "Offline": "Offline",
- "Non": "No",
- "Rafraichir": "Refresh"
- },
- "plugins\/googlecast\/desktop\/js\/googlecast.js": {
- "Santé GoogleCast": "Health GoogleCast",
- "Arrêter le scan": "Stop scan",
- "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)": "Scan pending for one minute... (Clic to stop before)",
- "Lancer Scan": "Run Scan",
- "Un GoogleCast vient d\\'être inclu\/exclu. Veuillez réactualiser la page": "A GoogleCast has just been included. Refresh the page",
- "Commande": "Command",
- "Afficher": "Show",
- "Historiser": "Historize",
- "Inverser": "Inverse",
- "Valeur retour d\\'état": "State return value",
- "Durée avant retour d\\'état (min)": "Duration before state return (min)"
- },
- "plugins\/googlecast\/plugin_info\/configuration.php": {
- "Démon": "Deamon",
- "Port socket interne (modification dangereuse)": "Socket port intern (hasardous modification)",
- "55012": "55012",
- "Configuration spéciale (eg: Docker, VM)": "Special configuration (eg: Docker, VM)",
- "Fréquence de rafraissement": "Refresh frequency",
- "Rapide": "High",
- "Normal (recommandé)": "Normal (recommanded)",
- "Basse": "Low",
- "Très basse": "Very low",
- "TTS - Text To Speech": "TTS - Text To Speech",
- "Utiliser l'adresse Jeedom externe": "Use external Jeedom address",
- "Langue par défaut": "Défaut language",
- "Français": "French",
- "Anglais": "English",
- "Espagnol": "Spanish",
- "Allemand": "Dutsh",
- "Italien": "Italien",
- "Moteur par défaut": "Default engine",
- "PicoTTS (local)": "PicoTTS (local)",
- "Google Translate API (internet requis)": "Google Translate API (internet required)",
- "Google Speech API (clé api & internet requis)": "Google Speech API (API key & internet required)",
- "Google Speech API - dev (clé api & internet requis)": "Google Speech API - dev (API key & internet required)",
- "Key Google Cloud Text-to-Speech": "Key Google Cloud Text-to-Speech",
- "Voix Google Cloud Text-to-Speech": "Google Cloud Text-to-Speech default voice",
- "Vitesse de parole": "Speech speed",
- "Très lent": "Very slow",
- "Lent": "slow",
- "Normal": "Normal",
- "Très rapide": "Very quick",
- "Encore plus rapide": "Still more rapid",
- "Ne pas utiliser le cache (déconseillé)": "Don't use cache (not recommended)",
- "Nettoyer tout le cache": "Clean all cache",
- "Suppression automatique du cache de plus de X jours": "Remove cache older than X days",
- "Nombre en jour": "Number of days",
- "Notifications": "Notifications",
- "Désactiver notif pour nouveaux GoogleCast": "Disable notification for new GoogleCast",
- "Réussie": "Successed"
- }
+ "plugins/googlecast/desktop/php/googlecast.php": {
+ "Rechercher": "Search",
+ "Gestion": "Manage",
+ "Lancer Scan": "Run Scan",
+ "Configuration": "Configuration",
+ "Santé": "Health",
+ "Mes équipements GoogleCast": "My GoogleCast equipments",
+ "Sauvegarder": "Save",
+ "Supprimer": "Delete",
+ "Configuration avancée": "Advanced configuration",
+ "Dupliquer": "Duplicate",
+ "Equipement": "Equipment",
+ "Commandes": "Commands",
+ "Nom de l'équipement": "Equipment name",
+ "Objet parent": "Parent objet",
+ "Aucun": "None",
+ "Catégorie": "Category",
+ "Activer": "Enable",
+ "Visible": "Disable",
+ "UUID": "UUID",
+ "Nom diffusé": "Broadcast name",
+ "Modèle": "Model",
+ "Constructeur": "Manufacturer",
+ "Type": "Type",
+ "Ignorer contrôle CEC": "Ignore CEC control",
+ "Si le statut 'Occupé' ne remonte pas bien": "Is status doesn't work well",
+ "Ajouter une commande": "Add a new command",
+ "Nom": "Name",
+ "Liste de commandes": "Command list",
+ "Paramètres": "Parameters",
+ "Options": "Options",
+ "IP": "IP"
+ },
+ "plugins/googlecast/core/class/googlecast.class.php": {
+ "Statut Name": "Status Name"
+ },
+ "plugins/googlecast/core/class/googlecast_utils.inc.php": {
+ "Alarme 1": "Alarm 1",
+ "Statut Alarme 1": "Statut Alarm 1",
+ "Aujourd'hui": "Today",
+ "Demain": "Tomorrow"
+ },
+ "plugins/googlecast/desktop/modal/googlecast.health.php": {
+ "Nom": "Name",
+ "Nom diffusé": "Broadcast name",
+ "UUID": "UUID",
+ "Modèle": "Model",
+ "Type": "Type",
+ "Online": "Online",
+ "Occupé": "Busy",
+ "Dernière com": "Last com",
+ "Date création": "Creation date",
+ "Offline": "Offline",
+ "Non": "No",
+ "Oui": "Yes",
+ "Rafraichir": "Refresh"
+ },
+ "plugins/googlecast/desktop/js/googlecast.js": {
+ "Santé GoogleCast": "Health GoogleCast",
+ "Arrêter le scan": "Stop scan",
+ "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)": "Scan pending for one minute... (Clic to stop before)",
+ "Lancer Scan": "Run Scan",
+ "Un GoogleCast vient d\\'être inclu/exclu. Veuillez réactualiser la page": "A GoogleCast has just been included. Refresh the page",
+ "Commande": "Command",
+ "Afficher": "Show",
+ "Historiser": "Historize",
+ "Inverser": "Inverse",
+ "Valeur retour d\\'état": "State return value",
+ "Durée avant retour d\\'état (min)": "Duration before state return (min)"
+ },
+ "plugins/googlecast/plugin_info/configuration.php": {
+ "Démon": "Deamon",
+ "Port socket interne (modification dangereuse)": "Socket port intern (hasardous modification)",
+ "55012": "55012",
+ "Configuration spéciale (eg: Docker, VM)": "Special configuration (eg: Docker, VM)",
+ "Fréquence de rafraissement": "Refresh frequency",
+ "Rapide": "High",
+ "Normal (recommandé)": "Normal (recommanded)",
+ "Basse": "Low",
+ "Très basse": "Very low",
+ "TTS - Text To Speech": "TTS - Text To Speech",
+ "Utiliser l'adresse Jeedom externe": "Use external Jeedom address",
+ "Langue par défaut": "Défaut language",
+ "Français": "French",
+ "Anglais": "English",
+ "Espagnol": "Spanish",
+ "Allemand": "Dutsh",
+ "Italien": "Italien",
+ "Moteur par défaut": "Default engine",
+ "PicoTTS (local)": "PicoTTS (local)",
+ "Google Translate API (internet requis)": "Google Translate API (internet required)",
+ "Google Speech API (clé api & internet requis)": "Google Speech API (API key & internet required)",
+ "Google Speech API - dev (clé api & internet requis)": "Google Speech API - dev (API key & internet required)",
+ "Key Google Cloud Text-to-Speech": "Key Google Cloud Text-to-Speech",
+ "Voix Google Cloud Text-to-Speech": "Google Cloud Text-to-Speech default voice",
+ "Vitesse de parole": "Speech speed",
+ "Très lent": "Very slow",
+ "Lent": "slow",
+ "Normal": "Normal",
+ "Très rapide": "Very quick",
+ "Encore plus rapide": "Still more rapid",
+ "Ne pas utiliser le cache (déconseillé)": "Don't use cache (not recommended)",
+ "Nettoyer tout le cache": "Clean all cache",
+ "Suppression automatique du cache de plus de X jours": "Remove cache older than X days",
+ "Nombre en jour": "Number of days",
+ "Notifications": "Notifications",
+ "Désactiver notif pour nouveaux GoogleCast": "Disable notification for new GoogleCast",
+ "Réussie": "Successed"
+ }
}
diff --git a/core/i18n/fr_FR.json b/core/i18n/fr_FR.json
index c077323..92f4fa9 100644
--- a/core/i18n/fr_FR.json
+++ b/core/i18n/fr_FR.json
@@ -1,110 +1,129 @@
{
- "plugins\/googlecast\/desktop\/php\/googlecast.php": {
- "Rechercher": "Rechercher",
- "Gestion": "Gestion",
- "Lancer Scan": "Lancer Scan",
- "Configuration": "Configuration",
- "Santé": "Santé",
- "Mes équipements GoogleCast": "Mes équipements GoogleCast",
- "Sauvegarder": "Sauvegarder",
- "Supprimer": "Supprimer",
- "Configuration avancée": "Configuration avancée",
- "Dupliquer": "Dupliquer",
- "Equipement": "Equipement",
- "Commandes": "Commandes",
- "Nom de l'équipement": "Nom de l'équipement",
- "Objet parent": "Objet parent",
- "Aucun": "Aucun",
- "Catégorie": "Catégorie",
- "Activer": "Activer",
- "Visible": "Visible",
- "UUID": "UUID",
- "Nom diffusé": "Nom diffusé",
- "Modèle": "Modèle",
- "Constructeur": "Constructeur",
- "Type": "Type",
- "Ignorer contrôle CEC": "Ignorer contrôle CEC",
- "Si le statut 'Occupé' ne remonte pas bien": "Si le statut 'Occupé' ne remonte pas bien",
- "Ajouter une commande": "Ajouter une commande",
- "Nom": "Nom",
- "Liste de commandes": "Liste de commandes",
- "Paramètres": "Paramètres",
- "Options": "Options",
- "IP": "IP"
- },
- "plugins\/googlecast\/core\/class\/googlecast.class.php": {
- "Statut Name": "Statut Name"
- },
- "plugins\/googlecast\/core\/class\/googlecast_utils.inc.php": {
- "Alarme 1": "Alarme 1",
- "Statut Alarme 1": "Statut Alarme 1",
- "Aujourd'hui": "Aujourd'hui",
- "Demain": "Demain"
- },
- "plugins\/googlecast\/desktop\/modal\/googlecast.health.php": {
- "Nom": "Nom",
- "Nom diffusé": "Nom diffusé",
- "UUID": "UUID",
- "Modèle": "Modèle",
- "Type": "Type",
- "Online": "Online",
- "Occupé": "Occupé",
- "Dernière com": "Dernière com",
- "Date création": "Date création",
- "Offline": "Offline",
- "Non": "Non",
- "Rafraichir": "Rafraichir"
- },
- "plugins\/googlecast\/desktop\/js\/googlecast.js": {
- "Santé GoogleCast": "Santé GoogleCast",
- "Arrêter le scan": "Arrêter le scan",
- "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)": "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)",
- "Lancer Scan": "Lancer Scan",
- "Un GoogleCast vient d\\'être inclu\/exclu. Veuillez réactualiser la page": "Un GoogleCast vient d\\'être inclu\/exclu. Veuillez réactualiser la page",
- "Commande": "Commande",
- "Afficher": "Afficher",
- "Historiser": "Historiser",
- "Inverser": "Inverser",
- "Valeur retour d\\'état": "Valeur retour d\\'état",
- "Durée avant retour d\\'état (min)": "Durée avant retour d\\'état (min)"
- },
- "plugins\/googlecast\/plugin_info\/configuration.php": {
- "Démon": "Démon",
- "Port socket interne (modification dangereuse)": "Port socket interne (modification dangereuse)",
- "55012": "55012",
- "Configuration spéciale (eg: Docker, VM)": "Configuration spéciale (eg: Docker, VM)",
- "Fréquence de rafraissement": "Fréquence de rafraissement",
- "Rapide": "Rapide",
- "Normal (recommandé)": "Normal (recommandé)",
- "Basse": "Basse",
- "Très basse": "Très basse",
- "TTS - Text To Speech": "TTS - Text To Speech",
- "Utiliser l'adresse Jeedom externe": "Utiliser l'adresse Jeedom externe",
- "Langue par défaut": "Langue par défaut",
- "Français": "Français",
- "Anglais": "Anglais",
- "Espagnol": "Espagnol",
- "Allemand": "Allemand",
- "Italien": "Italien",
- "Moteur par défaut": "Moteur par défaut",
- "PicoTTS (local)": "PicoTTS (local)",
- "Google Translate API (internet requis)": "Google Translate API (internet requis)",
- "Google Speech API (clé api & internet requis)": "Google Speech API (clé api & internet requis)",
- "Google Speech API - dev (clé api & internet requis)": "Google Speech API - dev (clé api & internet requis)",
- "Key Google Cloud Text-to-Speech": "Key Google Cloud Text-to-Speech",
- "Voix Google Cloud Text-to-Speech": "Voix Google Cloud Text-to-Speech",
- "Vitesse de parole": "Vitesse de parole",
- "Très lent": "Très lent",
- "Lent": "Lent",
- "Normal": "Normal",
- "Très rapide": "Très rapide",
- "Encore plus rapide": "Encore plus rapide",
- "Ne pas utiliser le cache (déconseillé)": "Ne pas utiliser le cache (déconseillé)",
- "Nettoyer tout le cache": "Nettoyer tout le cache",
- "Suppression automatique du cache de plus de X jours": "Suppression automatique du cache de plus de X jours",
- "Nombre en jour": "Nombre en jour",
- "Notifications": "Notifications",
- "Désactiver notif pour nouveaux GoogleCast": "Désactiver notif pour nouveaux GoogleCast",
- "Réussie": "Réussie"
- }
+ "plugins/googlecast/desktop/php/googlecast.php": {
+ "Rechercher": "Rechercher",
+ "Gestion": "Gestion",
+ "Lancer Scan": "Lancer Scan",
+ "Configuration": "Configuration",
+ "Santé": "Santé",
+ "Mes équipements GoogleCast": "Mes équipements GoogleCast",
+ "Sauvegarder": "Sauvegarder",
+ "Supprimer": "Supprimer",
+ "Configuration avancée": "Configuration avancée",
+ "Dupliquer": "Dupliquer",
+ "Equipement": "Equipement",
+ "Commandes": "Commandes",
+ "Nom de l'équipement": "Nom de l'équipement",
+ "Objet parent": "Objet parent",
+ "Aucun": "Aucun",
+ "Catégorie": "Catégorie",
+ "Activer": "Activer",
+ "Visible": "Visible",
+ "UUID": "UUID",
+ "Nom diffusé": "Nom diffusé",
+ "Modèle": "Modèle",
+ "Constructeur": "Constructeur",
+ "Type": "Type",
+ "Ignorer contrôle CEC": "Ignorer contrôle CEC",
+ "Si le statut 'Occupé' ne remonte pas bien": "Si le statut 'Occupé' ne remonte pas bien",
+ "Ajouter une commande": "Ajouter une commande",
+ "Nom": "Nom",
+ "Liste de commandes": "Liste de commandes",
+ "Paramètres": "Paramètres",
+ "Options": "Options",
+ "IP": "IP",
+ "Mes équipements Google Cast": "Mes équipements Google Cast",
+ "https://github.com/guirem/plugin-googlecast/blob/master/docs/fr_FR/index.md#commandes-personnalisées": "https://github.com/guirem/plugin-googlecast/blob/master/docs/fr_FR/index.md#commandes-personnalisées",
+ "Google Cast": "Google Cast",
+ "Compatible Google Assistant ?": "Compatible Google Assistant ?",
+ "Jeton Google Assistant/Home": "Jeton Google Assistant/Home",
+ "Optionnel - Permet d'avoir accès à certaines configurations Google Home (alarmes, timers...)": "Optionnel - Permet d'avoir accès à certaines configurations Google Home (alarmes, timers...)",
+ "Actions": "Actions"
+ },
+ "plugins/googlecast/core/class/googlecast.class.php": {
+ "Statut Name": "Statut Name"
+ },
+ "plugins/googlecast/core/class/googlecast_utils.inc.php": {
+ "Alarme 1": "Alarme 1",
+ "Statut Alarme 1": "Statut Alarme 1",
+ "Aujourd'hui": "Aujourd'hui",
+ "Demain": "Demain"
+ },
+ "plugins/googlecast/desktop/modal/googlecast.health.php": {
+ "Nom": "Nom",
+ "Nom diffusé": "Nom diffusé",
+ "UUID": "UUID",
+ "Modèle": "Modèle",
+ "Type": "Type",
+ "Online": "Online",
+ "Occupé": "Occupé",
+ "Dernière com": "Dernière com",
+ "Date création": "Date création",
+ "Offline": "Offline",
+ "Non": "Non",
+ "Rafraichir": "Rafraichir",
+ "Oui": "Oui"
+ },
+ "plugins/googlecast/desktop/js/googlecast.js": {
+ "Santé GoogleCast": "Santé GoogleCast",
+ "Arrêter le scan": "Arrêter le scan",
+ "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)": "Mode scan en cours pendant 1 minute... (Cliquer sur arrêter pour stopper avant)",
+ "Lancer Scan": "Lancer Scan",
+ "Un GoogleCast vient d\\'être inclu/exclu. Veuillez réactualiser la page": "Un GoogleCast vient d\\'être inclu/exclu. Veuillez réactualiser la page",
+ "Commande": "Commande",
+ "Afficher": "Afficher",
+ "Historiser": "Historiser",
+ "Inverser": "Inverser",
+ "Valeur retour d\\'état": "Valeur retour d\\'état",
+ "Durée avant retour d\\'état (min)": "Durée avant retour d\\'état (min)"
+ },
+ "plugins/googlecast/plugin_info/configuration.php": {
+ "Démon": "Démon",
+ "Port socket interne (modification dangereuse)": "Port socket interne (modification dangereuse)",
+ "55012": "55012",
+ "Configuration spéciale (eg: Docker, VM)": "Configuration spéciale (eg: Docker, VM)",
+ "Fréquence de rafraissement": "Fréquence de rafraissement",
+ "Rapide": "Rapide",
+ "Normal (recommandé)": "Normal (recommandé)",
+ "Basse": "Basse",
+ "Très basse": "Très basse",
+ "TTS - Text To Speech": "TTS - Text To Speech",
+ "Utiliser l'adresse Jeedom externe": "Utiliser l'adresse Jeedom externe",
+ "Langue par défaut": "Langue par défaut",
+ "Français": "Français",
+ "Anglais": "Anglais",
+ "Espagnol": "Espagnol",
+ "Allemand": "Allemand",
+ "Italien": "Italien",
+ "Moteur par défaut": "Moteur par défaut",
+ "PicoTTS (local)": "PicoTTS (local)",
+ "Google Translate API (internet requis)": "Google Translate API (internet requis)",
+ "Google Speech API (clé api & internet requis)": "Google Speech API (clé api & internet requis)",
+ "Google Speech API - dev (clé api & internet requis)": "Google Speech API - dev (clé api & internet requis)",
+ "Key Google Cloud Text-to-Speech": "Key Google Cloud Text-to-Speech",
+ "Voix Google Cloud Text-to-Speech": "Voix Google Cloud Text-to-Speech",
+ "Vitesse de parole": "Vitesse de parole",
+ "Très lent": "Très lent",
+ "Lent": "Lent",
+ "Normal": "Normal",
+ "Très rapide": "Très rapide",
+ "Encore plus rapide": "Encore plus rapide",
+ "Ne pas utiliser le cache (déconseillé)": "Ne pas utiliser le cache (déconseillé)",
+ "Nettoyer tout le cache": "Nettoyer tout le cache",
+ "Suppression automatique du cache de plus de X jours": "Suppression automatique du cache de plus de X jours",
+ "Nombre en jour": "Nombre en jour",
+ "Notifications": "Notifications",
+ "Désactiver notif pour nouveaux GoogleCast": "Désactiver notif pour nouveaux GoogleCast",
+ "Réussie": "Réussie",
+ "Fréquence de rafraichissement": "Fréquence de rafraichissement",
+ "Français - Canada": "Français - Canada",
+ "Anglais - US": "Anglais - US",
+ "Anglais - GB": "Anglais - GB",
+ "Jeedom TTS (local)": "Jeedom TTS (local)",
+ "Google Cloud Text-to-Speech (clé api & internet requis)": "Google Cloud Text-to-Speech (clé api & internet requis)",
+ "Voix TTS WebServer": "Voix TTS WebServer",
+ "tester": "tester",
+ "Normal +": "Normal +",
+ "Normal ++": "Normal ++",
+ "Désactiver notifs pour nouveaux GoogleCast": "Désactiver notifs pour nouveaux GoogleCast"
+ }
}
diff --git a/docs/fr_FR/index.md b/docs/fr_FR/index.md
index c43e2bd..1acc774 100644
--- a/docs/fr_FR/index.md
+++ b/docs/fr_FR/index.md
@@ -1,11 +1,9 @@
-Plugin GoogleCast (googlecast)
-=============================
+# Plugin GoogleCast (googlecast)
![Logo plugin](../images/logoplugin.png "Logo plugin")
Plugin pour commander les équipements compatibles Google Cast et Google Assistant.
-
**Fonctionnalités :**
- Contrôle du son (mute, +/-)
@@ -17,25 +15,26 @@ Plugin pour commander les équipements compatibles Google Cast et Google Assista
- Affichage de la lecture en cours
- Text To Speech (TTS)
- Pour les équipements 'Google Assistant' (ex: Google Home)
- - DoNotDisturb (on/off)
- - recupération/configuration d'autres paramètres
-
+ - DoNotDisturb (on/off)
+ - recupération/configuration d'autres paramètres
![Logo plugin](../images/chromecast.png "Chromecast")
**Modèles compatibles Google Cast**
+
- Chromecast Audio/Video
- Google Home (ou compatible Google Assistant)
- Android TV, Nexus Player, TV (Vizio, Sharp, Sony, Toshiba, Philips)
- Soundbars and speakers (Vizio, Sony, LG, Philips
-B&O Play, Grundig, Polk Audio, Bang & Olufsen, Onkyo, Pioneer...)
-- Autres modèles labelisés *Google Cast*
+ B&O Play, Grundig, Polk Audio, Bang & Olufsen, Onkyo, Pioneer...)
+- Autres modèles labelisés _Google Cast_
- Certaines Box internet (ex: Bouygues)
![GoogleCast Logo](../images/googlecast_logo.png "GoogleCast Logo")
![Android TV](../images/tv.png "Android TV")
**Autres liens**
+
- Wikipedia GoogleCast
- Applications pouvant diffuser sur un équipement GoogleCast
@@ -43,75 +42,88 @@ B&O Play, Grundig, Polk Audio, Bang & Olufsen, Onkyo, Pioneer...)
![Summary](../images/summary.png "Summary")
-Dashboard
-=======================
+# Dashboard
![Visuel du dashboard](../images/dashboard.png "Visuel du dashboard")
![Visuel du dashboard 2](../images/dashboard2.png "Visuel du dashboard 2")
-Quick Start
-=======================
+# Quick Start
Le plugin est normalement fonctionnel dès l'installation avec le paramétrage par défaut.
En quelques étapes :
+
1. Installer le plugin du market, les dépendances puis démarrer le démon,
2. Lancer un scan des Google Cast disponibles sur le réseau,
3. Sauvegarder les équipements trouvés,
4. Aller sur le dashboard et tester les boutons 'démo' (media, web...),
5. Pour changer/adapter le paramétrage, lire le reste de la documentation.
-Table des matières
-=======================
+# Table des matières
-- [Plugin GoogleCast (googlecast)](#plugin-googlecast--googlecast-)
+- [Plugin GoogleCast (googlecast)](#plugin-googlecast-googlecast)
- [Dashboard](#dashboard)
- [Quick Start](#quick-start)
-- [Table des matières](#toble-des-matieres)
+- [Table des matières](#table-des-mati%c3%a8res)
- [Configuration du plugin](#configuration-du-plugin)
-- [Configuration des équipements](#configuration-des--quipements)
- + [Onglet Commandes](#onglet-commandes)
- + [Afficheur Lecture en cours (widget)](#afficheur-lecture-en-cours--widget-)
- + [Widget TTS pour saisie de texte et control du volume](#widget-tts-pour-saisie-de-texte-et-control-du-volume)
-- [Commandes personnalisées](#commandes-personnalis-es)
- + [Applications spéciales](#applications-sp-ciales)
- + [Commandes avancées](#commandes-avanc-es)
+- [Configuration des équipements](#configuration-des-%c3%a9quipements)
+ - [Onglet Commandes](#onglet-commandes)
+ - [Afficheur Lecture en cours (widget)](#afficheur-lecture-en-cours-widget)
+ - [Widget TTS pour saisie de texte et control du volume](#widget-tts-pour-saisie-de-texte-et-control-du-volume)
+- [Commandes personnalisées](#commandes-personnalis%c3%a9es)
+ - [Applications spéciales](#applications-sp%c3%a9ciales)
+ - [Commandes avancées](#commandes-avanc%c3%a9es)
- [Syntaxe des commandes brutes](#syntaxe-des-commandes-brutes)
- - [Paramètres possibles pour *play_media* en mode *media* :](#param-tres-possibles-pour--play-media--en-mode--media---)
- - [Paramètres possibles pour *load_url* en mode *web* :](#param-tres-possibles-pour--load-url--en-mode--web---)
- - [Paramètres possibles pour *play_media* en mode *plex* :](#param-tres-possibles-pour--play-media--en-mode--plex---)
- - [Paramètres possibles pour cmd *tts* :](#param-tres-possibles-pour-cmd--tts---)
- - [Paramètres possibles pour cmd *notif* :](#param-tres-possibles-pour-cmd--notif---)
- - [Séquence de commandes](#s-quence-de-commandes)
- + [Configuration des fonctionnalités Google Home/Assistant](#configuration-des-fonctionnalit-s-google-home-assistant)
- - [Récupérer une configuration](#r-cup-rer-une-configuration)
- * [paramètres possibles pour cmd *getconfig* :](#param-tres-possibles-pour-cmd--getconfig---)
+ - [Paramètres possibles pour _play_media_ en mode _media_ :](#param%c3%a8tres-possibles-pour-playmedia-en-mode-media)
+ - [Paramètres possibles pour _load_url_ en mode _web_ :](#param%c3%a8tres-possibles-pour-loadurl-en-mode-web)
+ - [Paramètres possibles pour _play_media_ en mode _plex_ :](#param%c3%a8tres-possibles-pour-playmedia-en-mode-plex)
+ - [Paramètres possibles pour _play_media_ en mode _spotify_ (experimental) :](#param%c3%a8tres-possibles-pour-playmedia-en-mode-spotify-experimental)
+ - [Paramètres possibles pour cmd _tts_ :](#param%c3%a8tres-possibles-pour-cmd-tts)
+ - [Paramètres possibles pour cmd _notif_ :](#param%c3%a8tres-possibles-pour-cmd-notif)
+ - [Séquence de commandes](#s%c3%a9quence-de-commandes)
+ - [Configuration des fonctionnalités Google Home/Assistant](#configuration-des-fonctionnalit%c3%a9s-google-homeassistant)
+ - [Récupérer une configuration](#r%c3%a9cup%c3%a9rer-une-configuration)
+ - [paramètres possibles pour cmd _getconfig_ :](#param%c3%a8tres-possibles-pour-cmd-getconfig)
- [Modifier une configuration](#modifier-une-configuration)
- *[paramètres possibles pour cmd *setconfig* :](#param-tres-possibles-pour-cmd--setconfig---)
- - [Commande configuration pré-définies](#commande-configuration-pr--d-finies)
- + [Création dune commande *action* de type *Liste*](#cr-ation-dune-commande--action--de-type--liste-)
- + [Création d'une commande *action* pour un webradio pré-enregistrées](#cr-ation-d-une-commande--action--pour-un-webradio-pr--enregistr-es)
- + [Utilisation dans un scénario](#utilisation-dans-un-sc-nario)
- - [Avec commande dédiée *Custom Cmd*](#avec-commande-d-di-e--custom-cmd-)
+ - [paramètres possibles pour cmd _setconfig_ :](#param%c3%a8tres-possibles-pour-cmd-setconfig)
+ - [Commande configuration pré-définies](#commande-configuration-pr%c3%a9-d%c3%a9finies)
+ - [Création dune commande _action_ de type _Liste_](#cr%c3%a9ation-dune-commande-action-de-type-liste)
+ - [Création d'une commande _action_ pour un webradio pré-enregistrées](#cr%c3%a9ation-dune-commande-action-pour-un-webradio-pr%c3%a9-enregistr%c3%a9es)
+ - [Utilisation dans un scénario](#utilisation-dans-un-sc%c3%a9nario)
+ - [Avec commande dédiée _Custom Cmd_](#avec-commande-d%c3%a9di%c3%a9e-custom-cmd)
- [Avec bloc code php](#avec-bloc-code-php)
- + [Utilisation avec interactions et IFTTT](#utilisation-avec-interactions-et-ifttt)
+ - [Utilisation avec interactions et IFTTT](#utilisation-avec-interactions-et-ifttt)
- [Interactions](#interactions)
- - [Réponse type ask](#r-ponse-type--ask-)
+ - [Réponse type _ask_](#r%c3%a9ponse-type-ask)
- [Custom CMD](#custom-cmd)
-- [Limitations et bug connus](#limitations-et-bugs-connus)
+- [Limitations et bugs connus](#limitations-et-bugs-connus)
- [FAQ](#faq)
+ - [Aucune détection lors du scan](#aucune-d%c3%a9tection-lors-du-scan)
+ - [Aucune commande ne semble fonctionner](#aucune-commande-ne-semble-fonctionner)
+ - [Certaines commandes ne fonctionnent pas](#certaines-commandes-ne-fonctionnent-pas)
+ - [Les dépendances ne s'installent pas](#les-d%c3%a9pendances-ne-sinstallent-pas)
+ - [Les dépendances sont 'ok' mais le démon ne se lance pas](#les-d%c3%a9pendances-sont-ok-mais-le-d%c3%a9mon-ne-se-lance-pas)
+ - [Le Text To Speech (TTS) ne fonctionne pas](#le-text-to-speech-tts-ne-fonctionne-pas)
+ - [Le Text To Speech (TTS) fonctionne mais a des coupures pendant le message ou se termine trop tôt](#le-text-to-speech-tts-fonctionne-mais-a-des-coupures-pendant-le-message-ou-se-termine-trop-t%c3%b4t)
+ - [Les fichiers nouvellement placés dans le repertoire 'localmedia' ne fonctionnent pas](#les-fichiers-nouvellement-plac%c3%a9s-dans-le-repertoire-localmedia-ne-fonctionnent-pas)
+ - [Diffuser Jeedom sans authentification sur un Google Cast](#diffuser-jeedom-sans-authentification-sur-un-google-cast)
+ - [La commande est tronquée au dela de 128 caractères](#la-commande-est-tronqu%c3%a9e-au-dela-de-128-caract%c3%a8res)
+ - [Récupérer une clé API pour utiliser TTS 'Google Cloud Text-to-Speech'](#r%c3%a9cup%c3%a9rer-une-cl%c3%a9-api-pour-utiliser-tts-google-cloud-text-to-speech)
+ - [La clé API pour utiliser TTS 'Google Cloud Text-to-Speech' ne fonctionne plus](#la-cl%c3%a9-api-pour-utiliser-tts-google-cloud-text-to-speech-ne-fonctionne-plus)
+ - [Comment récupérer les alamers et timers d'un Google Home](#comment-r%c3%a9cup%c3%a9rer-les-alamers-et-timers-dun-google-home)
- [Changelog](#changelog)
-Configuration du plugin
-=======================
+# Configuration du plugin
Après téléchargement du plugin :
+
- Activer le plugin
- Lancer l'installation des dépendances
- Niveau de log recommandé : info
- Lancer le démon.
Les paramètres de configuration n'ont généralement pas besoin d'être modifiés
+
- **Démon**
- Port du socket interne de communication. Ne modifier que si nécessaire (ex: s'il est déjà pris par un autres plugin)
- Configuration spéciale (eg: Docker, VM). Ne modifier que si ça ne fonctionne pas sans l'option.
@@ -129,28 +141,29 @@ Les paramètres de configuration n'ont généralement pas besoin d'être modifi
- **Notifications**
- Désactiver notifs pour nouveaux Google Cast : ce sont des notifications lors de la découverte de nouveaux Google Cast non configurés
-> **Notes pour TTS (Text To Speech)**
+> **Notes pour TTS (Text To Speech)**
+>
> - Jeedom TTS est le moteur TTS utilisé par Jeedom. Cela rend compatible l'utilisation du plugin officiel 'Song'. Il ne nécessite pas de connexion internet.
> - TTSWebserveur nécessite l'installation et configuration d'un autre plugin dédié ('TTS Web Server' - payant).
> - PicoTTS ne nécessite pas de connexion internet, l'API Google Translate nécessite un accès web et le rendu est meilleur.
> - Un mécanisme de cache permet de ne générer le rendu sonore que s'il n'existe pas déjà en mémoire (RAM). La cache est donc supprimé au redémarrage du serveur.
> - En cas d'échec sur un des moteurs autre que picotts (ex: problème de connexion internet), la commande sera lancée via picotts.
-> **Notes sur le moteur 'Google Cloud Text-to-Speech'**
+> **Notes sur le moteur 'Google Cloud Text-to-Speech'**
+>
> - C'est le moteur TTS de Google (https://cloud.google.com/text-to-speech). Il est entre autres utilisé par la voix de Google Assistant. La qualité est bien supréieure aux autres moteurs TTS.
> - Une clé API est nécessaire qu'il faut avoir créé au préalable (voir [créer un clé API](gcloudttskey.md)).
> - Il est possible de tester les voix sur la page principale https://cloud.google.com/text-to-speech
> - L'utilisation est gratuite jusqu'à un certain quota d'utilisation qui est largement suffisant pour une utilisation domotique d'un particulier.
+
+ Voix standards (hors WaveNet): Gratuit de 0 à 4 millions de caractères par mois (puis 4 USD/1 million de caractères supplémentaires)
+ Voix WaveNet: gratuit de 0 à 1 million de caractères par mois (puis 16 USD/1 million de caractères supplémentaires)
-
![Configuration Plugin](../images/configuration_plugin.png "Configuration Plugin")
-Configuration des équipements
-=============================
+# Configuration des équipements
-La configuration des équipements Google Cast est accessible à partir du menu *Plugins > Multimedia > Google Cast*.
+La configuration des équipements Google Cast est accessible à partir du menu _Plugins > Multimedia > Google Cast_.
![Configuration](../images/configuration.png "Configuration")
@@ -158,7 +171,7 @@ Une fois les équipements branchés, lancer un scan pour les détecter et les aj
La vue 'Santé'' permet d'avoir une vue synthétique des équipements et de leurs états.
-> **Note**
+> **Note**
> Il n'est pas possible d'ajouter manuellement un Google Cast
### Onglet Commandes
@@ -170,22 +183,23 @@ Vous pouvez également ajouter de nouvelles commandes (voir section ci-dessous).
![Alt text](../images/commands.png "Custom command")
Liste des commandes non visibles par défaut :
-- *Statut Player* : info affichant l'état de lecture Média (ex: PLAYING/PAUSED) ;
-- *Titre* : Titre du média en cours ;
-- *Artist* : Artist du média en cours ;
-- *Custom Cmd* : Ce composant est destiné à être utilisé via un scénario ou pour test (voir section [Utilisation dans un scénario](#utilisation-dans-un-scénario));
-- *Pincode* : pincode pour association rapide (exemple de configuration avancée)
-Pour les voir sur le dashboard, il faut activer 'Afficher' dans l'onglet des commandes.
+- _Statut Player_ : info affichant l'état de lecture Média (ex: PLAYING/PAUSED) ;
+- _Titre_ : Titre du média en cours ;
+- _Artist_ : Artist du média en cours ;
+- _Custom Cmd_ : Ce composant est destiné à être utilisé via un scénario ou pour test (voir section [Utilisation dans un scénario](#utilisation-dans-un-scénario));
+- _Pincode_ : pincode pour association rapide (exemple de configuration avancée)
-> **Notes sur commande info 'Statut' (*status_text*)**
-> - *status_text* renvoie le statut en cours du Google Cast.
-> - En cas d'erreur au lancement d'une commande, *status_text* est à
-> 'CMD UNKNOWN' si la commande n'existe pas,
-> 'NOT CONNECTED' si offline ou
-> 'ERROR' pour les autres erreurs
-> - Au repos (pas d'action en cours), *status_text* = ` `
+Pour les voir sur le dashboard, il faut activer 'Afficher' dans l'onglet des commandes.
+> **Notes sur commande info 'Statut' (_status_text_)**
+>
+> - _status_text_ renvoie le statut en cours du Google Cast.
+> - En cas d'erreur au lancement d'une commande, _status_text_ est à
+> 'CMD UNKNOWN' si la commande n'existe pas,
+> 'NOT CONNECTED' si offline ou
+> 'ERROR' pour les autres erreurs
+> - Au repos (pas d'action en cours), _status_text_ = ` `
### Afficheur Lecture en cours (widget)
@@ -196,22 +210,24 @@ L'afficheur se rafraichit toutes les 20 secondes par défaut.
![Display 1](../images/display1.png "Display 1")
Installation / configuration :
+
- Affiché par défaut après installation. Désactiver l'affichage pour cacher.
-- Pour une utilisation dans un dashboard, iL est possible d'utiliser un virtuel en créant une commande de type *info / autres* avec pour valeur la commande *Playing Widget* (non interne *nowplaying*) du Google Cast. Appliquer alors le widget dashboard *googlecast_playing* (via onglet *Affichage* de la configuration avancée de la commande)
-- Pour une utilisation dans un design, ajouter la commande *Playing Widget* directement dans le design.
-
-paramètres CSS optionnels (via '*Paramètres optionnels widget*'):
-- *fontSize* (ex: 35px, défaut=25px) : taille de police de base
-- *fontColor* (ex: blue, défaut=white) : couleur de l'afficheur
-- *fontFamily* (ex: 'Arial') : change la police de l'afficheur
-- *backColor* (ex: blue, défaut=black) : couleur du fond de l'afficheur
-- *playingSize* (ex: 300px, défaut 250px) : largeur et hauteur de l'image de lecture en cours
-- *contentSize* (ex: 70px,défaut 50px) : hauteur de la partie textuelle
-- *additionalCss* (format css, ex: '.blabla {...}') : pour ajouter/modifier d'autres CSS (utilisateur avancé)
+- Pour une utilisation dans un dashboard, iL est possible d'utiliser un virtuel en créant une commande de type _info / autres_ avec pour valeur la commande _Playing Widget_ (non interne _nowplaying_) du Google Cast. Appliquer alors le widget dashboard _googlecast_playing_ (via onglet _Affichage_ de la configuration avancée de la commande)
+- Pour une utilisation dans un design, ajouter la commande _Playing Widget_ directement dans le design.
+
+paramètres CSS optionnels (via '_Paramètres optionnels widget_'):
+
+- _fontSize_ (ex: 35px, défaut=25px) : taille de police de base
+- _fontColor_ (ex: blue, défaut=white) : couleur de l'afficheur
+- _fontFamily_ (ex: 'Arial') : change la police de l'afficheur
+- _backColor_ (ex: blue, défaut=black) : couleur du fond de l'afficheur
+- _playingSize_ (ex: 300px, défaut 250px) : largeur et hauteur de l'image de lecture en cours
+- _contentSize_ (ex: 70px,défaut 50px) : hauteur de la partie textuelle
+- _additionalCss_ (format css, ex: '.blabla {...}') : pour ajouter/modifier d'autres CSS (utilisateur avancé)
![Configuration CSS](../images/configuration_css.png "Configuration CSS")
-> **Notes**
+> **Notes**
> Non disponible pour mobile pour le moment
### Widget TTS pour saisie de texte et control du volume
@@ -221,40 +237,42 @@ Un widget est disponible pour les commandes de type action et sous-type message
![Speak Widget](../images/widget_speak.png "Speak Widget")
Installation / configuration :
+
- Un exemple est affiché par défaut après installation pour tester la fonction TTS.
-- Pour une utilisation dans un dashboard, iL est possible d'utiliser un virtuel en créant une commande de type *action / message* avec pour valeur la commande *Custom Cmd* du Google Cast. Appliquer alors le widget dashboard *googlecast_speak* (via onglet *Affichage* de la configuration avancée de la commande)
-- Le contenu de la commande action (sous-type message) peut contenir les variables *#message#* et *#volume#*
+- Pour une utilisation dans un dashboard, iL est possible d'utiliser un virtuel en créant une commande de type _action / message_ avec pour valeur la commande _Custom Cmd_ du Google Cast. Appliquer alors le widget dashboard _googlecast_speak_ (via onglet _Affichage_ de la configuration avancée de la commande)
+- Le contenu de la commande action (sous-type message) peut contenir les variables _#message#_ et _#volume#_
-paramètres CSS optionnels (via '*Paramètres optionnels widget*'):
-- *width* (ex: 35px, défaut=150px) : taille du widget
-- *default_volume* (ex: blue, défaut=100) : volume par défaut
-- *default_message* (ex: 'Test') : texte par défaut dans le widget
-- *additionalCss* (format css, ex: '.blabla {...}') : pour ajouter/modifier d'autres CSS (utilisateur avancé)
+paramètres CSS optionnels (via '_Paramètres optionnels widget_'):
-> **Notes**
-> Non disponible pour mobile pour le moment
+- _width_ (ex: 35px, défaut=150px) : taille du widget
+- _default_volume_ (ex: blue, défaut=100) : volume par défaut
+- _default_message_ (ex: 'Test') : texte par défaut dans le widget
+- _additionalCss_ (format css, ex: '.blabla {...}') : pour ajouter/modifier d'autres CSS (utilisateur avancé)
+> **Notes**
+> Non disponible pour mobile pour le moment
-Commandes personnalisées
-=============================
+# Commandes personnalisées
### Applications spéciales
-- *Web* : afficher une page web sur un Google Cast. Les paramètres disponibles sont l'url, forcer, et le délai de rechargement (ex: value='https://google.com',False,0 pour charger Google sans forcer (nécessaire pour certains sites) et sans rechargement)
-- *Media* : lire un fichier audio ou vidéo à partir d'une URL
-- *YouTube* : afficher une vidéo à partir d'un ID de vidéo (en fin d'url) => Ne fonctionne pas pour le moment
-- *Backdrop* : afficher le fond d'écran ou économiseur d'écran Google Cast (selon les modèles)
-- *Plex* : jouer un fichier ou une playlist à partir d'un serveur Plex
+- _Web_ : afficher une page web sur un Google Cast. Les paramètres disponibles sont l'url, forcer, et le délai de rechargement (ex: value='https://google.com',False,0 pour charger Google sans forcer (nécessaire pour certains sites) et sans rechargement)
+- _Media_ : lire un fichier audio ou vidéo à partir d'une URL
+- _YouTube_ : afficher une vidéo à partir d'un ID de vidéo (en fin d'url) => Ne fonctionne pas pour le moment
+- _Backdrop_ : afficher le fond d'écran ou économiseur d'écran Google Cast (selon les modèles)
+- _Plex_ : jouer un fichier ou une playlist à partir d'un serveur Plex
-> **Notes**
-> - Voir les boutons créés par défaut pour un exemple d'utilisation
+> **Notes**
+>
+> - Voir les boutons créés par défaut pour un exemple d'utilisation
> - Youtube est non fonctionnel pour le moment
-
### Commandes avancées
#### Syntaxe des commandes brutes
-Elles doivent être séparées par *|*
+
+Elles doivent être séparées par _|_
+
```
- app : name of application (web/backdrop/youtube/media)
- cmd : name of command (depend of application)
@@ -304,10 +322,11 @@ ex broadcast : cmd=quit_app|broadcast=all
ex storecmd and resume : app=web|cmd=load_url|vol=90|value='http://pictoplasma.sound-creatures.com'|storecmd=1$$cmd=sleep|value=10$$cmd=resume
```
-> **Notes**
+> **Notes**
> les chaînes de caractères pour les commandes sont limitées dans Jeedom à 128 caractères. Utiliser les scénarios (voir plus bas pour passer outre cette limitation) ou voir la FAQ pour optimiser la commande.
-#### Paramètres possibles pour *play_media* en mode *media* :
+#### Paramètres possibles pour _play_media_ en mode _media_ :
+
```
- value: str - seperated by ',' (see notes)
* url: str - url of the media (mandatory).
@@ -337,12 +356,14 @@ ex long : app=media|cmd=play_media|value='http://contentlink','video/mp4',title:
subtitles_mime:'text/vtt'
```
-> **Notes**
+> **Notes**
+>
> - Les url et chaînes de caractères sont entourées de guillemets simples ('). Les autres valeurs possibles sont True/False/None ainsi que des valeurs numériques entières.
> - Il est nécessaire de remplacer le signe '=' dans les url par '%3D'
-> - Un média local situé dans le répertoire */plugins/googlecast/localmedia/* peut être utilisé en appelant l'url *local://* (ex: local://bigben1.mp3)
+> - Un média local situé dans le répertoire _/plugins/googlecast/localmedia/_ peut être utilisé en appelant l'url _local://_ (ex: local://bigben1.mp3)
+
+#### Paramètres possibles pour _load_url_ en mode _web_ :
-#### Paramètres possibles pour *load_url* en mode *web* :
```
- value: str - seperated by ',' (see notes)
* url: str - website url. Must start with http, https...
@@ -354,12 +375,14 @@ ex 2 : app=web|cmd=load_url|value='http://mywebsite/index.php?apikey%3Dmyapikey'
ex 3 : app=web|value='http://mywebsite/index.php?apikey%3Dmyapikey' (implicit load_url command call)
```
-> **Notes**
+> **Notes**
+>
> - Les url et chaînes de caractères sont entourées de guillemets simples ('). Les autres valeurs possibles sont True/False/None ainsi que des valeurs numériques entières.
> - Il est nécessaire de remplacer le signe '=' dans les url par '%3D'
> - Pour la diffusion de flux caméra, la caméra doit pouvoir fournir le flux via http (rtsp n'est pas compatible google cast)
-#### Paramètres possibles pour *play_media* en mode *plex* :
+#### Paramètres possibles pour _play_media_ en mode _plex_ :
+
```
- value: str - search query. It could be individual title, playlist or other type of content handled by Plex (it will play the first element returned).
- type: str - type of content. Example: 'video/audio' (optional, default=video).
@@ -371,38 +394,40 @@ ex 3 : app=web|value='http://mywebsite/index.php?apikey%3Dmyapikey' (implicit lo
- repeat: 0/1 - repeat media (optional, default=0).
- offset: int - media offset (optional, default=0).
-ex using user & pass :
+ex using user & pass :
app=plex|cmd=play_media|user=XXXXXX|pass=XXXXXXXXXXX|server=MyPlexServer|value=Playlist Jeedom|shuffle=1|type=audio
-ex using token :
+ex using token :
app=plex|cmd=play_media|token=XXXXXXXXX|server=http://IP:32400|value=Playlist Jeedom
-ex using token with implicit play_media command call :
+ex using token with implicit play_media command call :
app=plex|token=XXXXXXXXX|server=http://IP:32400|value=Playlist Jeedom
```
-> **Notes**
+> **Notes**
+>
> - When using user & pass, internet access is required
> - Token value is displayed in logs (debug) when user & pass has been used the first time. Token is then persistent.
> - you can simulate result of search query (value) in main search field of Plex web UI
+#### Paramètres possibles pour _play_media_ en mode _spotify_ (experimental) :
-#### Paramètres possibles pour *play_media* en mode *spotify* (experimental) :
-
-!! Le plus dur est de récupérer un token valable !!
+!! Le plus dur est de récupérer un token valable !!
Pas de support sur cette fonctionnalité
```
- value: str - media id. Format : 'track:', 'album:', 'playlist:'.
- token: str - token (required).
-ex using valid token :
+ex using valid token :
app=spotify|token=XXXXXX|value=track:3Zwu2K0Qa5sT6teCCHPShP
```
-> **Notes**
-> - Token is too long to be passed through regular command. Use *CustomCmd*.
+> **Notes**
+>
+> - Token is too long to be passed through regular command. Use _CustomCmd_.
> - For test, you can use a web token (open spotify in browser, log in and look for 'wp_access_token' value to use as token).
-#### Paramètres possibles pour cmd *tts* :
+#### Paramètres possibles pour cmd _tts_ :
+
```
- value: str - text
- lang: str - fr-FR/en-US or any compatible language (optional, default is configuration)
@@ -429,11 +454,13 @@ ex : cmd=tts|value=Mon texte|engine=gtts|speed=0.8|forcetts=1
ex voice/ssml : cmd=tts|engine=gttsapi|voice=fr-CA-Standard-A|value=Etape 1Etape 2
```
-> **Notes**
+> **Notes**
+>
> - By default, the plugin will try to resume previous app launched (will only work when previous application has been launched by the plugin).
> - You can try to force resume to any application using 'forceapplaunch=1' but there is a good chance that it will not resume correctly.
-#### Paramètres possibles pour cmd *notif* :
+#### Paramètres possibles pour cmd _notif_ :
+
```
- value: str - local media filename (located in '/plugins/googlecast/localmedia/' folder)
- quit: 0/1 - quit app after notif action.
@@ -448,47 +475,51 @@ ex : cmd=notif|value=bigben1.mp3|vol=100
ex : cmd=notif|value=tornado_siren.mp3|vol=100|duration=11
```
-> **Notes**
+> **Notes**
+>
> - By default, the plugin will try to resume previous app launched (will only work when previous application has been launched by the plugin).
> - You can try to force resume to any application using 'forceapplaunch=1' but there is a good chance of failure.
> - Existing sounds in plugin : house_firealarm.mp3, railroad_crossing_bell.mp3, submarine_diving.mp3, tornado_siren.mp3, bigben1.mp3, bigben2.mp3
> - files added to localmedia folder must have approriate rights
#### Séquence de commandes
-Il est possible de lancer plusieurs commandes à la suite en séparant par *$$*
+
+Il est possible de lancer plusieurs commandes à la suite en séparant par _\$\$_
```
ex 1 : cmd=tts|sleep=2|value=Je lance ma vidéo$$app=media|cmd=play_video|value='http://contentlink','video/mp4','Video name'
ex 2 : app=media|cmd=play_video|value='http://contentlink','video/mp4','Video name',current_time:148|sleep=10$$cmd=quit_app
-ex Commande TTS sur plusieurs google cast en parallèle en s'assurant que le fichier est déjà en cache :
+ex Commande TTS sur plusieurs google cast en parallèle en s'assurant que le fichier est déjà en cache :
cmd=tts|value=My TTS message|generateonly=1$$uuid=XXXXXXXXXXX|cmd=tts|value=My TTS message$$uuid=YYYYYYYYYYY|cmd=tts|value=My TTS message
```
-> **Note**
+
+> **Note**
> adding 'uuid' parameter will redirect to this uuid device in new thread. This can be used to send a sequence to several device in one command.
### Configuration des fonctionnalités Google Home/Assistant
Cela permet de récupérer (ou modifier) des informations tel que les alarmes, timers, configuration bluetooth...
-> **Important**
-> Depuis mi 2019, un jeton d'authorisation est nécessaire afin de pouvoir récupérer ou modifier la plupart de ces configurations.
+> **Important**
+> Depuis mi 2019, un jeton d'authorisation est nécessaire afin de pouvoir récupérer ou modifier la plupart de ces configurations.
La procédure de récupération des jetons est ici : https://gist.github.com/rithvikvibhu/1a0f4937af957ef6a78453e3be482c1f#the-token
Ce jeton doit être saisi sur la page de configuration de chaque Gooogle Home.
#### Récupérer une configuration
-Certaines configurations peuvent être récupérées dans une commande de type info (*cmd=getconfig*).
+
+Certaines configurations peuvent être récupérées dans une commande de type info (_cmd=getconfig_).
Ces commandes de ce type sont rafraichies toutes les 15 minutes ou manuellement via appel de la commande 'refreshconfig' (non visible par défaut)
-La liste non officielles des elements récupérables est disponible sur https://rithvikvibhu.github.io/GHLocalApi/
+La liste non officielles des elements récupérables est disponible sur https://rithvikvibhu.github.io/GHLocalApi/
-> Note
+> Note
> Quelques information récupérables sans jetons d'authenficiation sont visibles via l'url de l'équipement : http://IP:8008/setup/eureka_info?options=detail
+##### paramètres possibles pour cmd _getconfig_ :
-##### paramètres possibles pour cmd *getconfig* :
```
- value: str - uri base after 'setup/' based on API doc (default is 'eureka_info'). If starts with 'post:', a POST type request will be issued.
- data: str - json path to be returned separated by '/'. To get several data, separate by ','. Alternatively, JsonPath format can be used ( http://goessner.net/articles/JsonPath).
@@ -516,11 +547,13 @@ cmd=setconfig|value=assistant/set_night_mode_params|data={"led_brightness": 0.2}
```
#### Modifier une configuration
-Certaines configurations peuvent être modifiées dans une commande de type action (*cmd=setconfig*).
+
+Certaines configurations peuvent être modifiées dans une commande de type action (_cmd=setconfig_).
Voir l'api Google sur ce lien pour ce qui est modifiable : https://rithvikvibhu.github.io/GHLocalApi/
-##### paramètres possibles pour cmd *setconfig* :
+##### paramètres possibles pour cmd _setconfig_ :
+
```
- value: str - uri base after 'setup/' based on API doc.
- data: str - json data.
@@ -534,34 +567,34 @@ cmd=setconfig|value=assistant/alarms/volume|data={'volume': 1}
#### Commande configuration pré-définies
-Les commandes suivantes peuvent être utilisées dans une commande 'info' ou scénario (via fonction *getInfoHttpSimple()*) :
-
-- *gh_get_alarms_date* : retourne la date de toutes les alarmes.
-- *gh_get_alarms_id* : retourne les identifiants uniques de toutes les alarmes et timers.
-- *gh_get_alarm_date_#* (#=numéro, commence par 0) : retourne la date de la prochaine alarme au format dd-mm-yyyy HH:mm.
-- *gh_get_alarm_datenice_#* (#=numéro, commence par 0) : retourne la date de la prochaine alarme au format {'Aujourdhui'|'Demain'|dd-mm-yyyy} HH:mm.
-- *gh_get_alarm_timestamp_#* (#=numéro, commence par 0) : retourne le timestamp de la prochaine alarme.
-- *gh_get_alarm_status_#* (#=numéro, commence par 0) : statut de l'alarme (1 = configuré, 2 = sonne).
-- *gh_get_timer_timesec_#* (#=numéro, commence par 0) : retourne le nombre de secondes avant déclenchement du timer.
-- *gh_get_timer_time_#* (#=numéro, commence par 0) : retourne la date de déclenchement du timer.
-- *gh_get_timer_duration_#* (#=numéro, commence par 0) : retourne la durée originale configurée du timer.
-- *gh_get_timer_status_#* (#=numéro, commence par 0) : statut du timer (1 = configuré, 3 = sonne).
-- *gh_get_donotdisturb* : retourne l'état de la fonction 'Do Not Disturb'.
-- *gh_get_alarms_volume* : récupère le volume des alarmes et timers.
-- *conf_pincode* : retourne le code pin d'association.
-- *castversion* : retourne le numero de version du firmware googlecast.
-- *conf_getbonded_bluetooth* : retourne tous les équipements bluetooth enregistrés.
-- *conf_getconnected_wifi* : retourne le nom du réseau wifi configuré.
-
-Les commandes suivantes peuvent être utilisées dans une commande 'action' ou scénario (via fonction *setInfoHttpSimple()* ou commande *Custom Cmd*) :
-
-- *gh_set_donotdisturb_on* : active la fonction 'Do Not Disturb'.
-- *gh_set_donotdisturb_off* : désactive la fonction 'Do Not Disturb'.
-- *gh_set_donotdisturb_#* (#=true/false) : active/désactive la fonction 'Do Not Disturb'
-- *gh_set_alarms_volume_#* (# = entre 0 et 100 (eg: 10)) : configure le volume des alarmes et timers.
-- *bt_connectdefault* : connecte l'équipement bluetooth configuré par défaut.
-- *bt_connect_X* (#=adresse mac au format xx:xx:xx:xx:xx:xx) : connecte l'équipement bluetooth donné en paramètre.
-- *bt_disconnectdefault* : déconnecte l'équipement bluetooth configuré par défaut.
+Les commandes suivantes peuvent être utilisées dans une commande 'info' ou scénario (via fonction _getInfoHttpSimple()_) :
+
+- _gh_get_alarms_date_ : retourne la date de toutes les alarmes.
+- _gh_get_alarms_id_ : retourne les identifiants uniques de toutes les alarmes et timers.
+- _gh*get_alarm_date*#_ (#=numéro, commence par 0) : retourne la date de la prochaine alarme au format dd-mm-yyyy HH:mm.
+- _gh*get_alarm_datenice*#_ (#=numéro, commence par 0) : retourne la date de la prochaine alarme au format {'Aujourdhui'|'Demain'|dd-mm-yyyy} HH:mm.
+- _gh*get_alarm_timestamp*#_ (#=numéro, commence par 0) : retourne le timestamp de la prochaine alarme.
+- _gh*get_alarm_status*#_ (#=numéro, commence par 0) : statut de l'alarme (1 = configuré, 2 = sonne).
+- _gh*get_timer_timesec*#_ (#=numéro, commence par 0) : retourne le nombre de secondes avant déclenchement du timer.
+- _gh*get_timer_time*#_ (#=numéro, commence par 0) : retourne la date de déclenchement du timer.
+- _gh*get_timer_duration*#_ (#=numéro, commence par 0) : retourne la durée originale configurée du timer.
+- _gh*get_timer_status*#_ (#=numéro, commence par 0) : statut du timer (1 = configuré, 3 = sonne).
+- _gh_get_donotdisturb_ : retourne l'état de la fonction 'Do Not Disturb'.
+- _gh_get_alarms_volume_ : récupère le volume des alarmes et timers.
+- _conf_pincode_ : retourne le code pin d'association.
+- _castversion_ : retourne le numero de version du firmware googlecast.
+- _conf_getbonded_bluetooth_ : retourne tous les équipements bluetooth enregistrés.
+- _conf_getconnected_wifi_ : retourne le nom du réseau wifi configuré.
+
+Les commandes suivantes peuvent être utilisées dans une commande 'action' ou scénario (via fonction _setInfoHttpSimple()_ ou commande _Custom Cmd_) :
+
+- _gh_set_donotdisturb_on_ : active la fonction 'Do Not Disturb'.
+- _gh_set_donotdisturb_off_ : désactive la fonction 'Do Not Disturb'.
+- _gh*set_donotdisturb*#_ (#=true/false) : active/désactive la fonction 'Do Not Disturb'
+- _gh*set_alarms_volume*#_ (# = entre 0 et 100 (eg: 10)) : configure le volume des alarmes et timers.
+- _bt_connectdefault_ : connecte l'équipement bluetooth configuré par défaut.
+- _bt_connect_X_ (#=adresse mac au format xx:xx:xx:xx:xx:xx) : connecte l'équipement bluetooth donné en paramètre.
+- _bt_disconnectdefault_ : déconnecte l'équipement bluetooth configuré par défaut.
```
Exemples:
@@ -571,14 +604,14 @@ gh_get_alarm_date_0
gh_set_alarms_volume_80
```
-### Création dune commande *action* de type *Liste*
+### Création dune commande _action_ de type _Liste_
-Pour créer une commande *action* de type *Liste* dont plusieurs paramètres changent, la commande doit impérativement s'appeler *cmdlist_XXXX* avec XXXX pouvant être remplacé par un nom (example cmdlist_radio).
+Pour créer une commande _action_ de type _Liste_ dont plusieurs paramètres changent, la commande doit impérativement s'appeler _cmdlist_XXXX_ avec XXXX pouvant être remplacé par un nom (example cmdlist_radio).
-Le champs *Liste de valeurs* doit contenir la liste de commandes entière et suivre le format `|;|;...`
+Le champs _Liste de valeurs_ doit contenir la liste de commandes entière et suivre le format `|;|;...`
Le séparateur de commande devra être changé de '|' pour '^'.
-````
+```
Exemple site web :
app=web^cmd=load_url^value='https://google.com'|Google;
app=web^cmd=load_url^value='https://facebook.com'|Facebook
@@ -587,36 +620,37 @@ Exemple pour webradio :
app=media^value='http://urlFluxRadio1/flux.mp3','audio/mpeg','Radio 1'|Radio 1;
app=media^value='http://urlFluxRadio2/flux.mp3','audio/mpeg','Radio 2'|Radio 2;
app=media^value='http://urlFluxRadio3/flux.mp3','audio/mpeg','Radio 3'|Radio 3
-````
+```
![Command action of type list](../images/commands_list.png "Command action of type list")
-> **Note**
-> Pour des commandes plus simples (un seul paramètre change), il est toujours possible d'utiliser le placeholder *#listValue#* dans une commande.
+> **Note**
+> Pour des commandes plus simples (un seul paramètre change), il est toujours possible d'utiliser le placeholder _#listValue#_ dans une commande.
> Exemple : `app=web|cmd=load_url|value=#listValue#` avec comme liste de valeurs `https://google.com|Google;https://facebook.com|Facebook`
-### Création d'une commande *action* pour un webradio pré-enregistrées
+### Création d'une commande _action_ pour un webradio pré-enregistrées
-Pour créer une commande *action* qui lance une webradio pré-enregistrée (avec logo), utiliser les commandes ci-dessous parmis la liste.
+Pour créer une commande _action_ qui lance une webradio pré-enregistrée (avec logo), utiliser les commandes ci-dessous parmis la liste.
radio_africa_n1_paris, radio_bfm_business, radio_cherie_fm, radio_europe_1, radio_fg, radio_fip, radio_fip_jazz, radio_fip_monde, radio_fip_nouveaute, radio_france_bleue, radio_france_culture, radio_france_info, radio_france_inter, radio_france_musique, radio_fun_radio, radio_hotmix-golds, radio_hotmix_2000, radio_hotmix_80, radio_hotmix_90, radio_hotmix_Hits, radio_hotmix_dance, radio_hotmix_frenchy, radio_hotmix_funky, radio_hotmix_game, radio_hotmix_hiphop, radio_hotmix_hot, radio_hotmix_lounge, radio_hotmix_metal, radio_hotmix_new, radio_hotmix_rock, radio_hotmix_sunny, radio_hotmix_vip, radio_jazz, radio_jazz_ladies_crooners, radio_jazz_radio, radio_latina, radio_m_radio, radio_mix_x_fm, radio_mouv, radio_nostalgie, radio_nova, radio_nrj, radio_nrj_uhd, radio_oui_fm, radio_phare_fm, radio_pulsradio_2000, radio_pulsradio_80, radio_pulsradio_90, radio_pulsradio_club, radio_pulsradio_dance, radio_pulsradio_hits, radio_pulsradio_lounge, radio_pulsradio_trance, radio_radio_classique, radio_radio_suisse_classique, radio_rcf, radio_rfi_monde, radio_rfi_monde_hd, radio_rfm, radio_rire_et_chanson, radio_rmc, radio_rtl, radio_rtl2_hd, radio_rtl_2, radio_rtl_hd, radio_skyrock, radio_sud_radio, radio_sweet_fm, radio_tsf_jazz, radio_vibration, radio_virage, radio_virgin_radio, radio_voltage, radio_voltage_lounge, radio_wit_fm
-````
+```
Exemple : commande appelée 'radio_rtl'
-````
-
-> **Note**
-> Il est possible de rajouter des webradios dans un fichier appelé *custom.json* (à créer) dans le répertoire du plugin *webradios*. Le format doit être similaire au fichier *webradios/radiolist.json* (l'id de la radio devra être concatené avec *radio_* au début pour l'utiliser en commande; eg: id radio *XXXX* devra être appelé avec la commande *radio_XXXX*).
-Ce fichier ne sera pas modifié lors des mises à jour du plugin.
-A la création du fichier, s'assurer que le fichier à les bons droits avec la commande `sudo chown www-data:www-data custom.json && sudo chmod 775 custom.json`
+```
+> **Note**
+> Il est possible de rajouter des webradios dans un fichier appelé _custom.json_ (à créer) dans le répertoire du plugin _webradios_. Le format doit être similaire au fichier _webradios/radiolist.json_ (l'id de la radio devra être concatené avec _radio\__ au début pour l'utiliser en commande; eg: id radio _XXXX_ devra être appelé avec la commande _radio_XXXX_).
+> Ce fichier ne sera pas modifié lors des mises à jour du plugin.
+> A la création du fichier, s'assurer que le fichier à les bons droits avec la commande `sudo chown www-data:www-data custom.json && sudo chmod 775 custom.json`
### Utilisation dans un scénario
-#### Avec commande dédiée *Custom Cmd*
-La commande nommée *Custom Cmd* permet de lancer une commande brute à partir d'un scénario.
+#### Avec commande dédiée _Custom Cmd_
+
+La commande nommée _Custom Cmd_ permet de lancer une commande brute à partir d'un scénario.
Par exemple, pour lancer Google sur un Google Cast à partir d'un scénario, ajouter la commande avec la valeur souhaitée dans le champs 'message'.
+
```
app=web|cmd=load_url|value='https://google.com',True,10
```
@@ -712,24 +746,30 @@ $ret = $googlecast->helperSendNotifandWait('XXXXXXXX', 'cmd=tts|value=Test Scén
### Utilisation avec interactions et IFTTT
Trois types d'actions sont possibles :
+
- Intéraction TTS (Text To Speech)
- Réponse à action de type ask
- Lancer une commande personnalisée
#### Interactions
-Compatibilité avec interaction IFTTT de type *TTS* en utilisant l'url suivante dans la configuration (GET ou POST) :
+
+Compatibilité avec interaction IFTTT de type _TTS_ en utilisant l'url suivante dans la configuration (GET ou POST) :
+
```
http(s)://#JEEDOM_DNS#/plugins/googlecast/core/php/googlecast.ifttt.php?apikey=#GCASTPLUGIN_APIKEY#&uuid=#GCAST_UUID#&query=<<{{TextField}}>>
-Optional :
- &vol=X (between 1 and 100)
- &noresume=1 (will not try to resume previous app)
- &quit=1
+Optional :
+ &vol=X (between 1 and 100)
+ &noresume=1 (will not try to resume previous app)
+ &quit=1
&silence=X (in milliseconds, ex: 1000 for 1 sec)
```
+
Documentation Jeedom et IFTTT : https://jeedom.github.io/plugin-gcast
-#### Réponse type *ask*
-Compatibilité avec IFTTT et réponse à une requête de type *ask* (scénarios) en utilisant l'url suivante dans la configuration (GET ou POST) :
+#### Réponse type _ask_
+
+Compatibilité avec IFTTT et réponse à une requête de type _ask_ (scénarios) en utilisant l'url suivante dans la configuration (GET ou POST) :
+
```
# on specific device UUID
http(s)://#JEEDOM_DNS#/plugins/googlecast/core/php/googlecast.ifttt.php?apikey=#GCASTPLUGIN_APIKEY#&uuid=#GCAST_UUID#&action=askreply&query=<<{{TextField}}>>
@@ -738,33 +778,33 @@ http(s)://#JEEDOM_DNS#/plugins/googlecast/core/php/googlecast.ifttt.php?apikey=#
http(s)://#JEEDOM_DNS#/plugins/googlecast/core/php/googlecast.ifttt.php?apikey=#GCASTPLUGIN_APIKEY#&uuid=any&action=askreply&query=<<{{TextField}}>>
```
-> **Notes**
-> - uuid peut avoir la valeur *any* pour tester tous les équipements Google Cast en attente potentielle de réponse.
-> - l'action ask du scénario peut utiliser soit la commande *Custom Cmd* (ex: cmd=tts|value="Confirmer commande ?"|vol=60) soit la commande *Parle !*.
+> **Notes**
+>
+> - uuid peut avoir la valeur _any_ pour tester tous les équipements Google Cast en attente potentielle de réponse.
+> - l'action ask du scénario peut utiliser soit la commande _Custom Cmd_ (ex: cmd=tts|value="Confirmer commande ?"|vol=60) soit la commande _Parle !_.
#### Custom CMD
+
Envoyer une commande à partir d'un webhook (GET ou POST)
+
```
http(s)://#JEEDOM_DNS#/plugins/googlecast/core/php/googlecast.ifttt.php?apikey=#GCASTPLUGIN_APIKEY#&uuid=#GCAST_UUID#&action=customcmd&query=#CUSTOM_CMD#
-Notes :
- #CUSTOM_CMD# : as defined in documentation (eg : app=web|cmd=load_url|value='http://pictoplasma.sound-creatures.com')
+Notes :
+ #CUSTOM_CMD# : as defined in documentation (eg : app=web|cmd=load_url|value='http://pictoplasma.sound-creatures.com')
It may be necessary to encode #CUSTOM_CMD# using https://www.url-encode-decode.com/
```
-Limitations et bugs connus
-=============================
+# Limitations et bugs connus
- Moteur PicoTTS ne gère pas les phrases accentuées (ils sont supprimés)
-
-FAQ
-=============================
+# FAQ
#### Aucune détection lors du scan
- Vérifier que le Google Cast est disponible à partir d'une application permettant la visualisation des appareils compatibles ;
-- Jeedom doit se trouver sur le même réseau que les équipements Google Cast
-(pour Docker, le container doit être configuré pour être sur le même réseau ; en VM, la machine est en mode bridge) ;
+- Jeedom doit se trouver sur le même réseau que les équipements Google Cast
+ (pour Docker, le container doit être configuré pour être sur le même réseau ; en VM, la machine est en mode bridge) ;
- Vérifier qu'il n'y a pas de blocages au niveau du firewall pour la découverte via le protocole 'Zeroconf' ;
- Pour mettre Docker sur le même réseau, voir https://github.com/guirem/plugin-googlecast/issues/8
@@ -779,25 +819,30 @@ FAQ
#### Les dépendances ne s'installent pas
-Vérifier dans les logs (*Googlecast_update*) la provenance de l'erreur. Le plugin nécessite l'installation de python3, pip3.
+Vérifier dans les logs (_Googlecast_update_) la provenance de l'erreur. Le plugin nécessite l'installation de python3, pip3.
+
+Si le log contient le message _Error: Cound not found pip3 program to install python dependencies !_, tenter de lancer les lignes de commandes en ssh :
-Si le log contient le message *Error: Cound not found pip3 program to install python dependencies !*, tenter de lancer les lignes de commandes en ssh :
- `python3 -V` doit retourner la version de python 3 installée.
- `compgen -ac | grep -E '^pip-?3' | sort -r | head -1` doit retourner une ligne (ex: pip3)
-- Si aucun retour sur la ligne précédente, tenter une réinstallation de pip3
+- Si aucun retour sur la ligne précédente, tenter une réinstallation de pip3
+
```
sudo python3 -m pip uninstall -y pip
sudo apt-get -y --reinstall install python3-pip
```
+
- Relancer l'installation des dépendances
#### Les dépendances sont 'ok' mais le démon ne se lance pas
Un des modules est peut etre corrompu.
Pour désinstaller les modules utiliser la commande
+
```
sudo pip3 uninstall -y requests zeroconf click bs4 six tqdm websocket-client
```
+
Puis relancer l'installation des dépendances.
#### Le Text To Speech (TTS) ne fonctionne pas
@@ -809,6 +854,7 @@ Puis relancer l'installation des dépendances.
#### Le Text To Speech (TTS) fonctionne mais a des coupures pendant le message ou se termine trop tôt
Le type d'équipements utilisés (wifi, serveur Jeedom) ou la longueur du message peut avoir un impact sur le rendu TTS.
+
- Ajouter le paramêtre 'sleep' pour ajouter un délai supplémentaire à la fin du message (ex: |sleep=0.8 pour 0.8 seconde).
- Tester avec le paramètre 'buffered=1' pour voir si cela règle le problème.
- Utiliser le paramêtre 'forcetts' durant les tests pour être certain que le cache n'est pas utilisé.
@@ -816,27 +862,28 @@ Le type d'équipements utilisés (wifi, serveur Jeedom) ou la longueur du messag
#### Les fichiers nouvellement placés dans le repertoire 'localmedia' ne fonctionnent pas
Les nouveaux fichiers doivent avoir les droits de lecture
-A partir du répertoire localmedia, corriger les droits avec la commande :
+A partir du répertoire localmedia, corriger les droits avec la commande :
`sudo chown www-data:www-data * && sudo chmod 775 *`
#### Diffuser Jeedom sans authentification sur un Google Cast
-C'est possible via le mode web. Pour gérer l'authentification automatiquement, utiliser le plugin 'autologin' (voir doc du plugin).
+C'est possible via le mode web. Pour gérer l'authentification automatiquement, utiliser le plugin 'autologin' (voir doc du plugin).
Note : Les champs de commandes sont limités a 128, voir ci-dessous pour optimiser la longueur de la commande.
#### La commande est tronquée au dela de 128 caractères
-C'est une limitation Jeedom. L'alternative est d'utiliser la commande *custom cmd* via un scénario qui n'a pas de limitation.
+C'est une limitation Jeedom. L'alternative est d'utiliser la commande _custom cmd_ via un scénario qui n'a pas de limitation.
Cependant, il est possible d'optimiser la longueur de la commande :
-- *value=* peut être réduit en *v=*
-- Pour le mode *web* et *media*, *cmd=X* est inutile car implicite (ex: *app=web|cmd=load_url|v=.....* identique à *app=web|v=.....*)
-- Les booleans *True*/*False* peuvent être réduits à *T*/*F*
+
+- _value=_ peut être réduit en _v=_
+- Pour le mode _web_ et _media_, _cmd=X_ est inutile car implicite (ex: _app=web|cmd=load_url|v=....._ identique à _app=web|v=....._)
+- Les booleans _True_/_False_ peuvent être réduits à _T_/_F_
- Enlever le port si 80 ou 443 (http://addresseweb:80/contenu => http://addresseweb/contenu)
-- Pour les url, *http://* peut être réduit en *h:/* et *https://* peut être réduit en *hs:/*
+- Pour les url, _http://_ peut être réduit en _h:/_ et _https://_ peut être réduit en _hs:/_
- Pour les url longues, utiliser des services web tel que bitly pour les réduire drastiquement
-Exemple : *app=web|cmd=load_url|value='https://xxxxx.xxxxxxx.com:443/plugins/autologin/core/php/go.php?apikey%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&id%3D999',True* réduit en *app=web|v=hs:/xxxxx.xxxxxxx.com/plugins/autologin/core/php/go.php?apikey%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&id%3D999,T*
+Exemple : _app=web|cmd=load_url|value='https://xxxxx.xxxxxxx.com:443/plugins/autologin/core/php/go.php?apikey%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&id%3D999',True_ réduit en _app=web|v=hs:/xxxxx.xxxxxxx.com/plugins/autologin/core/php/go.php?apikey%3Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&id%3D999,T_
#### Récupérer une clé API pour utiliser TTS 'Google Cloud Text-to-Speech'
@@ -850,8 +897,6 @@ Suite à la mise à jour de janvier 2020, il est probable que l'API 'Google Clou
C'est possible mais il est nécessaire d'avoir un jeton d'authentification (https://gist.github.com/rithvikvibhu/1a0f4937af957ef6a78453e3be482c1f) configuré sur la page du googlecast. Voir la section de la doc dédiée.
-
-Changelog
-=============================
+# Changelog
[Voir la page dédiée](changelog.md).
diff --git a/resources/googlecast.py b/resources/googlecast.py
index ae7bd8b..581ba3c 100644
--- a/resources/googlecast.py
+++ b/resources/googlecast.py
@@ -83,7 +83,7 @@
pass
try:
- from jeedom.jeedom import jeedom_com, jeedom_socket, jeedom_utils
+ from jeedom.jeedom import jeedom_com, jeedom_socket, jeedom_utils, JEEDOM_SOCKET_MESSAGE
except ImportError:
print("Error: importing module from jeedom folder")
sys.exit(1)
@@ -1920,7 +1920,7 @@ def start(cycle=2):
def read_socket(cycle):
while not globals.IS_SHUTTINGDOWN:
try:
- global JEEDOM_SOCKET_MESSAGE
+ # global JEEDOM_SOCKET_MESSAGE
if not JEEDOM_SOCKET_MESSAGE.empty():
logging.debug(
"SOCKET-READ------Message received in socket JEEDOM_SOCKET_MESSAGE")