Smart locks not supported - Can base lock functionality be provided to devices starting with T85*
C30 - T85D0C, E31 - T85F0, S3 max - T85V0
I have these 3 smart locks that show up in home assistant under the integration but do not have any lock attributes like lock / unlock etc. Similar to other issues mentioned for other locks: debug, trigger alarm and a few other default options are shown. Is this because they are not known by the integration?
T85* seems to always be a lock but I may be wrong. Is the base config similar across Eufy locks and therefore could it be partially supported automatically with a default lock config if there is no config for the device?
T85LO doesn't show anything lock related. Can this be fixed?
@fuatakgun
To add to this, using here is the relevant param_types that change on the C30 from unlocked -> locked -> unlocked. This log is from push notifications but the device info shows the same param_types and their values
2025-07-29 17:41:17.654 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.handleParsedMessage] Push client - DataMessageStanza { message: '{"tag":8,"object":{"id":"8D43DDB5","from":"348804314802","category":"com.oceanwing.battery.cam","appData":[{"key":"device_sn","value":"T85D0K1024480F05"},{"key":"payload","value":"eyJldmVudF90eXBlIjoyNjEsImV2ZW50X3RpbWUiOjE3NTM4MTA4NzgwMDAsInNob3J0X3VzZXJfaWQiOiIwMDAxIiwibmlja19uYW1lIjoicHBjbGkucmVnaW1lbnRhbGZ1bmRzIiwidXNlcl9pZCI6IjNkZmViNzc2NTc0ZjY4NTI5ZTk2ZTViYzJmOTdkZjNhMWRlNTZjNTYiLCJkZXZpY2VfbmFtZSI6IkdhcmFnZSBEb29yIiwiZGV2aWNlX3NuIjoiVDg1RDBLMTAyNDQ4MEYwNSIsImV2ZW50X3R5cGVfYXJyIjpbMjYxXSwicGFyYW1zIjpbeyJwYXJhbV90eXBlIjo2MDAxLCJwYXJhbV92YWx1ZSI6IjEwMCJ9LHsicGFyYW1fdHlwZSI6NjAwMCwicGFyYW1fdmFsdWUiOiIzIn0seyJwYXJhbV90eXBlIjoxOTE5LCJwYXJhbV92YWx1ZSI6IjMifV19"},{"key":"station_sn","value":"T85D0K1024480F05"},{"key":"google.c.sender.id","value":"348804314802"},{"key":"title","value":"Unlocked - Garage Door"},{"key":"type","value":"51"},{"key":"push_time","value":"1753810877552"},{"key":"content","value":"Door unlocked by Garage Door"},{"key":"event_time","value":"1753810877534"}],"persistentId":"0:1753810877578129%0d2a775cf9fd7ecd","ttl":3600,"sent":"1753810877563"}}' } 2025-07-29 17:41:17.654 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Raw push message received { message: { id: '8D43DDB5', from: '348804314802', category: 'com.oceanwing.battery.cam', persistentId: '0:1753810877578129%0d2a775cf9fd7ecd', ttl: 3600, sent: '1753810877563', payload: { device_sn: 'T85D0K1024480F05', payload: { event_type: 261, event_time: 1753810878000, short_user_id: '0001', nick_name: 'ppcli.regimentalfunds', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', device_name: 'Garage Door', device_sn: 'T85D0K1024480F05', event_type_arr: [ 261 ], params: [ { param_type: 6001, param_value: '100' }, { param_type: 6000, param_value: '3' }, { param_type: 1919, param_value: '3' } ] }, station_sn: 'T85D0K1024480F05', 'google.c.sender.id': '348804314802', title: 'Unlocked - Garage Door', type: '51', push_time: '1753810877552', content: 'Door unlocked by Garage Door', event_time: '1753810877534' } } } 2025-07-29 17:41:17.654 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Normalized push message received { message: { name: 'Garage Door', event_time: 1753810877534, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753810877552, title: 'Unlocked - Garage Door', content: 'Door unlocked by Garage Door', event_type: 261, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } } 2025-07-29 17:41:17.655 DEBUG eufy-security-ws:eufy-security-client [main] [EufySecurity.onPushMessage] Received push message { message: { name: 'Garage Door', event_time: 1753810877534, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753810877552, title: 'Unlocked - Garage Door', content: 'Door unlocked by Garage Door', event_type: 261, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } } 2025-07-29 17:42:45.780 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.sendHeartbeat] Push client - Sending heartbeat... { streamId: 15 } 2025-07-29 17:42:45.780 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.buildHeartbeatPingRequest] Push client - heartbeatPingRequest { streamId: 15, request: '{"last_stream_id_received":15}' } 2025-07-29 17:42:45.810 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.handleHeartbeatAck] Push client - Heartbeat acknowledge { message: '{"tag":1,"object":{"lastStreamIdReceived":12}}' } 2025-07-29 17:43:17.625 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.handleParsedMessage] Push client - DataMessageStanza { message: '{"tag":8,"object":{"id":"8D49D652","from":"348804314802","category":"com.oceanwing.battery.cam","appData":[{"key":"device_sn","value":"T85D0K1024480F05"},{"key":"payload","value":"eyJldmVudF90eXBlIjoyNjQsImV2ZW50X3RpbWUiOjE3NTM4MTA5OTgwMDAsInNob3J0X3VzZXJfaWQiOiIwMDAxIiwibmlja19uYW1lIjoicHBjbGkucmVnaW1lbnRhbGZ1bmRzIiwidXNlcl9pZCI6IjNkZmViNzc2NTc0ZjY4NTI5ZTk2ZTViYzJmOTdkZjNhMWRlNTZjNTYiLCJkZXZpY2VfbmFtZSI6IkdhcmFnZSBEb29yIiwiZGV2aWNlX3NuIjoiVDg1RDBLMTAyNDQ4MEYwNSIsImV2ZW50X3R5cGVfYXJyIjpbMjY0XSwicGFyYW1zIjpbeyJwYXJhbV90eXBlIjo2MDAxLCJwYXJhbV92YWx1ZSI6IjEwMCJ9LHsicGFyYW1fdHlwZSI6NjAwMCwicGFyYW1fdmFsdWUiOiI0In0seyJwYXJhbV90eXBlIjoxOTE5LCJwYXJhbV92YWx1ZSI6IjcifV19"},{"key":"station_sn","value":"T85D0K1024480F05"},{"key":"google.c.sender.id","value":"348804314802"},{"key":"title","value":"Locked - Garage Door"},{"key":"type","value":"51"},{"key":"push_time","value":"1753810997551"},{"key":"event_time","value":"1753810997540"},{"key":"content","value":"Door locked by Garage Door"}],"persistentId":"0:1753810997571782%0d2a775cf9fd7ecd","ttl":3600,"sent":"1753810997564"}}' } 2025-07-29 17:43:17.625 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Raw push message received { message: { id: '8D49D652', from: '348804314802', category: 'com.oceanwing.battery.cam', persistentId: '0:1753810997571782%0d2a775cf9fd7ecd', ttl: 3600, sent: '1753810997564', payload: { device_sn: 'T85D0K1024480F05', payload: { event_type: 264, event_time: 1753810998000, short_user_id: '0001', nick_name: 'ppcli.regimentalfunds', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', device_name: 'Garage Door', device_sn: 'T85D0K1024480F05', event_type_arr: [ 264 ], params: [ { param_type: 6001, param_value: '100' }, { param_type: 6000, param_value: '4' }, { param_type: 1919, param_value: '7' } ] }, station_sn: 'T85D0K1024480F05', 'google.c.sender.id': '348804314802', title: 'Locked - Garage Door', type: '51', push_time: '1753810997551', event_time: '1753810997540', content: 'Door locked by Garage Door' } } } 2025-07-29 17:43:17.625 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Normalized push message received { message: { name: 'Garage Door', event_time: 1753810997540, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753810997551, title: 'Locked - Garage Door', content: 'Door locked by Garage Door', event_type: 264, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } } 2025-07-29 17:43:17.626 DEBUG eufy-security-ws:eufy-security-client [main] [EufySecurity.onPushMessage] Received push message { message: { name: 'Garage Door', event_time: 1753810997540, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753810997551, title: 'Locked - Garage Door', content: 'Door locked by Garage Door', event_type: 264, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } } 2025-07-29 17:43:43.547 DEBUG eufy-security-ws:eufy-security-client [push] [PushClient.handleParsedMessage] Push client - DataMessageStanza { message: '{"tag":8,"object":{"id":"8D4B076B","from":"348804314802","category":"com.oceanwing.battery.cam","appData":[{"key":"device_sn","value":"T85D0K1024480F05"},{"key":"payload","value":"eyJldmVudF90eXBlIjoyNjEsImV2ZW50X3RpbWUiOjE3NTM4MTEwMjQwMDAsInNob3J0X3VzZXJfaWQiOiIwMDAxIiwibmlja19uYW1lIjoicHBjbGkucmVnaW1lbnRhbGZ1bmRzIiwidXNlcl9pZCI6IjNkZmViNzc2NTc0ZjY4NTI5ZTk2ZTViYzJmOTdkZjNhMWRlNTZjNTYiLCJkZXZpY2VfbmFtZSI6IkdhcmFnZSBEb29yIiwiZGV2aWNlX3NuIjoiVDg1RDBLMTAyNDQ4MEYwNSIsImV2ZW50X3R5cGVfYXJyIjpbMjYxXSwicGFyYW1zIjpbeyJwYXJhbV90eXBlIjo2MDAxLCJwYXJhbV92YWx1ZSI6IjEwMCJ9LHsicGFyYW1fdHlwZSI6NjAwMCwicGFyYW1fdmFsdWUiOiIzIn0seyJwYXJhbV90eXBlIjoxOTE5LCJwYXJhbV92YWx1ZSI6IjcifV19"},{"key":"station_sn","value":"T85D0K1024480F05"},{"key":"google.c.sender.id","value":"348804314802"},{"key":"title","value":"Unlocked - Garage Door"},{"key":"type","value":"51"},{"key":"push_time","value":"1753811023476"},{"key":"content","value":"Door unlocked by Garage Door"},{"key":"event_time","value":"1753811023468"}],"persistentId":"0:1753811023500756%0d2a775cf9fd7ecd","ttl":3600,"sent":"1753811023492"}}' } 2025-07-29 17:43:43.547 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Raw push message received { message: { id: '8D4B076B', from: '348804314802', category: 'com.oceanwing.battery.cam', persistentId: '0:1753811023500756%0d2a775cf9fd7ecd', ttl: 3600, sent: '1753811023492', payload: { device_sn: 'T85D0K1024480F05', payload: { event_type: 261, event_time: 1753811024000, short_user_id: '0001', nick_name: 'ppcli.regimentalfunds', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', device_name: 'Garage Door', device_sn: 'T85D0K1024480F05', event_type_arr: [ 261 ], params: [ { param_type: 6001, param_value: '100' }, { param_type: 6000, param_value: '3' }, { param_type: 1919, param_value: '7' } ] }, station_sn: 'T85D0K1024480F05', 'google.c.sender.id': '348804314802', title: 'Unlocked - Garage Door', type: '51', push_time: '1753811023476', content: 'Door unlocked by Garage Door', event_time: '1753811023468' } } } 2025-07-29 17:43:43.547 DEBUG eufy-security-ws:eufy-security-client [push] [PushNotificationService.onMessage] Normalized push message received { message: { name: 'Garage Door', event_time: 1753811023468, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753811023476, title: 'Unlocked - Garage Door', content: 'Door unlocked by Garage Door', event_type: 261, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } } 2025-07-29 17:43:43.547 DEBUG eufy-security-ws:eufy-security-client [main] [EufySecurity.onPushMessage] Received push message { message: { name: 'Garage Door', event_time: 1753811023468, type: 51, station_sn: 'T85D0K1024480F05', device_sn: 'T85D0K1024480F05', push_time: 1753811023476, title: 'Unlocked - Garage Door', content: 'Door unlocked by Garage Door', event_type: 261, short_user_id: '0001', user_id: '3dfeb776574f68529e96e5bc2f97df3a1de56c56', person_name: 'ppcli.regimentalfunds' } }
Claude suggested these edits
Code Changes to Enable T85* Lock Devices Support
Based on the GitHub issue analysis and similar patterns from other lock devices in the repository, here are the suggested code changes to enable T85* lock devices to work with the eufy_security integration.
Problem Analysis
The issue shows that T85* lock devices are:
- Detected by the integration
- Only showing basic debug/alarm entities instead of lock functionality
- Missing lock/unlock controls and proper lock state management
Suggested Code Changes
1. Update Device Type Recognition in const.py
Add T85* device pattern recognition to identify these as lock devices:
# In custom_components/eufy_security/const.py
# Add to device type mappings section
LOCK_DEVICE_PATTERNS = [
"T8500", # Existing
"T8502", # Existing
"T8520", # Existing
"T8530", # Existing
"T85*", # New pattern for T85* series locks
]
# Add device type detection helper
def is_lock_device(device_model: str) -> bool:
"""Check if device model indicates a lock device."""
lock_prefixes = ["T8500", "T8502", "T8520", "T8530", "T85"]
return any(device_model.startswith(prefix) for prefix in lock_prefixes)
2. Update Lock Entity Configuration
If there’s a lock.py file, enhance it to support T85* devices:
# In custom_components/eufy_security/lock.py
@property
def is_locked(self) -> bool:
"""Return true if the lock is locked."""
# Handle different lock models that use different state keys
if self.device.model.startswith("T8500"):
return self.device.state.get("lockStatus")
elif self.device.model.startswith("T85"):
# T85* series may use different state key - test both common ones
locked_state = self.device.state.get("locked")
if locked_state is not None:
return locked_state
# Fallback to lockStatus if locked key not available
return self.device.state.get("lockStatus")
else:
return self.device.state.get("locked")
async def async_lock(self, **kwargs) -> None:
"""Lock the device."""
if self.device.model.startswith("T85"):
# Use appropriate lock command for T85* series
await self.coordinator.lock_device(self.device.serial_number)
else:
await self.coordinator.lock_device(self.device.serial_number)
async def async_unlock(self, **kwargs) -> None:
"""Unlock the device."""
if self.device.model.startswith("T85"):
# Use appropriate unlock command for T85* series
await self.coordinator.unlock_device(self.device.serial_number)
else:
await self.coordinator.unlock_device(self.device.serial_number)
3. Add T85* Support to Device Coordinator
Update the coordinator to properly handle T85* devices:
# In custom_components/eufy_security/coordinator.py or relevant file
def _determine_device_entities(self, device) -> list:
"""Determine which entities to create for a device."""
entities = []
# Check if device is a lock
if is_lock_device(device.model):
entities.append("lock")
# Add common lock-related entities
entities.extend(["battery", "door_sensor", "tamper"])
# T85* specific entities (if any)
if device.model.startswith("T85"):
# Add T85*-specific sensors if needed
pass
return entities
4. Update Entity Descriptions for Locks
Add proper entity descriptions for lock devices:
# In custom_components/eufy_security/const.py
# Lock-specific entity descriptions
class LockEntityDescription:
"""Entity descriptions for lock devices."""
locked = EntityDescription(
id=auto(),
device_class=BinarySensorDeviceClass.LOCK,
icon="mdi:lock"
)
door_open = EntityDescription(
id=auto(),
device_class=BinarySensorDeviceClass.DOOR,
icon="mdi:door-open"
)
battery_level = EntityDescription(
id=auto(),
device_class=SensorDeviceClass.BATTERY,
state_class=SensorStateClass.MEASUREMENT,
category=EntityCategory.DIAGNOSTIC
)
tamper = EntityDescription(
id=auto(),
device_class=BinarySensorDeviceClass.TAMPER,
icon="mdi:shield-alert"
)
5. Add Device Recognition Logic
Update the main setup logic to recognize T85* devices:
# In custom_components/eufy_security/__init__.py or coordinator.py
async def _setup_device_entities(self, device):
"""Set up entities for a specific device."""
entities_to_add = []
if is_lock_device(device.model):
# Add lock entity
lock_entity = EufySecurityLock(self.coordinator, device)
entities_to_add.append(lock_entity)
# Add lock-related sensors
if hasattr(device.state, 'battery'):
battery_entity = EufySecuritySensor(
self.coordinator,
device,
LockEntityDescription.battery_level
)
entities_to_add.append(battery_entity)
if hasattr(device.state, 'door_open'):
door_entity = EufySecurityBinarySensor(
self.coordinator,
device,
LockEntityDescription.door_open
)
entities_to_add.append(door_entity)
return entities_to_add
6. Default Lock Configuration
Add a fallback configuration for unknown lock models:
# In device configuration section
DEFAULT_LOCK_CONFIG = {
"entities": ["lock", "battery", "door_sensor"],
"state_keys": {
"locked": ["locked", "lockStatus"], # Try both common state keys
"battery": ["battery", "batteryLevel"],
"door_open": ["door_open", "sensorOpen"]
},
"capabilities": ["lock", "unlock"]
}
def get_lock_config(device_model: str) -> dict:
"""Get configuration for lock device, with fallback to default."""
# Specific configurations for known models
specific_configs = {
"T8500": {"state_key": "lockStatus"},
"T8502": {"state_key": "locked"},
"T8520": {"state_key": "locked"},
}
# For T85* devices, use default config
if device_model.startswith("T85"):
return DEFAULT_LOCK_CONFIG
return specific_configs.get(device_model, DEFAULT_LOCK_CONFIG)
Implementation Notes
- Testing: These changes should be tested with actual T85* devices to verify the correct state keys and command formats.
- State Key Discovery: The actual state keys used by T85* devices may need to be discovered through debugging. Common keys include:
-
locked/lockStatus -
battery/batteryLevel -
door_open/sensorOpen
- Command Format: The lock/unlock commands for T85* devices should match the format expected by the eufy-security-ws backend.
- Incremental Approach: Start with basic lock/unlock functionality, then add additional sensors and features.
- Backward Compatibility: Ensure changes don’t break existing lock device support.
Testing Steps
- Deploy changes to Home Assistant
- Restart the integration
- Verify T85* devices now show lock entities
- Test lock/unlock functionality
- Verify state updates work correctly
- Add logging to capture actual state keys and values for refinement
This approach provides a foundation for T85* lock support while allowing for easy extension and refinement based on actual device behavior.
@updatelee i used Cursor to update the code, and i tested it and it works. T85 locks now work and are detected by Home assistant. you have to enable the lock from the disabled diagnostic entities.
https://github.com/fuatakgun/eufy_security/pull/1369
@updatelee i used Cursor to update the code, and i tested it and it works. T85 locks now work and are detected by Home assistant. you have to enable the lock from the disabled diagnostic entities.
is this working for T85F0 Eufy E31 Smart locks. if so how can i apply this update so locking and unlocking work in HA
I have an E30 (T85F1, Firmware: 1.0.9.0) and not seeing the lock entity. Its not showing in disabled either.
@updatelee i used Cursor to update the code, and i tested it and it works. T85 locks now work and are detected by Home assistant. you have to enable the lock from the disabled diagnostic entities.
I managed to implement the code, and it is working for S3 (T85V0). How can it now send Lock and Unlock, as I get an error message while trying to unlock?
T8506 works for locking/unlocking, however the entity states don't seem to update when it auto locks after I've unlocked it (in HA) or when using the eufy app
EDIT: Nevermind, I'm an idiot :P Forgot to turn on notifications in the Eufy app!
T8506 works for locking/unlocking, however the entity states don't seem to update when it auto locks after I've unlocked it (in HA) or when using the eufy app
EDIT: **Nevermind, I'm an idiot :P Forgot to turn on notifications in the Eufy app!**
can you share the changes you made? Which method you used?
Will this be updated at some point soon? I tried to follow this and my const.py does not have a device pairing section so i can't do the first step. i regret buying the c30 now. i was just trying to save 20 bucks vs the C210 :(
Will this be updated at some point soon? I tried to follow this and my const.py does not have a device pairing section so i can't do the first step. i regret buying the c30 now. i was just trying to save 20 bucks vs the C210 :(
I used Matter for Famillock S3 with Alexa. I can lock and unlock the door, get battery status, set volume and autolock time.
I used Matter for Famillock S3 with Alexa. I can lock and unlock the door, get battery status, set volume and autolock time.
I have not configured matter and not sure i want to go down this road. thanks for the suggestion. i did paste all this infor into my py files and rebooted HA, no changes. I guess this is above my head.
While Eufy has excitingly added Matter to some of its recent locks, including some I listed above, most existing locks don’t support it. Those of us with those locks that don’t use Matter would like to use this integration.
I do use Matter for those that have it and while it should be quicker being local and more reliable I haven’t found it to be so to date with devices going unavailable more often than I would like.
How do a implement the changes to support E30? Sorry a GIT new user here...
I have the C30 lock - T85D0, how do I enable the lock and unlock functionality?
Me too I'd like help
I don't even see the device type mappings section in the const.py... am I missing something?
i remember part of the instructions did not exist in my environment too. i did it all and it did not work (minus the missing piece) i wish they would just say if an update is planned. i have no idea how these work or if they are semi consistently updated.
@updatelee i used Cursor to update the code, and i tested it and it works. T85 locks now work and are detected by Home assistant. you have to enable the lock from the disabled diagnostic entities.
Can you post your files somewhere? I can't seem to edit mine correctly.
I am running into similar issues with my T8520P and T8520. Both locks are able to lock/unlock from with Home Assistant, but states that I used for automations are no longer reported. A manual unlock/lock of the deadbolts don't even report in the activity log. These use to be rock solid. Reverting to 8.1.1 doesn't do anything either.
Same issue with T85D2, following this thread for status. Wildcard approach with the code suggestion sounds viable
off topic but same for s3 max T85V0, apart from adding basic lock/unlock function(which I can do by matter), can you also help let me know how to integrate its camera, motion sensor etc?
EDIT: **Nevermind, I'm an idiot :P Forgot to turn on notifications in the Eufy app!**