Compare latest 4 messages against mysql

Hi, I looking for a way how to compare the latest 4 messages against data in MySQL.

I got a keypad that sends a message for every key pressed(MQTT message), now I using sequence-detector to check for a sequence of the correct pin but that sequence-detector works only with "hard set" values in node and there is no way how to set new pin for example with config message. I need to check the sequence of the last 4 messages against MySQL. Any suggestions?

Thanks .

DIY it.

6nxxhvt7cJ

[{"id":"d7fba0a9.11671","type":"function","z":"553814a2.1248ec","name":"pin","func":"var seq = context.get(\"seq\") || \"\";\nvar pin = context.get(\"pin\") || \"9999\";\nvar pinLength = pin.length;\n\nfunction showStars(count, colour) {\n    var str = new Array(count+1).join(\"*\");\n    node.status({ fill: colour, shape: \"ring\", text: str });\n}\n\n\n\nif(msg.topic == \"setpin\") {\n    context.set(\"pin\", msg.payload);\n    context.set(\"seq\", \"\");\n} else if (msg.topic == \"clear\") {\n    context.set(\"seq\", \"\");\n} else {\n    seq += (msg.payload + \"\");\n}\n\nshowStars(seq.length, \"red\");\n\nmsg.payload = false; //fail by default\n\nif(seq === pin) {\n    seq = \"\"; //reset seq\n    msg.payload = true;\n    showStars(seq.length, \"green\");\n} else if (seq.length >= pinLength) {\n    seq = \"\"; //restart seq\n} \n\n//store seq\ncontext.set(\"seq\", seq);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":1220,"wires":[["4f6e9447.bba25c"]]},{"id":"4f6e9447.bba25c","type":"debug","z":"553814a2.1248ec","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":690,"y":1220,"wires":[]},{"id":"bfa78fcf.4d9c3","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"str","x":290,"y":1140,"wires":[["d7fba0a9.11671"]]},{"id":"1b38a685.e629e9","type":"inject","z":"553814a2.1248ec","name":"set pin 1234","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"setpin","payload":"1234","payloadType":"str","x":310,"y":1080,"wires":[["d7fba0a9.11671"]]},{"id":"80fb8831.314068","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"str","x":290,"y":1180,"wires":[["d7fba0a9.11671"]]},{"id":"d45fc8b7.38c3f8","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"3","payloadType":"str","x":290,"y":1220,"wires":[["d7fba0a9.11671"]]},{"id":"b01f67c9.c5fae8","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"4","payloadType":"str","x":290,"y":1260,"wires":[["d7fba0a9.11671"]]},{"id":"821671cd.2bc3","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"5","payloadType":"str","x":290,"y":1300,"wires":[["d7fba0a9.11671"]]},{"id":"694ac4.e6e3453c","type":"inject","z":"553814a2.1248ec","name":"","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"clear","x":290,"y":1360,"wires":[["d7fba0a9.11671"]]}]

I edit it to detect the sequence in stream of messages. Maybe it help someone.

var pin = context.get("pin") || "9999";
var pinLength = pin.length;
var seqCorrect = context.get("seqCorrect") || 0;
var latestNumber = 0;
function showStars(count, colour) {
    var str = new Array(count+1).join("*");
    node.status({ fill: colour, shape: "ring", text: str });
}

//node.warn(msg.payload);

if(msg.topic == "setpin") {
    context.set("pin", msg.payload);
    context.set("seq", "");
}else if (msg.topic == "clear") {
    context.set("pin", "0000");
}else{ 
    latestNumber = msg.payload;
}
//node.warn("pin:"+pin);
msg.payload = false; //fail by default
//node.warn("input:"+latestNumber);
//node.warn("compare to:"+pin.toString()[seqCorrect]);
//node.warn("seq correct:"+seqCorrect);
if(latestNumber == pin.toString()[seqCorrect]){
 seqCorrect++;
}else if(latestNumber == pin.toString()[0]){
    seqCorrect=1;
}else{
 seqCorrect = 0;
}
if(seqCorrect >= pin.length){
    node.status({ fill: "green", shape: "ring", text: "CORRECT" });
 msg.payload = true;
}else{
    showStars(seqCorrect, "red");
}
context.set("seqCorrect",seqCorrect);
return msg;

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.