IoT

Yeelight BT 모델 무드등을 쓰기위한 튜닝 완결판 (usb reset 및 구성요소 재 로딩)

ㅋㅋ잠자 2022. 8. 1. 23:35
반응형

안녕하세요 도정진입니다.

 

아래 글을 올려드린지 오랜 시간이 지났음에도 아직까지 해결을 못한것이 있는데요.

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 무드등이 되었네요.

이라이트 캔들라이트 중고 올라오는 것 줏어도 되겠습니다. ㅎㅎ

마치겠습니다.

 

 

반응형