PHP Ecoute du réseau local Multicast OWL
Publié : 15 sept. 2016, 13:55
Bonjour,
En quelques mots, la description du projet:
Il s'agit de lire récupérer sur le reseau local, les valeurs émises par le boitier OWL intuition cm 180 et les intégrer dans Domoticz, dans un device electricité.
--> pub de OWL (La gamme Intuition OWL est la nouvelle façon de surveiller sa consommation électrique.
Il suffit de placer un émetteur dans le tableau électrique et de brancher la passerelle Ethernet sur votre box ADSL.
Les données sont alors automatiquement transmises sur la plateforme OWL, afin de suivre ces informations de n'importe quel poste connecté à Internet.)
Cela marche en interrogeant leur site.
mais pour etre independant des sites du cloud, le boitier émet en simultiné en Multicast sur le réseau local, la meme trame que celle envoyée vers leur site.
Je me suis dit de suite .... YAPLUSKA .... oui, mais.. Y'a toujours un mais !!!
Le principe retenu.
-Faire un script lua dans Dz et lancer un script PHP qui ecoute le reseau, lit les trames envoyées, et retourne cette trame, si elle correspond
au (ex: toutes les 5 minutes), au script lua ou mieux, peut etre directement au device electricité dont on a l'IDX.
Avance du projet.
Le script PHP est fait, et fonctionne dans le terminal Impec.. il se nomme -- ecouteowljson.php --
évidemment,il faut installer PHP sur la machine et donner un droit d'éxècution au script chmod u+x lebonfichier
echo "chan 2 immediat,courant : ".$chan2['curr']."\n";
echo "chan 3 immediat,courant : ".$chan3['curr']."\n";
echo "chan 1 cumule jr (Total General): ".$chan1['day']."\n";
echo "chan 2 cumule jr (Cuisine+ECS) : ".$chan2['day']."\n";
echo "chan 3 cumule jr (PAC/Clim) : ".$chan3['day']."\n";
echo "chan 4 cumule jr (lavage& Autre): ".$chan4."\n";
echo "Niveau Pile : ".$battery['level']."\n";
if(!($chan1['day'] == 0 && $chan2['day'] == 0 && $chan3['day'] == 0)) /* evite les lignes de "weather" */
{
/*"192.168.1.165"/json.htm?type=command¶m=udevice&idx=46&nvalue=0&svalue=POWER;9999 */
echo " ici envoi des data vers DZ, ligne test : MAJ de la base domoticz \n";
}
endwhile;
?>
[/code]
Le script lua: qui ne fonctionne que pour la partie lancement du .PHP
La question Comment dans le script envoyer dans Domoticz les datas lues dans ce script PHP ?
Apres, il ne s'agira que de ventiler celles-ci dans les devices appropriés.
merci de m'avoir lu..
En quelques mots, la description du projet:
Il s'agit de lire récupérer sur le reseau local, les valeurs émises par le boitier OWL intuition cm 180 et les intégrer dans Domoticz, dans un device electricité.
--> pub de OWL (La gamme Intuition OWL est la nouvelle façon de surveiller sa consommation électrique.
Il suffit de placer un émetteur dans le tableau électrique et de brancher la passerelle Ethernet sur votre box ADSL.
Les données sont alors automatiquement transmises sur la plateforme OWL, afin de suivre ces informations de n'importe quel poste connecté à Internet.)
Cela marche en interrogeant leur site.
mais pour etre independant des sites du cloud, le boitier émet en simultiné en Multicast sur le réseau local, la meme trame que celle envoyée vers leur site.
Je me suis dit de suite .... YAPLUSKA .... oui, mais.. Y'a toujours un mais !!!
Le principe retenu.
-Faire un script lua dans Dz et lancer un script PHP qui ecoute le reseau, lit les trames envoyées, et retourne cette trame, si elle correspond
au (ex: toutes les 5 minutes), au script lua ou mieux, peut etre directement au device electricité dont on a l'IDX.
Avance du projet.
Le script PHP est fait, et fonctionne dans le terminal Impec.. il se nomme -- ecouteowljson.php --
évidemment,il faut installer PHP sur la machine et donner un droit d'éxècution au script chmod u+x lebonfichier
Code : Tout sélectionner
#!/usr/bin/php
<?php
# ecouteowljson.php
/*--------------------Paramettres Cout Electrique-----------------------*/
$coutfixe = '0.0515'; // valeur moyenne par KWh
$coutHC = '0.0763'; //valeur moyenne par KWh HC
$coutHP = '0.1249'; // valeur moyenne par KWh HP
$heuresCreuses[0]['debut'] = '01:30:00';
$heuresCreuses[0]['fin'] = '07:30:00';
$heuresCreuses[1]['debut'] = '12:15:00';
$heuresCreuses[1]['fin'] = '14:15:00';
/*--------------------fin des Paramettres Cout Electrique---------------*/
/*--------------------Paramettres OWL-----------------------------------*/
$idsonde = '47'; // ID de la sonde qui sera utilisee
$domoticzurl = "192.168.1.165:8080"; // Adresse IP de domoticz
$port = 22600; // Ne rien changer ici port multicast de OWL emission
$addressIP = '224.192.32.19'; // Ne rien changer ici adresse multicast de OWL emission
$iplocal = "192.168.1.165"; // adresse ip de la machine qui lance le script
/*--------------------Fin des paramettres OWL---------------------------*/
print (" ------- Début d'écoute du réseau owl ");
print (" " .strftime("%d/%m/%y %H:%M:%S "). "\n");
$i=0;
/*----Lancement pour une journée, en dev -------------*/
while ($i <= 2890): # 1journee 24h x 60Min x 2 moy.30s
$i++;
$socketClient = socket_create(AF_INET, SOCK_DGRAM, 0);
socket_set_option($socketClient, SOL_SOCKET, SO_REUSEADDR, 1);
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
socket_bind($socketClient, $iplocal, $port);
} else {
socket_bind($socketClient, $addressIP, $port);
}
$tab_mcast = array("group" => $addressIP, "interface" => 0,);
socket_set_option($socketClient, IPPROTO_IP, MCAST_JOIN_GROUP, $tab_mcast);
socket_recvfrom($socketClient, $buf, 800, 0, $from, $fromPort);
$chaine_xml = "<xml>".$buf.'</xml>';
/* print_r($chaine_xml); */
socket_close($socketClient);
$document_xml = json_decode(json_encode(simplexml_load_string($chaine_xml)),1);
$electricity = $document_xml['electricity'];
$timestamp = $electricity['timestamp'];
$chan = $electricity['chan'];
$battery0 = $electricity['battery'];
$battery = $battery0['@attributes'];
$battery = $battery0['@attributes'];
if($battery['level'] == "100%") {
$lowbat = '0';
} else {
$lowbat = '1';
}
$chan1 = $chan[0];
$chan2 = $chan[1];
$chan3 = $chan[2];
$chan4 = $chan1['day'] - $chan2['day'] - $chan3['day'];
$conso_elec = $chan1['curr'] + $chan2['curr'] + $chan3['curr'];
$total_elec = $chan1['day'] + $chan2['day'] + $chan3['day'];
[code]
/* echo en dev */
/* print_r($document_xml); */
echo "Timestamp : ".$timestamp."\n";
print (date ("d/m/Y H:i:s", $timestamp));
echo " ----> lecture: ".$i." \n";
echo "chan 1 immediat,courant : ".$chan1['curr']."\n";echo "chan 3 immediat,courant : ".$chan3['curr']."\n";
echo "chan 1 cumule jr (Total General): ".$chan1['day']."\n";
echo "chan 2 cumule jr (Cuisine+ECS) : ".$chan2['day']."\n";
echo "chan 3 cumule jr (PAC/Clim) : ".$chan3['day']."\n";
echo "chan 4 cumule jr (lavage& Autre): ".$chan4."\n";
echo "Niveau Pile : ".$battery['level']."\n";
if(!($chan1['day'] == 0 && $chan2['day'] == 0 && $chan3['day'] == 0)) /* evite les lignes de "weather" */
{
/*"192.168.1.165"/json.htm?type=command¶m=udevice&idx=46&nvalue=0&svalue=POWER;9999 */
echo " ici envoi des data vers DZ, ligne test : MAJ de la base domoticz \n";
}
endwhile;
?>
[/code]
Le script lua: qui ne fonctionne que pour la partie lancement du .PHP
Code : Tout sélectionner
commandArray = {}
time = os.date("*t")
-- if (time.hour == 00 and time.min == 20) then -- tout les matins à 00h20
-- if (time.min == 20 and ((time.hour == 7) or (time.hour == 13) or (time.hour == 18))) then -- 3 éxecutions du script par jour à 7H20, 13h20 et 18H20
-- if time.hour%2 == 0 then -- toutes les deux heures
-- if (time.hour%5 == 0 and time.min == 10) then -- Toutes les heures et 10 minutes
if time.min%1 == 0 then -- Toutes les 2 minutes
-- Time to run?
print("-------------------passage lecture du php ------------")
-- local reponse=os.execute("/home/pi/ecouteowljson.php")
print(reponse)
local file=assert(io.open("/home/pi/ecouteowljson.php", "r"))
print(file)
local stdout=file:read("*all")
assert(file:close())
return (reponse==0 or reponse==true), stdout
--Ensuite remplissez votre commandArray avec les données recueillies :)
-- commandArray[1] = {['UpdateDevice'] = '45|0|' ..tempInt..";"..hygroInt;0}
-- commandArray[2] = {['UpdateDevice'] = '46|0|' ..tempExt..";"..tempExt;0}
--
end
return commandArray
Apres, il ne s'agira que de ventiler celles-ci dans les devices appropriés.
merci de m'avoir lu..