Serveur Hayward injoignable

Salut,

Il semblerait que le serveur Hayward est injoignable depuis plusieurs jours…
C’est tres embetant en cette periode !!!

Existe-t-il un autre moyen de piloter sa PAC Hayward en local et ne pas passer par ce Cloud?

Merci,

Sebastien

Salut,
Oui depuis 3/4 jours le serveur est craché… J’espère qu’il n’est pas arrêté !
Tu peux toujours piloter ta PAC avec leur application smartphone, chez moi elle fonctionne.

Bonne journée.

Merci pour ta reponse!
Donc si l’appli du smartphone arrive a piloter la PAC alors le Cloud peut etre contourne !
Faudrait sniffer les trames reseaux entre le smartphone et la PAC …
On peut faire ca avec quoi ? (Wireshark ?)

J’ai essaye avec l’app sur mon tel, cela ne fonctionne pas non plus …
J’ai juste entre le code barre et le mot de passe…

Ceci ne me rassure pas, si j’accede a la page web de smarttemp (sans le port 9000) voici ce que ca donne:

Pas cool …

Oui j’ai vue pour le site dans le port.
Le cloud mobile n’est pas le même, il faut que je prenne le temps de sniffer les trames.
J’ai fais un test rapide avec packet capture sur android et je vois ça :

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetPackageData xmlns="http://www.phnix.cn/"><barcode>MON_ID</barcode><verifiedCode>PASSWORD</verifiedCode><communicateType>128</communicateType><communicatePage>0</communicatePage><paraType>82</paraType></GetPackageData></soap:Body></soap:Envelope>

OK c’est genial ca !
Ils utilisent l’appel a un webservice …
Tu devrais voir plus de trames en fonction de ce que tu demandes.
Ceci se fait sur l’url d’un site de chez Hayward ou alors directment en local sur la PAC ?

Malheureusement sur un serveur chez eux.

Re,

J’ai de nouveau essaye avec l’app de mon tel (iPhone) et la communication fonctionne !
Il appelle un webservice depuis le site http://phnixsmart.com
Tu confirmes?

Regarde ici:
http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx

De la tu peux tout obtenir et contrôler :grin:

Oui c’est ça je confirme.

Sur mon iPhone je ne peux pas faire grand chose… je n’arrive à voir que des trames http.
Et en http l’app de Hayward récupère seulement l’historique des températures…
Je ne vois ni passation de la consigne de température ni rien d’autres…
Peut-être en https?
Tu vois ça depuis Android ?

Pour le moment je n’ai pas tenté de modifier de valeurs car je suis loin de chez moi donc j’aimerai être devant.

1 « J'aime »

Salut,

J’ai un peu etudie la facon dont l’application smartphone communique avec le serveur PHNIXSMART.
Pour cela j’ai fait un sniff des packets echanges lors de l’utilisation de l’application, juste en changeant la temperature de consigne.
J’ai mis 25 degC et j’ai releve ceci en retour:

POST /Phnix.WaterHeater.WebService/SmartDeviceService.asmx HTTP/1.1
Content-Type: text/xml;charset=utf-8
Content-Length: 466
Host: www.phnixsmart.com
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SavePackageData xmlns="http://www.phnix.cn/"><company>PHNIX</company><barcode>MONLOGIN</barcode><pw>MONMOTDEPASSE</pw><requestPackData>qlqxgwEAL6gACEAAAQZybnR8THxafEw9PQACAAAAAAAAffA=
</requestPackData></SavePackageData></soap:Body></soap:Envelope>

On voit ici que c’est la fonction ‹ SavePackageData › qui est appelee.

J’ai alors fait un petit programme en VB.NET pour simuler la meme chose et TADA cela fonctionne :slight_smile:
J’appelle simplement le Web Service http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx et j’utilise la fonction ‹ SavePackageData ›

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim Login As String = "MONLOGIN"
            Dim Password As String = "MONMOTDEPASSE"
            Dim Param As String = "qlqxgwEAL6gACEAAAQZybnR8THxafEw9PQACAAAAAAAAffA="
            Dim PackData As Byte() = Convert.FromBase64String(Param)
            Dim PhNixService As New PhNix.SmartDeviceServiceSoapClient("SmartDeviceServiceSoap")
            Dim Result = PhNixService.SavePackageData("PHNIX", Login, Password, PackData)
            Dim Message As String = ""
            If Result.Messages IsNot Nothing Then
                For Each Entry In Result.Messages
                    Message += Entry
                Next
                    MsgBox(Message)
            Else
                MsgBox("Success!")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

