Hoe filter ik een door komma's gescheiden lijst?

Continuing the discussion from MQTT met de Siemens LOGO! 8.4:

Beetje offtopic, maar ik gebruik, voor zover ik er verstand van heb, MQTT voor mijn Nuki Smartlock Pro.
Hiervoor gebruik ik de Broker en Client op Homey.

Ik heb de Nuki verbonden met de broker en de berichten komen binnen op homey.
Ik gebruik hiervoor de kaart:
Schermafbeelding 2024-05-23 om 00.36.56

Nu zie ik dat het Siemen-MQTT verhaal in JSON-format is. Geldt dit ook voor Nuki?
Dit is wat ik bijvoorbeeld krijg:
Schermafbeelding 2024-05-23 om 00.36.06

Zo ja, wat is bijvoorbeeld een manier om het getal ‘3431645’ uit het bericht te filteren?

Alvast bedankt.

Hmm, dat is comma separated, oftewel spreadsheet formaat.
Daar je inmiddels hebt laten weten of van het eerste deel 2,0, de nul echt altijd een nul is, zou je dit filter kunnen gebruiken:

Ik heb ter de test de waarde 2,0,3431645,0,0 even in een variabele gezet
Gebruik deze Homeyscript “Dan” kaart: “Run code met argument en return Nummer-tag”:

Met gefilterd getal op de tijdlijn:

Je MQTT flowtrigger maakt deze tag beschikbaar [Message received from topic], welke je als argument invoert in het argumentveld van het HS kaartje

De code:

// Filter the big number out of the MQTT argument from the Nuki lock
const arg = args[0];
var nukiNumber = Number('' + arg.split("0")[1].slice(1).split(",")[0]);
console.log('Argument: ', args[0]);
return nukiNumber;


En even nieuwsgierig, waarom loopt Nuki via MQTT bij jou, en hoe heb je dat gedaan? Als in, Nuki heeft zelf geen MQTT dacht ik?

Ik heb de Smartlock 4, met Matter (via HomeAssistant) en dat reageert vrij vlot.
Bluetooth is echt verschrikkelijk traag haha

1 Like

Maar MQTT over WiFi lijkt me niet ideaal voor een slot met batterijen, WiFi is niet echt een energiezuinig protocol.

Als je geen externe controls hebt voor je Nuki (keypad en zo) is het denk ik ook niet echt nuttig om te gebruiken. Voor die controls kan het handig zijn omdat je zo (vermoed ik) b.v. kunt zien wie precies de deur heeft geopend.

Ah, is enkel beschikbaar op de Pro. De niet-pro heeft ook geen wifi haha.

Of over Thread, wat de niet-pro ook kan:

Vraag me af of je MQTT en Matter tegelijkertijd kunt gebruiken over Thread.

Haha, ik lees steeds net niet ver genoeg denk ik :stuck_out_tongue_winking_eye:

In de app staat het MQTT gedeelte ook net ergens anders, onder smart home.
Maar goed, nu kan ik het niet activeren, waarschijnlijn omdat het slot niet als ‘echt’ Thread apparaat is toegevoegd.
Óf omdat hij al via Matter verbonden is.

Dit gaat over de bridge, maar het lijkt erop dat je moet kiezen tussen Matter OF Thread:


Oh, @iBosvelt ik vond de betekenis van de getallen:

1 Like

Thanks! Jouw uitgebreide antwoorden zijn altijd fijn :slight_smile:

Dat script kan ik mooi gebruiken. Alleen geeft het eerste cijfer in de reeks aan of het een ‘lock’ of ‘unlock’ is van een bepaalde gebruiker.

1.0.365162.0.0 = unlock
2.0.365162.0.0 = lock.

Kan het script ook bekijken of de eerste cijfer een 1 of 2 is? En daarna het grote getal eruit filteren?

1 Like

Heel graag gedaan. Voor mij ook weer leerzaam :wink:

Het eerste cijfer kun je er uit filteren, zie de regel in de code onder “// filter out the first digit, …”.
Maar nu hebben we geen nummer maar tekst als resultaat: gebruik dan het kaartje “Run code met Argument en return Text-tag”

// Filter the auth.id from the MQTT msg argument from the Nuki lock
// 1.0.365162.0.0 : unlock/Jantje
// 2.0.365162.0.0 : lock/Jantje
var arg = args[0];
console.log('Used Argument =', arg);
// filter out the auth.id
const nukiNumber = Number('' + arg.split("0")[1].slice(1).split(",")[0]);
console.log('nukiNumber =', nukiNumber);
// filter out the first digit, representing lock action
const nukiAction = Number('' + arg.slice(0,1));
console.log('nukiAction =', nukiAction);
// replace 1 with "Unlock" and 2 with "Lock"
// replace auth.id 365162 with "Jantje" and 369999 with "Pietje"
if (nukiAction === 1 && nukiNumber === 365162) {
   return `Ontgrendeld door Jantje`
};
if (nukiAction === 1 && nukiNumber === 369999) {
   return `Ontgrendeld door Pietje`
};
if (nukiAction === 2 && nukiNumber === 365162) {
   return `Vergrendeld door Jantje`
};
if (nukiAction === 2 && nukiNumber === 369999) {
   return `Vergrendeld door Pietje`
};


1 Like