Yeelight BT 모델 무드등을 쓰기위한 튜닝 완결판 (usb reset 및 구성요소 재 로딩)
안녕하세요 도정진입니다.
아래 글을 올려드린지 오랜 시간이 지났음에도 아직까지 해결을 못한것이 있는데요.
https://blog.djjproject.com/754
외출모드 시, 무드등의 전원자체가 나가면 일정 시간 이후, 재실전환 시, 재연결에 실패하는 문제입니다.
1. 그러면 블루투스 모듈이 삐꾸가 나면?
흔히 hciconfig hci0 down / up 혹은 rfkill 을 통해 리셋을 시도할 것입니다만, 이걸로 복구가 안되는 경우가 많더라구요.
그러면 해볼만한게... 일단 INTEL NUC J5005 제품은 USB BT이기 때문에 USB 리셋을 해봄직 합니다.
USB리셋은 어떻게 하느냐.. 아래와 같이 진행하시면 됩니다.
일단은 lsusb 로 확인해보시면 intel 제품 vendor 를 확인할 수 있습니다. 8087이 인텔이죠. bus 1에 dev4 를 보면 Wireless / btusb 임을 확인할 수 있겠습니다.
root@debian:~# lsusb Bus 002 Device 002: ID 067b:2773 Prolific Technology, Inc. PL2773 SATAII bridge controller Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 8087:0aaa Intel Corp. Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 001 Device 006: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub root@debian:~# lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/7p, 5000M |__ Port 4: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/9p, 480M |__ Port 1: Dev 6, If 1, Class=CDC Data, Driver=cdc_acm, 12M |__ Port 1: Dev 6, If 0, Class=Communications, Driver=cdc_acm, 12M |__ Port 3: Dev 3, If 0, Class=Vendor Specific Class, Driver=ch341, 12M |__ Port 9: Dev 4, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 9: Dev 4, If 1, Class=Wireless, Driver=btusb, 12M |
그러면 여기서 잠깐 생각해볼 수 있는것이 아래처럼 rmmod 와 insmod 해결이 가능하지 않는가? 할 수도 있습니다만, usb 리셋이 가장 좋은 해답이였습니다.
root@debian:~# lsmod | grep btusb btusb 61440 0 btrtl 24576 1 btusb btbcm 16384 1 btusb btintel 28672 1 btusb bluetooth 634880 32 btrtl,btintel,btbcm,bnep,btusb root@debian:~# modprobe -r btusb root@debian:~# lsmod | grep btusb root@debian:~# modprobe btusb root@debian:~# lsmod | grep btusb btusb 61440 0 btrtl 24576 1 btusb btbcm 16384 1 btusb btintel 28672 1 btusb bluetooth 634880 30 btrtl,btintel,btbcm,bnep,btusb |
그러면 vendor 0x8087 / product 0xaaa 를 리셋해보겠습니다.
먼저 커널로그를 백그라운드로 돌려놓고 로그를 확인해보겠습니다.
root@debian:/opt/hass/config# usb_modeswitch -v 0x8087 -p 0x0aaa --reset-usb Look for default devices ... Found devices in default mode (1) Access device 004 on bus 001 Get the current device configuration ... Current configuration number is 1 Use interface number 0 with class 224 Warning: no switching method given. See documentation Reset USB device . Device was reset -> Run lsusb to note any changes. Bye! |
root@debian:~# journalctl -kf & [1] 30274 root@debian:~# -- Logs begin at Mon 2022-08-01 08:41:01 KST. -- Aug 01 23:21:15 debian kernel: usb 1-9: reset full-speed USB device number 4 using xhci_hcd Aug 01 23:21:15 debian kernel: Bluetooth: hci0: Firmware revision 0.1 build 184 week 15 2019 |
이 상태에서 확인하면 모듈이 다운 되어 있는 상태입니다.
root@debian:/opt/hass/config# hciconfig hci0: Type: Primary Bus: USB BD Address: 50:76:AF:AC:0E:71 ACL MTU: 1021:4 SCO MTU: 96:6 DOWN RX bytes:1770 acl:7 sco:0 events:113 errors:0 TX bytes:1403 acl:5 sco:0 commands:104 errors:0 root@debian:/opt/hass/config# hciconfig hci0 up root@debian:/opt/hass/config# hciconfig hci0: Type: Primary Bus: USB BD Address: 50:76:AF:AC:0E:71 ACL MTU: 1021:4 SCO MTU: 96:6 UP RUNNING RX bytes:2505 acl:7 sco:0 events:164 errors:0 TX bytes:2159 acl:5 sco:0 commands:155 errors:0 |
자 그러면 리셋 스크립트를 아래와 같이 사용하면 되겠네요.
root@debian:/opt/hass/config# usb_modeswitch -v 0x8087 -p 0x0aaa --reset-usb && sleep 1 && hciconfig hci0 up Look for default devices ... Found devices in default mode (1) Access device 004 on bus 001 Get the current device configuration ... Current configuration number is 1 Use interface number 0 with class 224 Warning: no switching method given. See documentation Reset USB device . Device was reset -> Run lsusb to note any changes. Bye! |
2. yeelight-bt 모듈에 적용하기
코드는 아래와 같이 적용합니다.
fork 하여 제 github 에 작성하여 올려 두었습니다.
https://github.com/djjproject/hass-yeelightbt/commit/2c09e73e6efcbcef066c06c2819a9af14c43158f
다만, 근래에 원본 git 이 업데이트가 되었네요. 일단 구관이 명관이라 일단 업데이트는 하지 않았습니다. ㅎㅎ
3. 컨테이너 설정
일단 컨테이너에서 동작에 문제가 없으려면 capability 가 부여되야 하는게 있습니다.
- SYS_ADMIN - NET_ADMIN |
homeassistant 가 하는 일이 많아 저는 privileged 로 운영중이라 위의 옵션은 신경쓰지 않았습니다.
4. USB 절전 설정 비활성화
USB절전 때문에라도 btusb 가 죽는 경우가 있는 것 같습니다. usb_core 에 modprobe 할 당시 부터 옵션을 줄 수 있겠습니다만, 이미 모듈이 올라가 있는 상태에서 모듈을 언로드 하면 다른 USB 장치가 죽음으로 모듈 설정에 바로 echo로 박습니다.
그래서 아래 설정을 echo 로 넣고, 이 설정은 새로 추가되는 usb 에만 적용됨으로 usb_reset 을 한번 수행해 주었습니다.
부팅 시, 1회 실행해 줍니다.
# usb sleep disable echo -1 >/sys/module/usbcore/parameters/autosuspend sleep 3 usb_modeswitch -v 0x8087 -p 0x0aaa --reset-usb sleep 3 hciconfig hci0 up |
5. 재실모드 전환 시, 자동화 루틴 설정
재실모드 전환 시, yeelight 통합구성요소가 리셋되도록 설정하고, update entity 를 계속적으로 호출하여 unavailable 에서 available 로 바뀌었는지 확인합니다.
저의 재실모드 전환 루틴의 마지막에 아래의 구문을 추가했습니다.
service: homeassistant.reload_config_entry data: {} target: entity_id: light.moodelight |
repeat: until: - condition: state entity_id: light.moodelight state: 'off' sequence: - service: homeassistant.update_entity data: {} target: entity_id: light.moodelight - service: light.turn_on data: {} target: entity_id: light.moodelight - delay: hours: 0 minutes: 0 seconds: 1 milliseconds: 0 - service: light.turn_off data: {} target: entity_id: light.moodelight - delay: hours: 0 minutes: 0 seconds: 1 milliseconds: 0 |
그러면 재실모드 전환 시, 엔티티 재 로딩으로 인해 무드등이 unavailable 이 되었다가 켜졌다가 꺼지는 현상이 생기면서 리셋이 됩니다.
영상으로 확인해보겠습니다.
이때 homeassistant 로그는 아래와 같이 남습니다.
# 엔티티 리셋이 일어남 2022-08-01 23:53:29 WARNING (MainThread) [homeassistant.helpers.entity_component] Forced update failed. Ent ity light.moodelight not found. Look for default devices ... 2022-08-01 23:53:29 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entitie$ light.moodelight Found devices in default mode (1) Access device 004 on bus 001 Get the current device configuration ... Current configuration number is 1 Use interface number 0 with class 224 Warning: no switching method given. See documentation 2022-08-01 23:53:30 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entitie$ light.moodelight Reset USB device . Device was reset -> Run lsusb to note any changes. Bye! |
엔티티가 unavailable 상태로 바뀌어 아래와 같이 못찾는다고 나오지만, 조만간 연결이 되면서 turn_on 했다가 turn_off 됩니다.
# 리셋이 일어나고 엔티티 업데이트 시도 2022-08-01 23:53:37 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entities light.moodelight 2022-08-01 23:53:38 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entities light.moodelight 2022-08-01 23:53:39 WARNING (MainThread) [homeassistant.components.light] Setup of light platform yeelight_ bt is taking over 10 seconds. 2022-08-01 23:53:39 WARNING (MainThread) [homeassistant.helpers.entity_component] Forced update failed. Ent ity light.moodelight not found. 2022-08-01 23:53:39 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entities light.moodelight 2022-08-01 23:53:40 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entities light.moodelight 2022-08-01 23:53:41 WARNING (MainThread) [homeassistant.helpers.entity_component] Forced update failed. Ent ity light.moodelight not found. 2022-08-01 23:53:41 WARNING (MainThread) [homeassistant.helpers.service] Unable to find referenced entities light.moodelight |
6. 마치며
와 이제 절대 끊기지 않는 BT 무드등이 되었네요.
이라이트 캔들라이트 중고 올라오는 것 줏어도 되겠습니다. ㅎㅎ
마치겠습니다.