Déterminer la pièce la plus froide (comparaison entre plusieurs valeurs)

Bonjour,
Afin de profiter pleinement de mes nouveaux panneaux solaires, et soulager ma cuve de fuel, je souhaiterais sur-chauffer en journées (ensoleillées) mes pièces avec des radiateurs électriques.
Par contre, pour faire les choses bien, j’aurais aimé déterminer quelle est la pièce la plus froide afin de déclencher en priorité le radiateur de l’endroit qui en a le plus besoin (et les faire les uns après les autres pour ne pas acheter d’électricité).
Ne sachant que faire des comparaisons qu’entre deux valeurs (et ayant plus de deux pièces chez moi :stuck_out_tongue_closed_eyes:), est ce que quelqu’un pourrait m’aiguiller pour démarrer proprement mon scénario.
Exemple:
#[Pièce 1][Thermostat Pièce 1][Température]# = 19.2
#[Pièce 2][Thermostat Pièce 2][Température]# = 18.3
#[Pièce 3][Thermostat Pièce 3][Température]# = 19
#[Pièce 4][Thermostat Pièce 4][Température]# = 18.1
#[Pièce 5][Thermostat Pièce 5][Température]# = 19.3
→ Exécution de #[Pièce 4][Radiateur élec][On]#

En vous remerciant d’avance

Bien cordialement

Jeedolm n’est pas hyper fort pour fair ede la comparaison inter-equipememnt ou interpièce !!!

Je peux te proposer un bloc code :

// Création d'un tableau pour stocker les températures des pièces
$temperatures = array(
    "Pièce 1" => cmd::byString('#[Pièce 1][Thermostat Pièce 1][Température]#')->execCmd(),
    "Pièce 2" => cmd::byString('#[Pièce 2][Thermostat Pièce 2][Température]#')->execCmd(),
    "Pièce 3" => cmd::byString('#[Pièce 3][Thermostat Pièce 3][Température]#')->execCmd(),
    "Pièce 4" => cmd::byString('#[Pièce 4][Thermostat Pièce 4][Température]#')->execCmd()
);

// Tri du tableau par température
asort($temperatures);

// Récupération de la première entrée du tableau trié (la pièce la plus froide)
$piece_la_plus_froide = key($temperatures);
$temperature_la_plus_froide = $temperatures[$piece_la_plus_froide];

$scenario->setLog( "La pièce la plus froide est : " . $piece_la_plus_froide . " avec une température de " . $temperature_la_plus_froide . "°C.");

// Stockage du résultat dans des tags Jeedom
$scenario->setTags(array('piece_la_plus_froide' => $piece_la_plus_froide, 'temperature_la_plus_froide' => $temperature_la_plus_froide));

// Pour utiliser ces tags dans un autre scénario, utilisez tag(piece_la_plus_froide) et tag(temperature_la_plus_froide)

(fait avec chatGPT :wink:)

Ensuite, soit tu continues en bloc code, soit tu recupereres la pièce via les tags et avec des SI

SI <piece 1> Alors 
     mettre le chauffage dans Pièce 1 
     Eteindre dans toutes les autres pièces
SI <piece 2> Alors .....

Norbert

Il (le chat) aurait pu just proposer:

min(val1, val2...)

https://www.php.net/manual/fr/function.min.php

mais on peut faire plus compliqué effectivement :wink:

2 « J'aime »

Et comment tu récupères ensuite la pièce concernée pour lancer le chauffage :wink:
sans compter que min, coté jeedom correspond à la recup d’un min dans une même commande

min(commande,période) & minBetween(commande,start,end) : Donnent le minimum de la commande sur la période (period=[month,day,hour,min] ou expression PHP) ou entre les 2 bornes demandées (sous la forme Y-m-d H:i:s ou expression PHP).

$tempCmds = array(
    cmd::byString('[Pièce 1][Thermostat Pièce 1][Température]'),
    cmd::byString('[Pièce 2][Thermostat Pièce 2][Température]'),
    cmd::byString('[Pièce 3][Thermostat Pièce 3][Température]'),
    cmd::byString('[Pièce 4][Thermostat Pièce 4][Température]')
);
$tempMin = 300;
$pieceMin = null;
foreach ($tempCmds as $cmd) {
   $temp =  $cmd->execCmd();
   if ($temp < $tempMin) {
      $tempMin = $temp;
      $pieceMin = $cmd->getEqLogic();
   }
}

