[PHP] programmation des Timers IPX PRO

Bonjour,
les commandes HTML suggèrent de prendre un PC et de lui faire piloter les cartes.

Maintenant si le PC doit donner le même ordre à heure fixe (arrosage, autorisation d’ouverture de gille le jour, simulation de présence…) il est logique de programmer la carte avec un Timer.
Et alors le PC laisse la carte faire le boulot avec son NTP interne.
PC éteins la carte fera le boulot toute seule. C’est que sa consomme un PC B-)

Mais voilà la carte IPX utilise un formulaire! Alors il faut faire répondre au formulaire par le PC… pas de cde html.
C’est simple (si si!!) mais demande bcp de ligne de PHP (voir ci-dessous).
EasyPHP est tout prêt a faire tourner cette page en PHP/Curl.

Bye
Rno

<HTML><HEAD><TITLE>Lancement de commandes CURL</TITLE>
</HEAD><BODY>
<?php

$ip = "192.168.0.6";
//url de la page de soumission
$url = "http://".$ip."/protect/timers.htm";

// ==========================
// DATA de TIMERS de 0 à 15!
// ==========================
echo "<br>--------------<br>Setting Timers <br>--------------<br>";
 $fields = array(
    'Timer00Time' => '13:51',    'Timer00Relay' => '0',    'Timer00Action' => '0',
/* value="0" Off; value="1" On; value="2" Inv; value="3" Fugitif;  value="4" Empty  */
    'Timer01Time' => '12:52',    'Timer01Relay' => '0',    'Timer01Action' => '1',
    'Timer02Time' => '12:53',    'Timer02Relay' => '1',    'Timer02Action' => '4',
    'Timer03Time' => '12:54',    'Timer03Relay' => '1',    'Timer03Action' => '4',
    'Timer04Time' => '12:55',    'Timer04Relay' => '2',    'Timer04Action' => '4',
    'Timer05Time' => '12:56',    'Timer05Relay' => '2',    'Timer05Action' => '4',
    'Timer06Time' => '12:57',    'Timer06Relay' => '3',    'Timer06Action' => '4',
    'Timer07Time' => '12:58',    'Timer07Relay' => '3',    'Timer07Action' => '4',
    'Timer08Time' => '12:59',    'Timer08Relay' => '4',    'Timer08Action' => '4',
    'Timer09Time' => '13:00',    'Timer09Relay' => '4',    'Timer09Action' => '4',
    'Timer10Time' => '13:01',    'Timer10Relay' => '5',    'Timer10Action' => '4',
    'Timer11Time' => '13:02',    'Timer11Relay' => '5',    'Timer11Action' => '4',
    'Timer12Time' => '13:03',    'Timer12Relay' => '6',    'Timer12Action' => '4',
    'Timer13Time' => '13:04',    'Timer13Relay' => '6',    'Timer13Action' => '4',
    'Timer14Time' => '13:05',    'Timer14Relay' => '7',    'Timer14Action' => '4',
    'Timer15Time' => '13:06',    'Timer15Relay' => '7',    'Timer15Action' => '4',
    'TimeSaving' => '02');

if(1){echo '<pre>'; print_r($fields); echo '</pre>'; }
// ===============
// EOF DATA
// ===============

