NEWS
[gelöst] NFC mqtt in iobroker anwenden
-
Ich habe ein NFC–Modul im Einsatz, welches über mqtt in iobroker eingebunden ist. Im „in“–Kanal wird unter „Wert“ die Nummer des RFID–Chips angezeigt. Das Format ist hier JSON.
Ich suche nach einer Möglichkeit, hiermit eine Tastfunktion auszulösen.
Mit Blockly bin ich da noch nicht zum Ziel gekommen. Allein schon die „wenn…mache“ Funktion ist nicht schlüssig. Entweder wird aktualisiert oder geändert als Bedingung. Das verursacht aber das Problem, dass wenn Änderung aktiv ist, chip1 sich einmal anmeldet, dann nur noch über Änderung der Nummer, also z.B. Chip2 wieder aktiv werden kann.
Andersrum wenn Aktualisierung drin steht, dann kann nur der letzte drin stehende Wert auslösen.
Außerdem muss wohl JSON erst dekodiert werden, damit iobroker damit etwas anfangen kann. Ich hatte zuerst testweise den gesamten Inhalt von „Wert“ in ein Textblockly eingefügt, was aber keinerlei Funktion hervorrief. Verwende ich ein JSON konvert, dann funktioniert das ebenfalls nicht. Wenn ich mir den Code dazu anschaue, sieht der aber recht sonderbar aus.
Wie bekomme ich eine Auswertung des Inhaltes von mqtt hin bzw. was ist falsch?
-
@Ati:Das Format ist hier JSON. ` Poste doch mal das JSON.
Ich mag Blockly nicht, deswegen kann ich dir eher mit JS Helfen.
In JS gibt es die möglichkeit auf jede Änderung zu reagieren, das sieht dann so aus:
on({id: "in-kanal", change: any} ,function(obj){ log(obj.state.val) } });
-
{"idx":1,"nvalue":0,"svalue":"305247091"}
mich interessiert dabei svalue.
Wenn JS soll mir recht sein. Ich versuche je eh mich da reinzufummeln - auch wenn vieles schwer fällt.
Hier noch der Blockly Code
on[({id: 'mqtt.0.domoticz.in', change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; console.log('value'); if (getState("mqtt.0.domoticz.in").val == ' {"idx":1,"nvalue":0,"svalue":"30524xxxx"} ') { setState("hm-rpc.2.000218A9916FDA.3"/*Schaltsteckdose test:3*/, true); setStateDelayed("hm-rpc.2.000218A9916FDA.3"/*Schaltsteckdose test:3*/, false, 1000, true); // RFID
Auffällig sind für mich zumindest die Leerstellen im GetState
-
So. Das Problem ist nun gelöst.
on({id: 'mqtt.0.domoticz.in', change: "any"}, function (obj) { var NFC; //der try ist wichtig, dass der adapter nicht abschmiert bei einem Fehler. Hiermit parsen wir die json in ein object try {obj = JSON.parse(getState('mqtt.0.domoticz.in').val); } catch (e) { console.error('Cannot parse: ' + getState('mqtt.0.domoticz.in').val); return; } log(obj.svalue); NFC = obj.svalue; if ( NFC === "xxxx47091" || NFC === "xxxx076275" || NFC === "xxxx880515" || NFC === "xxxx213571" || NFC === "xxxx486467" || NFC === "xxxx713987" || NFC === "xxxx057774" ) { setState("hm-rpc.2.000218A9916FDA.3.STATE", true);//schaltet Aktor ein log("Einschalten ausgeführt"); setStateDelayed("hm-rpc.2.000218A9916FDA.3.STATE", false, 2000, true);//schaltet Aktor in 1 Sekunde aus und aktiviert Planung für nächste Aktivierung log("Ausschalten ausgeführt"); } });