Question de codage pour z-wave

Ok, je vais creuser.
Bonne soirée

1 « J'aime »

Donc, pour ceux que ça intéresse, voici un bout de code à mettre dans un scénario lancé régulièrement pour pinguer un type de module spécifique, en l’occurence, dans le cas présent, les vannes Eurotronic Spiritz.

Merci à @Jeandhom et @Bercolly pour leurs précieux conseils.

//*********************************************************
// Ping a list of equipment
//**********************************************************


// Parameters
$API_Key = your_API_key;
$Ping_Wait = 1;						// Delay between 2 pings
$Name_prod = 'EUR_SPIRITZ';			// Name of the equipment to ping
$Nb_ping = 2;						// Number of pings on each device
//

$scenario->setLog('***** Ping : ' . $Name_prod); 

// Equipment search
$eqLogics = eqLogic::byTypeAndSearhConfiguration('openzwave', $Name_prod);

// Equipment ping loop
foreach($eqLogics as $eqLogic) {
	$scenario->setLog($eqLogic->getLogicalId() . ' ' . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
	$url_ping = 'http://localhost:8083/node?apikey=' .$API_Key .'&node_id=' .$eqLogic->getLogicalId() .'&type=action&action=testNode';
	for ($i=0; $i<$Nb_ping; $i++) {
		file_get_contents($url_ping);
  		sleep($Ping_Wait);
	}
}

Pour ma part, je le lance toutes les 2 heures afin que les vannes ne se désactivent pas, autrement leur latence est trop importante.

1 « J'aime »

@Jeandhom @Bercolly

Pour info le strpos() ne marche pas comme vous l’aviez écrit. La chaine de caractère recherchée étant en tout début, il me retournait une position 0, qui revient au même qu’un false. J’aurais dû le comparer à null parce que le test rend soit null soit une valeur numérique mais soit il considère que false et null c’est pareil, ce qui est une erreur, soit il y a un autre problème et là j’ai la flemme d’explorer davantage.
C’est surprenant mais j’ai mis un certain à comprendre pourquoi tout sortait en false. Pour ma part, je pensais que la première position était en 1 pas en 0.
Pour contourner le problème, j’effectue la recherche sur une partie du nom qui ne se trouve pas au début, en l’occurence SPIRITZ et là, plus de problème.

Merci encore

Bon, j’ai écrit cela un peu à l’arrache en fait la bonne écriture est la suivante :

if( strpos($eqLogic->getConfiguration()['product_name'], 'EUR_SPIRITZ') !== false {
   

Voir la doc php == ou != si les deux éléments sont du même type et === ou !== si les deux éléments de comparaison ne sont pas de même type mais comparés après transtypage…

A+
Bernard

Yes, je n’avais pas vu non plus. C’est vrai qu’à une heure du matin, on n’a pas forcément toute l’attention voulue.
Je fais la modif et reposte le scénario.
Merci et bonne journée

Tu peux aussi optimiser le code en ne faisant qu’une seule boucle foreach.

C’est comme ça que je l’avais écrit dans un premier temps.
Mais, d’une part, je me suis dis qu’en les séparant ça rendait le code plus lisible si d’autres veulent s’en inspirer, d’autre part j’ai ajouté la possibilité de multiplier les pings sur chaque équipement, un seul ne suffit pas toujours à faire retomber la latence dans une plage nominale.

Finalement, je suis revenu en arrière et je t’ai suivi, j’ai tout mis dans la même boucle.
Ce n’est pas si illisible que ça et puis c’est pas bien sorcier à comprendre.

En regardant les autres fonctions de la classe, tu dois pouvoir remplacer :

$eqLogics = eqLogic::byType('openzwave');

par

$eqLogics = eqLogic::byTypeAndSearhConfiguration('openzwave', 'EUR_SPIRITZ');

et plus besoin du test

if( strpos($eqLogic->getConfiguration()['product_name'], 'EUR_SPIRITZ') !== false {

Génial, je vais tester ça ce soir.
Si je comprends bien tous les Z-wave s’appelant EUR_SPIRITZ sont directement extraits dans $eqLogics.
Si c’est ça, je vais simplifier d’autres codes.

Modification apportée et fonctionnelle.
J’ai apporté la modif dans le post.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.