Garagentor via NFC öffnen

  • Ich habe mir das Video von Dennis über nodeMCU und NFC lang und breit reingezogen, Teile bestellt, geflasht, gelötet, über fehlerhafte Hinweise gemault, viel gesucht und letztlich zum laufen gebracht.

    Und jetzt kommt es aber zum Problem. Ich bin einfach noch nicht fit für Blockly. Das Script von Dennis schaltet Lampen ein oder aus. Das kann ich aber so nicht gebrauchen. Mein Garagentor wird von einer Homematic Schaltplatine angesteuert. Da die üblichen Garantore (Teckentrup) mit einem Taster bedient werden ist also eine toggle Funktion unbrauchbar. Die Platine bietet aber bei derzeitiger Firmware keine Tastfunktion. Also muss diese Funktion per Programm erzeugt werden. In diesem Fall automatisch nach einer Sekunde ausschalten. Ok, das klappt so weit. Ich kann nun mit einer Fernbedienung von HM oder auch HM IP oder auch mit Tastschalteraktoren das Tor bedienen.

    Aber jetzt soll auch der Wahnsinn Einzug halten – NFC. Ich brauche dazu ein Blockly oder Java, was eine Tastfunktion abbildet. Also in etwa so:

    RFID erkannt – sofort einschalten des Aktors – Wartezeit 1 Sekunde – ausschalten

    Wie geht das? Ich habe dazu leider nicht viel gefunden

    Grüße

    Andreas

  • Äh...

    Triggere wenn RFID erkannt, dann

    steuere Aktor mit wahr ohne Verzögerung

    steuere Aktor mit unwahr mit 1sek Verzögerung.

    fertig

    ioBroker: Pi3B / Sonoff -Basic / Mobile.0 / Shelly2.5 (Rollladen)

    ZigBee: Pi2B RaspBee-GW DeConz / Philips Hue Dimmer-Switch, Hue/Innr-Leuchten / XIAOMI Mi/Aqara Fenster-, BWM-Sensor, Magic Cube

    EQ-3 Max! Cube, Ventile, Thermostate / Logitech Harmony Elite mit Hub / Roborock S5

    Tasmota durch TasmoAdmin (&Atom.IO) / AVM FB 7490 / Devolo Magic 1 Powerline

  • So, habe ein paar Tage experimentiert. Allerdings nicht ganz erfolgreich. Immerhin habe ich jetzt das Blockly Prinzip halbwegs kapiert.schimmer-media.de/index.php?attachment/2967/

    Also meinem Verständnis nach – tritt im Objekt domoticz eine Änderung ein, wird diese Script abgefragt. Trifft dann unter mache einer der genannten Werte zu, dann setze den Aktor Garagentor auf true und im zweiten Schritt eine Sekunde später wieder auf false.

    Ich nehme mal, das true=wahr und false=unwahr entspricht.

    Aber irgendwas stimmt halt noch nicht. Das Script funktioniert noch nicht.

    Davon mal abgesehen sind die unter Wert stehenden Zahlen nicht identisch mit der RFID–Nummer der Karte bzw. des Chips. Diese habe ich testweise an einer RFID–Station ausgelesen. Das nur am Rande. Ich wollte vorab im Wertefeld die Nummer schon mal eintragen. Aber das funktioniert so dann nicht.

    Hat jemand einen Rat zu obigem Script?

  • Wenn Du immer die gleiche Karte vorhälst, wird sich der Wert nicht ändern, nur aktualisieren.

    Kommt denn bei gleicher Karte immer der gleiche String ?

    Man könnte den empfangenen String auch per JSON decodieren und dann den Wert einzeln auswerten.

    ioBroker: Pi3B / Sonoff -Basic / Mobile.0 / Shelly2.5 (Rollladen)

    ZigBee: Pi2B RaspBee-GW DeConz / Philips Hue Dimmer-Switch, Hue/Innr-Leuchten / XIAOMI Mi/Aqara Fenster-, BWM-Sensor, Magic Cube

    EQ-3 Max! Cube, Ventile, Thermostate / Logitech Harmony Elite mit Hub / Roborock S5

    Tasmota durch TasmoAdmin (&Atom.IO) / AVM FB 7490 / Devolo Magic 1 Powerline

  • Ich halte nicht nur die gleiche Karte vor. Es sind insgesamt zunächst drei RFID-Chips und die Karte, die bei dem Modul dabei war. Also für Abwechslung ist schon gesorgt.

    Und ja, es ist immer die gleiche Ziffernfolge je Chip oder Karte. Vielleicht sollte ich zum Funktionstest mal nicht das Tor nehmen, sondern auf eine Lampe verknüpfen. :) Die Rennerei ist lästig.

    Aber würde das Script denn so funktionieren?

  • Das Script so soweit "funktionabel" aus.

    Die abweichenden Zahlen können schon daran liegen, daß der eine dezimal arbeitet und der andere Hexadezimal angibt.

    Du must halt die gleichen Zeichen in den Script eingeben, die an dem Datenpunkt erscheinen, wenn der entsprechende Chip/Karte vorgehalten wird.

    ioBroker: Pi3B / Sonoff -Basic / Mobile.0 / Shelly2.5 (Rollladen)

    ZigBee: Pi2B RaspBee-GW DeConz / Philips Hue Dimmer-Switch, Hue/Innr-Leuchten / XIAOMI Mi/Aqara Fenster-, BWM-Sensor, Magic Cube

    EQ-3 Max! Cube, Ventile, Thermostate / Logitech Harmony Elite mit Hub / Roborock S5

    Tasmota durch TasmoAdmin (&Atom.IO) / AVM FB 7490 / Devolo Magic 1 Powerline

  • Ich habe zum Anlegen des Scriptes copy/paste bzw. kopiere aus Objekte /Feld "Wert" in Zwischenablage und Einfügen in Textfeld genutzt. Fehler sind damit eigentlich ausgeschlossen.

    Kann man ein log oder auch Debug aktivieren, sodass man im Script oder woanders sehen kann, dass das Script arbeitet? Wie gesagt - Blockly ist Neuland für mich.

    Würde denn bei Änderung von "aktualisieren" auf "ändern" auch die gleiche ID erneut erkannt? Denn es kann ja sowohl die gleiche ID als auch eine andere ID das Tor bedienen.

  • Hab die Nummern noch mal geprüft.

    Es ist weder hex noch oct noch dez. Ich habe mal alle Werte von links nach rechts und umgekehrt umgerechnet. Keins davon passt.

    Code
    Dieser interne Code wird immer nur als Hexadezimalcode dargestellt.
    Der interne Code kann in verschiedene externe Dezimalcodes umgerechnet werden.

    Beispiel

    08H>10D interner UID Code des Chips

    8 stellig Hexadezimal(02b0a5fd) in 10 stellig Dezimal

    0045131261

    Da es noch einige weitere Möglichkeiten der Umrechung gibt, ist das also müßig hier Gleichheit zu suchen. Macht wohl jedes System nach eigenem Bedarf

    Quelle: RFID Chip Codes

    Einmal editiert, zuletzt von Ati (7. Juni 2018 um 10:05)

  • Kann man ein log oder auch Debug aktivieren, sodass man im Script oder woanders sehen kann, dass das Script arbeitet? Wie gesagt - Blockly ist Neuland für mich.

    Ja,

    es gibt einen Debug-Befehl, den Du als ersten nach dem Trigger vor allen Abfragen einfügst und als Argument oder rechts die Variable "value" einsetzt.

    Dann siehst Du im Log die empfangenen Werte.

    Spiel damit.

    ioBroker: Pi3B / Sonoff -Basic / Mobile.0 / Shelly2.5 (Rollladen)

    ZigBee: Pi2B RaspBee-GW DeConz / Philips Hue Dimmer-Switch, Hue/Innr-Leuchten / XIAOMI Mi/Aqara Fenster-, BWM-Sensor, Magic Cube

    EQ-3 Max! Cube, Ventile, Thermostate / Logitech Harmony Elite mit Hub / Roborock S5

    Tasmota durch TasmoAdmin (&Atom.IO) / AVM FB 7490 / Devolo Magic 1 Powerline

  • Würde denn bei Änderung von "aktualisieren" auf "ändern" auch die gleiche ID erneut erkannt? Denn es kann ja sowohl die gleiche ID als auch eine andere ID das Tor bedienen.

    Nein, sie wird ja nicht geändert.

    ioBroker: Pi3B / Sonoff -Basic / Mobile.0 / Shelly2.5 (Rollladen)

    ZigBee: Pi2B RaspBee-GW DeConz / Philips Hue Dimmer-Switch, Hue/Innr-Leuchten / XIAOMI Mi/Aqara Fenster-, BWM-Sensor, Magic Cube

    EQ-3 Max! Cube, Ventile, Thermostate / Logitech Harmony Elite mit Hub / Roborock S5

    Tasmota durch TasmoAdmin (&Atom.IO) / AVM FB 7490 / Devolo Magic 1 Powerline

  • Ich habe jetzt einige Versucher unternommen, damit das Script zum laufen kommt.

    Vorweg es tut es nicht.

    Ich habe also zunächst einmal mir die Datenpunkte in iobroker gesucht. Zum testen habe ich einfach an Stelle des Garagentores eine Schaltsteckdose verwendet. Über Kanal 3 kann State bearbeitet werden (ein oder aus - true - false).

    Also habe ich Kanal drei State eingesetzt in das Script

    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 Karte
      }

    Aber es tut nicht. Und im log sehe ich auch gar keine Änderung. Nach meinem Dafürhalten wird das Script gar nicht angesprochen. Also Stimmt der Inhalt, der unter if (getState.... abgefragt wird nicht mit den Bedingungen überein. Davon abgesehen sieht der Code mit den vielen Leerzeichen in der if-Zeile sonderbar aus. Wie müsste der abgefragte Wert aussehen?

    im Wertefeld in von mqtt steht {"idx":1,"nvalue":0,"svalue":"30524xxxx"}

  • #5 wird nie "true" werden, da du einen Value mit einem JSON-String vergleichst.


    Eigentlich müsste

    Code
    if ( getState('mqtt.0.domoticz.in') == '{"idx":1,"nvalue":0,"svalue":"30524xxxx"}' ) {

    funktionieren. Nur die Nummer

    Code
    var obj = JSON.parse(getState('mqtt.0.domoticz.in'));
    log(obj.svalue);

    Die letzten Worte vor dem Weltuntergang: "...das ist technisch völlig unmöglich..."

    aktuelle Projekte: <<< Magic Mirror +++ RMS +++ Wetterstation +++ Somfy Fernbedienung >>>

  • Also ich komme derzeit noch nicht so recht mit dem Java-Gedöhns zurecht. X/

    Die Zeile 5 holt nach meinem Verständnis mittels get den Wert (Value) vom Objekt "mqtt.0.domoticz.in".

    Nach dem was Du sagst, sind die Werte darin JSON.

    Also, wiederum nach meinem Verständnis, wird mittels var obj = JSON.parse(getState('mqtt.0.domoticz.in')) der Inhalt dekodiert. Und da nur der Wert von svalue interessiert, mittels log(obj.svalue) im Log angezeigt.

    So weit richtig?

    Dann müsste die Variable obj nur noch in Aktivität umgesetzt werden.

    So weit ich das sehe, kann in Blockly nicht so einfach Code gebastelt werden.. Also ich habe das jetzt mal mit Blocklymitteln versucht einzubauen.

    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 == (function () { try {return JSON.parse('    {"idx":1,"nvalue":0,"svalue":"30524xxxxx"}    ');} catch(e) {return {};}})()) {

    schimmer-media.de/index.php?attachment/3055/

    ob das so funktioniert, muss ich dann heute Abend schauen.

  • So weit richtig?

    Jepp, In "obj.idx" steht dann die "1", "obj.nvalue" eine "0" und in "obj.svalue" eben die "3052...."

    Bin leider kein "Blockly-Held" (und auch kein JS-Experte), aber das JS sieht IMHO nicht gut aus. Da wird der JSON-String vom State "MQTT...." mit einer Funktion verglichen die ein Objekt aus einem JSON-String zurück gibt. Ob das funktioniert?

    Die letzten Worte vor dem Weltuntergang: "...das ist technisch völlig unmöglich..."

    aktuelle Projekte: <<< Magic Mirror +++ RMS +++ Wetterstation +++ Somfy Fernbedienung >>>

  • Mit ein wenig Abstand heute mal weiter zusammengeschustert.

    Würde das in etwa gehen? Speziell die Zeile mit if then wäre dann halt zur Umsetzung wichtig. Und was mit ebenfalls einfiel, kann man den Wert in mqtt zurück schreiben? Also, wenn das Script den Wert gelesen hat sollte der Wert gelöscht bzw. auf einen Blindwert gesetzt werden. Damit wäre der Weg frei für eine erneute Aktivierung.

    Unter if-Abfrage sollten dann mehrere Werte eingetragen sein (alle NFC-Chips).

    Könnte einer das anhand eines Scriptes mal aufschlüsseln?

    freundlichen Dank :S

  • Bei JS wird eigentlich (natürlich gibt es Ausnahmen) jede Zeile mit ";" beendet.

    Zeile 3 sollte also korrekt lauten: var NFC;

    Zeile 12 sollte eigentlich jetzt korrekt deinen NFC-Tag ausgeben.

    15 geht nicht. JS kennt zwar if-then, hat aber eine gänzlich andere Syntax (außerdem hast du dem Tag eine Variable zugewiesen, dann nutzt man eigentlich auch diese)

    if ( NFC === "305247091" ) {

    Den MQTT kannst du einfach mit einem "setState" plätten: setState('mqtt.0.domoticz.in',0); (anstelle der 0 würde auch "" gehen, dann steht überhaupt kein Wert drin, kann aber später zu unerwünschtem Fehlverhalten führen [wenn man bspw. mit VIS darauf zugreift]).

    Wenn jetzt der eine wenigstens mal vernünftig funktioniert kann man auch die anderen einfügen.

    Die letzten Worte vor dem Weltuntergang: "...das ist technisch völlig unmöglich..."

    aktuelle Projekte: <<< Magic Mirror +++ RMS +++ Wetterstation +++ Somfy Fernbedienung >>>

  • Stimmt. Zeile drei hatte ich versehentlich das Semikolon gekillt.

    Zeile 15 hast Du komplett recht. Natürlich gehört da die Variable rein. Als wenn ich die if-Abfrage richtig interpretiere, dann braucht es kein then, sondern es wird alles ausgeführt, was in der danach folgenden geschweiften Klammer steht. (grad mal gegoogelt dazu - es gibt wohl in JS kein then - alte BASIC Angewohnheiten).

    Und hier der korrigierte Code:

    Und jetzt das Beste. Das Blockly, mit dem es zuvor nie ging - jetzt funktioniert es auf einmal. Zumindest teilweise. Und das liegt an einem zusätzlichen Baustein (debug output). Wenn der im Blockly drin ist, funktioniert es mit den Chips. Die Karte hingegen tut es nicht, aber egal. Das Einzige was auffällig ist, eine Wiederholung der Schaltaktion ist nicht sofort möglich. Da ist eine offenbare Latenz im System. Ob das an der Übermittlung an iobroker oder an iobroker an sich liegt, der auf einem Raspi derzeit noch werkelt, wird sich zeigen.

    schimmer-media.de/index.php?attachment/3206/

    Ich habe das Ganze nun aber als JS im Plan - bin gespannt.

  • btw: die drei Gleichheitszeichen bei "if" waren beabsichtigt. Korrekt bei JS wären wirklich nur zwei, der Broker möchte aber hier drei. Es scheint auch mit zwei zu funktionieren, nur habe ich mir für den Broker nun den "dreier" angewöhnt.

    Steht denn im Datenpunkt sofort der neue Wert wenn du einen anderen Tag nutzt oder dauert es hier bereits einen Augenblick?

    Die letzten Worte vor dem Weltuntergang: "...das ist technisch völlig unmöglich..."

    aktuelle Projekte: <<< Magic Mirror +++ RMS +++ Wetterstation +++ Somfy Fernbedienung >>>

  • Ich bin hier auch am grübeln. Mitunter meine ich , dass am Datenpunkt sofort der neue Wert erscheint, mitunter aber nicht. Wenn es HM bzw. HM IP wäre, würde ich auf duty cicle tippen. Aber hier ist es ja WLAN...und so weit ich das bisher gesehen habe, aktualisiert iobroker den Inhalt erst nach der Betätigung des Aktualisierungsbuttons. Also eine definitive Aussage, ob ein Tag sofort gesetzt wird oder nicht, kann ich nicht sagen.

    Ich habe dann das neue JS aktiviert und das Blockly deaktiviert. Nun tut es im ersten Test aber gar nix mehr. Könnte aber auch daran liegen, dass am Datenpunkt einfach keine Änderung erfolgt ist. Ließ sich gestern auch nicht provozieren. Vielleicht habe in meiner Werkstatt (Keller) einfach einen zu schlechten WLAN Empfang für das Modul. Ich muss mir da wohl einen AP hinstellen.

    Ich setze mal noch ein Gleichheitszeichen hinzu. Vielleicht tut es ja tatsächlich etwas.

  • Ich setze mal noch ein Gleichheitszeichen hinzu. Vielleicht tut es ja tatsächlich etwas.

    Nicht wirklich, zumindest funktioniert bei mir auch alles mit 2 (so wie es Java vorsieht).

    Ich kann bei meinen Projekten keine nennenswerten Verzögerungen feststellen. Wenn ich da was vom ESP per WLAN schicke, ist es sofort im Datenpunkt aktualisiert und die ggf. vorhandene Java-Routine greift sofort.

    Die letzten Worte vor dem Weltuntergang: "...das ist technisch völlig unmöglich..."

    aktuelle Projekte: <<< Magic Mirror +++ RMS +++ Wetterstation +++ Somfy Fernbedienung >>>

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!