JSONPATH comment testé l'absence d'une propriété?

Bonjour a tous,

J’utilise Jeedom, JMQTT, un serveur mosquitto sur synology et un zigbee2tasmota sur un ESP32-POE avec un interrupteur aqara doubleSwitch.

Je souhaite distinguer les 2 messages MQTT suivant ayant pour origine l’interrupteur :

Le message d’indication du niveau de batterie

{
  "ZbReceived":
  {
    "2CHS-doubleSwitch":
    {
      "Device":"0x50D2",
      "Name":"2CHS-doubleSwitch",
      "BatteryVoltage":3.03,
      "BatteryPercentage":100,
      "Endpoint":1,
      "LinkQuality":123
    }
  }
}

Le message d'indication d'action sur le bouton gauche de double interrupteur.
{
  "ZbReceived":
  {
    "2CHS-doubleSwitch":
    {
      "Device":"0x50D2",
      "Name":"2CHS-doubleSwitch",
      "BatteryPercentage":100,
      "Endpoint":1,
      "LinkQuality":123
    }
  }
}

Seul le deuxième m’intéresse et il est reconnaissable car il n’a pas la propriété BatteryVoltage…
Facile ! :slight_smile: Il suffit d’écrire un JSONPATH excluant les objets ayant cette propriété… sauf que apparemment le JSONPATH de JMQTT ne supporte pas la notion suivante :

$..book[?(!@.isbn)]

qui justement permet de selectionner des objets (ici ‹ book ›) sans une propriété donnée (ici ‹ isbn ›).

Avez-vous une idée ?
Merci de votre aide.

Hello,

Il y a effectivement quelque chose d’étrange dans l’implémentation de la lib jsonPath…
jsonPath : $.ZbReceived.2CHS-doubleSwitch[?(! @.BatteryVoltage)]
On a le même résultat avec la prop BatteryVoltage :


et sans la prop BatteryVoltage :

Par contre, le chemin $..[?(not @.BatteryVoltage)].BatteryPercentage répond bien :


Bad

1 « J'aime »

Superbe !
Merci, j’essaie de suite.

Tu pourras juste m’expliquer ton cas d’usage ?
Je ne comprends pas trop pourquoi tu ignorerais une valeur si une autre prop est manquante ?

Je te répond ce soir. Je suis un peu pris tout de suite…

Bonsoir Bad,

Voici ce que j’utilise finalement :
$.ZbReceived…[?(@.Name == « 2SDDWC-doubleSwitch » && not @.BatteryVoltage)].Endpoint

Voici ce que j’utilisais intialement:
[ZbReceived][2SDDWC-doubleSwitch][Endpoint]

L’objet « 2SDDWC-doubleSwitch » est en fait un double interrupteur xiaomi aqara wireless situé dans la salle de douche et wc du 2ème étage… :-). Le poussoir de gauche pilote les 2 appliques murales tandis que celui de droite pilote la lumière du miroir et enfin le double appui allume ou éteint le tout. Mon problème était que l’interrupteur xiaomi envoie deux trames vraiment similaires pour indiquer soit son état de batterie ou soit l’action sur le poussoir de gauche (Endpoint == 1). La seule différence est la présence ou l’absence de la propriété « BatteryVoltage ».

Et voici l’ensemble des commandes JMQTT du fameux interrupteur xiaomi :

Associé il y a plusieurs scénarios très simples pour allumer ou éteindre les lumières dont voici un déclenchement :


Je te fais un petit historique de mon installation pour que tu comprennes comment j’en suis arrivé là.

Il y a 6 ans quand j’ai créé mon installation, l’objectif initial était de piloter des relais z-wave (via le plugin Z-wave) avec des interrupteurs xiaomi (via plugin Xiaomi Home) ceci pour une raison de coût. Ce principe c’est révélé robuste, mais terriblement lent à cause notamment du réseau Z-wave…

Nous avons vécu comme ça 5 ans et il y a un an, en 2022, je décidé de remédier au problème :
1/ En passant tout en zigbee pour pouvoir faire du binding avec mes vieux interrupteurs xiaomi. Exit Z-wave donc.
2/ en segmentant mon réseau zigbee (1 réseau par niveau => 4 réseaux)

Accessoirement je veux me débarrasser des mes vieux gateway xiaomi connectés au serveur « chinese mainland » seul compatible avec ces 1er exemplaires importés de chine… et je ne veux pas de rasberryPI avec leur SDcard et leur OS, je veux une liaison Ethernet et pas wifi et je veux une alimentation POE. J’ai donc choisi « Zigbee 2 Tasmota » (Z2T) hébergé sur des microcontrolleurs OLIMEX ESP32-POE avec une clé SONOFF ZigBee 3.0 USB Dongle Plus (TI CC2652P). (cf. file : « Plugin ZigbeeLinker pourrait-il évoluer pour suporter zigbee2tasmota en plus de zigbee2mqtt »).

Les relais aqara étant toujours relativement cher je me suis tourné vers des relais SONOFF ZBMINI. Manque de chance mes vieux interrupteurs xiaomi ne respectent pas strictement la norme zigbee et ne peuvent être « binder » avec les relais SONOFF ZBMINI. Bon ! Me voila donc reparti pour faire du scripting et je l’ai fait dans Z2T avec du « berry scripting ». ça fonctionne nickel et c’est ultra-rapide ! Ah ! Enfin ! :slight_smile:

Ca fait 1 an que Z2T est déployé dans une seule pièce. RAS. J’ai donc étendu l’usage de Z2T à tout le 2ème étage (26 devices zigbee dont alarme périmétrique). RAS pour l’instant c’est toujours ultra rapide !

Je conserve jeedom pour la supervision, d’où ma question… :slight_smile:

En espérant avoir répondu à ta question. Merci encore pour ton aide.

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.