Skip to content

Commit 6b3d7cc

Browse files
authored
Merge pull request #3161 from jeedom/4.5.1
4.5.1
2 parents fa839c1 + 3cf20ec commit 6b3d7cc

9 files changed

Lines changed: 398 additions & 383 deletions

File tree

core/class/cmd.class.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,10 +1042,10 @@ public function formatValue($_value, $_quote = false) {
10421042
return intval($binary xor boolval($this->getConfiguration('invertBinary', false)));
10431043
case 'numeric':
10441044
if ($this->getConfiguration('historizeRound') !== '' && is_numeric($this->getConfiguration('historizeRound')) && $this->getConfiguration('historizeRound') >= 0) {
1045-
if (!is_numeric($_value)) {
1046-
log::add('cmd', 'error', __('La formule de calcul doit retourner une valeur numérique uniquement : ', __FILE__) . $this->getHumanName() . ' => ' . $_value);
1047-
$_value = (float) (str_replace(',', '.', $_value));
1048-
}
1045+
if (!is_numeric($_value)) {
1046+
log::add('cmd', 'error', __('La formule de calcul doit retourner une valeur numérique uniquement : ', __FILE__) . $this->getHumanName() . ' => ' . $_value);
1047+
$_value = (float) (str_replace(',', '.', $_value));
1048+
}
10491049
$_value = round($_value, $this->getConfiguration('historizeRound'));
10501050
}
10511051
if ($_value > $this->getConfiguration('maxValue', $_value)) {
@@ -3071,7 +3071,7 @@ public function getDisplay($_key = '', $_default = '') {
30713071
}
30723072

30733073
public function setDisplay($_key, $_value) {
3074-
if ($this->getDisplay($_key) !== $_value) {
3074+
if ($this->getDisplay($_key, null) !== $_value) {
30753075
$this->_needRefreshWidget = true;
30763076
$this->_changed = true;
30773077
}

core/class/scenarioExpression.class.php

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,17 @@ public static function getDatesFromPeriod($_period = '1 hour') {
194194
if ($_period == 'day') $_period = '1 day';
195195

196196
if (ctype_digit($_period[0]) && !stristr($_period, "ago")) {
197-
$_startTime = date('Y-m-d H:i:s',(int) strtotime('-' . $_period));
197+
$_startTime = date('Y-m-d H:i:s', (int) strtotime('-' . $_period));
198198
} else {
199-
$_startTime = date('Y-m-d H:i:s',(int) strtotime($_period));
199+
$_startTime = date('Y-m-d H:i:s', (int) strtotime($_period));
200200
}
201201
$_endTime = date('Y-m-d H:i:s');
202202

203203
if ($_period == 'today') {
204204
$_startTime = date('Y-m-d') . ' 00:00:00';
205205
} elseif ($_period == 'yesterday') {
206-
$_startTime = date('Y-m-d',(int) strtotime('-1 day')) . ' 00:00:00';
207-
$_endTime = date('Y-m-d',(int) strtotime('-1 day')) . ' 23:59:59';
206+
$_startTime = date('Y-m-d', (int) strtotime('-1 day')) . ' 00:00:00';
207+
$_endTime = date('Y-m-d', (int) strtotime('-1 day')) . ' 23:59:59';
208208
}
209209
return array($_startTime, $_endTime);
210210
}
@@ -303,8 +303,8 @@ public static function averageBetween($_cmd_id, $_startDate, $_endDate, $_round
303303
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
304304
return '';
305305
}
306-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
307-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
306+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
307+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
308308
$historyStatistique = $cmd->getStatistique($_startTime, $_endTime);
309309
if (!isset($historyStatistique['avg'])) {
310310
return '';
@@ -328,8 +328,8 @@ public static function averageTemporalBetween($_cmd_id, $_startDate, $_endDate,
328328
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
329329
return '';
330330
}
331-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
332-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
331+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
332+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
333333
return round($cmd->getTemporalAvg($_startTime, $_endTime), $_round);
334334
}
335335

@@ -458,8 +458,8 @@ public static function maxBetween($_cmd_id, $_startDate, $_endDate, $_round = 1)
458458
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
459459
return '';
460460
}
461-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
462-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
461+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
462+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
463463
$historyStatistique = $cmd->getStatistique($_startTime, $_endTime);
464464
if (!isset($historyStatistique['max'])) {
465465
return '';
@@ -489,8 +489,8 @@ public static function minBetween($_cmd_id, $_startDate, $_endDate, $_round = 1)
489489
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
490490
return '';
491491
}
492-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
493-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
492+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
493+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
494494
$historyStatistique = $cmd->getStatistique($_startTime, $_endTime);
495495
if (!isset($historyStatistique['min'])) {
496496
return '';
@@ -642,8 +642,8 @@ public static function stateChangesBetween($_cmd_id, $_value, $_startDate, $_end
642642
$_endDate = func_get_arg(2);
643643
$_value = null;
644644
}
645-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
646-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
645+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
646+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
647647

648648
return history::stateChanges($cmd_id, $_value, $_startTime, $_endTime);
649649
}
@@ -724,8 +724,8 @@ public static function durationBetween($_cmd_id, $_value, $_startDate, $_endDate
724724
$_endDate = date('Y-m-d H:i:s');
725725
}
726726

727-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
728-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
727+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
728+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
729729
$_value = str_replace(',', '.', $_value);
730730
$_decimal = strlen(substr(strrchr($_value, "."), 1));
731731

@@ -769,8 +769,8 @@ public static function lastBetween($_cmd_id, $_startDate, $_endDate) {
769769
if (!is_object($cmd) || $cmd->getIsHistorized() == 0) {
770770
return '';
771771
}
772-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
773-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
772+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
773+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
774774
$historyStatistique = $cmd->getStatistique($_startTime, $_endTime);
775775
if (!isset($historyStatistique['last']) || $historyStatistique['last'] === '') {
776776
return '';
@@ -802,8 +802,8 @@ public static function statisticsBetween($_cmd_id, $_calc, $_startDate, $_endDat
802802
return '';
803803
}
804804
$_calc = str_replace(' ', '', $_calc);
805-
$_startTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_startDate)));
806-
$_endTime = date('Y-m-d H:i:s',(int) strtotime(self::setTags($_endDate)));
805+
$_startTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_startDate)));
806+
$_endTime = date('Y-m-d H:i:s', (int) strtotime(self::setTags($_endDate)));
807807
$historyStatistique = $cmd->getStatistique(self::setTags($_startTime), self::setTags($_endTime));
808808
return $historyStatistique[$_calc];
809809
}
@@ -960,7 +960,7 @@ public static function trigger($_name = '', &$_scenario = null) {
960960
if (trim($_name) == '') {
961961
return $_scenario->getTag('trigger_name');
962962
}
963-
if (trim(jeedom::toHumanReadable($_name),'#') == $_scenario->getTag('trigger_name')) {
963+
if (trim(jeedom::toHumanReadable($_name), '#') == $_scenario->getTag('trigger_name')) {
964964
return 1;
965965
}
966966
return 0;
@@ -1038,8 +1038,8 @@ public static function time_diff($_date1, $_date2, $_format = 'd', $_rnd = 2) {
10381038
if ($_date2 < 100) $_date2 = '00' . $_date2;
10391039
if ($_date2 < 1000) $_date2 = '0' . $_date2;
10401040
}
1041-
$d1 = str_replace(array('"','\'',"'"), '', self::setTags($_date1));
1042-
$d2 = str_replace(array('"','\'',"'"), '', self::setTags($_date2));
1041+
$d1 = str_replace(array('"', '\'', "'"), '', self::setTags($_date1));
1042+
$d2 = str_replace(array('"', '\'', "'"), '', self::setTags($_date2));
10431043
$date1 = new DateTime($d1);
10441044
$date2 = new DateTime($d2);
10451045
$duree = $date2->getTimestamp() - $date1->getTimestamp();
@@ -1275,6 +1275,9 @@ public static function setTags(&$_expression, &$_scenario = null, $_quote = fals
12751275
}
12761276
if ($_quote) {
12771277
foreach ($replace1 as &$value) {
1278+
if ($value === null) {
1279+
continue;
1280+
}
12781281
if (strpos($value, ' ') !== false || preg_match("/[a-zA-Z]/", $value) || $value === '') {
12791282
$value = '"' . trim($value, '"') . '"';
12801283
}
@@ -1386,7 +1389,7 @@ public function execute(&$scenario = null) {
13861389
}
13871390
$this->checkBackground();
13881391
if ($this->getOptions('background', 0) == 1) {
1389-
$key = 'scenarioElement'.$this->getId().'::' . config::genKey(16).'::'.strtotime('now');
1392+
$key = 'scenarioElement' . $this->getId() . '::' . config::genKey(16) . '::' . strtotime('now');
13901393
cache::set($key, array('scenarioExpression' => $this, 'scenario' => $scenario), 60);
13911394
$cmd = __DIR__ . '/../php/jeeScenarioExpression.php';
13921395
$cmd .= ' key=' . $key;
@@ -1571,14 +1574,14 @@ public function execute(&$scenario = null) {
15711574
}
15721575
$this->setLog($scenario, $GLOBALS['JEEDOM_SCLOG_TEXT']['launchScenario']['txt'] . $actionScenario->getName() . ' ' . __('options :', __FILE__) . ' ' . json_encode($actionScenario->getTags()));
15731576
if ($scenario !== null) {
1574-
$actionScenario->addTag('trigger','scenario');
1575-
$actionScenario->addTag('trigger_message',$GLOBALS['JEEDOM_SCLOG_TEXT']['startByScenario']['txt'] . $scenario->getHumanName());
1576-
$actionScenario->addTag('trigger_name',trim($scenario->getHumanName(),'#'));
1577-
$actionScenario->addTag('trigger_id',$scenario->getId());
1577+
$actionScenario->addTag('trigger', 'scenario');
1578+
$actionScenario->addTag('trigger_message', $GLOBALS['JEEDOM_SCLOG_TEXT']['startByScenario']['txt'] . $scenario->getHumanName());
1579+
$actionScenario->addTag('trigger_name', trim($scenario->getHumanName(), '#'));
1580+
$actionScenario->addTag('trigger_id', $scenario->getId());
15781581
return $actionScenario->launch();
15791582
} else {
1580-
$actionScenario->addTag('trigger','other');
1581-
$actionScenario->addTag('trigger_message',$GLOBALS['JEEDOM_SCLOG_TEXT']['startCausedBy']['txt']);
1583+
$actionScenario->addTag('trigger', 'other');
1584+
$actionScenario->addTag('trigger_message', $GLOBALS['JEEDOM_SCLOG_TEXT']['startCausedBy']['txt']);
15821585
return $actionScenario->launch();
15831586
}
15841587
break;
@@ -1597,14 +1600,14 @@ public function execute(&$scenario = null) {
15971600
}
15981601
$this->setLog($scenario, $GLOBALS['JEEDOM_SCLOG_TEXT']['launchScenario']['txt'] . $actionScenario->getName() . ' ' . __('options :', __FILE__) . ' ' . json_encode($actionScenario->getTags()));
15991602
if ($scenario !== null) {
1600-
$actionScenario->addTag('trigger','scenario');
1601-
$actionScenario->addTag('trigger_message',$GLOBALS['JEEDOM_SCLOG_TEXT']['startByScenario']['txt'] . $scenario->getHumanName());
1602-
$actionScenario->addTag('trigger_name',trim($scenario->getHumanName(),'#'));
1603-
$actionScenario->addTag('trigger_id',$scenario->getId());
1603+
$actionScenario->addTag('trigger', 'scenario');
1604+
$actionScenario->addTag('trigger_message', $GLOBALS['JEEDOM_SCLOG_TEXT']['startByScenario']['txt'] . $scenario->getHumanName());
1605+
$actionScenario->addTag('trigger_name', trim($scenario->getHumanName(), '#'));
1606+
$actionScenario->addTag('trigger_id', $scenario->getId());
16041607
return $actionScenario->launch(true);
16051608
} else {
1606-
$actionScenario->addTag('trigger','other');
1607-
$actionScenario->addTag('trigger_message',$GLOBALS['JEEDOM_SCLOG_TEXT']['startCausedBy']['txt']);
1609+
$actionScenario->addTag('trigger', 'other');
1610+
$actionScenario->addTag('trigger_message', $GLOBALS['JEEDOM_SCLOG_TEXT']['startCausedBy']['txt']);
16081611
return $actionScenario->launch(true);
16091612
}
16101613
break;
@@ -1791,8 +1794,8 @@ public function execute(&$scenario = null) {
17911794
$tmp_file = jeedom::getTmpFolder('history_export') . '/' . $options['name'] . '.csv';
17921795
$cmd_parameters = array('files' => [$tmp_file], 'title' => $options['name'], 'message' => $options['name']);
17931796

1794-
$start = date('Y-m-d H:i:s',(int) strtotime($options['start']));
1795-
$end = date('Y-m-d H:i:s',(int) strtotime($options['end']));
1797+
$start = date('Y-m-d H:i:s', (int) strtotime($options['start']));
1798+
$end = date('Y-m-d H:i:s', (int) strtotime($options['end']));
17961799
$this->setLog($scenario, __('Export de l\'historique du', __FILE__) . ' ' . $start . ' ' . __('au', __FILE__) . ' ' . $end);
17971800

17981801
$histories = array();

core/class/user.class.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public static function connect(string $_login, string $_mdp) {
122122
->setProfils($profile);
123123
$user->save();
124124
log::add("connection", "info", __('User created from the LDAP :', __FILE__) . ' ' . $_login);
125-
jeedom::event('user_connect');
125+
jeedom::event('user_connect', false, array('trigger_value' => $_login));
126126
// TODO : if username == password => change ldap password
127127
log::add('event', 'info', __('User connection accepted', __FILE__) . ' ' . $_login);
128128
return $user;
@@ -145,7 +145,7 @@ public static function connect(string $_login, string $_mdp) {
145145
if (is_object($user)) {
146146
$user->setOptions('lastConnection', date('Y-m-d H:i:s'));
147147
$user->save();
148-
jeedom::event('user_connect');
148+
jeedom::event('user_connect', false, array('trigger_value' => $_login));
149149
log::add('event', 'info', __('Local account found for', __FILE__) . ' ' . $_login);
150150
log::add('event', 'info', __('User connection accepted', __FILE__) . ' ' . $_login);
151151
}

core/config/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.5
1+
4.5.1

core/template/dashboard/cmd.action.color.picker.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@
1919
if ('#time#' == 'duration' || '#time#' == 'date') {
2020
jeedom.cmd.displayDuration(_options.valueDate, cmd.querySelector('.timeCmd'), '#time#')
2121
}
22-
cmd.querySelector('.action_colorpicker_change').value = (_options.display_value != '') ? _options.display_value.substr(0, 7) : '#000000'
22+
if (_options.display_value.length == 0) {
23+
cmd.querySelector('.action_colorpicker_change').value = '#000000'
24+
} else if (_options.display_value.startsWith('#')) {
25+
cmd.querySelector('.action_colorpicker_change').value = _options.display_value.substr(0, 7)
26+
} else {
27+
cmd.querySelector('.action_colorpicker_change').value = '#' + _options.display_value.substr(0, 6)
28+
}
2329
}
2430
})
2531

docs/fr_FR/changelog.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog Jeedom V4.5
22

3+
# 4.5.1
4+
5+
- Le déclencheur de scénarios `#user_connect#` inclut dorénavant le tag `#trigger_value#` qui renseigne le nom de l'utilisateur venant de se connecter ([Détails](https://github.com/jeedom/core/pull/3109))
6+
- Montée de version de nodejs 20 vers 22 ([Détails](https://github.com/jeedom/core/issues/3147))
7+
- La sauvegarde se fera maintenant a une heure aléatoire entre 00:10 et 9:59
8+
- Correction d'un warning sur les valeurs de tags null
9+
310
# 4.5
411

512
- [Développeurs] Ajout de la fonction `$listener->removeEvent($_id)`
@@ -10,7 +17,7 @@
1017
- Les graphiques se mettent à jour automatiquement lors de l'arrivée de nouvelles valeurs [LIEN](https://github.com/jeedom/core/issues/2749)
1118
- Jeedom ajoute automatiquement la hauteur de l'image lors de la création des widgets pour éviter les soucis de chevauchement en mobile [LIEN](https://github.com/jeedom/core/issues/2539)
1219
- Refonte de la partie backup cloud [LIEN](https://github.com/jeedom/core/issues/2765)
13-
- **DEV** Mise en place d'un système de queue pour l'exécution d'actions [LIEN](https://github.com/jeedom/core/issues/2489)
20+
- [Développeurs] Mise en place d'un système de queue pour l'exécution d'actions [LIEN](https://github.com/jeedom/core/issues/2489)
1421
- Les tags des scénarios sont maintenant propres à l'instance du scénario (si vous avez deux lancements de scénarios très proches, les tags du dernier n'écrasent plus le premier) [LIEN](https://github.com/jeedom/core/issues/2763)
1522
- Changement sur la partie trigger des scénarios : [LIEN](https://github.com/jeedom/core/issues/2414)
1623
- ``triggerId()`` est maintenant deprecated et sera retiré dans les futures mises à jour du core. Si vous avez ``triggerId() == 587`` il faut le remplacer par ``#trigger_id# == 587``
@@ -95,4 +102,4 @@
95102
96103
>**IMPORTANT**
97104
>
98-
> La restauration d'un backup 4.4 peut dans certains cas finir par des erreurs dans l'interface web. Rien de grave cela peut facilement se corriger il suffit de faire : `cd /tmp;wget https://github.com/jeedom/core/archive/refs/tags/4.4.20.zip;unzip 4.4.19.zip;cd core-4.4.20;cp -rf * /var/www/html/;rm -rf /tmp/master.zip;rm -rf /tmp/core-4.4.20;`. Vous pouvez lancer cette commande depuis l'interface rescue de jeedom (ajouter `&rescue=1` dans l'url), ou directement en ssh.
105+
> La restauration d'un backup 4.4 peut dans certains cas finir par des erreurs dans l'interface web. Rien de grave cela peut facilement se corriger il suffit de faire : `cd /tmp;wget https://github.com/jeedom/core/archive/refs/tags/4.4.20.zip;unzip 4.4.20.zip;cd core-4.4.20;cp -rf * /var/www/html/;rm -rf /tmp/master.zip;rm -rf /tmp/core-4.4.20;`. Vous pouvez lancer cette commande depuis l'interface rescue de jeedom (ajouter `&rescue=1` dans l'url), ou directement en ssh.

docs/fr_FR/scenario.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ Il existe des déclencheurs spécifiques (autre que ceux fournis par les command
236236
- ``#end_update#`` : Événement envoyé à la fin d’une mise à jour.
237237
- ``#begin_restore#`` : Événement envoyé au début d’une restauration.
238238
- ``#end_restore#`` : Événement envoyé à la fin d’une restauration.
239-
- ``#user_connect#`` : Connexion d'un utilisateur
239+
- ``#user_connect#`` : Connexion d'un utilisateur, le tag `#trigger_value#` contient le nom de l'utilisateur.
240240
- ``#variable(nom_variable)#`` : Changement de valeur de la variable nom_variable.
241241
- ``#genericType(GENERIC, #[Object]#)#`` : Changement d'une commande info de Type Generic GENERIC, dans l'objet Object.
242242
- ``#new_eqLogic#`` : Événement envoyé lors de la création d'un nouvelle équipement, vous avez dans les tags id (id de l'équipement crée), name (nom de l'équipement crée) et eqType (type/plugin de l'équipement crée)
@@ -439,7 +439,7 @@ Une boîte à outils de fonctions génériques peut également servir à effectu
439439
- ``randText(texte1;texte2;texte…​..)`` : Permet de retourner un des textes aléatoirement (séparer les texte par un ; ). Il n’y a pas de limite dans le nombre de texte.
440440
- ``randomColor(min,max)`` : Donne une couleur aléatoire comprise entre 2 bornes ( 0 => rouge, 50 => vert, 100 => bleu).
441441
- ``trigger(commande)`` : Permet de connaître le déclencheur du scénario ou de savoir si c’est bien la commande passée en paramètre qui a déclenché le scénario. **=> Deprecated il vaut mieux utiliser le tag #trigger#**
442-
- ``triggerValue()`` : Permet de connaître la valeur du déclencheur du scénario. **=> Deprecated il vaut mieux utiliser le tag #triggerValue#**
442+
- ``triggerValue()`` : Permet de connaître la valeur du déclencheur du scénario. **=> Deprecated il vaut mieux utiliser le tag #trigger_value#**
443443
- ``round(valeur,[decimal])`` : Donne un arrondi au-dessus, [decimal] nombre de décimales après la virgule.
444444
- ``odd(valeur)`` : Permet de savoir si un nombre est impair ou non. Renvoie 1 si impair 0 sinon.
445445
- ``median(commande1,commande2…​.commandeN)`` : Renvoie la médiane des valeurs.

0 commit comments

Comments
 (0)