Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

user.function.class.php

Pour parler de tout, et surtout de rien !
Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

user.function.class.php

Message par fensoft » 31 déc. 2018, 14:53

Bonjour à tous,

Je n'ai pas trouvé sur le forum d'endroit avec des fonctions utilitaires "user.function.class.php" utilisable un peu partout.
J'ai donc créé ce topic pour y mettre les miennes et pourquoi pas les votres.

pour l'utiliser, il faut creer un fichier /var/www/html/data/php/user.function.class.php et y mettre:

Code : Tout sélectionner

<?php
require_once dirname(__FILE__) . '/../../core/php/core.inc.php';

class userFunction {
}
les différents codes doivent aller entre le { et le }
Dernière édition par fensoft le 31 déc. 2018, 15:08, édité 1 fois.
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

Re: user.function.class.php

Message par fensoft » 31 déc. 2018, 14:55

Je commence:

myname
je m'en sert avec l'alarme myname(#trigger#) pour avoir des messages plus joli que [Maison][Salon Detecteur Porte][Etat], à la place j'ai Salon Detecteur Porte

Code : Tout sélectionner

  public static function myname($var1) {
    $res = array();
    for ($i = 1; $i != func_num_args(); $i++)
      array_push($res, scenarioExpression::name($var1, trim(func_get_args()[$i])));
        return implode(",", $res);
  }
  
temps
dans mes scénarios je fait un $scenario->setData("mavar", date("Y-m-d H:i:s")); et dans mes virtuels je fait temps(variable(last_heat_sdb)) pour avoir le temps "sympa" entre les deux comme par exemple "3h" (quand on a entre 3 et 4h)

Code : Tout sélectionner

  public static function noquote($var1) {
    return str_replace('"', '', $var1);
  }
  public static function temps($t, $t2 = "") {
    if ($t2 == "")
      $t2 = date("Y-m-d H:i:s");
    $val = abs(DateTime::createFromFormat("Y-m-d H:i:s", self::noquote($t))->getTimestamp() - DateTime::createFromFormat("Y-m-d H:i:s", self::noquote($t2))->getTimestamp());
    if ($val < 60)
      return $val . " s";
    if ($val < 60 * 60)
      return intval($val / 60) . " m";
    if ($val < 60 * 60 * 24)
      return intval($val / (60 * 60)) . " h";
    return intval($val / (60 * 60 * 24)) . " j";
  }
si
la fonction si(var1, var2, res1, res2) renvoie res1 si var1=var2 ou sinon res2, c'est l'équivalent de l'opérateur ternaire var1==var2?res1:res2

Code : Tout sélectionner

	public static function si($var1, $var2, $res1, $res2) {
		if (strpos($var1, '#') !== false)
			$var1 = cmd::byString($var1)->execCmd();
		if (strpos($var2, '#') !== false)
			$var2 = cmd::byString($var2)->execCmd();
		if ($var1 == $var2)
			return $res1;
		else
			return $res2;
  }
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

Avatar de l’utilisateur
marmoul
Actif
Messages : 891
Inscription : 01 sept. 2015, 15:50
Localisation : Haute-Saône (70)

Re: user.function.class.php

Message par marmoul » 31 déc. 2018, 15:07

Au top Merci :)

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: user.function.class.php

Message par winhex » 31 déc. 2018, 15:33

sympas ca s'ajoute à ça
viewtopic.php?f=23&t=40534&p=661920&hil ... hp#p661920
ou l'inverse :D

Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

Re: user.function.class.php

Message par fensoft » 31 déc. 2018, 17:08

oups oui, faut fusionner ça !
perso je crois que je vais faire un "user function marketplace" dans un plugin bientôt, à la façon des widgets
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: user.function.class.php

Message par winhex » 01 janv. 2019, 19:58

la c'est moi qui suis perdu !
a quoi ça va bien pouvoir servir ?

Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

Re: user.function.class.php

Message par fensoft » 02 janv. 2019, 12:39

plutot que de copier/coller des trucs d'ici, il suffira d'aller se servir.
je sais pas trop, tu as peut-être une meilleure idée ?
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: user.function.class.php

Message par winhex » 02 janv. 2019, 23:10

ça y est j'ai compris . :D

c'est sympas de ta part
toi qui voit, selon l'intérêt et se qu'en dit la maison jeedom.

Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

Re: user.function.class.php

Message par fensoft » 03 janv. 2019, 12:55

disons que si on est que 2 ou 3 a créer des fonctions, ça sert pas à grand chose ducoup :)
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

tifred
Timide
Messages : 217
Inscription : 15 sept. 2014, 22:40

Re: user.function.class.php

Message par tifred » 03 janv. 2019, 13:09

Ah tres bonne idée ça me manque des fonctions php perso.
Par contre si tu passes par un fichier user.function.class.php, que se passe t'il si Jeedom fait une mise a jour?
est-ce que le fichier est détruit?
Le plugin et market serait peut-être une solution plus perenne

