[External Converter]: TLSR82xx from Allesin
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 15.7k
- Forks
- 2k
- Avg merge
- 18h 55m
- Merged PRs (30d)
- 35
Description
Link
https://www.amazon.com/dp/B0F8V7Z7SH
Database entry
{"id":28,"type":"EndDevice","ieeeAddr":"0x10a562fffe50908e","nwkAddr":16939,"manufId":4417,"manufName":"Aubor","powerSource":"Mains (single phase)","modelId":"TLSR82xx","epList":[1],"endpoints":{"1":{"profId":260,"epId":1,"devId":514,"inClusterList":[0,1,3,4,6,258,4096,64599],"outClusterList":[3,6,25],"clusters":{"genBasic":{"attributes":{"modelId":"TLSR82xx","manufacturerName":"Aubor","powerSource":1,"zclVersion":3,"appVersion":0,"stackVersion":2,"hwVersion":0}},"genPowerCfg":{"attributes":{"batteryPercentageRemaining":100,"batteryVoltage":0}},"genOnOff":{"attributes":{"onOff":0}},"closuresWindowCovering":{"attributes":{"windowCoveringMode":0,"currentPositionLiftPercentage":0}}},"binds":[{"cluster":1,"type":"endpoint","deviceIeeeAddress":"0x08b95ffffeb2f7d1","endpointID":1},{"cluster":6,"type":"endpoint","deviceIeeeAddress":"0x08b95ffffeb2f7d1","endpointID":1}],"configuredReportings":[{"cluster":1,"attrId":33,"minRepIntval":3600,"maxRepIntval":65000,"repChange":10},{"cluster":6,"attrId":0,"minRepIntval":0,"maxRepIntval":65000,"repChange":1}],"meta":{}}},"appVersion":0,"stackVersion":2,"hwVersion":0,"zclVersion":3,"interviewCompleted":true,"interviewState":"SUCCESSFUL","meta":{},"lastSeen":1784829431347}
Zigbee2MQTT version
2.12.1 (unknown)
External converter
import * as m from 'zigbee-herdsman-converters/lib/modernExtend';
const customBatteryFix = () => {
const baseBattery = m.battery();
return {
...baseBattery,
fromZigbee: [{
cluster: 'genPowerCfg',
type: ['attributeReport', 'readResponse'],
convert: (model, msg, publish, options, meta) => {
if (msg.data.hasOwnProperty('batteryPercentageRemaining')) {
let battery = msg.data['batteryPercentageRemaining'];
battery = Math.min(battery * 2, 100);
return {battery: battery};
}
},
}],
};
};
export default {
zigbeeModel: ['TLSR82xx'],
model: 'Allesin_Roller_Shade',
vendor: 'Allesin',
description: 'Zigbee roller shade',
extend: [customBatteryFix(), m.windowCovering({ controls: ['lift'] })]
};
What does/doesn't work with the external definition?
What works:
- Window Covering Control: Open, close, and precise position control via the
liftattribute work perfectly. - Battery Reporting: The device natively reports the
batteryPercentageRemainingattribute in raw half-percent steps (ZCL spec). Using a custommodernExtendwrapper to multiply the value by 2 correctly exposes the true 0–100% battery capacity.
What doesn't work:
- Standard
m.battery()extension without the multiplier results in the battery percentage displaying at exactly half value (e.g., a full battery reads as 50%). The provided code resolves this issue.
Notes
software_build_id: undefined
date_code: undefined
endpoints:
{"1":{"clusters":{"input":["genBasic","genPowerCfg","genIdentify","genGroups","genOnOff","closuresWindowCovering","touchlink","manuSpecificAmazonWWAH"],"output":["genIdentify","genOnOff","genOta"]}}}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the supplied external converter for the TLSR82xx model, especially the custom genPowerCfg battery conversion and the window-covering extension. Compare its behavior with the standard m.battery() handling and verify that the device reports accurate battery percentage alongside open, close, and lift-position controls.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- embedded-iot
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 57/100