Utiliser le mode callback HTTP en PHP

Utiliser le mode callback HTTP en PHP

Il y a quelques semaines, nous avons expliqué comment utiliser nos modules en PHP. Nous avions expliqué comment utiliser PHP en mode direct, mais il existe une deuxième utilisation: le mode callback HTTP. Cette semaine, nous vous expliquons comment écrire votre premier script PHP qui fonctionne en mode callback HTTP.

Le mode callback HTTP est différent du mode traditionnel car c'est le YoctoHub, ou VirtualHub, qui établit la connexion avec le script PHP. On pourrait expliquer le mode callback HTTP de la manière suivante: "Toutes les X secondes, le YoctoHub se connecte à un serveur pour l’informer de l'état de tous les modules et récupérer les instructions à envoyer aux modules Yoctopuce". Ce qui implique de nombreux changement de paradigme.

Premièrement, comme nous l'avons expliqué dans cet article, cela permet de passer au travers des filtres NAT et ainsi de l'affranchir de la configuration des routeurs et autre firewall.

Deuxièmement, la communication est n'est pas continue. C'est-à-dire que le YoctoHub ne peut pas se connecter à un script PHP et lui envoyer en permanence la valeurs d'un capteur. Des limitations propres à PHP font qu'un YoctoHub doit envoyer toutes les valeurs en une seule fois, traiter une éventuelle réponse du script et doit ensuite se déconnecter.

Troisièmement, il n'est pas possible de récupérer le données du datalogger en mode callback HTTP.

Finalement, la librairie n’a accès qu’aux modules rattachés au YoctoHub qui se connecte. Par exemple, si on a sur un YoctoHub A un Yocto-Meteo et sur un YoctoHub B un Yocto-Display, il n'est pas possible d'afficher directement la température du Yocto-Meteo sur leYocto-Display. Quand le YoctoHub A se connecte, l’application doit stocker la température du Yocto-Meteo et attendre que le YoctoHub B se connecte pour afficher cette température sur le Yocto-Display.

Exemple


Pour illustrer l'utilisation du mode HTTP callback, nous allons écrire un script PHP qui bascule l'entrée d'un relais quand la température dépasse 25°C.

Le script PHP


La première étape est d'écrire le code du script PHP. Il faut commencer par inclure les fichiers nécessaires. Il faut ajouter le traditionnel fichier yocto_api.php pour pouvoir utiliser la librairie, mais aussi les fichiers yocto_temperature et yocto_relay.php pour utiliser les classes YTemperature et YRelay.

<?php
include('Sources/yocto_api.php');
include('Sources/yocto_temperature.php');
include('Sources/yocto_relay.php');


Il faut ensuite initialiser la librairie dans le mode callback HTTP, pour se faire on appelle la méthode YAPI::RegisterHub() mais au lieu de passer en argument l'adresse IP du YoctoHub, on utilise le mot clef "callback".

YAPI::RegisterHub("callback");


A partir de là, le reste du code est presque identique à ce que l'on écrirait en mode direct. On vérifie la présence d'un capteur de température et d'une fonction relais.

$t = YTemperature::FirstTemperature();
if (is_null($t)){
    die("No temperature sensor found");
}
$r = YRelay::FirstRelay();
if (is_null($r)) {
    die("No relay found");
}


Il faut basculer la sortie du relais en fonction de la température courante. Vous remarquerez qu'on passe le relais à l'état B si la température passe au dessus de 25 alors qu'on ne revient à l'état A que si la température passe en dessous de 24. Cela s'appelle un schmitt trigger et évite que le relais ne se mette à osciller quand la température se trouve juste à la limite de déclenchement.

$value = $t->get_currentValue();
if ($value>25)
    $r->set_state(YRelay::STATE_B);
if ($value<24)
    $r->set_state(YRelay::STATE_A);


