Batmon w HA z MQTT

Witam. Próbuję połączyć BMS Daly za pomocą bluetooth do Home Assistant używając dodatku BATMON i dodaniu czujników w MQTT. Problem taki, że kompletnie się nie znam na HA, a instrukcje są nie jasne dla kogoś nieobeznanego. Czy mógł by mi ktoś objaśnić krok po kroku jak to zrobić, zaczynając od zera?

Za mało danych, nikomu nie chce się szukać tego co ty już masz. Daj tu te instrukcje i jakieś linki do sprzętu, który chcesz integrować.

EDIT:
Większość widzę, że jest opisane w dokumentacji dodatku.

Na początek potrzebujesz:
Działający w HA adapter bluetooth oraz zainstalowany broker MQTT w postaci np. dodatku Mosquitto.
Czy te kroki masz za sobą?

Zgadza się. Adapter Bluetooth tylko jeden hci0, mqtt mousqitto na HA generic.

No i? Na czym utknąłeś?

połączenie z Mosquitto skonfigurowałeś? (dane przykładowe, nie mam kompatybilnego BMSa)

Sporo dodatkowych informacji jest w dodatkowej dokumentacji

oraz jak zawsze w otwartych projektach w issues

Ma tak ustawione. Logi z Batmon:

━ 4.7/4.7 MB 1.0 MB/s eta 0:00:00
Installing collected packages: dbus-fast, bleak
  Attempting uninstall: bleak
    Found existing installation: bleak 0.13.1a1
    Uninstalling bleak-0.13.1a1:
      Successfully uninstalled bleak-0.13.1a1
