正在加载完整 README。 以下为已保存的摘录。
Integrates the ESP32-based FingerprintDoorbell
into ioBroker over plain HTTP — no MQTT and no simple-api adapter required.
The adapter runs a small HTTP webhook receiver. The doorbell calls it directly on
a fingerprint match or an unknown-finger ring. The adapter also polls the device
to report its online/offline status and can reboot it or toggle the touch ring.
This adapter talks to the FingerprintDoorbell firmware running on your ESP32.查看完整 README ↗Integrates the ESP32-based FingerprintDoorbell into ioBroker over plain HTTP — no MQTT and no simple-api adapter required.
The adapter runs a small HTTP webhook receiver. The doorbell calls it directly on a fingerprint match or an unknown-finger ring. The adapter also polls the device to report its online/offline status and can reboot it or toggle the touch ring.
This adapter talks to the FingerprintDoorbell firmware running on your ESP32.
control.ignoreTouchRing and the fingerprint list.Feature-by-firmware overview:
| Feature | Firmware |
|---|---|
| Match / Ring / Status / Reboot | v0.9 |
| Server mode, ignore touch ring, fingerprint list | v0.9.1 |
| Backup / Restore (all fingers) | v0.9.3 |
| Enroll from adapter, LED ring, WiFi RSSI | v0.9.4 |
Get the firmware here:
http://<device-ip>/update → Firmware → upload
firmware.bin from the Releases.firmware.bin, spiffs.bin and flash instructions).Check the running version at http://<device-ip>/api/status (field version).
FingerprintDoorbell (ESP32) ioBroker.fingerprint
───────────────────────── ────────────────────
match ──► HTTP GET /match?id=.. ─────────► webhook receiver ──► lastMatch.*
ring ──► HTTP GET /ring ─────────► webhook receiver ──► ring.*
◄─────── poll GET /debug ──► info.connection
reboot ◄─────── GET /reboot ◄── control.reboot
touch ring ◄─────── GET /set-touch-ring ◄── control.ignoreTouchRing
Install and add an instance of the adapter.
In the instance settings, configure:
0.0.0.0:8095)In the FingerprintDoorbell WebUI → Settings, set the HTTP action URLs to point
to this adapter (copy the ready-made URLs from the instance settings — they already
include the webhook token; replace <iobroker-ip> with the ioBroker host IP):
HTTP Match URL: http://<iobroker-ip>:8095/match?id={id}&name={name}&confidence={confidence}&token=<token>
HTTP Ring URL: http://<iobroker-ip>:8095/ring?token=<token>
This adapter is an independent, community-made integration. It is not affiliated with, endorsed by or supported by the authors of the FingerprintDoorbell firmware, the sensor manufacturers or ioBroker GmbH. The software is provided "as is", without warranty of any kind (see the MIT LICENSE); you use it at your own risk.
fingerprint.0.storage, readable for every admin user and possibly through a web instance,
and on an external SFTP server, see Backup)
and observe the laws that apply to you (e.g. GDPR/BDSG, works-council rules for employees).A German version is available in DISCLAIMER.de.md.
Communication is authenticated in both directions:
token query parameter or X-Auth-Token header) are rejected with
HTTP 401. Optionally, enable "Accept webhooks only from the device IP" to also reject
requests from any other host.With firmware < v0.9.1 the token must be pasted manually into the device URLs. From v0.9.1 (server mode), the adapter provisions the URLs and token automatically.
adminPassword and webhookToken are stored encrypted in the instance configuration
(encryptedNative) and are protected (protectedNative), so other adapters cannot read
them. Values stored as plain text by version 0.7.12 or older are encrypted automatically on the
first start of 0.7.13: the log shows … is now stored encrypted (one-time migration) and the
instance restarts once — this is expected and not a crash.
The Fingerprint Actions tab lets you trigger ioBroker objects directly from a fingerprint — no JavaScript needed:
Set value or Toggle),
a Value and an optional Min confidence (leave empty to ignore).true, 1, on, yes, ja, да → true; anything else → false, accepted as decimal separator)1,2,4), tick the weekdays and set a From/To time (HH:MM). Multiple rows for the same finger are OR-combined; time ranges may cross
midnight (e.g. 22:00–06:00). If Conditions is on but no row matches, the action is skipped.The Manage Fingers tab lets you administer fingers without opening the device WebUI:
Backup and restore are on the Backup tab (see Backup).
Save the instance settings first so the device connection is available.
Everything about backups is on the Backup tab of the instance settings: Create backup, Backup to restore + Restore the selected backup, the automatic backup, the copy to an external server and the restore from that server.
Note: reliable backup/restore of all fingers needs firmware v0.9.4 (full 1536-byte templates). Backups made with older firmware are incomplete — re-create them after updating.
Every backup (by hand, automatic, fetched from the server, safety copy) is a file in the ioBroker
file storage, folder fingerprint.0.storage/backups/:
| File | Made by | Deleted automatically |
|---|---|---|
fingerprint-backup-<time>.json | Create backup | never |
fingerprint-auto-<time>.json | automatic backup | the oldest beyond Automatic backups to keep (default 7, 0 = keep all) |
fingerprint-prerestore-<time>.json | safety copy of the sensor right before a restore | never |
fingerprint.0.storage → backups to download a backup
or to upload one (e.g. a copy from your NAS); uploaded files must keep the name pattern above.meta.user, so ioBroker backups (BackItUp: include this instance and
its files) take the folder along.<iobroker-data>/fingerprint.0/fingerprints-backup.json)
is moved into the folder once as fingerprint-backup-<time of the file>.json; the old file is
renamed to fingerprints-backup.json.migrated.web instance serves the file storage without login, possibly in the browser. They contain the
raw fingerprint templates (biometric data): protect your admin and web instances accordingly.Tab Backup → Backup to restore: choose a backup (newest first; reopen the settings to
refresh the list) → Restore the selected backup → confirm. The adapter checks the file
(valid JSON, finger ids 1–200, no duplicates, templates present), saves the current content of the
sensor as fingerprint-prerestore-<time>.json and then writes the backup to the sensor. If the
current content cannot be read from the device, the restore is aborted.
fingerprint.0.storage → backups → upload the file;The Backup tab of the instance settings can create the fingerprint backup automatically, daily or weekly — it is off by default. Every automatic backup is a new file in the storage folder; the device has to be reachable.
info.lastBackup.A backup that lies on the same machine as ioBroker does not survive the loss of that machine.
The Backup tab can copy every backup (automatic and by hand) to another computer, for
example a NAS, over SFTP. The adapter opens the SSH connection itself: no mount, no sudo,
no shell command.
How it behaves:
info.remoteBackupError; the last successful copy is in info.lastRemoteBackup.
A failed copy is not retried: the next backup is copied again.fingerprint-backup-<time>.json (by hand) and fingerprint-auto-<time>.json
(automatic), time in UTC..part, size
checked, renamed). The whole copy is limited to ten minutes. Leftovers of interrupted uploads
of this adapter are removed by the next good copy.You can enroll a new fingerprint directly from ioBroker — no need to open the device WebUI:
control.enrollId and control.enrollName, then set
control.enrollStart = true.Enrollment runs on the device and needs the user to place the finger on the
sensor 5 times. Progress is reported live in the enroll channel:
| State | Type | Description |
|---|---|---|
enroll.active | boolean | true while an enrollment is running |
enroll.step | number | Current scan step (0–5) |
enroll.status | string | idle / scanning / success / error |
enroll.message | string | Last human-readable status line |
On success the fingerprint list is refreshed automatically.
Control the sensor's RGB ring from ioBroker:
control.ledMode — 0 off, 1 on, 2 breathing, 3 flashingcontrol.ledColor — 1 red, 2 blue, 3 purple, 4 green, 5 yellow, 6 cyan, 7 whiteWriting either state applies the ring immediately.
| State | Type | Description |
|---|---|---|
info.connection | boolean | Device reachable (via /api/status or /debug poll) |
info.uptime | number | Device uptime in seconds |
info.freeHeap | number | Free heap in bytes |
info.firmwareVersion | string | Device firmware version |
info.serverMode | boolean | Device sends events directly to this adapter |
info.wifiRssi | number | WiFi signal strength in dBm (firmware ≥ v0.9.4) |
info.lastBackup | number | Time of the last fingerprint backup (by hand or automatic) |
info.lastRemoteBackup | string | Path of the last copy on the external SFTP server |
info.remoteBackupError | string | Error of the last copy to the external server (empty = fine) |
fingerprints.<id>.name | string | Name of the enrolled finger with that ID |
fingerprints.<id>.lastSeen | number | Timestamp the finger was last matched |
fingerprints.<id>.count | number | How often the finger was matched |
lastAccess.text | string | Readable last access entry (granted/denied) |
lastAccess.granted | boolean | Whether the last access was granted |
lastAccess.timestamp | number | Timestamp of the last access |
stats.totalMatches | number | Total fingerprint matches |
stats.totalRings | number | Total doorbell rings (unknown finger) |
stats.lastPerson | string | Name of the last recognized person |
lastMatch.id | number |
control.ignoreTouchRing, server mode and the fingerprint list require v0.9.1.info.wifiRssi require v0.9.4.fingerprint.0.storage/backups/ (meta.user): every backup is a file there — download and upload it in the admin tab Files; ioBroker/BackItUp backups take it along. The backup file of 0.8.0 is moved there oncefingerprint-prerestore-…); the file is checked first (JSON, ids 1–200, no duplicates, templates).part with size check and rename, optional host key fingerprint, test button, cleanup of old automatic copies. The password is stored encrypted (encryptedNative)info.lastBackup, info.lastRemoteBackup, info.remoteBackupErrorssh2; tests against an SFTP server inside the test and an integration test with a simulated deviceadminPassword and webhookToken are stored encrypted (encryptedNative), resolving repository checker warning W1074lib/secrets.js). The log shows … is now stored encrypted (one-time migration) and the instance restarts once; nothing has to be entered again0600); match events with invalid finger IDs are ignored; device-supplied names are sanitized (control characters, length); rejected webhook requests are logged rate-limited; removed the unused getWebhookInfo message commandlastMatch.matched is reset after 3 s, so every match is a state change for scriptsinfo.connection is correct when status polling is disabled (one initial poll is always done)localLinks name into all languageslocalLinks)DISCLAIMER.de.md), added the 0.7.7 changelog entry, updated @iobroker/testing to 6.3.x@iobroker/testing to 6.3.xadminPassword / webhookToken as encryptedNative
made the js-controller transform previously stored plain text values into unusable data
before the adapter started, so the device login (HTTP Basic auth) and the server-mode
provisioning failed. encryptedNative was removed again — the values are only declared as
protectedNative now, so stored values keep workinglib/secrets.js with unit tests for the secret repair logicprotectedNative / encryptedNative to the root of
io-package.json (inside common they were ignored and the schema reported error E1105),
reduced common.news to 7 entries, added the complete MIT license text including the
copyright line to the README, completed the .vscode JSON schema settings, bumped
@iobroker/testing to 6.2.xcontrol.enrollId/ledColor
use level, ring.ringing uses sensor), marked adminPassword /
webhookToken as protected & encrypted native, added Node.js 26 to CI,
bumped @iobroker/testing to 6.x, added .vscode JSON schema settingscontrol.enrollStart; live progress in the enroll channel
(active / step / status / message)control.ledMode + control.ledColorinfo.wifiRssi state (firmware ≥ v0.9.4)attr from the Manage Fingers rename fields (settings page failed to load)1,2,4); added a hint/tooltipOlder entries: see CHANGELOG_OLD.md
MIT License
Copyright (c) 2026 sadam6752-tech [email protected]
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
| ID of the last matched finger (1–200) |
lastMatch.name | string | Name of the last matched finger |
lastMatch.confidence | number | Match confidence |
lastMatch.timestamp | number | Timestamp of the last match |
lastMatch.matched | boolean | Set to true on each match event |
ring.ringing | boolean | True for a few seconds on a doorbell ring |
ring.timestamp | number | Timestamp of the last ring |
control.reboot | boolean (button) | Reboot the device |
control.ignoreTouchRing | boolean (switch) | Ignore the touch ring (firmware ≥ v0.9.1) |
control.enrollId | number | Slot id (1–200) for the next enrollment (firmware ≥ v0.9.4) |
control.enrollName | string | Name for the next enrollment (firmware ≥ v0.9.4) |
control.enrollStart | boolean (button) | Start enrollment (firmware ≥ v0.9.4) |
control.ledMode | number | LED ring mode 0–3 (firmware ≥ v0.9.4) |
control.ledColor | number | LED ring color 1–7 (firmware ≥ v0.9.4) |
enroll.active | boolean | Enrollment running (firmware ≥ v0.9.4) |
enroll.step | number | Current enrollment scan step 0–5 |
enroll.status | string | idle / scanning / success / error |
enroll.message | string | Last enrollment status line |