Dans un programme traditionnel, on mettrait ce test dans une boucle avec une petite attente, mais en mode callback HTTP cela n'est pas possible. Il faut terminer l’exécution du script et attendre la prochaine connexion du YoctoHub pour avoir une nouvelle valeur.

Print("temperature = $value\n");
YAPI::FreeAPI();
?>


Une fois tout mis bout à bout, le code complet ressemble à ceci:

<?php
include('Sources/yocto_api.php');
include('Sources/yocto_temperature.php');
include('Sources/yocto_relay.php');

YAPI::RegisterHub("callback");

$t = YTemperature::FirstTemperature();
if (is_null($t)){
    die("No temperature sensor found");
}
$r = YRelay::FirstRelay();
if (is_null($r)) {
    die("No temperature sensor found");
}
$value = $t->get_currentValue();
if ($value>25)
    $r->set_state(YRelay::STATE_B);
if ($value<24)
    $r->set_state(YRelay::STATE_A);

Print("temperature = $value\n");
YAPI::FreeAPI();
?>



Configuration du serveur PHP


Pour que le mode callback HTTP fonctionne, l'option de PHP allow_url_fopen doit être activée. Si cette option n'est pas activée, l'appel à YAPI::RegisterHub va déclencher une erreur avec le message "URL file-access is disabled in the server configuration".

Malheureusement, la plupart des hébergements n'activent pas cette option par défaut et il faut l'activer manuellement. Certains hébergeurs permettent de changer cette option depuis leur console d'administration, mais c'est rare.

Dans 90% des cas, cette option peut être activée en créant un fichier .htaccess dans le même répertoire que votre script avec le contenu suivant:

php_flag "allow_url_fopen" "On"


Pour d'autres hébergeurs, il faut créer un fichier .user.ini avec le contenu suivant:

allow_url_fopen = 1


Si vous avez un doute, contacter votre hébergeur pour savoir comment activer cette option.

Configuration du YoctoHub


Maintenant que le script est installé sur un serveur PHP correctement configuré, il faut configurer le YoctoHub, ou VirtualHub, pour qu'il s'y connecte périodiquement.

Il faut accéder à l'interface web du YoctoHub, cliquer sur le bouton configure du YoctoHub et finalement cliquer sur le bouton edit de la section Outgoing callbacks

Cliquer sur le bouton configure de la première ligne
Cliquer sur le bouton configure de la première ligne



Cliquer sur le bouton edit de la section Outgoing callbacks
Cliquer sur le bouton edit de la section Outgoing callbacks



Dans la fenêtre de configuration des callbacks, il faut choisir le type "Yocto-API callback". Il faut ensuite fournir l'URL du script créé précédemment et s'assurer que l'URL commence bien par http://, car l'option "ws://" n'est pas supportée par la librairie PHP. Ne spécifiez aucun type de sécurité.

Les deux derniers paramètres permettent de définir à quel intervalle le YoctoHub doit contacter le script. Il est possible de définir un intervalle de base et un intervalle plus court si un des capteurs branchés au YoctoHub a varié.

Pour notre exemple, nous allons configurer le YoctoHub pour qu'il se connecte au script toutes les minutes.

La configuration du YoctoHub pour utiliser notre script
La configuration du YoctoHub pour utiliser notre script



Avant de fermer la fenêtre, il est recommandé de vérifier la configuration avec le bouton test. Si tout fonctionne, vous devriez avoir la température du capteur de température affichée.

La fenêtre de test quand tout fonctionne
La fenêtre de test quand tout fonctionne



Il ne reste plus qu'à fermer la fenêtre de configuration et sauver la configuration.

La suite


Nous avons gardé cet exemple très simple car le but de cet article est vous aider à démarrer et écrire votre premier script. Mais maintenant que vous avez réussi à commuter un relais, il y a fort à parier que vous aimeriez réaliser quelque chose de plus complexe. Dans ce cas, vous risquez de trouver très intéressant la lecture des articles suivants:

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.