Scripts PHP dans les scénarios : qq modestes apports pour débutants

Bonjour,
Cherchant à écrire des scénarios génériques pour tous mes équipements similaires (thermostats de radiateur à eau), je me suis porté rapidement à devoir écrire en PHP des scripts dans mes scénarios. J’ai pas mal perdu de temps à fouiner un peu partout et ce à quoi je suis arrivé peut faciliter le travail des débutants comme moi qui se poseraient les mêmes questions.

En l’occurence il s’agit essentiellement de manipuler les noms d’objets, d’équipements et de commande en PHP.

Voici donc par quoi je commence systématiquement mes blocs « code » pour un scénario applicable à différents déclencheurs sans se payer une bardée de lignes avec des « si xxxx== yyyy » :

//nom de la commande déclencheuse
$t_cmde=cmd::cmdToHumanReadable($scenario-getRealTrigger()); 
//extraction des noms utiles
$objet=strtok($t_cmde,"#[]");
$equipmt=strtok("#[]");
$cmde=strtok("#[]");

On peut ainsi facilement créer un nom de commande complet en réassemblant les morceaux utiles, par exemple :

$cmde_dest = "#[Thermostats][".$equipmt."][Commande Consigne Chauffe]#";

Qu’on peut exploiter facilement en appliquant par exemple pour récupérer la valeur d’une commande.

$valeur = cmd::byString($cmde_dest)->execCmd();

ou écrire une valeur par :

cmd::byString($cmde_dest)->event(($valeur));

Et pour asservir un slider à une valeur donnée (celle là m’a donné pas mal de fil à retordre) et c’est en l’occurrence pour contrôler la consigne de température de mes thermostats :

$cmd_array=array('slider' => $valeur);
cmd::byString($dest_apply)->execCmd($options=$cmd_array, $cache=0);

Voilà c’est toute ma science pour l’instant, mais ça peut en aider d’autres! Désolé si ça vous parait très/trop basique…
Si ça n’est pas clair merci me le signaler!

Je suis bien sûr preneur de toute « astuce » du même genre!

5 « J'aime »

Hello

Va jeter un oeil là Jeedom v4 | Petits codes entre amis | Jeedom by KiboOst
Tu pourras compléter tes notes

1 « J'aime »

Hello
merci pour ton partage
un petit truc pour publier les parties de code

Merci @Fabrice d’avoir modifié ton message

Bonne soirée

4 « J'aime »

@cminssie pour inspiration
mon scénario chauffage
qui provient du plug maxcube avec 2,3 modif
se lance toutes les minutes

$d = date('d-m-Y H:i:s'.substr((string)microtime(), 1, 8).' e');
$scenario->setLog($d); 
$temperatures = array("Salle a manger]",
                      "Cuisine]",
//                      "Chambre Adrien]",
//                      "Chambre Lisa]",
                      "Chambre Ami]",
);
$chaudiere = 0;
// $scenario->setData("chaudiere", $chaudiere);
$cmd_chaudiere = "#[Nouveau Chauffage][Chaudiére][Chaudiére]#";
$cmd = cmd::byString($cmd_chaudiere)->event(($chaudiere));

foreach ($temperatures as $temperature) {
$consigne_cmd = cmd::byString('#[Nouveau Chauffage][Gestion Chauffage][Consignes ' . $temperature . '#');
$setpoint = $consigne_cmd->execCmd();  
$temp_cmd = cmd::byString('#[Nouveau Chauffage][Gestion Chauffage][' . $temperature . '#');
$temp = $temp_cmd->execCmd();
    $temp_difftime = ((new DateTime(date("Y-m-d H:i:s")))->getTimestamp() - (new DateTime($temp_cmd->getCollectDate()))->getTimestamp());
  if ($temp != 0 && $temp < $setpoint - 0.3 && $temp_difftime < 600) {
    $eq = explode("/", str_replace("[", "", str_replace("]", "", str_replace("][", "/", $thermostat))));
    $scenario->setData("last_heat_" . strtolower(str_replace(" ", "_", $eq[0])), date("Y-m-d H:i:s"));
    $chaudiere += $setpoint - $temp;
  }
   $scenario->setLog("sonde : [$temperature température : [$temp] consigne : [$setpoint] temp_difftime : [$temp_difftime]");
  }
