Bug dans la création des templates JMQTT

Bonjour,

Depuis les deux dernières versions du plugin JMQTT, il semble qu’il y ait un petit bug dans la création des templates : il enregistre le nom complet du topic de l’équipement, au lieu de lui substituer « %s ».

Du coup, quand on applique un template, le remplacement du nom ne se fait pas et on se retrouve avec un nouvel équipement qui est un doublon de celui qui avait servi pour faire le template => croisements des remontées de données dans tous les sens :frowning:

Je pense qu’il n’y a que ça, car en faisant une export du fichier, en modifiant le topic par « %s », puis en le réimportant cela fonctionne.

En passant : une petite suggestion SVP => forcer l’équipement à passer en « inactif ».
Cela permettrai d’éviter ce genre de problèmes, aussi en cas d’erreur utilisateur :wink:

1 « J'aime »

Hello et merci pour la remontée de bug.

Tu peux me faire une capture d’écran ? Je n’arrive pas à reproduire ici.

Bien sûr.

En rouge le pas bon (version actuelle) :

et le bon en vert (ancien export d’avant les 2 dernières màj) :


En passant : je vois également que les noms des templates sont modifiés : tous les espaces sont remplacés par des underscores. Y’a une raison, ou c’est un bug ?
Exemple :

Blabla - Sonoff Dual R3 - VMC

devient

Blabla_-_Sonoff_Dual_R3_-_VMC

ce qui fait super moche dans la liste de gauche :frowning:

Hello,
Avant que j’efface mes tests, est-ce que tu as ce qu’il te faut pour reproduire/corriger le bug ou bien il te faut d’autres infos ?

Hello,

Merci pour tes messages, autant je confirme que le nom est un peu moche…
Autant je n’arrive pas à reproduire le fonctionnement où on se retrouve avec le topic complet dans le template.

Je regarde si ce ne serait pas une histoire de caractères spéciaux.

Possible : j’ai une des commandes qui comporte le symbole degré => « C° histo »

Sinon, ça ne fonctionne plus depuis au moins les 2 dernières versions, donc la modif en cause remonte à entre 3 et 5 versions max.

EDIT : j’ai viré le symbole degré, sauvé, suis sorti et re-rentré dans l’équipement et ai fait une création de template => même problème, donc ce n’est pas ça.
Si ça peut t’aider, voici l’export tel-quel d’un template créé avec les erreurs :
Test_sans_symboles.json.txt (42,8 Ko)

1 « J'aime »

Je parlais plus de _ et - dans le topic de souscription, mais merci des tests

Les tirets et underscore dans le topic, j’en ai toujours eu et ça fonctionnais avant donc peut-être.
Mais je pense qu’on en a tous car même les noms par défaut en comprennent (ils se finissent généralement par un underscore et 4 chiffres de l@ MAC).

Oui en effet, c’est bien un bug avec des - ou des _ dans le topic de souscription.

Peux-tu remplacer le code de la fonction createTemplate, dans le fichier
jMQTT/core/class/jMQTT.class.php par le code suivant :

	public function createTemplate($_tName) {
		if ($this->getType() != self::TYP_EQPT)
			return true;
		$_tName = ucfirst(str_replace('  ', ' ', trim($_tName)));
		$_tName = preg_replace('/[^a-zA-Z0-9 ()_-]+/', '', $_tName);
		$exportedTemplate[$_tName] = $this->export();
		$exportedTemplate[$_tName]['name'] = $_tName;
		unset($exportedTemplate[$_tName]['configuration'][self::CONF_KEY_BRK_ID]);
		if (array_key_exists('cmd', $exportedTemplate[$_tName])) {
			$exportedTemplate[$_tName]['commands'] = $exportedTemplate[$_tName]['cmd'];
			unset($exportedTemplate[$_tName]['cmd']);
		}
		$cmdsId = array();
		$cmdsName = array();
		foreach ($this->getCmd() as $cmd) {
			$cmdsId[] = '#' . $cmd->getId() . '#';
			$cmdsName[] = '#[' . $cmd->getName() . ']#';
			if ($cmd->isBattery())
				$exportedTemplate[$_tName]['configuration'][self::CONF_KEY_BATTERY_CMD] = $cmd->getName();
			if ($cmd->isAvailability())
				$exportedTemplate[$_tName]['configuration'][self::CONF_KEY_AVAILABILITY_CMD] = $cmd->getName();
		}
		$jsonExport = json_encode($exportedTemplate, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
		$jsonExport = str_replace($cmdsId, $cmdsName, $jsonExport);
		$baseTopic = $this->getTopic();
		if (substr($baseTopic, -1) == '#' || substr($baseTopic, -1) == '+') { $baseTopic = substr($baseTopic, 0, -1); }
		if (substr($baseTopic, -1) == '/') { $baseTopic = substr($baseTopic, 0, -1); }
		if ($baseTopic != '') {
			$toReplace = array('"'.self::CONF_KEY_AUTO_ADD_TOPIC.'": "'.$baseTopic, '"topic": "'.$baseTopic);
			$replaceBy = array('"'.self::CONF_KEY_AUTO_ADD_TOPIC.'": "%s',          '"topic": "%s');
			$jsonExport = str_replace($toReplace, $replaceBy, $jsonExport);
		}
		file_put_contents(__DIR__ . '/../../' . self::PATH_TEMPLATES_PERSO . str_replace(' ', '_', $_tName) . '.json', $jsonExport);
	}

Je regarde pour intégrer ça en beta prochainement.

1 « J'aime »

ça fonctionne parfaitement :ok_hand: :

  • le nom du template conserve bien les espaces au lieu de mettre des underscores
  • les topics ont bien « %s » au lieu de rester identiques aux topics sources

Merci beaucoup pour la rapidité :+1:

1 « J'aime »

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