Nuki Smart Lock : Retour d'état vers la V5

Bonjour,
Je possède depuis peu une serrure connecté de type Nuki Smart Lock v3 avec le pont wifi.
Je parviens parfaitement à faire fonctionner celle-ci via la fonction de « push », cependant peut-on aller lire l’état de celle-ci (l’api répond en json) ?
Merci

Bonjour,
si l’api répond en JSON, il faut combiner un objet PUSH qui contient la requête avec la commande lockstate et un objet JSON PARSER pour extraire la valeur selon le nom de la clé « state ».
Dans la config du Parser, il faut choisir la réponse du PUSH en tant que datasource.

exemple de requête extrait de la doc :
http://192.168.1.50:8080/lockState

réponse json :

{
 “state”: 1,
 “stateName”: “locked”,
 “batteryCritical”: false,
 “success”: true
}

bonne journée

1 « J'aime »

Mais oui, « parser » !!! Merci @fgtoul

Une idée pour restituer les résultats dans le Dashboard ?
Capture d’écran 2022-05-18 à 14.30.52

l’objet parser permet l’association de variables.
Il faudra alors utiliser 10 comparateurs pour savoir si state==1 ou state==2 ou … ou state==255 si vous souhaitez scénariser.
Pour un simple affichage des valeurs, il suffit d’associer une ANA8 pour state et une String32 pour stateName.
Il suffira d’afficher ces variables dans un widget.

@fgtoul : J’ai bien utilisé le parser, mais si je lui donne plusieurs clés il n’y a qu’un « output » qui apparait (peut-être un bug) ?
Finalement le plus simple me semble : parser « stateName » et « batteryChargeState ».
Peut-on afficher les deux dans un unique widget ?

Les widgets Texte ne permettent pas de sélectionner plusieurs sources.
Sur un dashboad clasique, il faudra donc créer un widget HTML pour afficher les 2 sur un seul widget.

Sur un Liveview, le positionnement de 2 widgets (ou superposition) est libre, sinon HTML également.

En ce qui concerne le nombre de clé lue dans les parsers, ne devais je pas avoir un output pour chacune ?

Il y a possibilité d’en mettre 8

@fgtoul pour ma part, dans les widget, seul la clé 1 apparait…

si la clé ainsi nommée n’est pas présente dans la réponse Json, cela génère certainement le problème.
Avec la commande lockState, essayez « batteryCritical »

Attention à la casse des noms

@fgtoul la réponse est pourtant bien dans le json retour :

{"mode": 2, "state": 1, "stateName": "locked", "batteryCritical": false, "batteryCharging": false, "batteryChargeState": 100, "success": true}

vous pouvez partager une capture du Parser ?

Oui :
Capture d’écran 2022-05-19 à 10.46.54

1 « J'aime »

dans les widgets, il y a bien les 8 sorties du Parser

Capture d’écran 2022-05-19 à 10.51.48
Oui, mais ils me renvoient le nom de la clé, pas son contenu (ex. « stateName » et non « locked »)

EDIT : erreur de capture :blush: voilà la bonne (pour les lecteurs)

@fgtoul ton message était la solution : il faut utiliser le bon type de widget !!

1 « J'aime »

j’ai bien output 1 et output 2 si toutes 2 définies en Str.
Il faut choisir le widget en fonction du type défini sur la clé du parser

Pour les lecteurs :
voici un widget que j’ai développé pour @Gevaudan, testé par ses soins car je n’ai pas de smartLock Nuki

Principe : créer le push sur la V5.
Ce push exécutera la requête « lockState » sur la Nuki via le Nuki Http Bridge.

Le résultat du Push sera récupéré (sous forme de Json imbriqué) par le Widget, il conviendra donc de modifier l’URI avec l’IP de l’IPX et l’ID du résultat du Push (STR512) et l’ApiKey de la V5

Dans le code ci-dessous, nous avons renseigné l’ID 786507 pour l’exemple. Nous avons également mis l’adresse publique de la v5 pour un accès depuis internet.
La requête se charge de récupérer la variable STR512 dont l’ID est 786507 :

{
  "_id": 786507,
  "link0": 1114131,
  "link1": 0,
  "name": "[LACASELOCKSTATUS]Response",
  "value": "{\"mode\": 2, \"state\": 1, \"stateName\": \"locked\", \"batteryCritical\": false, \"batteryCharging\": false, \"batteryChargeState\": 100, \"success\": true}"
}