$cmd = cmd::byString($cmd_chaudiere)->event(($chaudiere));
// $scenario->setData("chaudiere", $chaudiere);
$scenario->setLog("chaudiere : $chaudiere");
$d = date('d-m-Y H:i:s'.substr((string)microtime(), 1, 8).' e');
$scenario->setLog($d); 

recherche de consigne, températures et dernière remonté < 10mn pour être prise en compte

-----------------------------------
[2020-11-27 23:42:03][SCENARIO] Start : Scenario execute automatiquement sur programmation.
[2020-11-27 23:42:03][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-11-27 23:42:03][SCENARIO] Exécution d'un bloc code
[2020-11-27 23:42:03][SCENARIO] 27-11-2020 23:42:03.2368880 Europe/Brussels
[2020-11-27 23:42:03][SCENARIO] sonde : [Salle a manger] température : [19.9] consigne : [19] temp_difftime : [56]
[2020-11-27 23:42:03][SCENARIO] sonde : [Cuisine] température : [19.6] consigne : [19] temp_difftime : [592]
[2020-11-27 23:42:03][SCENARIO] sonde : [Chambre Ami] température : [15.5] consigne : [12] temp_difftime : [752]
[2020-11-27 23:42:03][SCENARIO] chaudiere : 0
[2020-11-27 23:42:03][SCENARIO] 27-11-2020 23:42:03.3986020 Europe/Brussels
[2020-11-27 23:42:03][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-11-27 23:42:03][SCENARIO] Evaluation de la condition : [0 >= 0.4] = Faux
[2020-11-27 23:42:03][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-11-27 23:42:03][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-11-27 23:42:03][SCENARIO] Evaluation de la condition : [0 == 0] = Vrai
[2020-11-27 23:42:03][SCENARIO] Non exécution des actions pour cause de répétition
[2020-11-27 23:42:03][SCENARIO] Fin correcte du scénario
-------------------------

tu as le temps de son exécution 0,16s

si #[Nouveau Chauffage][Chaudiére][Chaudiére]# >= 0.4
-’ si lastChangeStateDuration(etat) valeur 1 > 1800s

« fonctionne depuis 30mn stop »
stop du scénario (le module zwave à un time off de paramètrer)

– si lastChangeStateDuration(etat) valeur 0 > 300 en marche
« doit attendre 5mn avant se remettre en marche »

si #[Nouveau Chauffage][Chaudiére][Chaudiére]# == 0
off

Bonjour,

Ça ne peut pas marcher ca:

Ceci peut-être

$scenario->getRealTrigger()

Merci MIPS. Il y a eu effectivement un pb lors du copier/coller, le « > » a sauté, mais heureusement mes scénarios originaux marchent bien! Merci pour ta vigilance. Désolé pour le bug.

Je vais de ce pas étudier le lien fourni par naboleo (merci à lui) et le scénario de chauffage de ajja17 car effectivement je suis en pleine réflexion sur la meilleure façon de contrôler finement le chauffage.

Mon idée pour l’instant est de créer pour chaque thermostat de radiateur, un virtuel permettant de définir 4 silders températures (HC/HP/Confort/Eco) et 2 actions-liste à savoir Mode Local (HC/HP/Confort/Eco) et Pilotage (Centralisé, agenda, local, off).

J’ajoute un virtuel supplémentaire « général » qui permet de définir des consignes de température et un mode de fonctionnement applicable à tous les thermostats. Ca permet en une seule action d’asservir tous les thermostats aux mêmes consignes.

Les modes de pilotage sur les thermostats locaux permettent une gestion fine au cas par cas, par le virtuel de centralisation ci-dessus (mode centralisé) ou en local manuel ou à travers son agenda propre (chacun le sien) ou arrêté pour les pièces inutilisées.

Ca donne ça pour le virtuel associé à chaque thermostat :

Vos remarques et suggestions sont bienvenues!