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.txt
To 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 $cardUID
Then 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 $profileCard
To 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 $Status
To 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 $WindowsVersion
To 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 $HostName
To 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 $ReaderName
Output :
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 lockwin
Click 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)