Zkteco, eSSL, Cams Biometrics Integration Module with HR Attendance
by Cams Biometrics https://www.camsunit.com| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Attendances (hr_attendance)
• Employees (hr) • Discuss (mail) |
| Lines of code | 1012 |
| Technical Name |
odoo-biometric-attendance |
| License | AGPL-3 |
| Website | https://www.camsunit.com |
| Versions | 13.0 14.0 15.0 16.0 17.0 18.0 19.0 |
This module seamlessly integrates biometric attendance machines with Odoo HR Attendance. Punch data is pushed directly from your devices into Odoo in real time — no manufacturer software, no middleware, no manual exports. It works with every biometric machine that exists globally, from brand-new cloud-capable terminals to decade-old legacy hardware on air-gapped factory networks.
1. 100% Global Device Compatibility
Every biometric device on the planet is covered through two deployment architectures:
NATIVE PUSH
Real-time • Direct • Full API
For devices verified at developer.camsbiometrics.com. The device pushes punch data directly to Odoo over HTTPS the moment it happens — sub-second latency, no intermediary required.
HYBRID PUSH
Legacy • Air-gapped • Any Network
For all other devices. Punch data is collected via SDK or database connector — through a public IP or a push service on a local computer — and forwarded to Odoo through the API.
One API. Any Device. Any Network. Any ERP. — Read the full architecture guide: Universal Deployment Guide → (https://forum.camsbiometrics.com/universal-deployment-100-global-device-compatibility-for-biometric-attendance-systems/)
2. Real-time Punch Sync
Attendance and punch data is instantly pushed from biometric devices directly into the Odoo HR Attendance module. Records appear in Odoo the moment an employee checks in or out — accurate, up-to-date, with zero delay.
3. Zero Extra Software
No manufacturer software. No ZKTeco ADMS server. No third-party sync tools. Communication happens entirely through a secure HTTP API. Simply connect your biometric device to the internet and punches are recorded directly in Odoo — a truly hassle-free setup.
4. Offline Punch Synchronization
If your biometric device loses connectivity, punches are stored locally on the device or intermediary service. The moment connectivity is restored, all queued records sync to Odoo automatically in chronological order — no manual intervention, no data loss, ever.
5. Customizable and Scalable
The module can be customized to receive user and biometric information from hardware, offering flexibility to tailor it to your specific HR workflows. It scales from a single office to enterprise-wide deployments spanning thousands of devices across hundreds of locations globally.
6. API Activation and License
Every device requires two things to communicate through the API — regardless of whether it uses Native Push or Hybrid Push:
- Native Push devices — API Activation (one-time, no expiry) + API License (1 year, multi-year, or lifetime)
- Hybrid Push devices — Hybrid Push Setup (one-time) + API License (1 year, multi-year, or lifetime)
There is no separate integration charge for using this Odoo module — only the per-device charges above apply. For a full breakdown of the pricing model, read the API Activation and License Guide → (https://forum.camsbiometrics.com/api-activation-and-api-license-understanding-the-charges-for-biometric-device-integration/)
Supported Device Brands
Includes — but is not limited to:
Works In Every Environment
Retail and Branch Networks
Devices push directly to Odoo cloud. Real-time shift visibility across all locations.
Manufacturing and Air-gapped Networks
Hybrid Push bridges isolated OT networks — devices need no internet access.
Healthcare and Regulated Industries
HIPAA-compliant deployments — biometric templates stay fully on-premise.
Corporate Multi-site
Manage thousands of devices across global offices from a single Odoo instance.
Streamline your attendance management by eliminating manual exports, third-party sync tools, and vendor lock-in. Whether you have 5 devices or 50,000 — across one office or one hundred countries — this module keeps Odoo HR Attendance accurate, real-time, and fully automated.
For Customization and Developer Support
Cams Biometrics — www.camsbiometrics.com
Please log in to comment on this module
What truly impressed us about Cams Biometrics was two minutes integration with Odoo. There was no need for custom development or complicated setup. The biometric attendance data started syncing seamlessly in real time with our Odoo HR and payroll modules, which significantly reduced manual work and improved data accuracy. It’s clear that the integration has been thoughtfully designed for real business needs. Our HR processes are now faster, more reliable, and far more efficient. We’re very satisfied with the performance and support from the Cams Biometrics team.
Hello, does this module support the ZKTeco ZGT6 or G5 models?
Re:
Yes. It supports all the machines that is verified at https://developer.camsbiometrics.com/
ngak bisa digunakan
hi, this device are compatible ? ICLOCK260/ID/AD
Re: hi, this device are compatible ? ICLOCK260/ID/AD
Yes it is one of most supported device.
Pleaes refer to https://forum.camsbiometrics.com/how-to-integrate-zkteco-biometric-attendance-system-with-cloud-application/ which helps how you can confirm if your device has API supportability
Hi,
My name is Pavankalyan, and I am currently working on integrating an eSSL biometric device with Odoo. I have been exploring your module for this integration, and I would greatly appreciate some clarification on a few points:
Could you please provide detailed instructions or documentation on how to effectively use your module for integrating the eSSL device with Odoo? Any specific configurations or prerequisites that need to be taken care of would be extremely helpful.
I need to obtain the service tag ID from the eSSL device. Could you guide me on how to retrieve this ID? Is there a specific API endpoint or command that I should use to access this information?
I understand that an authorization token is required to access biometric data from the eSSL device. Could you please explain the process of generating or retrieving this token? If there are specific steps or security protocols that need to be followed, I would appreciate a detailed explanation.
If there are any additional considerations or best practices that I should be aware of while integrating the eSSL device with Odoo, please do share them.
Please feel free to reach out to me at pavankalyan.p@ahex.co.in with any further questions or if you need more information from my end.
Thank you in advance for your assistance. I look forward to your guidance.
Best regards,
Pavankalyan
pavankalyan.p@ahex.co.in
Re:
Thank you Mr Pavan. Our sales team from +91-98409-41006 will contact you.
- Does we need to buy the Biotime Software with the Devices ??
- Are you using SQL to connect or API ? because with the API supplier told me I need to buy the Biotime native software with it which is expensive .
- If we have Odoo on cloud and the device in local network how we can connect ?
Thanks for your answer
Sincerely
Re:
No need of biotime software and we dont use the sql or software which comes along with the biometric machine. We only only the API available at https://camsunit.com/application/biometric-web-api.html .
And our solution works only in cloud. If your odoo exist in local network, our module will not help.
You can reach us on support@camsunit.com for more specific support.
eror install odoo 17 enterprise on premiss
Traceback (most recent call last): File "/usr/lib/python3/dist-packages/odoo/http.py",line 613, in parse self._tag_root(de) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 556, in _tag_root f(rec) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 567, in _tag_root raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback odoo.tools.convert.ParseError: while parsing /usr/lib/python3/dist-packages/odoo/addons/odoo-biometric-attendance/views/views.xml:3 Error while validating view near:
Field "machine_id" does not exist in model "hr.attendance" View error context: {'file': '/usr/lib/python3/dist-packages/odoo/addons/odoo-biometric-attendance/views/views.xml', 'line': 3, 'name': 'inherited.attendance.form.view', 'view': ir.ui.view(5050,), 'view.model': 'hr.attendance', 'view.parent': ir.ui.view(1853,), 'xmlid': 'inherited_attendance_form_view'} The above server error caused the following client error: RPC_ERROR: Odoo Server Error at makeErrorFromResponse (http://192.168.10.207:8069/web/assets/ad4616e/web.assets_web.min.js:2866:163) at XMLHttpRequest. (http://192.168.10.207:8069/web/assets/ad4616e/web.assets_web.min.js:2870:13) Traceback (most recent call last): File "/usr/lib/python3/dist-packages/odoo/http.py", line 1732, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 133, in retrying result = func() File "/usr/lib/python3/dist-packages/odoo/http.py", line 1759, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "/usr/lib/python3/dist-packages/odoo/http.py", line 1960, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "/usr/lib/python3/dist-packages/odoo/addons/website/models/ir_http.py", line 235, in _dispatch response = super()._dispatch(endpoint) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 207, in _dispatch result = endpoint(**request.params) File "/usr/lib/python3/dist-packages/odoo/http.py", line 722, in route_wrapper result = endpoint(self, *args, **params_ok) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 28, in call_button action = self._call_kw(model, method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 20, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 466, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "/usr/lib/python3/dist-packages/odoo/api.py", line 453, in _call_kw_multi result = method(recs, *args, **kwargs) File "", line 2, in button_immediate_install File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 75, in check_and_log return method(self, *args, **kwargs) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 459, in button_immediate_install return self._button_immediate_function(type(self).button_install) File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_module.py", line 583, in _button_immediate_function registry = modules.registry.Registry.new(self._cr.dbname, update_module=True) File "", line 2, in new File "/usr/lib/python3/dist-packages/odoo/tools/func.py", line 87, in locked return func(inst, *args, **kwargs) File "/usr/lib/python3/dist-packages/odoo/modules/registry.py", line 113, in new odoo.modules.load_modules(registry, force_demo, status, update_module) File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 480, in load_modules processed_modules += load_marked_modules(env, graph, File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 364, in load_marked_modules loaded, processed = load_module_graph( File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 227, in load_module_graph load_data(env, idref, mode, kind='data', package=package) File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 71, in load_data tools.convert_file(env, package.name, filename, idref, mode, noupdate, kind) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 627, in convert_file convert_xml_import(env, module, fp, idref, mode, noupdate) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 693, in convert_xml_import obj.parse(doc.getroot()) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 613, in parse self._tag_root(de) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 556, in _tag_root f(rec) File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 567, in _tag_root raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback odoo.tools.convert.ParseError: while parsing /usr/lib/python3/dist-packages/odoo/addons/odoo-biometric-attendance/views/views.xml:3 Error while validating view near: Field "machine_id" does not exist in model "hr.attendance" View error context: {'file': '/usr/lib/python3/dist-packages/odoo/addons/odoo-biometric-attendance/views/views.xml', 'line': 3, 'name': 'inherited.attendance.form.view', 'view': ir.ui.view(5050,), 'view.model': 'hr.attendance', 'view.parent': ir.ui.view(1853,), 'xmlid': 'inherited_attendance_form_view'} The above server error caused the following client error: RPC_ERROR: Odoo Server Error at makeErrorFromResponse (http://192.168.10.207:8069/web/assets/ad4616e/web.assets_web.min.js:2866:163) at XMLHttpRequest. (http://192.168.10.207:8069/web/assets/ad4616e/web.assets_web.min.js:2870:13)Re: eror install odoo 17 enterprise on premiss
Hi.
It has been updated. Please check now.
Thanks
Not able to activate
Traceback (most recent call last): File "C:\Program Files\Odoo 17.0.20240222\server\odoo\http.py", line 1765, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\service\model.py", line 133, in retrying result = func() File "C:\Program Files\Odoo 17.0.20240222\server\odoo\http.py", line 1792, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\http.py", line 1996, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\base\models\ir_http.py", line 222, in _dispatch result = endpoint(**request.params) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\http.py", line 722, in route_wrapper result = endpoint(self, *args, **params_ok) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\web\controllers\dataset.py", line 28, in call_button action = self._call_kw(model, method, args, kwargs) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\web\controllers\dataset.py", line 20, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\api.py", line 468, in call_kw result = _call_kw_multi(method, model, args, kwargs) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\api.py", line 453, in _call_kw_multi result = method(recs, *args, **kwargs) File "", line 2, in button_immediate_install File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\base\models\ir_module.py", line 75, in check_and_log return method(self, *args, **kwargs) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\base\models\ir_module.py", line 466, in button_immediate_install return self._button_immediate_function(self.env.registry[self._name].button_install) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\base\models\ir_module.py", line 590, in _button_immediate_function registry = modules.registry.Registry.new(self._cr.dbname, update_module=True) File "", line 2, in new File "C:\Program Files\Odoo 17.0.20240222\server\odoo\tools\func.py", line 87, in locked return func(inst, *args, **kwargs) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\modules\registry.py", line 113, in new odoo.modules.load_modules(registry, force_demo, status, update_module) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\modules\loading.py", line 480, in load_modules processed_modules += load_marked_modules(env, graph, File "C:\Program Files\Odoo 17.0.20240222\server\odoo\modules\loading.py", line 364, in load_marked_modules loaded, processed = load_module_graph( File "C:\Program Files\Odoo 17.0.20240222\server\odoo\modules\loading.py", line 185, in load_module_graph load_openerp_module(package.name) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\modules\module.py", line 394, in load_openerp_module __import__(qualname) File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\odoo-biometric-attendance\__init__.py", line 4, in from . import models File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\odoo-biometric-attendance\models\__init__.py", line 4, in from . import models File "C:\Program Files\Odoo 17.0.20240222\server\odoo\addons\odoo-biometric-attendance\models\models.py", line 5, in from odoo.exceptions import Warning ImportError: cannot import name 'Warning' from 'odoo.exceptions' (C:\Program Files\Odoo 17.0.20240222\server\odoo\exceptions.py) The above server error caused the following client error: RPC_ERROR: Odoo Server Error at makeErrorFromResponse (http://erp.mk3.com:8069/web/assets/ca2e8e9/web.assets_web.min.js:2874:163) at XMLHttpRequest. (http://erp.mk3.com:8069/web/assets/ca2e8e9/web.assets_web.min.js:2878:13)