Successfully installed bleak-0.20.2 dbus-fast-1.95.2
10:05:01 INFO [main] Power cycle bluetooth hardware
Unable to open mgmt_socket
Unable to open mgmt_socket
10:05:05 INFO [bt] BT Discovery:
10:05:10 INFO [bt] BT 40:18:05:01:11:E4            DL-4018050111E4
10:05:10 INFO [main] Bleak version 0.20.2, BtBackend version bluez-v5.76
10:05:11 INFO [__init__] Verbose log for 40:18:05:01:11:E4 enabled
10:05:11 ERROR [main] Main loop exception: 'DalyBt' object has no attribute 'logger'
10:05:11 ERROR [main] Stack: Traceback (most recent call last):
File "/app/main.py", line 359, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.12/asyncio/runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/app/main.py", line 147, in main
    bms = construct_bms(dev, verbose_log, devices)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/bmslib/models/__init__.py", line 63, in construct_bms
    return bms_class(addr,
           ^^^^^^^^^^^^^^^
  File "/app/bmslib/models/daly.py", line 65, in __init__
    self.logger.warning('JBD usually does not use a pairing PIN')
    ^^^^^^^^^^^
AttributeError: 'DalyBt' object has no attribute 'logger'

10:05:11 INFO [main] exit signal handler... (), {}, shutdown was False
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

To znaczy jak? przełącz na tryb YAML i wklej konfigurację do posta, rzuć też screenshotami, aha i zobacz jak się formatuje tekst przy wstawianiu do posta
https://forum.arturhome.pl/t/jak-prawidlowo-zamieszczac-yaml-inny-kod-lub-logi-w-postach-na-forum/11455

Logi z batmon to są dobre dla jego autorów, my mamy szansę jedynie znaleźć oczywiste błędy w konfiguracji (i podejrzewam, że pozmieniałeś domyślne opcje).

No i gdzie są informacje, które już zebrałeś, bo widzę że zmieniasz domyślną wersję bleak na jakąś inną

devices:
  - address: 40:18:05:01:11:E4
    type: daly
    alias: Pakiet1
    adapter: hci0
concurrent_sampling: false
keep_alive: true
verbose_log: false
sample_period: 1
publish_period: 2
invert_current: true
watchdog: true
expire_values_after: 20
install_newer_bleak: false
bt_power_cycle: false
mqtt_user: homeassistant
mqtt_broker: core_mosquitto
mqtt_port: 1883

Tak wiem, nadal w złym formacie .



W instrukcji którą sam pisałem pierwszym zdaniem jest żeby nie cytować…


Nie masz używać zarezerwowanego użytkownika homeassistant, stwórz sobie jakiegoś na potrzeby łączenia się z brokerem - wystarczy dodać nowego w ustawieniach HA (dzięki temu, że broker jest standardowym Dodatkiem on z niego skorzysta), aby było jasne po co on jest niech się nazywa mqtt-user z jakimś prowizorycznym prostym hasłem np. mqtt-password (albo w ogóle ustaw jako użytkownika nazwę i hasło batmon, teraz będziesz je publikował na forum więc nie ustawiaj swojego hasła które będziesz używał w przyszłości, ale jak już uruchomisz to zmienisz sobie na dowolnie skomplikowane) ponadto w konfiguracji wyżej nawet nie ustawiłeś hasła.
Aby ten nowy użytkownik HA zadziałał najprościej jest po bożemu zrestartowac hosta (z menu - restart systemu, nie restart samego HA!!!)

UWAGA w ustawieniach swojego użytkownika musisz włączyć tryb zaawansowany (w przeciwnym razie zarządzanie użytkownikami jest ukryte)

Więc najpierw
Ty → Ogólny → Ustawienia użytkownika → Tryb zaawansowany → włącz

a potem

Ustawienia → Osoby → Użytkownicy → DODAJ UŻYTKOWNIKA
i ten nowy ma mieć dowolną nazwę byś wiedział do czego on służy, proste hasło dostęp lokalny i nie ma być administratorem

następnie

Ustawienia → hamburger menu → Uruchom ponownie Home Assistanta → Opcje zaawansowane → Uruchomi ponownie system → URUCHOM PONOWNIE

i dopiero w tym miejscu można pomyśleć o konfigurowaniu tego Dodatku
dane użytkownika będziesz znał bo przed chwilą go stworzyłeś.

Informacje w logu na zdrowy rozsądek nie pasują do konfiguracji którą pokazałeś, więc wrzuć też aktualnego loga (nie mogę tego przetestować bo nie mam sprzętu), w każdym razie “na sucho” u mnie działa, Dodatek się nie wywraca ani nie instaluje innych wersji bleak (prawdę mówiąc nie wiem co tam miałeś poustawiane, ale być może powinieneś go usunąć i zainstalować pownownie po restarcie hosta), no i słyszy inne urządzenia BLE choć z nimi nie współpracuje, jakkolwiek kończy pracę po jakimś czasie nie mogąc odczytać nic z BMSa.
moja konfiguracja (założyłem w sobie w HA użytkownika batmon z hasłem batmon)
jeśli masz jednego dongla nie musisz go specyfikować

devices:
  - address: D6:6C:0A:61:14:30
    type: daly
    alias: battery1
concurrent_sampling: false
keep_alive: true
verbose_log: false
sample_period: 1
publish_period: 2
invert_current: true
watchdog: true
expire_values_after: 20
install_newer_bleak: false
bt_power_cycle: false
mqtt_user: batmon
mqtt_password: batmon
mqtt_broker: core_mosquitto
mqtt_port: 1883

Jeszcze jedno jeśli masz zamiar wrzucać skrinszoty z telefonu to sobie je daruj.


Może to się wydaje oczywiste, ale urządzenie musi być w zasięgu dongla (z pierwszego loga wygląda na to że jest) ale nie powinno tam być dużych zakłóceń RF (zalecają nie używać falownika w bezpośredniej bliskości).

Okej. W home assistant przy tworzeniu pomocników itd widać sensory. Teraz jak to zrobić żeby się pokazywało jako jedno urządzenie z parametrami? Bo parametry niedostępne.

Pokaż, bo nie rozumiem.

Zakładam, że potrzebujesz tak skonfigurować sensory MQTT aby pojawiły sie pod jednym urządzeniem - device, przykład z dokumentacji MQTT Sensor - Home Assistant :

# Example configuration.yaml entry
mqtt:
  sensor:
    - name: "turned on"
      state_topic: "pump/timestamp_on"
      device_class: "timestamp"
      value_template: "{{ as_datetime(value) }}"
      unique_id: "hp_1231232_ts_on"
      device:
        name: "Heat pump"
        identifiers:
          - "hp_1231232"

Wtedy uzyskasz efekt podobny do takiego:

Dobra. Sensory są w mqtt jako encje. Mają odczyt z przed 2 godzin i teraz cisza. Wrócę do domu to przejdę przez te wątki i postaram się doszlifować ustawienia. Dziękuję za pomoc.

Sprawdź czy Dodatek nadal pracuje - może się wyłożył z jakiejś przyczyny (na sucho, czyli nie słysząc skonfigurowanego BMSa kończy pracę po 5 minutach, zasadniczo urządzenia BLE raportują po kilka-kilkanaście razy na minutę, więc to celowe zachowanie).

Mam połączone 3 bmsy jk i problem ze stabilnością odczytów. Co jakiś czas losowy i losowo znikają wartości.
Instalowanie bleak mam wyłączone, bo i tak się nie zainstaluje. Może to jest problem? bleak 0.13.1a1? Czy odczyt co 2s i publikacja co 3, to za często?

23:17:41 INFO [sampling] JK_BD4A17S4P2 device info: DeviceInfo(JK_BD4A17S4P,hw-11.XW,sw-11.41,JK_BD4A17S4P2,#31124321348)
23:17:41 INFO [sampling] Bleak version 0.13.1a1
23:17:41 ERROR [main] Error (num 2, max 200) reading BMS: timeout waiting for 2
23:17:41 ERROR [main] Stack: Traceback (most recent call last):
  File "/usr/lib/python3.12/asyncio/tasks.py", line 520, in wait_for
    return await fut
           ^^^^^^^^^
asyncio.exceptions.CancelledError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/bmslib/__init__.py", line 81, in wait_for
    return await asyncio.wait_for(self._futures.get(name), timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/tasks.py", line 519, in wait_for
    async with timeouts.timeout(timeout):
  File "/usr/lib/python3.12/asyncio/timeouts.py", line 115, in __aexit__
    raise TimeoutError from exc_val
TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/app/main.py", line 36, in fetch_loop
    if await fn():
       ^^^^^^^^^^
  File "/app/bmslib/sampling.py", line 155, in __call__
    s = await self._sample_inner()
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/bmslib/sampling.py", line 237, in _sample_inner
    sample = await bms.fetch()
             ^^^^^^^^^^^^^^^^^
  File "/app/bmslib/models/jikong.py", line 248, in fetch
    await self._fetch_futures.wait_for(0x02, self.TIMEOUT)
  File "/app/bmslib/__init__.py", line 84, in wait_for
    raise asyncio.TimeoutError("timeout waiting for %s" % name)
TimeoutError: timeout waiting for 2


Zainstaluje się, przecież to się dzieje w kontenerze

Installing collected packages: dbus-fast, bleak
  Attempting uninstall: bleak
    Found existing installation: bleak 0.13.1a1
    Uninstalling bleak-0.13.1a1:
      Successfully uninstalled bleak-0.13.1a1
Successfully installed bleak-0.20.2 dbus-fast-1.95.2

Proszę

23:48:53 INFO [main] Background thread ends. shutdown=True
23:48:54 INFO [main] fetch_loop <bmslib.sampling.BmsSampler object at 0x7f95dad6a0> ends
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
23:49:01 INFO [install_bleak] bleak 0.13.1a1 installed, want 0.20.2, running pip3 install bleak==0.20.2
23:49:01 INFO [install_bleak] influxdb installed=False need=False
Looking in indexes: https://pypi.org/simple, https://wheels.home-assistant.io/musllinux-index/
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/




23:51:13 INFO [install_bleak] bleak 0.13.1a1 installed, want 0.20.2, running pip3 install bleak==0.20.2
23:51:13 INFO [install_bleak] influxdb installed=False need=False
Looking in indexes: https://pypi.org/simple, https://wheels.home-assistant.io/musllinux-index/
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/bleak/
Collecting bleak==0.20.2
  Downloading https://wheels.home-assistant.io/musllinux-index/bleak-0.20.2-py3-none-any.whl (135 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 135.6/135.6 kB 336.5 kB/s eta 0:00:00
Collecting dbus-fast<2.0.0,>=1.83.0 (from bleak==0.20.2)
  Downloading dbus_fast-1.95.2.tar.gz (67 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.9/67.9 kB 1.4 MB/s eta 0:00:00
  Installing build dependencies: started
Traceback (most recent call last):
  File "/app/install_bleak.py", line 37, in <module>
    p.wait(timeout=120)
  File "/usr/lib/python3.12/subprocess.py", line 1264, in wait
    return self._wait(timeout=timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/subprocess.py", line 2045, in _wait
    raise TimeoutExpired(self.args, timeout)
subprocess.TimeoutExpired: Command '['pip3', 'install', 'bleak==0.20.2']' timed out after 120 seconds
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped

Na moje oko masz problemy z połączeniem z internetem, to tak w kwestii instalacji nowszej wersji (ona jest instalowana przy każdym starcie kontenera, więc zrestartuj Dodatek i zobacz czy problem występuje za każdym razem).

Ja tego nie używam, bo nie mam BMSa ale widzę, że działa raczej poprawnie i na starej wersji i na nowej. Architektura x86-64 jakby co.

bleak nie da sie zainstalowac nawet z terminala. Można tylko w wirtualnym środowisku. Na bleak 0.13 działa, tylko czasem jest brak danych z bms, czy brak danych kilku encji.
Co jakiś czas słychać pikanie bms, czyli łączy się od nowa.
A jak działa to :

<bleak.backends.bluezdbus.characteristic.BleakGATTCharacteristicBlueZDBus object at 0x7f953a22a0>}
00:05:03 INFO [sampling] JK_BD4A17S4P2 device info: DeviceInfo(JK_BD4A17S4P,hw-11.XW,sw-11.41,JK_BD4A17S4P2,#31124321348)
00:05:03 INFO [sampling] Bleak version 0.13.1a1
00:05:03 ERROR [main] Error (num 5, max 200) reading BMS: timeout waiting for 2
00:05:03 ERROR [main] Stack: Traceback (most recent call last):
  File "/usr/lib/python3.12/asyncio/tasks.py", line 520, in wait_for
    return await fut
           ^^^^^^^^^
asyncio.exceptions.CancelledError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/bmslib/__init__.py", line 81, in wait_for
    return await asyncio.wait_for(self._futures.get(name), timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/tasks.py", line 519, in wait_for
    async with timeouts.timeout(timeout):
  File "/usr/lib/python3.12/asyncio/timeouts.py", line 115, in __aexit__
    raise TimeoutError from exc_val
TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/app/main.py", line 36, in fetch_loop
    if await fn():
       ^^^^^^^^^^
  File "/app/bmslib/sampling.py", line 155, in __call__
    s = await self._sample_inner()
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/bmslib/sampling.py", line 237, in _sample_inner
    sample = await bms.fetch()
             ^^^^^^^^^^^^^^^^^
  File "/app/bmslib/models/jikong.py", line 248, in fetch
    await self._fetch_futures.wait_for(0x02, self.TIMEOUT)
  File "/app/bmslib/__init__.py", line 84, in wait_for
    raise asyncio.TimeoutError("timeout waiting for %s" % name)
TimeoutError: timeout waiting for 2

Edit moderator: ostatnia edycja posta aby poprawnie zamieścić fragment logów.