Kepasub a écrit:C'est un réel plaisir de partager mes modestes connaissances.
<?php
define('EED_CMD','http://192.168.0.2/script/?exec=lissage.php&periphId=1549815&coeffs=DT=240,KV=288&eedomus_controller_module_id=1694423');
define('SAVE_PATH', 'temp/');
define('EEDGET_PATH', 'http://192.168.0.2/api/get?api_user=LSe1g8&api_secret=gY6topdBw6I94411');
//$arrgetValue = array('1694423'=>'{ "success": 1, "body":{"periph_id": "1694423", "name": "TExt Lissee SondesT", "last_value": "6.126", "last_value_text": "", "unit": " ", "battery": "", "last_value_change": "2021-02-28 11:34:22"}}');
// Recuperation des arguments et sauvegarde dans $eed_tabcmd (var globale)
define ('EED_REPCODE','|');// ou #{}!@$;()-+*
define('EED_SUBSTCODE','?');//code substitution des '"'
// V1.0 : lissage eedomus (2021/02/17)
// Opa95
/*
*******************************************************************************
* Lissage des valeurs par filtre recursif *
* Url de la requete : *
* http://localhost/script/?exec=lissage.php&periphId=[VAR1]&coeffs=[VAR2]&modes=[VAR3] *
* VAR1 : temp_id *
* VAR2 : coeffs DT=deltat ',' KV=Kval ',' DC=Nbdecimales *
* VAR3 : modes MO=auto/reset/init ',' V=ValeurInit si MO=init *
* DT intervalle (secondes) entre 2 mesures *
* KV Coefficient de lissage new = valeur/KV + old*(KV-1)/KV *
* Resultat *
* XPATH : *
* //result=Valeur lissee *
* //value (change ou id) *
* //DT (KV ou DC) *
* //now (old ou new) *
*******************************************************************************
*/
define('ELEMSEP', ',');define('KEYSEP', '=');// separateur cle - valeur
/************************* Fonctions de str2array.php **************************
*******************************************************************************
*Transformation chaine/array et array/chaine *
*Structure cle0=valeur0[,cle1=valeur1[,cle2=valeur2[,.....]]] *
*definir define('ELEMSEP', ',');define('KEYSEP', '=');//separateur cle/valeur *
*appels *
* $chaine=sdk_array2string($tableau,$elemsep=ELEMSEP,$keysep=KEYSEP) *
* $tab=sdk_array2string($chaine,chainedef='',$elemsep=ELEMSEP,$keysep=KEYSEP) *
* sdk_array2string recursif *
******************************************************************************
*/
function sdk_array2json($tab,$lmsep=',',$ksep=':',$lmstr='"',$space=' ',$datastr=true){
// equivalent à json_encode, fonctionne avec tableaux multidimensionnels
$chaine='';
if (count($tab)==0) return '{'.$chaine.'}';
while (false!==$elem = current($tab)) {
if ((is_string($elem)||is_numeric($elem))===false) {
$bof=sdk_array2json($elem,$lmsep,$ksep,$lmstr,$space,$datastr);
$chaine.=$lmstr.key($tab).$lmstr.$ksep.$bof.$lmsep;
}
else {
$chaine.= $lmstr.key($tab).$lmstr.$ksep;
if ($datastr||(($lmstr!='')&&!is_numeric($elem)))
$chaine.=$lmstr.$elem.$lmstr.$lmsep;
else $chaine.=$elem.$lmsep;
}
next($tab);
}
if ($space!=' ') $chaine=str_replace(' ',$space,$chaine);
$chaine=str_replace('{}','[]',$chaine);
$chaine=str_replace('"{','{',$chaine);
$chaine=str_replace('}"','}',$chaine);
$chaine='{'.trim($chaine,$lmsep).'}';
return $chaine;
}
//tableau depuis $chaine 'keyelem'.KEYSEP.'elem'.[ELEMSEP.'keyelem'.KEYSEP.'elem'...]
function sdk_string2array($chaine,$chainedef='',$elemsep=ELEMSEP,$keysep=KEYSEP){
if (strlen($chainedef)>2){// appel recursif
$tableau=sdk_string2array($chainedef,'',$elemsep,$keysep);
}
$bof=explode($elemsep,$chaine);
if (false===strpos($chaine,$keysep)) return $bof;
foreach($bof as $elem){
$elem.=$keysep;
if ((strlen($elem)>0)&&(strpos($elem,$keysep)>0)) {
list($cle,$valeur)=explode($keysep,$elem);
if($cle<>'') $tableau[$cle] = $valeur;
}
}
return $tableau;
}
/********************* Fin de Fonctions de str2array.php***********************/
define('MOD_INIT','auto');//MO:auto,reset,init V:ValeurInit (actif si MO=init)
define('COEFFS_INIT','KV=1,DT=60,DC=3');//KV, DT, DC
//Recuperation des arguments
$periph_id =getArg('eedomus_controller_module_id');// id du programme appelant
$periphid = getArg('periphId');
$list_modes = getArg('modes');
$list_coeffs = getArg('coeffs');
// decodage parametres
$bof=getValue($periphid, true);
$data['value'] = $bof['value'];// eedomus n'accepte pas getValue(...)[Value]
$data['change'] = strtotime($bof['change']);
$data['periph_id'] = $bof['periph_id'];
//decodage coefficients
$coeffs=sdk_string2array($list_coeffs,COEFFS_INIT);
if ($coeffs['KV']<1) {$coeffs['KV']=1;};
//decodage modes
$modes=sdk_string2array($list_modes,MOD_INIT);
// Sauvegarde des valeurs pour reutilisation
$varname='lissage'.$periph_id;
$time=time();
$save='no';
$lastdatastr=loadVariable($varname);
$lastdata=sdk_json_decode($lastdatastr,true);
if (!array_key_exists('MO',$modes)) $modes['MO']=MOD_INIT;
if ((is_string($lastdata))||($modes['MO']!='auto')){
$lastdata=$data;
$lastdata['change']=$time;
if ($modes['MO']=='init') {$lastdata['value']=$modes['V'];}
$save='rst';
}
// valeur lissee (filtrage recursif)
if ($time-$lastdata['change']>=$coeffs['DT']) { //Echantillonage (secondes)
$lastdata['value']=round((($coeffs['KV']-1)*$lastdata['value']+$data['value'])/$coeffs['KV'],$coeffs['DC']);
$save='yes';
}
$timestr='<time>'.PHP_EOL.'<now>'.$time.'</now>'.PHP_EOL.'<old>'.$lastdata['change'].'</old>'.PHP_EOL.'<new>'.$data['change'].'</new>'.PHP_EOL.'</time>'.PHP_EOL;
if ($save!='no') {
$lastdata['change']=time();
$savestr=sdk_array2json($lastdata);
saveVariable($varname,$savestr);
}
$result=$lastdata['value'];
// Affichage des resultats
// Generation du XML
sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xml .= '<result>'.$result.'</result>'.PHP_EOL ;
$xml .= '<donnees>'.PHP_EOL.'<TX>'.$data['value'].'</TX>'.PHP_EOL.'<change>'.$data['change'].'</change>'.PHP_EOL.'<id>'.$data['periph_id'].'</id>'.PHP_EOL.'</donnees>'.PHP_EOL;
$xml .= $timestr;
$xml .= '<const>'.PHP_EOL.'<DT>'.$coeffs['DT'].'</DT>'.PHP_EOL.'<KV>'.$coeffs['KV'].'</KV>'.PHP_EOL.'<DC>'.$coeffs['DC'].'</DC>'.PHP_EOL.'<mode>'.$modes['MO'].'</mode>'.PHP_EOL.'<save>'.$save.'</save>'.PHP_EOL.'</const>'.PHP_EOL;
$xml .='</root>';
echo $xml;
?>
Retour vers Portail web "classique"
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité