PHP Ecoute du réseau local Multicast OWL

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Homerci
Messages : 10
Inscription : 01 août 2016, 18:20

PHP Ecoute du réseau local Multicast OWL

Message par Homerci »

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

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 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&param=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
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..
beppedot
Messages : 3
Inscription : 08 avr. 2017, 18:02

Re: PHP Ecoute du réseau local Multicast OWL

Message par beppedot »

Hi, I would also like to try it ...
Two questions: 1 (idsonde = '47';) Do you intend IDX of dummy device on domoticz?
2) I think, lacks authentication of domoticz
Homerci
Messages : 10
Inscription : 01 août 2016, 18:20

Re: PHP Ecoute du réseau local Multicast OWL

Message par Homerci »

hi
1 (idsonde = '47') ---> yes IDX of dummy device on domoticz
2 owl is on local network

/*--------------------Paramettres OWL-----------------------------------*/
$idsonde = '47'; // IDX de la sonde qui sera utilisee dummy device on domoticz
$domoticzurl = "192.168.1.165:8080"; // Adresse IP de domoticz
$port = 22600; // FIX , Ne rien changer ici port multicast de OWL emission
$addressIP = '224.192.32.19'; //Fix, Ne rien changer ici adresse multicast de OWL emission
$iplocal = "192.168.1.165"; // adresse ip of computer qui lance le script
beppedot
Messages : 3
Inscription : 08 avr. 2017, 18:02

Re: PHP Ecoute du réseau local Multicast OWL

Message par beppedot »

hi,
Thanks for your help
The script works fine but does not send the values to Domoticz.
The script runs locally on raspberry with Domoticz.
I added a dummy device with its countdown to Domoticz, and
tried the script with both ids (15/207) but it does not work
Schermata 2017-06-27 alle 23.21.32.png
Schermata 2017-06-27 alle 23.21.32.png (35.73 Kio) Consulté 4509 fois
Schermata 2017-06-27 alle 23.21.54.png
Schermata 2017-06-27 alle 23.21.54.png (81.45 Kio) Consulté 4509 fois
Répondre