$scenario->setLog( "La pièce la plus froide est : " . $pieceMin->getHomanName() . " avec une température de " . $tempMin . "°C.");

oui ca je me suis posé la question en l’écrivant mais j’ai pourtant des scénarios avec max et ca fonctionne; faudrait que je creuse
et ca va d’autant plus fonctionner dans un bloc code

mais min tout seul va pas suffir on est d’accord, la solution du sort est très bien et surtout fonctionne!

Je confirme que je regarde la temp min de plusieurs pièces pour activer ou non le chauffage et que ca fonctionne a priori :grinning:

Merci énormément pour vos retours :smile:, par contre, j’ai quand même quelques problèmes (sans doute à cause de mon niveau inférieur à 0 en code :crazy_face:):

Je n’arrive pas à récupérer les tags pour mes blocs SI…

Exécution du sous-élément de type [condition] : if tag(piece_la_plus_froide) == 'Salle'
Evaluation de la condition : ["" == 'Salle'] = Faux

Exécution du sous-élément de type [condition] : if tag(temperature_la_plus_froide) < 19
Evaluation de la condition : ["" < 19] = Vrai

@ktn :
J’ai également testé ta solution, mais ça me retourne ceci:

Commande introuvable : [Salle][Thermostat Salle][Température] => [Salle][Thermostat Salle][Température]

J’ai donc ajouté les # avant et après la commande, du coup, j’ai ça:

Call to undefined method thermostat::getHomanName()

En tout cas, vous êtes top de vous pencher sur mes problèmes, et une fois de plus, désolé d’être une bille en code :woozy_face:

getHumanName()
Désolé, je n’ai pas de Jeedom sous la main pour tester. Il peut donc y avoir des fautes de frappe/syntaxe.

Les « # » dans les appels à « cmd::byString() » doivent être inutiles car la première chose que fait cette fonction est de les enlever s’il y en a.

Merci pour ton retour, en effet, ça va mieux sans la faute de frappe :stuck_out_tongue:, par contre, je te confirme que les ‹ # › sont obligatoire, et le code me retourne ça dans les logs:
La pièce la plus froide est : [Cuisine][Thermostat Cuisine] avec une température de 19.1°C.

De plus, peux-tu m’indiquer comment récupérer les tag dans mon scénario? (j’ai essayé de rajouter ça, mais ça marche pas, le tag(pieceMin) me répond toujours "" )

$tags = $scenario->getTags();
$tags['#pieceMin#'] = $pieceMin;
$tags['#tempMin#'] = $tempMin;
$scenario->setTags($tags);

Merci de nouveau

ChatGPT m’a trouvé ma bourde (merci @ngrataloup pour le conseil :stuck_out_tongue_closed_eyes:)
voici donc le code que je vais utiliser:

$tempCmds = array(
    cmd::byString('#[Salle][Thermostat Salle][Température]#'),
    cmd::byString('#[Cuisine][Thermostat Cuisine][Température]#'),
    cmd::byString('#[TV][Thermostat TV][Température]#'),
);

$tempMin = 300;
$pieceMin = null;

foreach ($tempCmds as $cmd) {
    $temp =  $cmd->execCmd();
    if ($temp < $tempMin) {
        $tempMin = $temp;
        $pieceMin = $cmd->getEqLogic();
    }
}

$scenario->setLog("La pièce la plus froide est : " . $pieceMin->getHumanName() . " avec une température de " . $tempMin . "°C.");

// Récupérer les tags actuels du scénario
$tags = $scenario->getTags();

// Mettre à jour les valeurs des tags
$tags['#piece_Min#'] = $pieceMin->getHumanName(); // Utiliser getHumanName() pour obtenir le nom de la pièce
$tags['#temp_Min#'] = $tempMin;

// Réaffecter les tags mis à jour au scénario
$scenario->setTags($tags);

Bon , je récupère le tag sous la forme "[TV][Thermostat TV]" (et non pas que le nom de la pièce), mais rien de bien gênant pour la suite de mon scénario :wink:

Un très grand merci à vous tous :smile:

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.