Le code en extrait le champ « value » puis le transforme à son tour en json pour parser les données de la smartLock.

<table width='100%' style="padding: 10px">
  <tr style="display: flex; align-item: center; justify-content: space-between">
           <td><i id="m_lockIcon" class="gce-glyph" style="font-size:20px"></i> </td>
           <td><h2><span id="m_lockState" style='font-size: 15px'></span></h2></td>
    </tr>    
    <tr style="display: flex; align-item: center; justify-content: space-between">
          <td><i id="m_batIcon" class="gce-glyph" style="font-size:20px"></i></td>
          <td><h2><span id="m_batState" style='font-size: 15px'></span></h2></td>
   </tr>
</table>
<script type="text/javascript">
  /* Get state and set widget */
  function init() {
    let lockIcon,
        lockState,lockColor,
        batIcon,
		batState, batColor;
    
    getState((nuki) => {
    let nukiString = nuki.value; // résultat du Push V5
    let nukiJSON=JSON.parse(nukiString);  
      switch(nukiJSON.state) {
				case 0:
					// lock uncalibrated
					lockState="Non calibrée";
					lockStateColor="#f00";
					lockIcon="icon-refresh";
					break;
				case 1:
					// locked
					lockState="Fermée";
					lockColor="#0f0";
					lockIcon="icon-key_security";
					break;
				case 2:
					// Unlocking
					lockState="Ouverture";
					lockColor="#ff0";
					lockIcon="icon-refresh";
					break;
				case 3:
					// unlocked
					lockState="Ouverte";
					lockColor="#f00";
					lockIcon="icon-key_security";
					break;
				case 4:
					// locking
					lockState="Fermeture";
					lockColor="#ff0";
					lockIcon="icon-refresh";
					break;	
				default:
					// undefined
					lockState="non défini";
					lockColor="#666";
					lockIcon="icon-key_security";
			}
			let nukiBatCharging=nukiJSON.batteryCharging;
			batState=nukiJSON.batteryChargeState		
			switch(nukiBatCharging){
				case false:
					if (batState>=80){
						batColor="#0f0";
						batIcon="icon-battery-charged_power";

					} else if (batState>=30 && batState<80 ) {
						batColor="#ff0";
						batIcon="icon-battery-half_power";
					} else {
                                                 batColor="#ff0";
						batIcon="icon-battery-low_power";
                                        }
					if (nukiJSON.batteryCritical==true){
						batColor="#f00";
						batIcon="icon-battery-low_power";
					}
					break;
				case true:
					batColor="#ff0";
					batIcon="icon-battery-charging_power";
                                        // batIcon="icon-flash_power"; //autre icone possible	
			} 
      
      setLockIcon(lockIcon, lockColor);
      setLockState(lockState, lockColor);
      setBatState(batState, batColor);
	  setBatIcon(batIcon,batColor);
    });
  }
  /***/
  
  /* Get data from IPX */
  function getState(cb) {
    fetch("http://IPX_IpAddress:Port/api/core/str/786507?ApiKey=xxxx", {method: "GET"}).then((ret) => { // Get Nuki Endpoint
      ret.json().then((nuki) => {
        cb(nuki); // Return IPX state from API
      });
    });
  }
  function setLockIcon(icon, color) {
    let myIcon = document.getElementById("m_lockIcon");
    myIcon.style.color = color;
    myIcon.classList.add(icon);
  }
  function setLockState(text, color) {
    let msg = document.getElementById("m_lockState");
    msg.style.color = color;
    msg.innerHTML = text;
  }
  function setBatState(text, color) {
    let battery = document.getElementById("m_batState");
    battery.style.color = color;
    battery.innerHTML =" chargée à " + text + "%";
  }
   function setBatIcon(icon, color) {
    let myIcon = document.getElementById("m_batIcon");
    myIcon.style.color = color;
    myIcon.classList.add(icon);
  }
  function autoRefresh() {
    setInterval(() => {
      init();
    }, 1000); // 1 sec
  }
  /***/
  
  init();
  autoRefresh(); // Optional
</script>

libre à vous de personnaliser le widget (taille du texte, couleurs et icones.)

image

image

image

Bonne journée

3 « J'aime »