par opa95 » 07 Fév 2023 11:43
Bonjour
Voici la dernière version (V1.2) qui affiche l'état du MSUNPV et permet d'envoyer des commandes.
Les informations nécessaires sont en tête de script, en attendant une doc et peut être une mise sur le STORE (je n'ai pas le temps).
Sauver le script MSUNPV.php et le transférer sur l'eedomus.
Créer des capteurs HTTP pour récupérer les informations : Mettre l'adresse IP du MSUNPV dans VAR1
Faire les appels avec
http://localhost/script/?exec=MSUNPV.php&url=[VAR1]
Faire les lectures avec //conso.... ou //inAns/@v0...
Créer des actionneurs HTTP pour envoyer des commandes : cmd1 (routeur1), cmd2 (routeur2) ou cmdtest
Créer les valeurs 3 valeurs pour les cmd, 4 valeurs pour cmdtest (cf. script) en remplissant Valeur brute, description et URL
exemple : 2, manuel et
http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmd1=2
Tester et signaler les problèmes ou les améliorations souhaitées (je ne peux pas tester les commandes car je n'ai pas de MSUNPV)
- Code : Tout sélectionner
<?php
/****************************************************************************
* optimisateur de production solaire MSUNPV.php por eedomus
* V1.0 : opa95 2023-02-03 niveaux instantanes
* V1.1 : opa95 2023-02-05 généralisation tests par flc85 et Scalaire
* V1.2 : opa95 2023-02-07 modification des commandes tests par flc85
* ligne decommande http://localhost/script/?exec=MSUNPV.php&url=[VAR1]
* ligne decommande http://localhost/script/?exec=MSUNPV&php&url=[VAR1]&cmd1=a
* ligne decommande http://localhost/script/?exec=MSUNPV&php&url=[VAR1]&cmd2=b
* avec VAR1 : adresse ip du MSUNPV
* avec a et b = 0 ou off, 1 ou manuel, 2 ou auto
* ligne decommande http://localhost/script/?exec=MSUNPV&php&url=[VAR1]&cmdtest=c
* avec c = 1 ou injection, 2 ou zero_injection, 4 ou moyen, 8 ou fort
* récupération avec un capteur HTTP
*Récupération des valeurs dans XPATH par //champ/@vi (i de 0 à 15)
* //rtcc/@v0
* //paramSys/@v0 à //paramSys/@v11
* //inAns/@v0 à //inAns/@v15
* //survMm/@v0 à //survMm/@v15
* //cmdPos/@v0 à //cmdPos/@v7
* //outStat/@v0 à //outStat/@v15
* //cptVals/@v0 à //cptVals/@v7
* //chOutVal/@v0 à //chOutVal/@v7
*Récuperations ciblées
* //time //timestamp //conso //production> //routage_1 //routage_2 //tension
* //powbal1 //powbal2 //enConso //enProd //enPV_J //enPV_P
* //heure //date //etat //intervalle //nom //version //sn //cmd1 //cmd2 //test_routeur
*Envoi de commande avec un actionneur HTTP
* pour cmd1, mettre les valeurs [Valeur Brute, Description,URL] et l'équivalent pour cmd2
* 0 off http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmd1=0
* 1 manuel http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmd1=1
* 2 manuel http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmd1=2
* pour cmdtest, mettre les valeurs
* 1 injection http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmdtest=1
* 2 zero_injection http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmdtest=2
* 4 moyen http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmdtest=4
* 8 fort http://localhost/script/?exec=MSUNPV.php&url=[VAR1]&cmdtest=8
*Contenu du xml renvoyé (exemple)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<time>2023-02-05 14:16:45</time>
<timestamp>1675603005</timestamp>
<current>
<conso>-1957.3</conso> <production>-5953.5</production> <routage_1>400</routage_1>
<routage_2>400</routage_2> <tension>227.5</tension> <powbal1>1.1</powbal1>
<powbal2>2917.7</powbal2> <enConso>9042.6</enConso> <enProd>-118.1</enProd>
<enPV_J>-7772.8</enPV_J> <enPV_P>-1416199.2</enPV_P> <heure>14:16:45</heure>
<date>05/02/2023</date> <etat>On</etat> <intervalle>01:00</intervalle>
<nom>MS_PV4_2</nom> <version>5.0.1</version> <sn>dl0420a</sn>
<cmd1>auto</cmd1> <cmd2>auto</cmd2> <test_routeur>zero_injection</test_routeur>
</current>
<rtcc v0="14:16:44 DI" />
<paramSys v0="14:16:45" v1="05/02/2023" v2="On" v3="01:00" v4="0.0" v5="MS_PV4_2" v6="5.0.1"
v7="dl0420a" v8="102e" v9="102c" v10="00:00" v11="00:00" />
<inAns v0="-1957.3" v1="-5953.5" v2="400" v3="400" v4="227.5" v5="1.1" v6="2917.7" v7="0.0"
v8="0.0" v9="0.0" v10="0.0" v11="0.0" v12="0.0" v13="0.0" v14="0.0" v15="0.0" />
<survMm v0="0" v1="0" v2="0" v3="0" v4="0" v5="0" v6="0" v7="0" v8="0" v9="0"
v10="0" v11="0" v12="0" v13="0" v14="0" v15="0" />
<cmdPos v0="10" v1="0" v2="0" v3="0" v4="0" v5="0" v6="0" v7="2" />
<outStat v0="100" v1="100" v2="0" v3="0" v4="0" v5="0" v6="0" v7="0"
v8="0" v9="0" v10="0" v11="0" v12="0" v13="0" v14="0" v15="0" />
<cptVals v0="90426" v1="-118.1" v2="-7772.8" v3="-1416199.2" v4="0" v5="0" v6="0" v7="0" />
<chOutVal v0="0" v1="0" v2="0" v3="255" v4="0" v5="0" v6="0" v7="0" />
</root>
**************************************************************************/
function sdk_set_command($cmd1,$cmd2) {//$command 0,1,2)
$cmd1 = min($cmd1%4,2);
$cmd2 = min($cmd2%4,2);
$command = $cmd1 + 4*$cmd2;
if ($command == 10) $command = 'a';
return $command;//nombre entre 0 et 10
}
function sdk_get_command($command) {//$command entre 0 et 10, select 0 ou 1
if (strtolower($command) == 'a') $command = 10;
$command = min($command,10);
$arr_cmd[1] = $command%4;
$arr_cmd[2] = round(($command - $arr_cmd[1])/4);
return $arr_cmd;
}
function sdk_num_command($cmd) {//$cmd off, manuel, auto
$cmd = trim(strtolower($cmd));
switch ($cmd) {
case '0' :
case 'off' : $cmd = 0;
break;
case '1' :
case 'manuel' : $cmd = 1;
break;
case '2' :
case 'auto' : $cmd = 2;
break;
default : $cmd = '*';
}
return $cmd;
}
$hexa = array('cmdPos','cptVals','chOutVal');//Champ hexa
$inAns = array('conso','production','routage_1','routage_2','tension','powbal1','powbal2');
$cptVals = array('enConso','enProd','enPV_J','enPV_P');
$paramSys = array('heure','date','etat','intervalle','','nom','version','sn');
$cmdPos = array('cmd0','','','','','','','test_routeur');
$arr_cmds = array('off','manuel','auto');
$arr_tests = array(1 => 'injection',2 => 'zero_injection',4 => 'moyen',8 => 'fort');
$max_int_pos = 0X100000000;
$max_int = ($max_int_pos+1)*2;
$url_ = getArg('url');
$url = $url_.'/status.xml';
$url_cmd = $url_.'/index.xml';
$cmd1_ = sdk_num_command(getArg('cmd1',false,''));
$cmd2_ = sdk_num_command(getArg('cmd2',false,''));
$cmd_test_ = getArg('cmdtest',false,'0');
if (in_array($cmd_test_, array(1,2,4,8))) { $cmd_test = $cmd_test_;}
else {
$cmd_test = 0;
foreach($arr_tests as $key => $item) {
if ($cmd_test_ == $item) {
$cmd_test = $key;
break;
}
}
}
$response = httpQuery($url, 'GET', '','', $header);
$response1 = xpath($response,'cmdPos');
$old_command = explode(';',$response1);
$old_cmds = sdk_get_command($old_command[0]);
if ($cmd1_ === '*') $new_cmds[1] = $old_cmds[1];
else {$new_cmds[1] = $cmd1_; }
if ($cmd2_ === '*') $new_cmds[2] = $old_cmds[2];
else {$new_cmds[2] = $cmd2_;}
if ($cmd_test == 0 ) $cmd_test = $old_command[7];
$is_new_command = ($new_cmds[1] != $old_cmds[1]) || ($new_cmds[2] != $old_cmds[2]) || ($cmd_test != $old_command[7]);
$cmd = sdk_set_command($new_cmds[1],$new_cmds[2]);
if ($is_new_command){
$parS=$cmd.';';
foreach ($old_command as $key => $item){
if ($key == 0) continue;
if ($key == 7) break;
$parS .= $item.';';
}
$parS = str_replace(';;',';',$parS.$cmd_test);
$url1 = $url_cmd.'?parS='.$parS;
$response = httpQuery($url1, 'POST', '','', $header);
}
$response = xpath($response,"concat('rtcc=',//rtcc,'@paramSys=',//paramSys,'@inAns=',//inAns,'@survMm=',//survMm,'@cmdPos=',//cmdPos,'@outStat=',//outStat,'@cptVals=',//cptVals,'@chOutVal=',//chOutVal)");
$response = trim(str_replace(';@','@',$response));
$response = str_replace(',','.',$response);
$arr_response = explode('@',$response);
foreach ($arr_response as $field) {
list($key,$values) = explode('=',$field);
$arrValue = array();
$arr_values = explode(';',$values);
if (in_array($key,$hexa)) {
foreach ($arr_values as $value){
$value = trim($value);
if ($value != '') {$result[$key][] = hexdec($value);}
}
}
else {
foreach ($arr_values as $value){
$value = trim($value);
if ($value != '') $result[$key][] = $value;
}
}
}
//var_dump($result);
$cmds = sdk_get_command($result['cmdPos'][0]);
$heure = $result['paramSys'][0];
list($day,$month,$year) = explode('/',$result['paramSys'][1]);
$date = $year.'-'.$month.'-'.$day;
$timestamp = strtotime($date.' '.$heure);
$time = date('Y-m-d H:i:s',$timestamp);
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= ' <root>'.PHP_EOL;
$xml .= ' <time>'.$time.'</time> '.PHP_EOL;;
$xml .= ' <timestamp>'.$timestamp.'</timestamp>'.PHP_EOL;;
$xml .= ' <current>'.PHP_EOL.' ';
$key = 'inAns';
$ind = 0;
foreach ($inAns as $item){
if ($item != '') $xml .= '<'.$item.'>'.$result[$key][$ind].'</'.$item.'> ';
$ind++;
}
$key = 'cptVals';
$ind = 0;
foreach ($cptVals as $item){
if ($item != '') {
if ($result[$key][$ind]<=$max_int_pos) {
$xml .= '<'.$item.'>'.($result[$key][$ind]/10).'</'.$item.'> ';
}
else {
$result[$key][$ind] = ($result[$key][$ind]-$max_int)/10;
$xml .= '<'.$item.'>'.$result[$key][$ind].'</'.$item.'> ';
}
$ind++;}
}
$key = 'paramSys';
$ind = 0;
foreach ($paramSys as $item){
if ($item != '') $xml .= '<'.$item.'>'.$result[$key][$ind].'</'.$item.'> ';
$ind++;
}
$xml .= '<cmd1>'.$arr_cmds[$cmds[1]].'</cmd1> '.'<cmd2>'.$arr_cmds[$cmds[2]].'</cmd2> ';
$key = 'cmdPos';$ind = 7;
$xml .= '<'.$cmdPos[$ind].'>'.$arr_tests[$result[$key][$ind]].'</'.$cmdPos[$ind].'>';
$xml .= PHP_EOL.' </current>'.PHP_EOL;
foreach ($result as $key => $value){
$xml .= ' <'.$key.' ';
foreach ($result[$key] as $key1 => $value1){
$xml .= 'v'.$key1.'="'.$value1.'" ';
}
$xml .= '/>'.PHP_EOL;
}
$xml .= ' </root>'.PHP_EOL;
echo $xml;
?>
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)