Question de codage pour z-wave

Oui, j’ai complété la réponse !

Ok, désolé, j’avais regardé mais je n’y ai vu que la liste des fonctions sans plus de détails.
J’ai dû mal cherché.
Merci encore.

Super, merci beaucoup.
Plus qu’à écrire le reste mais ça devrait aller.
Je posterais l’ensemble du bloc code au cas où ça intéresserait quelqu’un d’autre.
Bonne soirée

@Jeandhom @Bercolly

Désolé mais un truc m’échappe, comment avec juste ça :

Vous arrivez à avoir toutes les infos qu’il vous faut dans la doc.

J’ai écrit le bout de code que vous m’avez proposé et il ne trouve pas les bonnes valeurs, ce qui ne m’étonne qu’à moitié.

Le code :

$eqLogics = eqLogic::byType('openzwave');
foreach($eqLogics as $eqLogic) {
	$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
	if( $eqLogic->getConfiguration()['product_name'] == 'Eurotronic') {
    // équipements du type voulu
		$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
		$ToPing_List[] = $node_id;
    }
}

Le log :

------------------------------------
[2021-02-21 20:43:12][SCENARIO] Start : Scenario lance manuellement.
[2021-02-21 20:43:12][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-02-21 20:43:12][SCENARIO] Exécution d'un bloc code
[2021-02-21 20:43:12][SCENARIO] 75[Amis][FM AM] FGSD002 Smoke Sensor
[2021-02-21 20:43:12][SCENARIO] 92[Amis][Télécommande AM] CRC-3-6-0x Soft Remote
[2021-02-21 20:43:12][SCENARIO] 29[Amis][TV AM] FGWPE/F Wall Plug Gen5
[2021-02-21 20:43:12][SCENARIO] 87[Amis][Vanne AM] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 31[Atelier][Plug Amp] Power plug 12A
[2021-02-21 20:43:12][SCENARIO] 97[Atelier][Plug Chrg] Smart Power Plug NAS-WR01ZE
[2021-02-21 20:43:12][SCENARIO] 72[Atelier][Télécommande AT] CRC-3-6-0x Soft Remote
[2021-02-21 20:43:12][SCENARIO] 19[Couloir][PIR CL] Battery Powered PIR Sensor
[2021-02-21 20:43:12][SCENARIO] 85[Cuisine][Vanne CU] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 77[Enfants][FM EN] FGSD002 Smoke Sensor
[2021-02-21 20:43:12][SCENARIO] 74[Enfants][Vanne EN] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 37[Entree][FM ET] FGSD002 Smoke Sensor
[2021-02-21 20:43:12][SCENARIO] 21[Entree][PIR ET] FGMS001-ZW5 Motion Sensor
[2021-02-21 20:43:12][SCENARIO] 84[Entree][Vanne ET] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 45[Extérieur][EXT ET] SP816 Outdoor Motion Detector
[2021-02-21 20:43:12][SCENARIO] 48[Extérieur][EXT GA] SP816 Outdoor Motion Detector
[2021-02-21 20:43:12][SCENARIO] 46[Extérieur][Lampe ET] FGD212 Dimmer 2
[2021-02-21 20:43:12][SCENARIO] 60[Extérieur][Lampe GA] FGD212 Dimmer 2
[2021-02-21 20:43:12][SCENARIO] 61[Extérieur][Netatmo] FGS222 Double Relay Switch 2x1.5kW
[2021-02-21 20:43:12][SCENARIO] 33[Garage][Congélo] FGWPE/F Wall Plug Gen5
[2021-02-21 20:43:12][SCENARIO] 32[Garage][Cumulus] FGS222 Double Relay Switch 2x1.5kW
[2021-02-21 20:43:12][SCENARIO] 66[Garage][LL Fuite] Water Leakage Detector
[2021-02-21 20:43:12][SCENARIO] 95[Garage][Plug Clean] Power plug 12A
[2021-02-21 20:43:12][SCENARIO] 51[Garage][Plug IMP] Power plug 12A
[2021-02-21 20:43:12][SCENARIO] 34[Garage][Plug LL] FGWPE/F Wall Plug Gen5
[2021-02-21 20:43:12][SCENARIO] 30[Garage][Plug Vélo] Power plug 12A
[2021-02-21 20:43:12][SCENARIO] 55[Garage][Porte haut GA] Door/Window Detector
[2021-02-21 20:43:12][SCENARIO] 53[Local technique][Local] HKZW-DWS01 Door/Window Sensor
[2021-02-21 20:43:12][SCENARIO] 11[Local technique][PAC] FGS212 Switch 3kW
[2021-02-21 20:43:12][SCENARIO] 12[Local technique][PHSel] FGS213 Switch
[2021-02-21 20:43:12][SCENARIO] 13[Local technique][Piscine] FGBS001 Universal Binary Sensor
[2021-02-21 20:43:12][SCENARIO] 14[Local technique][Pompe] FGS212 Switch 3kW
[2021-02-21 20:43:12][SCENARIO] 96[Local technique][Range Extender LT]
[2021-02-21 20:43:12][SCENARIO] 93[Local technique][Télécommande LT] CRC-3-6-0x Soft Remote
[2021-02-21 20:43:12][SCENARIO] 1[Maison][1Z-Stick Gen5 (ZW090)] ZW090 Z-Stick Gen5 EU
[2021-02-21 20:43:12][SCENARIO] 73[Parents][Vanne PA] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 89[Salle de bain][SdBF] Water Leakage Detector
[2021-02-21 20:43:12][SCENARIO] 16[Salon][Range Extender GA] DSD37 Range Extender
[2021-02-21 20:43:12][SCENARIO] 65[Salon][Range Extender SA]
[2021-02-21 20:43:12][SCENARIO] 91[Salon][Télécommande SA] CRC-3-6-0x Soft Remote
[2021-02-21 20:43:12][SCENARIO] 23[Salon][TV SA] FGWPE/F Wall Plug Gen5
[2021-02-21 20:43:12][SCENARIO] 88[Salon][Vanne SA] EUR_SPIRITZ Wall Radiator Thermostat
[2021-02-21 20:43:12][SCENARIO] 35[Salon][Volet] FGR223 Roller Shutter Controller 3
[2021-02-21 20:43:12][SCENARIO] Fin correcte du scénario