Par contre, dans ce parametre ‹ requestPackData › tout est envoye en meme temps : mode, temp de consigne, ON ou OFF de la PAC, etc …
Tu vois aussi que je n’ai pas pu passer ce parametre ‹ requestPackData › tel quel… il a fallu que je le convertisse en Byte().
La est tout le mystere, comment comprendre cette chaine ‹ requestPackData › ???

Voici ce que j’obtiens en lisant ce ‹ requestPackData › converti en Byte Array lorsque je change les valeurs de temperatures de consigne de 25 a 32 DegC:
(la PAC est d’abord en OFF puis en ON … pas de timer en place …)

Si des matheux sont la, un peu d’aide serait la bienvenue.

Merci,

Sebastien

Voici comment on recupere des infos depuis PHP :slight_smile:

J’ai fais un scenario et j’ai mis les valeurs recuperees dans des Tags.
C’est juste pour essayer … mais le code PHP peut etre utilise directement dans ton plugin.

$tags = $scenario->getTags();
(empty($tags['#status#'])) ? $tags['#status#'] = "" : null;
(empty($tags['#waterTemp#'])) ? $tags['#waterTemp#'] = "" : null;

$login = "LOGIN";
$password = "PASSWORD";

$client = new SoapClient("http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx?wsdl");

// Get Status
$result = $client->GetMachineRemoteControlStatus(array('barcode' => $login,'password' => $password));
if (!empty($result->GetMachineRemoteControlStatusResult->ActiveStatus)) {
	$tags['#status#'] = $result->GetMachineRemoteControlStatusResult->ActiveStatus;
} else {
 	$tags['#status#'] = "Failed";
}

// Get Water Temperature
$date = date('Y-m-d');
$result = $client->GetWHTemperatureHistoryData(array('barcode' => $login,'beginDate' => $date, 'endDate' => $date));
if (!empty($result->GetWHTemperatureHistoryDataResult->PackFullDataOf2Array)) {
	$data = $result->GetWHTemperatureHistoryDataResult->PackFullDataOf2Array;
  	$json = json_decode($data);
  	$waterTemp = $json[0]->WaterIn;
  	$tags['#waterTemp#'] = $waterTemp;
} else {
 	$tags['#waterTemp#'] = -99;
}


$scenario->setTags($tags);

Tu prends la suite @laurie.yoann ?

Merci,

Sebastien

Bon eh bien j’ai un peu plus bosse sur la chose et mon p’tit scenario / viruel fonctionne deja pleinement pour assigner une consigne de temperature, mettre la PAC en ON ou OFF et aussi relever les temperature In et Out :slight_smile:

Voici comment mettre ceci en place avant que le plugin ne soit mis a jour:

On fait un virtuel qui contient cela:
image

Puis on cree un scenario:

  • On y met 1 programmation pour executer chaque minute
  • On y met 2 declencheurs qui sont les la Consigne et Power (donc a chaque fois que depuis le virtuel on change la consigne ou que l’on allume/eteint la PAC alors le scenario est execute)

Voici le detail du scenario:

1) Un premier bloc ‹ Si Alors › (je donne le code PHP de ce premier bloc juste apres …)
Ce bloc sert a changer la consigne / allumer / eteindre la PAC, il est appele par les 2 declencheurs precedement definis.

Le code PHP:

// Set Water Temperature
$tags = $scenario->getTags();
(empty($tags['#status#'])) ? $tags['#status#'] = "" : null;

$cmd = cmd::byString("#[Page Principale][PAC Hayward][Consigne]#");
$setpoint = $cmd->execCmd();

$cmd = cmd::byString("#[Page Principale][PAC Hayward][Power]#");
$power = $cmd->execCmd();

$login = "MON-LOGIN";
$password = "MON-PASSWORD";

