Voici une humble contribution pour ceux qui, comme moi, ont une chaudière Viessmann connecté via le cloud VITODATA100/VITOTROL.
Code : Tout sélectionner
<?php
/*
Script viessmann version 1.0 par Michel Manceron
Permet de recuperer et gerer au minima la commande de gestion du système de chauffage Viessmann Vitodata 100
- Le script lancé sans parmètre : Récupération des données du chauffage (paramètre dans $DataIds)
- Envoyer une information au système de chauffage (par ex: passer en mode economique, ...
le script permet la récupération des informations dans un fichier au format JSON "viessmann.json" dans le même répertoire que fichier script "Viessmann.php"
le script est lancé par le plugin script
Update des informations:
Nom : Update
Type Script: Script
Type: Action et défaut
Requête: /var/www/html/plugins/script/core/ressources/Viessman.php
le numéro de l'information est la clef pour y acceder: l'accès se fait par le plugin script, avec comme requete :
"numInformation>Wert"
exemple: Nom: Temp_Exterieur
type Script: JSON
Type: info et Numérique
Requête: 5373>Wert
Options: https://AdresseJeedom/plugins/script/core/ressources/viessmann.json
Unité: °
Modification des paramètres:
exemple:
Nom : Eco_on (Valeur de la commande : ModeEconomique)
Type Script: Script
Type: Action et défaut
Requête: /var/www/html/plugins/script/core/ressources/Viessman.php 7853=1
Il est nécessaire de modifier la valeur des variables Users : $login, $Pass, $Installation
2017/11/17 - Version 1.0 Version initiale
*/
// Variable Users
$Login = "Adresse@Mail";
$Pass = "Password";
$Installation = "RéférenceDeInstallation";
// nom du fichier log
$filelog ='Script_Viessmann';
$directorylog= dirname(__FILE__)."/../../../../log";
// initialisation des variables
$InstallationID = '';
$AppareilID = '';
// Tableau des points d'information à interroger
$DataIds = array();
array_push ($DataIds,104,111,245,5372,5373,5374,5385); // groupe Chaudière
array_push ($DataIds,5272,5273,5274,5276,5277,5279); // groupe Solaire
array_push ($DataIds,77,89,94,709,718,730,5376,6053,7853,7856); //groupe Chauffage
array_push ($DataIds,5280,5381,7179,7181); //groupe ECS
// Adresse de l'API
$client = new SoapClient('https://www.viessmann.com/app_vitodata/VIIWebService-1.16.0.0/iPhoneWebService.asmx?WSDL');
$anlageID = 0;
/* fonction login
permet de se connecter à une installation. cette fonction récupère l'installationID et AppareilID
retour de true/false suivant la connexion
*/
function login(){
global $client,$anlage,$Login,$Pass,$Installation,$InstallationID,$AppareilID;
$flag = false;
$DataArray = array('Benutzer'=> $Login,
'Passwort'=> $Pass,
'Betriebssystem'=>'Debian9',
'AppId'=>'Jeedom',
'AppVersion'=>'1.0');
$out = time()+30;
while ( $out > time()) {
try
{
$response = $client->GetStateOfConnection();
if ($response->GetStateOfConnectionResult->Ergebnis == 6) {
$response = $client->login($DataArray);
if ($response->LoginResult->Ergebnis == 0){
write_log ('Connexion effectuées.');
$response = $client->getDevices();
foreach ($response->GetDevicesResult->AnlageListe as $key => $value) {
if ($value->AnlageName == $Installation) {
write_log ('installation : '. $value->AnlageId);
$InstallationID = $value->AnlageId;
foreach ($value->GeraeteListe as $key1 => $value1) {
write_log ('Appareil : '. $value1->GeraetId );
$AppareilID = $value1->GeraetId;
$flag = true;
}
}
}
}
}
}
catch (Exception $e){
write_log ('Err: ('.$e->getCode().')'.$e->getMessage() );
}
if ($flag) {break;}
sleep(5);
}
return $flag;
}
/* fonction logout
permet de se déconnecter du système de chauffage
pas de valeur de retour
*/
function logout(){
global $client;
$flag = false;
$out = time()+30;
while ( $out > time()) {
try{
$response = $client->logout();
if ($response->LogoutResult == 1 ) {
write_log ("Deconnexion du service");
break;
}
}
catch (Exception $e) {
write_log ('Err: ('.$e->getCode().')'.$e->getMessage() );
}
sleep(5);
}
}
/* fonction getInfoPoints
interroge le système de chauffage sur tous les noeuds disponible
retourne un tableau avec le Nom de l'information
*/
function getInfoPoints(){
global $client,$InstallationID,$AppareilID;
write_log ("Chargement des infos sur les noeuds de l'installation.");
$DataArray = array(
'AnlageId'=> $InstallationID,
'GeraetId'=> $AppareilID,
);
$out = time()+30;
while ( $out > time()) {
try{
$response = $client->GetTypeInfo($DataArray);
foreach ($response->GetTypeInfoResult->TypeInfoListe->DatenpunktTypInfo as $key => $value) {
$table[$value->DatenpunktId] =array('Name' => $value->DatenpunktName,
'iswriteable' => $value->IstSchreibbar
);
}
write_log (" Nombre de noeuds : ".count($table));
break;
}
catch (Exception $e) {
write_log ('Err: ('.$e->getCode().')'.$e->getMessage() );
}
sleep(5);
}
return $table;
}
/* fonction refreshInfos
interroge les noeuds du système de chauffage
retourne un tableau avec le Nom de l'information et la valeur de chaque noeuds
*/
Function refreshInfos(){
global $client,$InstallationID,$AppareilID,$TableInfo,$DataIds;
write_log ("Demande de rafraichissement des données....");
$DataArray = array(
'AnlageId'=> $InstallationID,
'GeraetId'=> $AppareilID,
'DatenpunktIds' => $DataIds
);
$response = $client->RefreshData($DataArray);
$DataArray_temp = array(
'AktualisierungsId'=> $response->RefreshDataResult->AktualisierungsId,
);
$flag = false;
$out = time()+90;
while ( $out > time()) {
$response1 = $client->RequestRefreshStatus ($DataArray_temp );
write_log ("Status de la demande de rafraichissement : ".status2string($response1->RequestRefreshStatusResult->Status));
if ($response1->RequestRefreshStatusResult->Status == 4) {
$flag = true;
break;
}
sleep(5);
}
//sleep(30);
if ($flag){
$flag = false;
if ($response->RefreshDataResult->Ergebnis == 0) {
$out = time()+90;
while ( $out > time()) {
$response = $client->GetData($DataArray);
if ($response->GetDataResult->Ergebnis == 0) {
foreach ($response->GetDataResult->DatenwerteListe->WerteListe as $key => $value) {
$Table[ $value->DatenpunktId ]=array (
"Wert" => $value->Wert,
"Zeitstempel" => $value->Zeitstempel,
"Name" => $TableInfo[$value->DatenpunktId]['Name'],
"iswriteable" =>$TableInfo[$value->DatenpunktId]['iswriteable']
);
}
write_log ("rafraichissement des données effectuées");
$flag = true;
break;
}
sleep(5);
}
}
if (!$flag){
write_log ("intérrogation des noeuds impossible !");
}
}
else
{
write_log ("demande de rafraichissement non aboutie !");
}
return $Table;
}
/* fonction WriteData
demande la modification d'une valeur d'un noeud du système de chauffage
retourne un tableau avec le Nom de l'information et la valeur de chaque noeuds
*/
function WriteData( $point,$Data){
global $client,$InstallationID,$AppareilID;
write_log ("Demande de rafraichissement des données....");
$DataArray = array(
'AnlageId'=> $InstallationID,
'GeraetId'=> $AppareilID,
'DatapointId' => $point,
'Wert' => $Data
);
write_log ('ecriture => '.$point.' => '.$Data );
$response = $client->WriteData($DataArray);
$DataArray_temp = array(
'AktualisierungsId'=> $response->WriteDataResult->AktualisierungsId,
);
$response1 = $client->RequestWriteStatus ($DataArray_temp);
$flag = false;
$out = time()+90;
while ( $out > time()) {
$response1 = $client->RequestWriteStatus ($DataArray_temp);
write_log ("Status de la demande d'écriture : ".status2string($response1->RequestWriteStatusResult->Status));
if ($response1->RequestWriteStatusResult->Status == 4) {
write_log ("Donnée Mise à jour : $point = $Data");
$flag = true;
break;
}
else {
}
sleep(5);
}
return $flag;
}
/* fonction write_json
ecrit le tableau des données en JSON dans le fichier Viessmann.json
ne retourne aucune valeur
*/
function write_json( $Chaine )
{
write_log ("Mise a jour du json");
$file = dirname(__FILE__)."/viessmann.json";
if (!file_exists($file)) touch($file);
$fh = fopen($file, 'w+');
fwrite($fh, $Chaine);
fclose($fh);
}
/* fonction status2string
transforme le code de status en texte lisible
retourne le texte si reconnus, sinon la valeur
*/
function status2string($status){
switch ($status) {
case '1':
case 1: $st = "prise en compte";
break;
case '3':
case 3: $st = "traitement en cours";
break;
case '4':
case 4: $st = "traitement effectué";
break;
default: $st = $status;
break;
};
return $st;
}
/* fonction write_log
Permet d'écrire un message dans le fichier log.
*/
function write_log ($message)
{
global $filelog,$directorylog;
$logfile = $directorylog."/".$filelog;
$dt = (new \DateTime())->format('Y-m-d H:i:s');
if (!file_exists($logfile)) {touch($logfile);};
$myfile = fopen($logfile, "a");
fwrite($myfile, "\n". $dt.": ".$message);
fclose($myfile);
}
//Main
// traitement des paramêtres
if (isset($argv)) {
foreach ($argv as $arg) {
$argList = explode('=', $arg);
if (isset($argList[0]) && isset($argList[1])) {
$_GET[$argList[0]] = $argList[1];
write_log("Paramètre ".$argList[0]."=".$argList[1]);
}
}
}
//traitement principal
try {
if (login()) {
$TableInfo = getInfoPoints();
if (is_array($TableInfo)){
if (isset($argList[0]) && isset($argList[1])) {
if (!(writedata($argList[0],$argList[1]))) {write_log("Ecriture impossible de la valeur demandée");} ;
}
$Info=refreshInfos();
if (is_array($Info)){
$filejson = json_encode($Info);
write_json ($filejson);
}
logout();
}
}
else{
write_log("Connexion impossible !");
}
echo "Ok";
}
catch (Exception $e) {
write_log ('Exception : ligne='.$e->getLine().'('. $e->getCode().')'. $e->getMessage());
//$trace = $e->getTrace();
//write_log (print_r( $trace,true));
//$a = print_r(get_defined_vars(), true);
//write_log ($a);
echo "Erreur, voir $filelog";
}
//garbage
write_log ('--------------------------------------------------------------------------');
unset ( $TableInfo,$Info,$filejson,$Login,$Pass,$Installation,$InstallationID,$AppareilID,$DataIds,$anlageID,$anlage,$filelog,$directorylog);
il peut aussi paramétrer certain paramètre comme par exemple passer en mode économique ou réception.
ATTENTION: Ce script est adapté à mon système, chaque système peut être différent le numéro de noeud d'information peut ne
pas correspondre donc attention à la modification de paramètre.
3 informations sont a modifier dans le script : login, mot de passe et la référence de l'installation.
La mise en place se fait via le plugin Script.
- Exécuter la mise à jour des information il suffit de lancer le script
par ex: /var/www/html/plugins/script/core/ressources/Viessmann.php
- Récupérer chaque information nécessaire, il faut créer une info JSON en mettant "le numéro du nœud d'information>Wert"
par ex: pour une température extérieur la requête est :, 5373 étant le nœud d'information. et l'option estCode : Tout sélectionner
5373>Wert
Code : Tout sélectionner
https://AdresseJeedom/plugins/script/core/ressources/viessmann.json
- Modifier un paramètre il suffit de lancer le script avec comme paramètre le "numéro du noeud d'information=valeur" par exemple pour passer en mode économique (sur mon système) il faut lancer :
Code : Tout sélectionner
/var/www/html/plugins/script/core/ressources/Viessmann.php 7853=1