WTRFID Mini Keypad RFID/Z-Wave

Hi Bodo,
can you pleas send an update if you found a way for register RFID tags?!
I also have a WTRFID and like to use it with OpenHAB.
Thanks, Harry

1 Like

Let’s see if I am patient enough to fiddle it out… But if I find a way, I will definitely share it here.

Yesterday I put WTRFID in production with OH 2.4. It took some time, but at the end I was happily surprised, that I made it. For sure it was a rocky road, but it is worth it. Now everything works like charm.

My biggest concern, to install another automation system to make WTRFID work with OH, became true. I had to install FHEM to register RFID tags. But thanks to the excellent documentation provided by @DocFraggle (many thanks for this), this was a very quick and convenient solution.

At the end it took me in total 6 hours of work to get WTRFID working, of which approx. 4 hours were about device setup in OH and struggling with registering user codes (!) and only 2 hours for installing FHEM, registering RFID chips, and some basic coding in OH.

Here is what I did, documented for others who want to take the same path:

1. Z-Wave include (via Openhab)
Before I had the device fully working in OH it took me at least 30 min and multiple includes/excludes. Issue was, that the devices was not fully recognized by OH (“unknown type”. I managed this by going really close to the Zwave-Controller and waking WTRFID up (via burglar switch) at least four to five times after inclusion.

2. Registering User Codes (via habmin, PaperUI doesn’t support it)
Initially I thought this would be a straight forward task, but it was not!
I was simply trying to add e.g 1234 for a UserID with label “1” or “test”.
Nothing happened after punching HOME+1234+ENTER.

So I was visiting the zwave debug log. It took a while before I could extract from the log what happened. I found a line which reads “COMMAND_CLASS_USER_CODE, value = 31 32 33 34 00 00 00 00 00 00”. And here you see, what the device (or wave binding?) makes out of the 1234.
These are the ASCII codes for 1, 2, 3, and 4: (31, 32, 33, 34). I was totally unaware, that it is required to enter the ASCII values into the user code field in habmin.
So I copied the “31 32 33 34 00 00 00 00 00 00” into the corresponding user code field in habmin and bam, it worked.

The wave debug log also showed the ID of a RFID tag I presented to the WTRFID. I copied that code to a user code field in habmin, but without luck. So I decided to take the workaround with FHEM.

3. Registering RFID-Tags with the help of FHEM
Follow the instructions (WTRFID Mini Keypad RFID/Z-Wave) given by @DocFraggle. This worked for me quite well. I did it on MacOS and had one issue in the beginning, that my zwave controller (USB Stick) was not recognized. After installing perl-Crypt-Rijndael the dongle was found and I could proceed.
Once the RFID tags were registered I returned to OH, while leaving FHEM offline for later registration activities.

4. Validating in OH, that RFID codes are available
In habmin I visited the user code section of the device and found there my three registered tags as user codes. I defined an item with a link to the access control channel and tested the whole thing.

Works pretty well now with user codes and with RFID.

Hope, this helps some others as well.

1 Like

Hi @chris, I am not sure if this is an indication, that something is wrong, but pls take a look at this:


This states, that Security is not being used… whatever that means… :wink:

It means that the link is unsecured - there is no security in use. This basically means that the device was not securely included and it is easier for people to hack this device if they were so included.

It is highly recommended to use a secure link for locks.

Oh wow. Understand. I did an ordinary include of the device. Are there any instruction to include a device with security?
BTW: It is not a lock at my site. So risk involved is quite low… but anyway…

You can check the binding documentation - just search for secure, or security. There’s a section on inclusion that includes information on secure inclusion.

1 Like

Thanks for the excellent feedback!

1 Like

Thank you for writing your experience. I have reached the point you mention in your message and have validated the codes in OH.

What I am getting at this stage when a valid userID keys in the device “Away -> 1234 (or any code registered in the device) -> Enter” is value 255 in the notification_access_control item.

If the sequence typed in the Zipato device is Home -> (registered user code) -> Enter the notification_access_control item gets a 0.

Any other sequence typed in does not alter the channels declared.

From the manufacturer documentation I think that you can know the user_id and the alarm event.

Do you know how to get this?

Thanks, Foruny

Unfortunately not.
I have the same. I do not work with the user id, instead it is sufficient for me to know, that there is some authorized user.
IIRC the binding / channel doesn’t support the user ID, but the binding doc or @chris could answer that better than me.

Hello,
interestingly in Z-Way the user ID is submitted.
I checked the Logs but in case of a valid input, I just see the following Alarm:

23:26:27.824 [DEBUG] [l.commandclass.ZWaveAlarmCommandClass] - NODE 4: ALARM report - 0 = 0
23:26:27.830 [DEBUG] [l.commandclass.ZWaveAlarmCommandClass] - NODE 4: Alarm Type = ACCESS_CONTROL (0)

But no information about the user.
In case of wrong input, the pressed keys are transmitted.

23:28:05.962 [DEBUG] [nding.zwave.handler.ZWaveThingHandler] - NODE 4: Got a value event from Z-Wave network, endpoint = 0, command class = COMMAND_CLASS_USER_CODE, value = 31 32 32 33 00 00 00 00 00 00

Here I could use a log reader to parse this information and compare the code with a whitelist, but this is not secure at all.

Does anyone have an idea where in the user ID is encoded in the sent rawdata if a valid code has been typed in?

Many thanks in advance.

Hello again,
according to
https://wiki.fhem.de/wiki/Z-Wave-ZIP_WT-RFID_Keypad#Alarmmeldungen the user ID is encoded in the following packet:

23:26:07.298 [DEBUG] [ZWaveSerialHandler$ZWaveReceiveThread] - Receive Message = 01 12 00 04 00 04 0A 71 05 00 FF 00 FF 06 05 01 01 AE 00 3E
23:26:07.336 [DEBUG] [rnal.protocol.ZWaveTransactionManager] - processReceiveMessage input 0<>128 : Message: class=ApplicationCommandHandler[4], type=Request[0], dest=4, callback=0, payload=00 04 0A 71 05 00 FF 00 FF 06 05 01 01 AE 00
23:26:07.346 [DEBUG] [ZWaveSerialHandler$ZWaveReceiveThread] - Receive Message = 01 0A 00 04 04 04 02 84 07 B9 00 C9
23:26:07.354 [DEBUG] [rnal.protocol.ZWaveTransactionManager] - Received msg (0): Message: class=ApplicationCommandHandler[4], type=Request[0], dest=4, callback=0, payload=00 04 0A 71 05 00 FF 00 FF 06 05 01 01 AE 00

I tried to follow the Alarm Command Class description in https://www.silabs.com/documents/login/miscellaneous/SDS13781-Z-Wave-Application-Command-Class-Specification.pdf, but the payload looks somehow different than specified.

I would be thankful for any idea on how to add the payload to alarm event in a proper way.

Ik have a benext Tag Reader, thats the same as the WTRFID
I also have the inclusion problem, “unknown type”. For the moment i can not getting it recognized by openHAB… any suggestions? The burglar switch is the Enter button on the device?

Post the xml from that node in the userdata zwave folder. A copy of the manual can be very useful too if you find one online.

xml:

    <node>
  <homeId>0xd41bf17a</homeId>
  <nodeId>9</nodeId>
  <version>4</version>
  <manufacturer>0x8a</manufacturer>
  <deviceId>0x200</deviceId>
  <deviceType>0x7</deviceType>
  <listening>false</listening>
  <frequentlyListening>false</frequentlyListening>
  <routing>true</routing>
  <security>false</security>
  <beaming>true</beaming>
  <maxBaudRate>40000</maxBaudRate>
  <sleepDelay>1000</sleepDelay>
  <nodeInformationFrame>
    <commandClass>COMMAND_CLASS_ZWAVEPLUS_INFO</commandClass>
    <commandClass>COMMAND_CLASS_SECURITY</commandClass>
    <commandClass>COMMAND_CLASS_FIRMWARE_UPDATE_MD</commandClass>
  </nodeInformationFrame>
  <associationGroups class="concurrent-hash-map">
    <entry>
      <int>1</int>
      <associationGroup>
        <index>1</index>
        <maxNodes>0</maxNodes>
        <name>Lifeline</name>
        <profile1>0x0</profile1>
        <profile2>0x1</profile2>
        <commands>
          <commandClass>COMMAND_CLASS_SWITCH_BINARY</commandClass>
          <commandClass>COMMAND_CLASS_ALARM</commandClass>
          <commandClass>COMMAND_CLASS_USER_CODE</commandClass>
          <commandClass>COMMAND_CLASS_DEVICE_RESET_LOCALLY</commandClass>
        </commands>
        <associations>
          <associationMember>
            <node>1</node>
          </associationMember>
        </associations>
      </associationGroup>
    </entry>
  </associationGroups>
  <endpoints class="concurrent-hash-map">
    <entry>
      <int>0</int>
      <endPoint>
        <deviceClass>
          <basicDeviceClass>BASIC_TYPE_ROUTING_SLAVE</basicDeviceClass>
          <genericDeviceClass>GENERIC_TYPE_ENTRY_CONTROL</genericDeviceClass>
          <specificDeviceClass>SPECIFIC_TYPE_SECURE_KEYPAD</specificDeviceClass>
        </deviceClass>
        <endpointId>0</endpointId>
        <secureCommandClasses>
          <commandClass>COMMAND_CLASS_BATTERY</commandClass>
          <commandClass>COMMAND_CLASS_CONFIGURATION</commandClass>
          <commandClass>COMMAND_CLASS_SWITCH_BINARY</commandClass>
          <commandClass>COMMAND_CLASS_MANUFACTURER_SPECIFIC</commandClass>
          <commandClass>COMMAND_CLASS_ALARM</commandClass>
          <commandClass>COMMAND_CLASS_POWERLEVEL</commandClass>
          <commandClass>COMMAND_CLASS_USER_CODE</commandClass>
          <commandClass>COMMAND_CLASS_DEVICE_RESET_LOCALLY</commandClass>
          <commandClass>COMMAND_CLASS_VERSION</commandClass>
          <commandClass>COMMAND_CLASS_ENTRY_CONTROL</commandClass>
          <commandClass>COMMAND_CLASS_INDICATOR</commandClass>
          <commandClass>COMMAND_CLASS_WAKE_UP</commandClass>
          <commandClass>COMMAND_CLASS_ASSOCIATION</commandClass>
          <commandClass>COMMAND_CLASS_ASSOCIATION_GRP_INFO</commandClass>
        </secureCommandClasses>
        <supportedCommandClasses class="concurrent-hash-map">
          <entry>
            <commandClass>COMMAND_CLASS_BATTERY</commandClass>
            <COMMAND__CLASS__BATTERY>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <batteryLevel>100</batteryLevel>
              <batteryLow>false</batteryLow>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__BATTERY>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_CONFIGURATION</commandClass>
            <COMMAND__CLASS__CONFIGURATION>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <configParameters/>
            </COMMAND__CLASS__CONFIGURATION>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_SECURITY</commandClass>
            <COMMAND__CLASS__SECURITY>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
            </COMMAND__CLASS__SECURITY>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_SWITCH_BINARY</commandClass>
            <COMMAND__CLASS__SWITCH__BINARY>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__SWITCH__BINARY>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_MANUFACTURER_SPECIFIC</commandClass>
            <COMMAND__CLASS__MANUFACTURER__SPECIFIC>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <initSerialNumber>false</initSerialNumber>
              <deviceManufacturer>138</deviceManufacturer>
              <deviceType>7</deviceType>
              <deviceId>512</deviceId>
            </COMMAND__CLASS__MANUFACTURER__SPECIFIC>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_ALARM</commandClass>
            <COMMAND__CLASS__ALARM>
              <version>2</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <alarms>
                <entry>
                  <alarmType>ACCESS_CONTROL</alarmType>
                  <alarmState>
                    <alarmType>ACCESS_CONTROL</alarmType>
                    <reportedEvents/>
                    <outer-class reference="../../../.."/>
                  </alarmState>
                </entry>
              </alarms>
              <v1Supported>true</v1Supported>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__ALARM>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_POWERLEVEL</commandClass>
            <COMMAND__CLASS__POWERLEVEL>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <powerLevel>0</powerLevel>
              <powerTimeout>0</powerTimeout>
            </COMMAND__CLASS__POWERLEVEL>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_USER_CODE</commandClass>
            <COMMAND__CLASS__USER__CODE>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <numberOfUsersSupported>255</numberOfUsersSupported>
              <userCodeList/>
            </COMMAND__CLASS__USER__CODE>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_DEVICE_RESET_LOCALLY</commandClass>
            <COMMAND__CLASS__DEVICE__RESET__LOCALLY>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
            </COMMAND__CLASS__DEVICE__RESET__LOCALLY>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_VERSION</commandClass>
            <COMMAND__CLASS__VERSION>
              <version>2</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <libraryType>LIB_SLAVE_ENHANCED</libraryType>
              <protocolVersion>4.33</protocolVersion>
              <applicationVersion>1.4</applicationVersion>
              <hardwareVersion>2</hardwareVersion>
            </COMMAND__CLASS__VERSION>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_BASIC</commandClass>
            <COMMAND__CLASS__BASIC>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__BASIC>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_ZWAVEPLUS_INFO</commandClass>
            <COMMAND__CLASS__ZWAVEPLUS__INFO>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <zwPlusVersion>1</zwPlusVersion>
              <zwPlusRole>ROLE_TYPE_SLAVE_SLEEPING_REPORTING</zwPlusRole>
              <zwPlusNodeType>NODE_TYPE_ZWAVEPLUS_NODE</zwPlusNodeType>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__ZWAVEPLUS__INFO>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_INDICATOR</commandClass>
            <COMMAND__CLASS__INDICATOR>
              <version>2</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <isGetSupported>true</isGetSupported>
              <supportedIndicatorsInitialised>false</supportedIndicatorsInitialised>
              <supportedIndicators>
                <ZWaveIndicator>
                  <type>ARMED</type>
                  <property>LOW_POWER</property>
                </ZWaveIndicator>
              </supportedIndicators>
            </COMMAND__CLASS__INDICATOR>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_NO_OPERATION</commandClass>
            <COMMAND__CLASS__NO__OPERATION>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
            </COMMAND__CLASS__NO__OPERATION>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_WAKE_UP</commandClass>
            <COMMAND__CLASS__WAKE__UP>
              <version>2</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <targetNodeId>1</targetNodeId>
              <interval>7200</interval>
              <minInterval>3</minInterval>
              <maxInterval>2592000</maxInterval>
              <defaultInterval>7200</defaultInterval>
              <intervalStep>1</intervalStep>
              <isGetSupported>true</isGetSupported>
            </COMMAND__CLASS__WAKE__UP>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_ASSOCIATION</commandClass>
            <COMMAND__CLASS__ASSOCIATION>
              <version>2</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
              <maxGroups>1</maxGroups>
            </COMMAND__CLASS__ASSOCIATION>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_FIRMWARE_UPDATE_MD</commandClass>
            <COMMAND__CLASS__FIRMWARE__UPDATE__MD>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>2</versionSupported>
            </COMMAND__CLASS__FIRMWARE__UPDATE__MD>
          </entry>
          <entry>
            <commandClass>COMMAND_CLASS_ASSOCIATION_GRP_INFO</commandClass>
            <COMMAND__CLASS__ASSOCIATION__GRP__INFO>
              <version>1</version>
              <instances>1</instances>
              <control>false</control>
              <versionSupported>1</versionSupported>
              <autoSubscribeGroups>
                <int>1</int>
              </autoSubscribeGroups>
            </COMMAND__CLASS__ASSOCIATION__GRP__INFO>
          </entry>
        </supportedCommandClasses>
      </endPoint>
    </entry>
  </endpoints>
  <nodeNeighbors/>
  <lastReceived>2019-10-09 23:20:28.148 UTC</lastReceived>
</node>

When i add a thing file for example image

`

Thing zwave:benext_tagreader_00_000:0e0d4505:node9 “Keypad” (zwave:serial_zstick:0e0d4505)[ zwave_class_basic=“BASIC_TYPE_ROUTING_SLAVE”, zwave_class_generic=“GENERIC_TYPE_ENTRY_CONTROL”, zwave_frequent=“false”, zwave_version=“1.4”, zwave_listening=“false”, zwave_deviceid=“512”, zwave_routing=“true”, zwave_beaming=“true”, zwave_class_specific=“SPECIFIC_TYPE_SECURE_KEYPAD”, node_id=9, zwave_manufacturer=“138”, zwave_devicetype=“7” ]

The device comes online and i get this in the paperUI
image
`

I will need to look at this further tomorrow. The manual looks complete with configuration information.

1 Like

The burglar switch is actually inside the device! It is not the Enter button.
You have to remove the back cover of the reader, then the burglar switch turns its state. When you attach the back cover again, state of the switch changes again.

1 Like

It appears there is a different variant of this already in our database, likely for a different zwave region.=. I need to research whether we can just update his entry or create a new one.

https://www.cd-jackson.com/index.php/zwave/zwave-device-database/zwave-device-list/devicesummary/444

1 Like