if ($power == 'ON') {
  	switch ($setpoint) {
    	case 25:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8bnR8THxafEw9PQAAAAAAAAAA5BU=';
        	break;
    	case 26:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8cHR8THxafEw9PQACAAAAAAAAofs=';
        	break;
    	case 27:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8cnR8THxafEw9PQAAAAAAAAAAI4M=';
        	break;
      	case 28:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8dHR8THxafEw9PQACAAAAAAAA4Mo';
        	break;
        case 29:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8dnR8THxafEw9PQACAAAAAAAAQXI=';
        	break;
        case 30:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8eHR8THxafEw9PQAAAAAAAAAAAFk=';
        	break;
        case 31:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8enR8THxafEw9PQACAAAAAAAAgiE=';
        	break;
        case 32:
        	$setpoint = 'qlqxgwEAL6gACEABAQZ8fHR8THxafEw9PQACAAAAAAAAYqg=';
        	break;
	}
} else {
  	switch ($setpoint) {
    	case 25:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZybnR8THxafEw9PQACAAAAAAAAffA=';
        	break;
    	case 26:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZycHR8THxafEw9PQAAAAAAAAAAOB4=';
        	break;
    	case 27:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZycnR8THxafEw9PQACAAAAAAAAumY=';
        	break;
      	case 28:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZydHR8THxafEw9PQACAAAAAAAAWu8';
        	break;
        case 29:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZ8dnR8THxafEw9PQACAAAAAAAAkb4=';
        	break;
        case 30:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZ8eHR8THxafEw9PQAAAAAAAAAA0JU=';
        	break;
        case 31:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZ8e3R8THxafEw9PQACAAAAAAAAAxE=';
        	break;
        case 32:
        	$setpoint = 'qlqxgwEAL6gACEAAAQZ8fHR8THxafEw9PQAAAAAAAAAAkaQ=';
        	break;
	}
}

$setpoint = base64_decode($setpoint);

$client = new SoapClient("http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx?wsdl");

$result = $client->SavePackageData(array('company' => 'PHNIX','barcode' => $login, 'pw' => $password, 'requestPackData' => $setpoint));

if (!empty($result->SavePackageDataResult->ResponseCode)) {
	$data = $result->SavePackageDataResult->ResponseCode;
  	$tags['#status#'] = $data;
} else {
 	$tags['#status#'] = 'empty';
}

$scenario->setTags($tags);

et on termine avec ce premier bloc comme ceci:


Note: Le popup c’est pour du debug … ceci pourra etre utilise dans le plugin pour les logs ou autres …
Je stoppe le scenario a ce niveau car il a ete appele pour un changement de consigne ou pour demarrer/arreter la PAC.

2) Un second bloc de type CODE
Ce bloc sert a recupere les temperature d’entree et de sortie de la PAC, il est execute chaque minute par la programmation du scenario precedement definis.

$tags = $scenario->getTags();
(empty($tags['#waterIn#'])) ? $tags['#waterIn#'] = "" : null;
(empty($tags['#waterOut#'])) ? $tags['#waterOut#'] = "" : null;

$login = "MON-LOGIN";
$password = "MON-PASSWORD";

$client = new SoapClient("http://www.phnixsmart.com/Phnix.WaterHeater.WebService/SmartDeviceService.asmx?wsdl");

// Get Water Temperature
$tomorrow = date("Y-m-d", time() + 86400);
$today = date('Y-m-d');
$result = $client->GetWHTemperatureHistoryData(array('barcode' => $login,'beginDate' => $today, 'endDate' => $tomorrow));
if (!empty($result->GetWHTemperatureHistoryDataResult->PackFullDataOf2Array)) {
	$data = $result->GetWHTemperatureHistoryDataResult->PackFullDataOf2Array;
  	$json = json_decode($data);
  	$waterIn = $json[0]->WaterIn;
  	$waterOut = $json[0]->WaterOut;
  	$tags['#waterIn#'] = $waterIn;
  	$tags['#waterOut#'] = $waterOut;
} else {
 	$tags['#waterIn#'] = -99;
  	$tags['#waterOut#'] = -99;
}

$scenario->setTags($tags);

3) On termine avec un dernier bloc de type ACTION

@laurie.yoann, dis moi si ceci fonctionne chez toi…
Ma seule crainte est que ces matrices que j’envoie pour definir la temperature/PAC ON-OFF soit lie au login/password … j’espere pas…

Sebastien

2 « J'aime »

Salut, je viens de tester et tout fonctionne !
Tu as fais du super boulot, merci à toi… Il faut que je bosse sur le plugin.

1 « J'aime »

J’ai fais la modif pour lire l’entrée et la sortie de l’eau dans le plugin et ça fonctionne super.

1 « J'aime »

Génial, ne te reste que la consigne :grin:
Tu devras par contre enlever la gestion des programmations…
Aussi jouter les températures en dessous de 25 degC… j’avais pas tout testé…

Sebastien

Salut @laurie.yoann, des news par rapport à l’update de ton plugin ?
Besoin d’aide?

Sébastien

Bonjour, oui on veut bien des news sur ton plugin avec le développement de Sattaz :slight_smile: