#!/usr/bin/php
<?php
//Recuperation de la commande passee en 1er argument
$cmd = $argv[1];
// On recupere soit all soit le nom du gpo en 2eme argument
if ($cmd == 'state')
$id = $argv[2];
// On recupere l id et la valeur (plage0-100) a affecter
if ($cmd == 'setWhiteDimmer' || $cmd == 'setRGBDimmer')
{
$id = $argv[2];
$dimmer = $argv[3];
}
// On recupere la couleur format ffffff ou #ffffff
if ($cmd == 'setRGBColor')
{
$color = $argv[2];
}
// On recupere l id du GPO a traiter
if ($cmd == 'getWatt')
{
$id = $argv[2];
}
// On recupere l id (0=Mot0 / 1=Mot1) du moteur
if ($cmd == 'getMotorPos')
{
$id = $argv[2];
}
// On recupere l id (0=Mot0 / 1=Mot1) du moteur et l ouverture (plage 0-100%)
if ($cmd == 'setMotorPos')
{
$id = $argv[2];
$pos = $argv[3];
}
// Passage du bit de controle en valeur 1 ou 0
if ($cmd == 'setRainMode' || $cmd == 'setSunTrackOnOff' || $cmd == 'setSunTrackMode' )
{
$bit = $argv[2];
}
// Adresse IP interne de la pergola
$ip = '192.168.1.47';
// Interrogation la pergola ou execution d un ordre
function getURL($url)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = simplexml_load_string(curl_exec($curl));
return $result;
}
// Passage d une plage 0-255 a 0-100 et inversement
function changeBase($base, $value)
{
if ($base == '255')
{
$new_value = $value * 100 / 255;
}
if ($base == '100')
{
$new_value = $value * 255 / 100;
}
if ($new_value < 0)
$new_value = 0;
return floor($new_value);
}
// Recuperation de la couleur au format #ffffff a partir des 3 composantes
function fromRGB($red, $green, $blue)
{
$hexa = sprintf("#%02x%02x%02x", $red, $green, $blue);;
return $hexa;
}
// Recuperation de la valeur de chaque composante (plage 0-255) a partir du format #ffffff
function toRGB($hexa)
{
if (substr($hexa,0,1) == "#")
$hexa = substr($hexa,1);
$RGB['R'] = hexdec(substr($hexa,0,2));
$RGB['G'] = hexdec(substr($hexa,2,2));
$RGB['B'] = hexdec(substr($hexa,4,2));
return $RGB;
}
// Retour de l etat de la pergola (id='all') ou d un gpo en particulier (id='gpo.')
function state()
{
global $ip, $id;
$url = "http://".$ip."/zns.cgi?cmd=d&p=os";
$pergola = getURL($url);
if ($id == 'all')
{
header('Content-type: text/xml');
print("<?xml version='1.0' encoding='utf-8'?><root>");
$rgb_power1 = explode(";", $pergola->xpath('gpo4')[0])[0];
$rgb_power1 = changeBase('255', $rgb_power1);
print("<rgb_power1>".$rgb_power1."</rgb_power1>");
$rgb_power2 = explode(";", $pergola->xpath('gpo5')[0])[0];
$rgb_power2 = changeBase('255', $rgb_power2);
print("<rgb_power2>".$rgb_power2."</rgb_power2>");
$white_dimmer1 = explode(";", $pergola->xpath('gpo6')[0])[0];
$white_dimmer1 = changeBase('255', $white_dimmer1);
print("<white_dimmer1>".$white_dimmer1."</white_dimmer1>");
$white_dimmer2 = explode(";", $pergola->xpath('gpo7')[0])[0];
$white_dimmer2 = changeBase('255', $white_dimmer2);
print("<white_dimmer2>".$white_dimmer2."</white_dimmer2>");
$rgb_red = explode(";", $pergola->xpath('gpo8')[0])[0];
$rgb_green = explode(";", $pergola->xpath('gpo9')[0])[0];
$rgb_blue = explode(";", $pergola->xpath('gpo10')[0])[0];
$rgb = fromRGB($rgb_red, $rgb_green, $rgb_blue);
print("<rgb_hexa>".$rgb."</rgb_hexa>");
$rgb_dimmer = explode(";", $pergola->xpath('gpo7')[0])[0];
$rgb_dimmer = changeBase('255', $rgb_dimmer);
print("<rgb_dimmer>".$rgb_dimmer."</rgb_dimmer>");
$motor1 = explode(";", $pergola->xpath('Mot0')[0])[0];
$motor1 = changeBase('255', $motor1);
print("<motor1>".$motor1."</motor1>");
$motor2 = explode(";", $pergola->xpath('Mot1')[0])[0];
$motor2 = changeBase('255', $motor2);
print("<motor2>".$motor2."</motor2>");
print("</root>");
}
else
{
$valeur = explode(";", $pergola->xpath($id)[0])[0];
$valeur = changeBase('255', $valeur);
print($valeur);
}
}
// Recuperation de l option Fermeture si pluie
function getRainMode()
{
global $ip;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
print(intval($user&1?1:0));
}
// Ecriture l option Fermeture si pluie
function setRainMode()
{
global $ip, $bit;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
$rain_mode = $bit;
$sun_tracking = intval($user&2?1:0);
$shadow_mode = intval($user&4?1:0);
$wintering = intval($user&8?1:0);
$user = ($rain_mode * 1) + ($sun_tracking * 2) + ($shadow_mode * 4) + ($wintering * 8);
$url = "http://".$ip."/zns.cgi?cmd=u&p=3&v=".$user;
$pergola = getURL($url);
}
// Recuperation de l option Suivi du soleil
function getSunTrackOnOff()
{
global $ip;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
print(intval($user&2?1:0));
}
// Ecriture l option Fermeture si pluie
function setSunTrackOnOff()
{
global $ip, $bit;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
$rain_mode = intval($user&1?1:0);
$sun_tracking = $bit;
$shadow_mode = intval($user&4?1:0);
$wintering = intval($user&8?1:0);
$user = ($rain_mode * 1) + ($sun_tracking * 2) + ($shadow_mode * 4) + ($wintering * 8);
$url = "http://".$ip."/zns.cgi?cmd=u&p=3&v=".$user;
$pergola = getURL($url);
}
// Recuperation de l option Ombrage minimal
function getSunTrackMode()
{
global $ip;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
print(intval($user&4?1:0));
}
// Ecriture l option Fermeture si pluie
function setSunTrackMode()
{
global $ip, $bit;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
//print_r($pergola);
$user = $pergola->xpath('user')[0];
$rain_mode = intval($user&1?1:0);
$sun_tracking = intval($user&2?1:0);
$shadow_mode = $bit;
$wintering = intval($user&8?1:0);
$user = ($rain_mode * 1) + ($sun_tracking * 2) + ($shadow_mode * 4) + ($wintering * 8);
$url = "http://".$ip."/zns.cgi?cmd=u&p=3&v=".$user;
$pergola = getURL($url);
}
// Recuperation de la position (plage 0-100) des lames
function getMotorPos()
{
global $ip, $id;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
// Recuperation position actuelle et maximale du moteur
$cur_pos = explode(";", $pergola->xpath('Mot'.$id)[0])[0];
$max_pos = explode(";", $pergola->xpath('Mot'.$id)[0])[1];
// Calcul du porcentage d ouverture
$valeur = max(0, $cur_pos * 100 / $max_pos);
print($valeur);
}
// Positionnement (plage 0-100) les lames
function setMotorPos()
{
global $ip, $id, $pos;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
// Calcul du nombre de pas correspondant au pourcentage demande
$max_pos = explode(";", $pergola->xpath('Mot'.$id)[0])[1];
$valeur = floor($pos * $max_pos / 100);
$url = "http://".$ip."/zns.cgi?cmd=m&m=".($id + 1)."&p=".$valeur;
$result = getURL($url);
}
// Recuperation de la T° interne de la carte
function getHWTemp()
{
global $ip;
$url = "http://".$ip."/zns.cgi?cmd=d&p=s";
$pergola = getURL($url);
$temp = ($pergola->xpath('Temp')[0])/10;
print($temp." °");
}
// Recuperation de la conso en W du GPO id
function getWatt()
{
global $ip, $id;
$url = "http://".$ip."/zns.cgi?cmd=d&p=os";
$pergola = getURL($url);
$v = ($pergola->xpath('VDC2')[0])/1000;
$i = (explode(";", $pergola->xpath($id)[0])[1])/1000;
$p = floor($v * $i);
print($p." W");
}
// Allumage des bandeaux Blanc
function setWhiteDimmer()
{
global $ip, $id, $dimmer;
if ($id=1)
$mask = 64;
else
$mask = 128;
$value = changeBase('100', $dimmer);
$url = "http://".$ip."/zns.cgi?cmd=l&o=".$mask."&p=".$value;
$result = getURL($url);
}
// Allumage des bandeaux RGB
function setRGBDimmer()
{
global $ip, $id, $dimmer;
if ($id=1)
$mask = 16;
else
$mask = 32;
$value = changeBase('100', $dimmer);
// Extinction / allumage du GPO4 ou GPO5 avant le GPO11
if ($value == 0)
{
$url = "http://".$ip."/zns.cgi?cmd=l&o=".$mask."&p=0";
$result = getURL($url);
}
else
{
$url = "http://".$ip."/zns.cgi?cmd=l&o=".$mask."&p=255";
$result = getURL($url);
}
// Envoi de la valeur au GPO11
$url = "http://".$ip."/zns.cgi?cmd=l&o=2048&p=".$value;
$result = getURL($url);
}
// Envoi des 3 composantes de couleur
function setRGBColor()
{
global $ip, $color;
$rgb = toRGB($color);
$url = "http://".$ip."/zns.cgi?cmd=l&o=256&p=".$rgb['R'];
$result = getURL($url);
$url = "http://".$ip."/zns.cgi?cmd=l&o=512&p=".$rgb['G'];
$result = getURL($url);
$url = "http://".$ip."/zns.cgi?cmd=l&o=1024&p=".$rgb['B'];
$result = getURL($url);
}
// Execution de la fonction demandee selon la commande passee en parametre
switch ($cmd) {
case 'state':
state();
break;
case 'setWhiteDimmer':
setWhiteDimmer();
break;
case 'setRGBDimmer':
setRGBDimmer();
break;
case 'setRGBColor':
setRGBColor();
break;
case 'getWatt':
getWatt();
break;
case 'getHWTemp':
getHWTemp();
break;
case 'getMotorPos':
getMotorPos();
break;
case 'setMotorPos':
setMotorPos();
break;
case 'getRainMode':
getRainMode();
break;
case 'setRainMode':
setRainMode();
break;
case 'getSunTrackOnOff':
getSunTrackOnOff();
break;
case 'setSunTrackOnOff':
setSunTrackOnOff();
break;
case 'getSunTrackMode':
getSunTrackMode();
break;
case 'setSunTrackMode':
setSunTrackMode();
break;
}
?>
Voici le scipt