Pour débuter/essayer :
Pour faire simple (on peut faire beaucoup beaucoup plus complexe et sécurisé) : il faut que le serveur domotique « Master » soit connecté à la box, ça permet de l’attaquer via le réseau WiFi depuis son smartphone/ordi/tablette.
(attention à la réservation d’@ip de façon à ne pas avoir de changement à chaque reboot, il y a un fil la-dessus)
Minou159 a écrit :
Merci gtn, j'attends vos infos avec impatience pour faire quelques tests
J'espère que ce sera un bon début :
Il n’y a pas d’authentification, tout se passe sur le port 20 000.
Il « suffit » d’envoyer directement sur @Master:20000 les commandes (en ascii c’est important, pas en unicode) et quand on lui parle bien, le serveur répond : *#*1##
Puis, si c’est une interrogation, il balance les données et termine par le même ack *#*1##
Ce serait simple s’il répondait en une seule trame mais non, il fait ça au fur et à mesure, rien de rédhibitoire mais du coup il faut attendre le ack de fin.
En WP8.1/C# pour envoyer les commandes, c’est obligatoirement de l’asynchrone, chez moi, ça donne ça, il y a surement plus joli mais ça fonctionne bien, j’ai fait une petite classe avec du send et du send+receive comme ci-dessous :
async public Task<String> WSend_r(string message, string serverHostname, string serverPort)
{
StreamSocket clientSocket = null;
HostName serverHost;
string r_message = "";
try {
clientSocket = new StreamSocket();
serverHost = new HostName(serverHostname);
await clientSocket.ConnectAsync(serverHost, serverPort);
}
catch (Exception ex) {
// Debug string mes = ex.Message;
return "KO";
}
try {
DataWriter writer = new DataWriter(clientSocket.OutputStream);
DataReader reader = new DataReader(clientSocket.InputStream);
reader.InputStreamOptions = Windows.Storage.Streams.InputStreamOptions.None;
writer.WriteString(message);
await writer.StoreAsync();
//Lecture premier octet
await reader.LoadAsync(1);
r_message = reader.ReadString(1);
string[] stringSeparators = new string[] { "*#*1##" } ;
string[] res = new string [] {""};
bool End_read = false ;
int i = 0;
// au 2 ème ack *#*1## on sort, c’est ok.
while (i<2)
{
await reader.LoadAsync(1);
r_message += reader.ReadString(reader.UnconsumedBufferLength);
if (r_message.EndsWith("*#*1##"))
{
i++;
}
}
writer.DetachStream();
reader.Dispose();
writer.Dispose();
clientSocket.Dispose();
clientSocket = null;
}
catch (Exception exception)
{
// Debug string err = exception.Message;
return "KO";
}
return r_message;
}
}
Pour allumer les lumières (idem send_r au-dessus mais plus simple, pas besoin de retour, juste Send) :
Send("*1*1*" + num + "##");
Avec num étant le n° d’index de la lumière (j’y viens ensuite)
Pour éteindre :
Send("*1*0*" + num + "##");
Pour interroger l’état des lumières :
WSend_r("*#1*0##", serverHostname, serverPort);
Qui va donner une réponse du type :
*1*0*33##*1*0*34##*1*1*35##*1*0*36##*1*0*16##*1*0*15##*1*1*17## etc
Avec 1 = lumière ; 0/1 = éteint/allumé ; 33/36/etc = les index des lumières
.
Et donc si on split avec ## on a donc l’état de chaque lumière et accessoirement ça me sert pour la détection des index
(qui sont individuellement > = 10) .
Pour les volets, c’est tout pareil sauf qu’il n’y a pas d’état.
Pour ouvrir le volet d’index « num » :
Send("*2*1*" + num + "##");
Pour fermer :
Send("*2*2*" + num + "##");
Pour stopper :
Send("*2*0*" + num + "##");
Pour obtenir la liste des index des volets, idem lampes :
WSend_r("*#2*0##");
On split avec ## pour avoir les index.
Pour les sondes de température :
WSend_r("*#4*1##");
Liste les différentes sondes avec leur température, elles sont séparées par ##
Je n’affiche que la principale ( chez moi il y en a deux, il peut y en avoir plus suivant les apparts/config)
Il y a un paquet d’autres fonctionnalités assez simple à récupérer voir modifier mais ce sera pour plus tard (pas eu le temps).
Je m’intéresse pour la suite à la programmation du chauffage, aux relevés de consos, aux scénarios, et pour le fun au visiophone. Il y a aussi des fonctions potentiellement sympa d'extinctions temporisées qui peuvent être utiles.
J’allais oublier, pour éteindre par zone et général, chez moi 0,1,2,3, il y a 4 zones de définies de mémoire (salon+ entrée, chambre, sdb+sde, ext), donc pour tout éteindre :
Send("*1*1*0##");
Send("*1*1*1##");
Send("*1*1*2##");
Send("*1*1*3##");
Pour tout allumer :
Send("*1*0*0##");
Send("*1*0*1##");
Send("*1*0*2##");
Send("*1*0*3##");
Pareil pour les volets, tout up :
Send("*2*1*0##");
Send("*2*1*1##");
Send("*2*1*2##");
Down :
Send("*2*2*0##");
Send("*2*2*1##");
Send("*2*2*2##");
Stop :
Send("*2*0*0##");
Send("*2*0*1##");
Send("*2*0*2##");
Voilà de quoi s’occuper pour quelques heures …
!