// +++++++++++++++
// cURL Publishing
// +++++++++++++++
$useragent = "Mozilla/5.0";
$referer = $url;
 foreach($fields as $key=>$value) {
   // on modifie le ':' qui ne passe pas en URL (?)
   $value = str_replace(":","%3A",$value);
   //url-ify the data for the POST
   $fields_string .= $key.'='.$value.'&';
   }
 rtrim($fields_string,'&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT, $useragent);
curl_setopt($ch,CURLOPT_REFERER, $referer);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
// ++++++++++++++++++++
// EOF cURL Publishing
// ++++++++++++++++++++


//on peut faire un echo du résultat obtenu
echo $url;
echo "<br>--------------<br>Timers Job DONE<br>--------------<br>";
echo $result;

?>

<br><br>c'est fini!
 </BODY></HTML>

Pour avoir la certitude que la carte est bien programmée.
Je lis les Timers dans un status.xml amendé:

[quote]<timer_0>
~timer_value(0)~
<relay_0>~relay(0,0)~</relay_0>
<relay_1>~relay(0,1)~</relay_1>
<relay_2>~relay(0,2)~</relay_2>
<relay_3>~relay(0,3)~</relay_3>
<relay_4>~relay(0,4)~</relay_4>
<relay_5>~relay(0,5)~</relay_5>
<relay_6>~relay(0,6)~</relay_6>
<relay_7>~relay(0,7)~</relay_7>
<action_0>~action(0,0)~</action_0>
<action_1>~action(0,1)~</action_1>
<action_2>~action(0,2)~</action_2>
<action_3>~action(0,3)~</action_3>
<action_4>~action(0,4)~</action_4>
</timer_0>
<timer_1>
~timer_value(1)~
<relay_0>~relay(1,0)~</relay_0>
«  »" etc… 15 fois donc c’est long!!«  »"
</timer_15>
[/quote]

Ensuite pour interpréter les timers j’ai fait un lecteur de XML spécial timers qui simplifie la notation fastidieuse que la carte restitue.

[code]
$url = « http:// ».$ip.« /status.xml »;
$xml = simplexml_load_file($url);
$result = array();
foreach($xml->children() as $child){
$result[$child->getName()] = trim($child);
if( $child->getName() == ‹ timers › ){
foreach($child->children() as $L1child){
$result[$L1child->getName()] = trim($L1child);
foreach($L1child->children() as $L2child){
$result[‹ timers ›][$L1child->getName()][$L2child->getName()] = trim($L2child);
} // for each level 2 child
} // for each level 1 child
} // For each TIMERS
} // for each XML child

$temp = $result[‹ timers ›];
foreach($temp as $Tkey => $Tdata) {
foreach($Tdata as $TTkey => $TTdata) {
// voir status.xml modifié pour ajouter les timers !
// Convertir le XML en ARRAY plus expoitable (vient d’un formulaire HTML) !
if($TTdata == ‹ selected › ){
$data = $magtab=explode(« _ »,$TTkey);
$result[‹ timers ›][$Tkey][$data[0]] = $data[1];
unset($result[‹ timers ›][$Tkey][$TTkey]);
}
if($TTdata == ‹  › ){
unset($result[‹ timers ›][$Tkey][$TTkey]);
}
}} // eof foreach
// mise en forme stricte !
$temp = array(); $temp[‹ response ›] = $result; $result = array(); $result = $temp;

echo ‹ 

 ›;
print_r($result);
echo ‹ 
 ›;
[/code]

Ca donne cela dans le PHP:

[color=#0000FF][timers] => Array
(
[timer_0] => Array
(
[time] => 08:30
[relay] => 0
[action] => 1
)

                [timer_1] => Array
                    (
                        [time] => 13:30
                        [relay] => 0
                        [action] => 0
                    )

                [timer_2] => Array
                    (
                        [time] => 08:31
                        [relay] => 1
                        [action] => 1
                    )

                [timer_3] => Array
                    (
                        [time] => 13:30
                        [relay] => 1
                        [action] => 0
                    )[/color]... jusqu'à 15 donc.

Une fois la certitude que les timers sont bon je peux arrêter de parler a la carte.
Jusqu’à la prochaine modification d’horaire.
Bye
Rno

status.xml.EXTENDED.zip (8.96 KB)

Enlevez l’extention .EXTENDED.zip la fichier n’est pas compressé.
J’ai juste changé le .xml refuse par le forum

Bye
Rno

Bonjour,
Super! beau boulot je vais récupérer tout ce code et l’intégrer à mon application.
ça marche nickel! en plus avec le status.xml déjà modifié c’est du pré-maché

Attention: Dans l’archive 20502 fourni par GCE il traine un fichier Thumbs.db de 10K qui vient s’intégrer lors de la compilation du site et donne un fichier trop important pour la mémoire de la carte. N’oublier pas de le virer!
(cela m’a craché ma carte il fallu la flasher)

Merci