Avatar de l’utilisateur
noodom
Actif
Messages : 982
Inscription : 13 juil. 2014, 17:25
Contact :

user.function.class.php

Message par noodom » 03 janv. 2019, 13:21

Je ne pense pas qu'il soit détruit puisqu'il a été prévu pour personnaliser jeedom.

Pouvoir les regrouper et les retrouver simplement est une très bonne idée pour les utiliser directement ou s'en inspirer fortement.

Et c'est vrai que la gestion par plugin/marketplace/.. peut être plus simple que la recherche/bookmark de posts qui peuvent disparaître comme ça s'est vu sur d'autres sujets

Avatar de l’utilisateur
fensoft
Actif
Messages : 1314
Inscription : 07 mai 2015, 11:26

Re: user.function.class.php

Message par fensoft » 03 janv. 2019, 14:48

oui mais je ne suis pas sur que loic/jeedom autorise d'écrire ce fichier à partir d'un plugin (car ça peux planter jeedom, même si je comptais faire un paquet de tests avant d'écrire ce fichier)
Coin!
Thermostat lowcost MaxCube DataTransfert (upload vers cloud)
Développeur embarqué (rtos/drivers linux/c/xilinx/atmel/pic/arm/mips), système (linux,docker,qnx), scientifique (c++/python/mongodb), web (php/mysql), webservices (java/nodejs)

superbricolo
Actif
Messages : 543
Inscription : 01 janv. 2016, 12:45
Contact :

Re: user.function.class.php

Message par superbricolo » 03 janv. 2019, 14:58

Très intéressant, je ne connaissais pas cette possibilité.
Jeedom mini PC Core I5 4300U ESXI
Zwave: Z-Stick Gen5, 31 noeuds, XIAOMI: 13 périph RFLINK,RFPLAYER,ZIBASEDOM: OWL, sondes Oregon,Livolo,X2D STARBOX F03, ECO-DEVICE, Bluetooth, ORVIBO, Karotz, RM PRO
Ecran tactile sur Pi 3, Google Home
Site météo: flash.galaxy.free.fr

Avatar de l’utilisateur
domoggvad
Actif
Messages : 1880
Inscription : 29 avr. 2015, 16:02
Localisation : Seine-Saint-Denis (Villepinte)

Re: user.function.class.php

Message par domoggvad » 29 janv. 2019, 19:24

Très bonne idée..

Envoyé de mon Redmi S2

3 Odroid C2 (Prod - secours - test) Z83 tests: rfxcom + Z-wave- Clims DAIKIN - espeasy - thekey - Xiaomi - Telinfo - broadlink... widget V3 :viewtopic.php?f=29&t=44183&p=717810#p717810

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: user.function.class.php

Message par winhex » 10 juin 2019, 19:07

un petit up avant oublie
melange de 2 commandes custom

si (état == 1 = Arrivée sinon Depart)
valueDateCustom = date au format souhaité
commande custom.png
commande custom.png (8.42 Kio) Consulté 3746 fois

Code : Tout sélectionner

str_replace('"', "", si(#[Recapitulatif][Présence][Lisa]#,1,Arrivée ,Départ ) valueDateCustom(#[Recapitulatif][Présence][Lisa]#))
soit dans le fichier
user.function.class.php

Code : Tout sélectionner

        public static function valueDateCustom($_cmd_id, $_locale = 'fr_FR.utf-8', $_format = 'le %A %d/%m à %H\h%M')
        {
                $cmd = cmd::byId(trim(str_replace('#', '', $_cmd_id)));
                if (!is_object($cmd)) {
                        return '';
                }
                $cmd->execCmd();

                setlocale(LC_TIME, $_locale);
                return ucfirst(strftime($_format, strtotime($cmd->getValueDate())));
        }
et

Code : Tout sélectionner

  	public static function si($var1, $var2, $res1, $res2) {
        // https://www.jeedom.com/forum/viewtopic.php?f=59&t=41804
		if (strpos($var1, '#') !== false)
			$var1 = cmd::byString($var1)->execCmd();
		if (strpos($var2, '#') !== false)
			$var2 = cmd::byString($var2)->execCmd();
		if ($var1 == $var2)
			return $res1;
		else
			return $res2;
  }
par sécurité ouvrir cette page dans 2 onglets de navigateur avant modif
editeur.png
editeur.png (258.57 Kio) Consulté 3737 fois

winhex
Actif
Messages : 3799
Inscription : 23 janv. 2015, 01:41

Re: user.function.class.php

Message par winhex » 22 juil. 2019, 01:19

un ajjout en reprenant le script "minMaxVal"

sauf que j'y met une recupération heure
la commande sera
minMaxDate($minOrMax, $_cmd_id, $start, $end,$dateFormat)
minOrMax = min/max
_cmd_id = la cmd
start = debut
end = fin
dateFormat = le format date
soit concretement

Code : Tout sélectionner

minMaxDate(max,#[Dehors][Sondes Nord][Température]#,yesterday,-1day23:59,d\ M\ à\ H:i)
et le resultat pour le max hier entre
2019-07-21 00:00
et
2019-07-21 23:59
Je vais évaluer : "21 Jul à 15:52"
Résultat : 21 Jul à 15:52
ou cumulé avec le max

Code : Tout sélectionner

str_replace('"', '',max(#[Dehors][Sondes Nord][Température]#,yesterday) minMaxDate(max,#[Dehors][Sondes Nord][Température]#,yesterday,-1day23:59,à\ H:i))
Je vais évaluer : "31.5 à 15:52"
Résultat : 31.5 à 15:52

Code : Tout sélectionner

    public static function minMaxDate($minOrMax, $_cmd_id, $start, $end,$dateFormat)  {
      // minMaxDate(min,#[Dehors][Sondes Nord][Température]#,yesterday,-1day23:59)
date_default_timezone_set("Europe/Paris");



$startEval = date('Y-m-d H:i', ereg("[0-9]{4} [0-9]{4}", $start) ? DateTime::createFromFormat('md Hi', $start)->getTimestamp() : strtotime($start)); 
$endEval = date('Y-m-d H:i', ereg("[0-9]{4} [0-9]{4}", $end) ? DateTime::createFromFormat('md Hi', $end)->getTimestamp() : strtotime($end)); 
 $cmdId = cmd::byString($_cmd_id)->getId(); 
      $all = history::all($cmdId, $startEval, $endEval);
      $ali = history::getStatistique($cmdId, $startEval, $endEval)[$minOrMax];
      if(count($all) == 0) echo "Pas de valeurs sur la période donnée";

$current = $all[0];
$current = $all[0];
for ($i = 0; $i < count($all); $i++) {
  $v = $all[$i];
  if($minOrMax == "max" && $v->getValue() >= $current->getValue())
  	$current = $v;
  if($minOrMax == "min" && $v->getValue() <= $current->getValue())
  	$current = $v;
} 
 return date ($dateFormat, strtotime($current->getDatetime()));   
      
        }

capic
Timide
Messages : 23
Inscription : 28 janv. 2019, 09:43

Re: user.function.class.php

Message par capic » 27 août 2019, 21:40

Bonjour,

je me casse les dents sur une userFunction que j'essaye de mettre en place.
Pour faire simple, je suis entrain d'essayer de créer des fonctions qui vont me permettre de gérer mes variables de scenario comme des tableaux.
Si je ne me trompe pas, les variables dans les scénarios sont gérer comme étant des string, donc j'aimerai faire une fonction qui va empiler dans ma variable, en concaténant avec un séparateur, les différentes valeurs que je veux stocker (ex avec le pipe comme séparateur: "a | b | c | d").

J'ai créé une fonction qui a cette signature: addKeyValueToArrayVariable($variable, $value), cela pourrait marcher dans un cas simple comme mon petit exemple, là où ça ne fonctionne plus c'est si $value est une chaine de caractère qui contient des virgules et que je l'utilise dans une action variable.
Dans ce cas bien précis, la virgule sera considéré comme un séparateur d'arguments de la fonction.

Je ne sais pas si j'ai été clair, mais si oui est ce que quelqu'un aurait une idée d'une façon de contourner le problème ?

Merci d'avance

Avatar de l’utilisateur
Jeandhom
Actif
Messages : 1386
Inscription : 20 oct. 2015, 17:32

Re: user.function.class.php

Message par Jeandhom » 27 août 2019, 23:15

Ça ne fonctionne pas avec les caractères d’échappement ?

capic
Timide
Messages : 23
Inscription : 28 janv. 2019, 09:43

Re: user.function.class.php

Message par capic » 27 août 2019, 23:22

j'avais essayé mais non, idem en essayant de mettre des doubles quote autour des arguments

EDIT:
Une solution de contournement est de passer par un bloc code, de faire un require sur le fichier userFunction et d'utiliser la fonction, mais dans ce cas comment on utilise les tags comme #heure# ?

Avatar de l’utilisateur
m.georgein
Timide
Messages : 299
Inscription : 18 mars 2016, 23:46
Localisation : 13820

Re: user.function.class.php

Message par m.georgein » 28 août 2019, 19:01

bonjour,
deux petites questions :
1) Quelle est la syntaxe pour appeler une 'userFonction' depuis un bloc code, j'ai fait différents essais mais sans succès :(
2) La variable $scenario n'étant à priori pas existante, comment appeler les fonctions de type $scenario->getData($varName); dans une 'userFonction'.
Si quelqu'un à des réponses, merci d'avance !
Plateforme :
NUCNUC6i5SYK en VM STRETCH
Version Jeedom 4.0.9
Version PHP 7.0.33-0+deb9u1
Version OS Linux debian9 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux [9.6]
Version database 10.1.26-MariaDB-0+deb9u1

Répondre

Revenir vers « Discussions Générales »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invités