This is a basic program that automatically locks the session if the NFC/RFID card is not present on the USB badge reader connected to the Windows computer.
It is necessary to have the pyscard library installed : https://github.com/LudovicRousseau/pyscard and the paho-mqtt client library if you want to send your data via mQTT : https://github.com/eclipse/paho.mqtt.python
You can simply run the following command to install the packages:
pip install -r requirements.txtTo create your executable usable on Windows, I recommend to use PyInstaller with the -F argument to create a single file, as well as the -w option to avoid displaying a command prompt that will be permanent since we are in an infinite While loop.
Build executable :
pyinstaller -F -w --hidden-import=modules.* /path/to/file/main.py -p "C:\Users\%USERNAME\Path_to_repository" To create an installer I usually use inno Setup, which is a simple Pascal script and will allow me to add a lot of options. In our case it is useful to not allow the user to change the installation directory, because it is hard written in the code.
You can also integrate the reader status, UID and profile of the read RFID card to send it to Home Assistant, it will be based on the output.json file located in the installation directory.
Structure of output.json :
{ "WinlockerDetails": { "Status": "Connected", "ConnectionType": "USB", "HostName": "DESKTOP-EXAMPLE", "WindowsVersion": "Windows-10-10.0.19044-SP0", "ReaderName": "WCR WCR330-ContactLess Reader 0", "CardUID": "01020304", "CardProfile": "JohnDoe" } }To create a sensor with the result data from output.json you need create a PowerShell sensor on Hass Agent. In the script or command section of the Hass agent PowerShell sensor, add the following lines depending on the data you want to obtain :
To retrieve the Card UID with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.CardUID With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $cardUID = $json.WinlockerDetails.CardUID Write-Output $cardUIDThen specify the path to the script in the installation directory, named GetCardUID.ps1 into script or command section.
To retrieve the Card profile with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.ProfileCard With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $profileCard = $json.WinlockerDetails.ProfileCard Write-Output $profileCardTo retrieve the Reader status with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.Status With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $Status = $json.WinlockerDetails.Status Write-Output $StatusTo retrieve the Windows Version with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.WindowsVersion With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $WindowsVersion = $json.WinlockerDetails.WindowsVersion Write-Output $WindowsVersionTo retrieve the HostName with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.HostName With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $HostName = $json.WinlockerDetails.HostName Write-Output $HostNameTo retrieve the Reader Name with a one command :
$json = Get-Content "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" | ConvertFrom-Json; $json.WinlockerDetails.ReaderName With a PowerShell script :
$jsonPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\output.json" $json = Get-Content $jsonPath | ConvertFrom-Json $ReaderName = $json.WinlockerDetails.ReaderName Write-Output $ReaderNameOutput :
The code is now able to send data via the MQTT protocol based on a configuration file mqttConfig.json with the following structure:
{ "hostname":"homeassistant.lan", "Port": 1883, "login": "YOU_LOGIN", "password": "YOU_PASSWORD", "topic": "homeassistant/sensor/WinLockerRFID/config" }In your Home Assistant configuration.yaml file it will also be necessary to add the following lines:
mqtt: sensor: - name: "Winlocker Status" state_topic: "homeassistant/sensor/WinLockerRFID/config" value_template: "{{ value_json.WinlockerDetails.Status }}" json_attributes_topic: "homeassistant/sensor/WinLockerRFID/attributes" - name: "Winlocker Card UID" state_topic: "homeassistant/sensor/WinLockerRFID/config" value_template: "{{ value_json.WinlockerDetails.CardUID }}" json_attributes_topic: "homeassistant/sensor/WinLockerRFID/attributes" - name: "Winlocker Profile Card" state_topic: "homeassistant/sensor/WinLockerRFID/config" value_template: "{{ value_json.WinlockerDetails.CardProfile }}" json_attributes_topic: "homeassistant/sensor/WinLockerRFID/attributes" Now you can search for the entity with the name given to the variable name in the configuration.yaml file
Example with Winlocker Status into Development Tools > State
You can also add a command with Hass Agent to control the lockwin.exe process which will allow you to stop or start the process and monitor whether it is active or not.
Create a command from the Hass Agent menu, choose PowerShell as the command type and add this line:
Stop-Process -Name lockwinClick on Save and activate the command.
You can now create a map on your dashboard with the entity
Now to be able to start the process lockwin.exe from Home Assistant, we will have to create another command which is the execution of the script RunProcess.ps1 located in the installation directory.
Here are the contents of the file:
$processPath = "C:\Users\%USERNAME%\AppData\Roaming\WinLockerRFID\lockwin.exe" $processName = "lockwin" $process = Get-Process -Name $processName -ErrorAction SilentlyContinue if ($process -eq $null) { Start-Process $processPath }This script will check if the process is in the list of active processes, if it is not then it starts it.
On the Home Assistant Dashboard you can have this:
If the number of processes is equal to 0 then it means that lockwin.exe is not active on the computer.
ACR122U :
WCR 330 :
- Create a table to manage the different readers (ACR122U / WCR330 etc)







