OpenWonderLabs / homebridge-switchbot

The Homebridge SwitchBot plugin allows you to access your SwitchBot Device(s) from HomeKit. Homebridge.
https://www.switch-bot.com/
ISC License
229 stars 47 forks source link

Bug: Plugin errors on subsequent bluetooth connections "Cannot read properties of undefined (reading 'runToPos')" #568

Closed asc6 closed 1 year ago

asc6 commented 1 year ago

Describe The Bug

When accessing curtains over bluetooth, gives an error after the first curtain. This happens both on standard refresh of bots as well as executing a command

To Reproduce

Send multiple HomeKit updates (like with a scene) for BLE devices

Expected behavior

Bluetooth connectivity with no error.

Relevant log output

[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain BLERefreshStatus
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain BLE Address: c5:fd:36:c7:XX:XX
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain Config BLE Address: c5:fd:36:c7:XX:XX, BLE Address Found: c5:fd:36:c7:XX:XX
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain serviceData: {"model":"c","modelName":"WoCurtain","calibration":true,"battery":49,"inMotion":false,"position":100,"lightLevel":1,"deviceChain":1}
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain calibration: true, position: 100, lightLevel: 1, battery: 49, inMotion: false
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain connected: true
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain BLEparseStatus
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain CurrentPosition 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain Standby, CurrentPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain Stopped
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain CurrentPosition: 0, TargetPosition: 0, PositionState: 2,
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain BatteryLevel: 49, StatusLowBattery: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateCharacteristic CurrentPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateCharacteristic PositionState: 2
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateCharacteristic TargetPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateCharacteristic BatteryLevel: 49
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateCharacteristic StatusLowBattery: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLERefreshStatus
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLE Address: d7:f1:b1:db:XX:XX
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLERefreshStatus
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLE Address: f9:08:cd:7f:XX:XX
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Config BLE Address: f9:08:cd:7f:XX:XX, BLE Address Found: f9:08:cd:7f:XX:XX
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain serviceData: {"model":"c","modelName":"WoCurtain","calibration":true,"battery":92,"inMotion":false,"position":1,"lightLevel":1,"deviceChain":1}
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain calibration: true, position: 1, lightLevel: 1, battery: 92, inMotion: false
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain connected: true
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLEparseStatus
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain CurrentPosition 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Standby, CurrentPosition: 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Stopped
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain CurrentPosition: 100, TargetPosition: 100, PositionState: 2,
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BatteryLevel: 92, StatusLowBattery: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic CurrentPosition: 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic PositionState: 2
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic TargetPosition: 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic BatteryLevel: 92
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic StatusLowBattery: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: A Bed Curtain No Changes, Set TargetPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain No Changes, Set TargetPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain No Changes, Set TargetPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: A Bed Curtain value: 0, CurrentPosition: 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: A Bed Curtain updateRate: 5
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain value: 0, CurrentPosition: 100
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateRate: 5
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain value: 0, CurrentPosition: 0
[29/10/2022, 19:24:17] [SwitchBot] [DEBUG] Curtain: G Office Curtain updateRate: 5
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLEpushChanges
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLE Address: d7:f1:b1:db:XX:XX
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] A Bed Curtain Mode: Default Mode
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLEpushChanges
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLE Address: f9:08:cd:7f:XX:XX
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] G Bed Curtain Mode: Default Mode
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: G Office Curtain BLEpushChanges
[29/10/2022, 19:24:18] [SwitchBot] [DEBUG] Curtain: G Office Curtain No BLEpushChanges, CurrentPosition & TargetPosition Are the Same.  CurrentPosition: 0, TargetPosition  0
[29/10/2022, 19:24:18] [SwitchBot] G Bed Curtain Target Position: 0
[29/10/2022, 19:24:20] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Done.
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: A Bed Curtain Refresh Status When Moving, PositionState: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLERefreshStatus
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: A Bed Curtain BLE Address: d7:f1:b1:db:XX:XX
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Refresh Status When Moving, PositionState: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLERefreshStatus
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLE Address: f9:08:cd:7f:XX:XX
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Config BLE Address: f9:08:cd:7f:XX:XX, BLE Address Found: f9:08:cd:7f:XX:XX
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain serviceData: {"model":"c","modelName":"WoCurtain","calibration":true,"battery":92,"inMotion":true,"position":22,"lightLevel":1,"deviceChain":1}
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain calibration: true, position: 22, lightLevel: 1, battery: 92, inMotion: true
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain connected: true
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BLEparseStatus
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain CurrentPosition 78
[29/10/2022, 19:24:22] [SwitchBot] Curtain: G Bed Curtain Checking Status ...
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain Opening, CurrentPosition: 78
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: 78 DECREASING PositionState: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain CurrentPosition: 78, TargetPosition: 0, PositionState: 0,
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain BatteryLevel: 92, StatusLowBattery: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic CurrentPosition: 78
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic PositionState: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic TargetPosition: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic BatteryLevel: 92
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain updateCharacteristic StatusLowBattery: 0
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: A Bed Curtain setNewTarget true timeout
[29/10/2022, 19:24:22] [SwitchBot] [DEBUG] Curtain: G Bed Curtain setNewTarget true timeout
[29/10/2022, 19:24:23] [SwitchBot] A Bed Curtain Target Position: 0
[29/10/2022, 19:24:23] [SwitchBot] Curtain: A Bed Curtain failed BLEpushChanges with BLE/OpenAPI Connection, Error Message: "Cannot read properties of undefined (reading 'runToPos')"
[29/10/2022, 19:24:23] [SwitchBot] Curtain: A Bed Curtain Using OpenAPI Connection to Push Changes
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain OpenAPI pushChanges
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain sign: ZHd6l4L+nB6aJziktU58oDyUEiUUVoB1aEb4ouGlgII=
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Pushing 0
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] A Bed Curtain Mode: Default Mode
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain Sending request to SwitchBot API, body: {"command":"setPosition","parameter":"0,ff,100","commandType":"command"},
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain openAPIpushChanges: {"_events":{"response":[Function],"error":[Function]},"_eventsCount":2,"_maxListeners":[Undefined],"outputData":[{"data":"POST /v1.1/devices/D7F1B1DBXXXX/commands HTTP/1.1\r\nAuthorization: XXXXXXXXXXXXXX\r\nsign: ZHd6l4L+nB6aJziktU58oDyUEiUUVoB1aEb4ouGlgII=\r\nnonce: requestID\r\nt: 1667089463096\r\nContent-Type: application/json\r\nContent-Length: 72\r\nHost: api.switch-bot.com\r\nConnection: close\r\n\r\n{\"command\":\"setPosition\",\"parameter\":\"0,ff,100\",\"commandType\":\"command\"}","encoding":[Undefined],"callback":[Function]},{"data":"","encoding":"latin1","callback":[Function]}],"outputSize":423,"writable":true,"destroyed":false,"_last":true,"chunkedEncoding":false,"shouldKeepAlive":false,"maxRequestsOnConnectionReached":false,"_defaultKeepAlive":true,"useChunkedEncodingByDefault":true,"sendDate":false,"_removedConnection":false,"_removedContLen":false,"_removedTE":false,"strictContentLength":false,"_contentLength":72,"_hasBody":true,"_trailer":"","finished":true,"_headerSent":true,"_closed":false,"socket":null,"_header":"POST /v1.1/devices/D7F1B1DBXXXX/commands HTTP/1.1\r\nAuthorization: XXXXXXXXXXXXXX\r\nsign: ZHd6l4L+nB6aJziktU58oDyUEiUUVoB1aEb4ouGlgII=\r\nnonce: requestID\r\nt: 1667089463096\r\nContent-Type: application/json\r\nContent-Length: 72\r\nHost: api.switch-bot.com\r\nConnection: close\r\n\r\n","_keepAliveTimeout":0,"_onPendingData":[ReferenceTo this.outputData[0].callback],"agent":{"_events":{"free":[Function],"newListener":[Function]},"_eventsCount":2,"_maxListeners":[Undefined],"defaultPort":443,"protocol":"https:","options":{"path":null},"requests":{},"sockets":{"api.switch-bot.com:443:::::::::::::::::::::":[{"_tlsOptions":{"allowHalfOpen":[Undefined],"pipe":false,"secureContext":{"context":{}},"isServer":false,"requestCert":true,"rejectUnauthorized":true,"session":[Undefined],"ALPNProtocols":[Undefined],"requestOCSP":[Undefined],"enableTrace":[Undefined],"pskCallback":[Undefined],"highWaterMark":[Undefined],"onread":[Undefined],"signal":[Undefined]},"_secureEstablished":false,"_securePending":false,"_newSessionPending":false,"_controlReleased":true,"secureConnecting":true,"_SNICallback":null,"servername":null,"alpnProtocol":null,"authorized":false,"authorizationError":null,"encrypted":true,"_events":{"close":[[Function],[Function],[Function]],"end":[[Function],[Function]],"newListener":[Function],"connect":[Function],"secure":[Function],"session":[Function],"free":[Function],"timeout":[Function],"agentRemove":[Function]},"_eventsCount":9,"connecting":true,"_hadError":false,"_parent":null,"_host":"api.switch-bot.com","_closeAfterHandlingError":false,"_readableState":{"objectMode":false,"highWaterMark":16384,"buffer":{"head":null,"tail":null,"length":0},"length":0,"pipes":[],"flowing":null,"ended":false,"endEmitted":false,"reading":false,"constructed":true,"sync":true,"needReadable":false,"emittedReadable":false,"readableListening":false,"resumeScheduled":false,"errorEmitted":false,"emitClose":false,"autoDestroy":true,"destroyed":false,"errored":null,"closed":false,"closeEmitted":false,"defaultEncoding":"utf8","awaitDrainWriters":null,"multiAwaitDrain":false,"readingMore":false,"dataEmitted":false,"decoder":null,"encoding":null},"_maxListeners":[Undefined],"_writableState":{"objectMode":false,"highWaterMark":16384,"finalCalled":false,"needDrain":false,"ending":false,"ended":false,"finished":false,"destroyed":false,"decodeStrings":false,"defaultEncoding":"utf8","length":0,"writing":false,"corked":0,"sync":true,"bufferProcessing":false,"onwrite":[Function],"writecb":null,"writelen":0,"afterWriteTickInfo":null,"buffered":[],"bufferedIndex":0,"allBuffers":true,"allNoop":true,"pendingcb":0,"constructed":true,"prefinished":false,"errorEmitted":false,"emitClose":false,"autoDestroy":true,"errored":null,"closed":false,"closeEmitted":false},"allowHalfOpen":false,"_sockname":null,"_pendingData":null,"_pendingEncoding":"","server":[Undefined],"_server":null,"ssl":{"_parent":{"reading":false,"onconnection":null},"_parentWrap":[Undefined],"_secureContext":[ReferenceTo this.agent.sockets.api.switch-bot.com:443:::::::::::::::::::::[0]._tlsOptions.secureContext],"reading":false,"onkeylog":[Function],"onhandshakestart":[Function],"onhandshakedone":[Function],"onocspresponse":[Function],"onnewsession":[Function],"onerror":[Function]},"_requestCert":true,"_rejectUnauthorized":true}]},"freeSockets":{},"keepAliveMsecs":1000,"keepAlive":false,"maxSockets":null,"maxFreeSockets":256,"scheduling":"lifo","maxTotalSockets":null,"totalSocketCount":1,"maxCachedSessions":100,"_sessionCache":{"map":{"oauth.ring.com:443:::::::::::::::::::::":{"0":48,"1":130,"2":8,"3":8,"4":2,"5":1,"6":1,"7":2,"...(sortened for brevity)..."1805":12,"1806":212,"1807":94,"1808":208,"1809":37,"1810":207,"1811":242,"1812":50,"1813":75,"1814":119}},"list":["oauth.ring.com:443:::::::::::::::::::::","api.ring.com:443:::::::::::::::::::::","android.clients.google.com:443:::::::::::::::::::::","fcm.googleapis.com:443:::::::::::::::::::::","app2.govee.com:443:::::::::::::::::::::"]}},"socketPath":[Undefined],"method":"POST","maxHeaderSize":[Undefined],"insecureHTTPParser":[Undefined],"path":"/v1.1/devices/D7F1B1DBXXXX/commands","_ended":false,"res":null,"aborted":false,"timeoutCb":null,"upgradeOrConnect":false,"parser":null,"maxHeadersCount":null,"reusedSocket":false,"host":"api.switch-bot.com","protocol":"https:"}
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain openAPIpushChanges statusCode: 200
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain Unknown statusCode.
[29/10/2022, 19:24:23] [SwitchBot] [DEBUG] Curtain: A Bed Curtain d: {"statusCode":100,"body":{"items":[{"deviceID":"D7F1B1DBXXXX","code":100,"status":{"deviceChain":1,"isCalibrate":true,"isMaster":true,"position":100,"power":"on","battery":99,"isGroup":false,"isMove":0},"message":"success"}]},"message":"success"}

Config for homebridge-switchbot

{
    "name": "SwitchBot",
    "credentials": {
        "token": "XXXXXXXXXXXXXX",
        "secret": "XXXXXXXXXXXXXX",
        "notice": "Keep your token a secret!"
    },
    "options": {
        "devices": [
            {
                "deviceId": "F908CD7FXXXX",
                "configDeviceName": "G Bed Curtain",
                "configDeviceType": "Curtain",
                "connectionType": "BLE/OpenAPI",
                "scanDuration": 10,
                "bot": {
                    "mode": "press",
                    "maxRetry": 15
                },
                "curtain": {
                    "set_minStep": 20,
                    "set_min": 5,
                    "set_max": 95,
                    "updateRate": 5,
                    "disable_group": false,
                    "hide_lightsensor": true
                },
                "contact": {
                    "hide_lightsensor": true,
                    "hide_motionsensor": true
                },
                "logging": "debug"
            },
            {
                "deviceId": "D7F1B1DBXXXX",
                "configDeviceName": "A Bed Curtain",
                "configDeviceType": "Curtain",
                "connectionType": "BLE/OpenAPI",
                "scanDuration": 10,
                "bot": {
                    "maxRetry": 15
                },
                "curtain": {
                    "updateRate": 5,
                    "disable_group": true,
                    "hide_lightsensor": true
                },
                "contact": {
                    "hide_lightsensor": true,
                    "hide_motionsensor": true
                },
                "logging": "debug"
            },
            {
                "deviceId": "C5FD36C7XXXX",
                "configDeviceName": "G Office Curtain",
                "configDeviceType": "Curtain",
                "connectionType": "BLE/OpenAPI",
                "scanDuration": 10,
                "bot": {
                    "maxRetry": 15
                },
                "curtain": {
                    "updateRate": 5,
                    "disable_group": true,
                    "hide_lightsensor": true
                },
                "contact": {
                    "hide_lightsensor": true,
                    "hide_motionsensor": true
                },
                "logging": "debug"
            }
        ],
        "irdevices": [
            {
                "deviceId": "02-202208242253-2685XXXX",
                "configDeviceName": "Fan",
                "configRemoteType": "Fan",
                "connectionType": "OpenAPI",
                "other": {
                    "deviceType": "Fan"
                }
            },
            {
                "deviceId": "02-202111222307-8961XXXX",
                "configDeviceName": "Bedroom TV",
                "configRemoteType": "TV",
                "connectionType": "OpenAPI"
            }
        ],
        "logging": "debug"
    },
    "platform": "SwitchBot"
}

Screenshots

No response

Device & Model

Curtain Bot: Firmware v6.0 (all 3)

Node.js Version

v16.18.0

NPM Version

v8.19.2

Homebridge Version

v1.5.1

Homebridge Switchbot Plugin Version

v2.2.2

Homebridge Config UI X Plugin Version

v4.50.1

Operating System

Raspberry Pi OS Lite

asc6 commented 1 year ago

This appears to be a new issue in version 2.X and this error didn't exist before in the 1.x versions.

donavanbecker commented 1 year ago

@asc6 It is not an issue with v2.0

This happens when Bluetooth connection cannot be established.

asc6 commented 1 year ago

Interesting, I don't recall seeing that error before so maybe it's just now logging or something. I also get [SwitchBot] Curtain: G Office Curtain wasn't able to establish BLE Connection, node-switchbot: [object Object] which I assume is related. The extra info at the end of both messages is what made me thing it was a bug. I'll see if I can fix the root issue around bluetooth connectivity then. Thanks!

github-actions[bot] commented 1 year ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

github-actions[bot] commented 1 year ago

This issue has been closed as no further activity has occurred.