En toute rigueur, si le nom Eurotronic était découvert, les lignes lui correspondant devraient être doublée dans le log, le code étant écrit pour.
Donc, j’imagine que la syntaxe de l’eqLogic n’est pas bonne puisqu’on trouve bien les vannes dans le log.
J’ai essayé avec « EUR_SPIRITZ », le résultat est le même.

Si vous avez une ou des suggestions à me faire, je suis bien évidemment preneur.

Par avance, merci

$eqLogics = eqLogic::byType('openzwave');
foreach($eqLogics as $eqLogic) {
	$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
	if( strpos($eqLogic->getConfiguration()['product_name'], 'EUR_SPIRITZ') != false {
    // équipements du type voulu
		$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
//		$ToPing_List[] = $node_id;
  		$ToPing_List[] = $eqLogic->getId();
    }
}
$eqLogics = eqLogic::byType('openzwave');
foreach($eqLogics as $eqLogic) {
	$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
	if( strpos($eqLogic->getConfiguration()['product_name'], 'EUR_SPIRITZ') != false {
    // équipements du type voulu
		$scenario->setLog($eqLogic->getLogicalId() . $eqLogic->getHumanName() . ' ' .$eqLogic->getConfiguration()['product_name']);
//		$ToPing_List[] = $node_id;
// 		$ToPing_List[] = $eqLogic->getId();
  		$ToPing_List[] = $eqLogic->getLogicalId();
    }
}

Merci à tous les 2 mais ça m’embête de vous déranger pour ça.
J’aimerais bien pouvoir être autonome sur l’utilisation de ces fonctions.
Y aurait-il une doc plus complète quelque part ou un mode d’emploi de la doc indiquée ?

Pas à ma connaissance, il faut regarder le code pour comprendre les arguments à passer et le résultat qui sera obtenu.
Regarder la structure des tables est aussi très instructif.

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.