NEWS
JK-BMS über RS485 mit ESPHome auslesen
-
@syssi
O.k. ja, es stehen die 5 darin könnte ich da auch 1s eintragen?jk_bms_ble: - ble_client_id: client0 protocol_version: ${protocol_version} throttle: 5s // Abrufintervall der BMS Datensätze id: bms0
Darf man im yaml File Kommentare mit // eintragen, sie he wie im Beispiel
-
@marco-3 said in JK-BMS über RS485 mit ESPHome auslesen:
jk_bms_ble:
- ble_client_id: client0
protocol_version: ${protocol_version}
throttle: 5s // Abrufintervall der BMS Datensätze
id: bms0
Ja, das Zeichen dafür ist aber ein
#
:jk_bms_ble: - ble_client_id: client0 protocol_version: ${protocol_version} throttle: 5s # Abrufintervall der BMS Datensätze id: bms0
Auch möglich ist:
jk_bms_ble: - ble_client_id: client0 protocol_version: ${protocol_version} # Abrufintervall der BMS Datensätze throttle: 5s id: bms0
- ble_client_id: client0
-
Es läuft immer besser! Daten im 1s Takt kommen sehr zuverlässig.
Und schon ist die nächste Frage da.
Ich verwende w verschiedene ESP32 Boards. Ein normales und eine D1 Mini Version. Das normal hat eine Status LED, welche Blinkzeichen von sich gibt, sieht so aus, als ob es immer der MQTT Sendebefehl ist. Das D1 Board hat 2 Led, die erste ist für die Power ON. Bei der 2. Led steht ein L, diese gibt aber keine Status von sich. Kann man dies noch aktivieren, oder muss ich am Pinout noch eine irgend wo anbauen. -
In der YAML ist keine Anweisung enthalten, dass die LED gesteuert werden soll. Die Erklärung wird vielmehr sein: Eines der Boards besitzt eine TX-LED, welche leuchtet sobald Daten auf der seriellen Schnittstelle (GPIO1?) rausgeschrieben werden. Wenn du das Board über das Kabel flashst sollte sie flackern. Da der
logger
von ESPHome periodisch die Nachrichten auf die serielle Schnittstelle schreibt, leuchtet die LED im gleichen Takt.Wir können die YAML-Konfiguration beliebig erweitern und mit einer Anweisung versehen, was mit der LED (an
GPIO2
des D1 Mini ESP32) passieren soll. -
@syssi
Danke, was wäre, die sinnvollste Lösung beim D1?Ich möchte eigentlich bei einem Blick drauf nur erkennen, daß es läuft und nicht fest gefahren ist.
Oder kann man daß so weiter stricken...
Kein W-Lan --> 2x blinken 5sec Pause
Keine BT Verbindung --> 5x blinken 5sec Pause.Am Ende wäre es Klasse, wenn man mit einem Blick sieht ESP ist o.k. Fehler liegt bei Iobroker ...
Durch die andere ESP Version für das JKBMS, hab es in 1-30Tagen Abständen Aufhänger des ESP. Wobei ich nicht gleich wusste was los war. Vermutung lang bei, fest gefahren.
Daher hab ich mich hier für dies Lösung entschieden, weil diese weiter entwickelt wird. Und nun erst Recht, da die ganzen Tips und Vorschläge von dir, meine Probierfreude fördern und ich nicht gefrustet hinwerfe... Noch mal ganz großes Lob für die Hilfe und die JKBMS Implementierung auf esphome Basis hier.
-
@marco-3 Für WiFi/MQTT kannst du diesen Schnippsel nutzen:
status_led: pin: number: GPIO2 inverted: true
Hier findest du eine Beschreibung, was er tut: https://esphome.io/components/status_led.html
Für Bluetooth solltest du dir einen Lötkolben schnappen und eine weitere LED an einen freien GPIO löten. Vorzugsweise eine Blaue. Daraufhin werde ich dir zeigen, wie man sich an den
on_connect
undon_disconnect
-Callback desble_client
haengt, so dass man die LED an bzw. ausschaltet, sobald die Verbindung zum BMS steht/abbricht. (https://esphome.io/components/ble_client.html#on-connect) -
@syssi
Moin, eigentlich schwebt mir GPIO0 vor, da er gleich neben GND liegt. Aber laut Legende soll dieser nicht benutz werden. -
Gut erkannt. Bitte umschiffen. Wenn du
GPIO0
versehentlich (permant) auf Masse ziehst, dann bootet der ESP in Zukunft nur noch in den "Schreibe jetzt bitte neue Software drauf"-Modus anstatt die Anwendung zu starten. -
@syssi
GPIO27 wird es werden, passt auch super, GND gleich da und rechts oben, als BT Led gut geeignet.... -
Bitte den (bisher nicht erwähnten) Widerstand vergessen: https://techexplorations.com/guides/esp32/begin/digitalout/
-
@syssi said in JK-BMS über RS485 mit ESPHome auslesen:
@marco-3 Für WiFi/MQTT kannst du diesen Schnippsel nutzen:
Für Bluetooth solltest du dir einen Lötkolben schnappen und eine weitere LED an einen freien GPIO löten. Vorzugsweise eine Blaue. Daraufhin werde ich dir zeigen, wie man sich an denon_connect
undon_disconnect
-Callback desble_client
haengt, so dass man die LED an bzw. ausschaltet, sobald die Verbindung zum BMS steht/abbricht. (https://esphome.io/components/ble_client.html#on-connect)Widerstand geht klar. Kann ich alles erst heut aben zusammen basteln... Dann wird es interessant wie ich die Zustände auf GPIO27 Ausgebe.
-
Diesen Abschnitt:
ble_client: - mac_address: ${mac_address} id: client0
bitte ersetzen durch diesen Abschnitt:
ble_client: - mac_address: ${mac_address} id: client0 on_connect: then: - output.turn_on: bluetoothled on_disconnect: then: - output.turn_off: bluetoothled output: - platform: gpio pin: GPIO27 id: bluetoothled
-
Ggf. sollten wir die Bluetooth LED lieber an den Update-Event eines Sensors (z.B.
total_voltage
) hängen. Ich habe die Sorge, dass warum auch immer die BLE-Verbindung nicht zusammenbricht und trotzdem keine Daten vom BMS kommen. Über ein Blink per Sensor-Update hättest du einen besseren Herzschlag. Alternativ lötest du eine dritte LED an Board. -
@syssi
Klar warum nicht. Herzschlag klingt sogar besser... -
So sieht das Schnippsel aus, wenn man am ersten Sensor (
min_cell_voltage
) lauscht und pro Update einmal die LED blinken lässt:output: - platform: gpio pin: GPIO27 id: bluetoothled sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 min_cell_voltage: name: "${name} min cell voltage" on_value: then: - output.turn_on: bluetoothled - delay: 500ms - output.turn_off: bluetoothled max_cell_voltage: name: "${name} max cell voltage" min_voltage_cell: name: "${name} min voltage cell" max_voltage_cell: name: "${name} max voltage cell" # ...und die restlichen Sensoren...
-
@syssi
Ich bin Mega begeistert!!! Danke Danke Danke...Bin aber einen ein klein wenig anderen Weg gegangen. Als Status LED, also GPIO02 war es net so dolle, ist immer an. Aber sie ist blau also kann sie als BT Kontroll LED verwendet werden und dein Heartbeat Vorschlag ist einfach genial.
output: - platform: gpio pin: GPIO02 id: bluetoothled sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 ..... total_voltage: name: "${name} total voltage" on_value: then: - output.turn_on: bluetoothled - delay: 500ms - output.turn_off: bluetoothled .....
Die vorhandene blaue Status LED sagt mir nun ob Daten vom BT kommen. Ich habe auch die Gegenprüfung gemacht und den ESP abgesteckt, mit Handy auf das JK drauf verbunden..... ESP angesteckt und es geht keine blaue Status LED an! Handyverbindung zum JK abgebaut.... der ESP verbindet sich automatisch auf das JK BMS und die Blaue LED blinkt.
SUPER !!!Ich habe aktuell das WEB interface aktiviert und den Update Intervall auf 1s gestellt
logging: steht auf INFO00:00:11 [I] [jk_bms_ble:467] Cell info frame (version 2, 300 bytes) received 00:00:12 [W] [component:214] Component esp32_ble took a long time for an operation (0.24 s). 00:00:12 [W] [component:215] Components should block for at most 20-30ms. 00:00:13 [I] [jk_bms_ble:467]
Die Message kommt aber auch, wenn ich auf 5s den Abrufintervall stelle.
Anhand der gesehenen BMS uptime, werden aller 2s neue Sekunden gezählt, dies werde ich im io broker anzeigen lassen und weiß somit, daß es lebt.
Ich bin voll begeistert!
-
@marco-3
Dies ist meine aktuelle Installation: nur die Sensoren:
-am ESP32 ist die blaue LED als BT Feedback --> erfolgreicher BT Datenabruf vom JKBM , aktiviert
-web Interface ist mit den mir wichtigen Daten aktiviertsubstitutions: name: bms1 device_description: "Monitor and control a JK-BMS via bluetooth" external_components_source: github://syssi/esphome-jk-bms@main mac_address: 11:22:33:44:AA:BB # Defaults to "JK02" (hardware version >= 6.0 and < 11.0) # Please use "JK02_32S" if you own a new JK-BMS >= hardware version 11.0 (f.e. JK-B2A8S20P hw 11.XW, sw 11.26) # Please use "JK04" if you have some old JK-BMS <= hardware version 3.0 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0) protocol_version: JK02 esphome: name: ${name} comment: ${device_description} project: name: "syssi.esphome-jk-bms" version: 1.5.0 esp32: board: esp32dev framework: type: esp-idf external_components: - source: ${external_components_source} refresh: 0s wifi: ssid: !secret wifi_ssid password: !secret wifi_password ota: web_server: # web server aktiviert logger: level: INFO # DEBUG geht auch # If you don't use Home Assistant please remove this `api` section and uncomment the `mqtt` component! # api: mqtt: broker: !secret mqtt_host username: !secret mqtt_username password: !secret mqtt_password port: !secret mqtt_port discovery: false # weniger Ordner im iobroker MQTT Ordner (esphome und homeassiant fehlen dann) esp32_ble_tracker: on_ble_advertise: then: - lambda: |- if (x.get_name().rfind("JK-", 0) == 0) { ESP_LOGI("ble_adv", "New JK-BMS found"); ESP_LOGI("ble_adv", " Name: %s", x.get_name().c_str()); ESP_LOGI("ble_adv", " MAC address: %s", x.address_str().c_str()); ESP_LOGD("ble_adv", " Advertised service UUIDs:"); for (auto uuid : x.get_service_uuids()) { ESP_LOGD("ble_adv", " - %s", uuid.to_string().c_str()); } } ble_client: - mac_address: ${mac_address} id: client0 jk_bms_ble: - ble_client_id: client0 protocol_version: ${protocol_version} throttle: 1s # BMS BT Datensatz Auswertung aller ...Sekunden id: bms0 output: # BT soll auf die status LED gelegt werden - platform: gpio pin: GPIO2 id: bluetoothled sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 min_cell_voltage: name: "${name} min cell voltage" max_cell_voltage: name: "${name} max cell voltage" min_voltage_cell: name: "${name} min voltage cell" max_voltage_cell: name: "${name} max voltage cell" delta_cell_voltage: name: "${name} delta cell voltage" average_cell_voltage: name: "${name} average cell voltage" cell_voltage_1: name: "${name} cell voltage 1" cell_voltage_2: name: "${name} cell voltage 2" cell_voltage_3: name: "${name} cell voltage 3" cell_voltage_4: name: "${name} cell voltage 4" cell_voltage_5: name: "${name} cell voltage 5" cell_voltage_6: name: "${name} cell voltage 6" cell_voltage_7: name: "${name} cell voltage 7" cell_voltage_8: name: "${name} cell voltage 8" cell_voltage_9: name: "${name} cell voltage 9" cell_voltage_10: name: "${name} cell voltage 10" cell_voltage_11: name: "${name} cell voltage 11" cell_voltage_12: name: "${name} cell voltage 12" cell_voltage_13: name: "${name} cell voltage 13" cell_voltage_14: name: "${name} cell voltage 14" cell_voltage_15: name: "${name} cell voltage 15" cell_voltage_16: name: "${name} cell voltage 16" cell_resistance_1: name: "${name} cell resistance 1" cell_resistance_2: name: "${name} cell resistance 2" cell_resistance_3: name: "${name} cell resistance 3" cell_resistance_4: name: "${name} cell resistance 4" cell_resistance_5: name: "${name} cell resistance 5" cell_resistance_6: name: "${name} cell resistance 6" cell_resistance_7: name: "${name} cell resistance 7" cell_resistance_8: name: "${name} cell resistance 8" cell_resistance_9: name: "${name} cell resistance 9" cell_resistance_10: name: "${name} cell resistance 10" cell_resistance_11: name: "${name} cell resistance 11" cell_resistance_12: name: "${name} cell resistance 12" cell_resistance_13: name: "${name} cell resistance 13" cell_resistance_14: name: "${name} cell resistance 14" cell_resistance_15: name: "${name} cell resistance 15" cell_resistance_16: name: "${name} cell resistance 16" total_voltage: name: "${name} total voltage" on_value: then: - output.turn_on: bluetoothled - delay: 500ms - output.turn_off: bluetoothled current: name: "${name} current" power: name: "${name} power" charging_power: name: "${name} charging power" discharging_power: name: "${name} discharging power" temperature_sensor_1: name: "${name} temperature sensor 1" temperature_sensor_2: name: "${name} temperature sensor 2" power_tube_temperature: name: "${name} power tube temperature" state_of_charge: name: "${name} state of charge" capacity_remaining: name: "${name} capacity remaining" total_battery_capacity_setting: name: "${name} total battery capacity setting" charging_cycles: name: "${name} charging cycles" total_charging_cycle_capacity: name: "${name} total charging cycle capacity" total_runtime: name: "${name} total runtime" balancing_current: name: "${name} balancing current" errors_bitmask: name: "${name} errors bitmask" text_sensor: - platform: jk_bms_ble errors: name: "${name} errors" total_runtime_formatted: name: "${name} total runtime formatted" # status_led: # status LED On-Board # pin: # number: GPIO2 # inverted: true
die mit
!secret
versehenen Daten müsst ihr im Secrets Ordner pflegen
-
Und wieder eine Frage.
Wie kann ich die Struktur der MQTT Daten anpassen, so daß diese nicht in einzelnen Ordnern einlaufen.
so hätte ich es gern:so ist es aktuell:
-
Sowas habe ich noch nie gemacht. Ich befürchte, dass es die YAML sehr unleserlich macht. Du wirst pro Sensor/Entität sog. Overrides der entsprechenden Eigenschaften ergänzen müssen. Hier die Dokumentation: https://esphome.io/components/mqtt.html#mqtt-component-base-configuration
Hier eine Vermutung, wie es dann pro Sensor aussehen würde (ungetestet!):
sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 min_cell_voltage: name: "${name} min cell voltage" state_topic: bms1_min_cell_voltage
-
Ich möchte euch hier meine Umsetzung veröffentlichen.
Vielen vielen Dank an syssi !!! ohne dich wäre das alles nix geworden.Ich hab das web Interface aktiviert um alles zu sehen was geht... letztlich werden dann bei mir durch # alles über das Web Interface verstellbaren Buttons etc. deaktiiviert.
aber so sieht es aus wenn alles "scharf" ist
yaml File, dafür solltet ihr im HomeAssistand den Secrets Ordner pflegen.
wifi: ssid: !secret wifi_ssid password: !secret wifi_password mqtt: broker: !secret mqtt_host username: !secret mqtt_username password: !secret mqtt_password port: !secret mqtt_port discovery: false # weniger Ordner im iobroker MQTT Ordner (esphome und homeassiant fehlen dann)
iobroker Typisch
# Your Wi-Fi SSID and password wifi_ssid: "deine Daten" wifi_password: "deine Daten" mqtt_host: "deine IP" mqtt_username: "mqttuser" mqtt_password: "deine Daten" mqtt_port: "1883"
Kleiner Tip, um Kompilierungsfehler Fehler zu vermeiden, "clean Build Files" löst sehr oft die Felhler, vor allem, wenn man mit # erst Teile nach der ersten Kompilierung deaktiviert.
meine Konfiguration (nicht deaktivierte Button, usw.) aber für den ESP32 D1 Mini die aktivierte LED mit dem Blinkfeedback für BT Daten
substitutions: name: bms1 device_description: "Monitor and control a JK-BMS via bluetooth" external_components_source: github://syssi/esphome-jk-bms@main mac_address: aa:bb:cc:dd:ee:ff # Defaults to "JK02" (hardware version >= 6.0 and < 11.0) # Please use "JK02_32S" if you own a new JK-BMS >= hardware version 11.0 (f.e. JK-B2A8S20P hw 11.XW, sw 11.26) # Please use "JK04" if you have some old JK-BMS <= hardware version 3.0 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0) protocol_version: JK02 esphome: name: ${name} comment: ${device_description} project: name: "syssi.esphome-jk-bms" version: 1.5.0 esp32: board: wemos_d1_mini32 framework: type: esp-idf external_components: - source: ${external_components_source} refresh: 0s web_server: # web server aktiviert logger: level: INFO # DEBUG geht auch # If you don't use Home Assistant please remove this `api` section and uncomment the `mqtt` component! # Enable Home Assistant API api: ota: wifi: ssid: !secret wifi_ssid password: !secret wifi_password mqtt: broker: !secret mqtt_host username: !secret mqtt_username password: !secret mqtt_password port: !secret mqtt_port discovery: false # weniger Ordner im iobroker MQTT Ordner (esphome und homeassiant fehlen dann) esp32_ble_tracker: on_ble_advertise: then: - lambda: |- if (x.get_name().rfind("JK-", 0) == 0) { ESP_LOGI("ble_adv", "New JK-BMS found"); ESP_LOGI("ble_adv", " Name: %s", x.get_name().c_str()); ESP_LOGI("ble_adv", " MAC address: %s", x.address_str().c_str()); ESP_LOGD("ble_adv", " Advertised service UUIDs:"); for (auto uuid : x.get_service_uuids()) { ESP_LOGD("ble_adv", " - %s", uuid.to_string().c_str()); } } ble_client: - mac_address: ${mac_address} id: client0 jk_bms_ble: - ble_client_id: client0 protocol_version: ${protocol_version} throttle: 1s # BMS BT Datensatz Auswertung aller ...Sekunden (JK sendet aller 1s) id: bms0 output: # BT soll auf die status LED gelegt werden - platform: gpio pin: GPIO2 id: bluetoothled button: - platform: jk_bms_ble retrieve_settings: name: "${name} retrieve settings" retrieve_device_info: name: "${name} retrieve device info" number: - platform: jk_bms_ble jk_bms_ble_id: bms0 balance_trigger_voltage: name: "${name} balance trigger voltage" cell_count: name: "${name} cell count" total_battery_capacity: name: "${name} total battery capacity" cell_voltage_overvoltage_protection: name: "${name} cell voltage overvoltage protection" cell_voltage_overvoltage_recovery: name: "${name} cell voltage overvoltage recovery" cell_voltage_undervoltage_protection: name: "${name} cell voltage undervoltage protection" cell_voltage_undervoltage_recovery: name: "${name} cell voltage undervoltage recovery" balance_starting_voltage: name: "${name} balance starting voltage" voltage_calibration: name: "${name} voltage calibration" current_calibration: name: "${name} current calibration" power_off_voltage: name: "${name} power off voltage" max_balance_current: name: "${name} max balance current" max_charge_current: name: "${name} max charge current" max_discharge_current: name: "${name} max discharge current" sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 min_cell_voltage: name: "${name} min V Zelle" max_cell_voltage: name: "${name} max V Zelle" min_voltage_cell: name: "${name} min V Zelle Nr." max_voltage_cell: name: "${name} max V Zelle Nr." delta_cell_voltage: name: "${name} delta Zelle Volt" average_cell_voltage: name: "${name} average Zelle Volt" cell_voltage_1: name: "${name} Zelle 01" cell_voltage_2: name: "${name} Zelle 02" cell_voltage_3: name: "${name} Zelle 03" cell_voltage_4: name: "${name} Zelle 04" cell_voltage_5: name: "${name} Zelle 05" cell_voltage_6: name: "${name} Zelle 06" cell_voltage_7: name: "${name} Zelle 07" cell_voltage_8: name: "${name} Zelle 08" cell_voltage_9: name: "${name} Zelle 09" cell_voltage_10: name: "${name} Zelle 10" cell_voltage_11: name: "${name} Zelle 11" cell_voltage_12: name: "${name} Zelle 12" cell_voltage_13: name: "${name} Zelle 13" cell_voltage_14: name: "${name} Zelle 14" cell_voltage_15: name: "${name} Zelle 15" cell_voltage_16: name: "${name} Zelle 16" cell_resistance_1: name: "${name} Widerstand 01" cell_resistance_2: name: "${name} Widerstand 02" cell_resistance_3: name: "${name} Widerstand 03" cell_resistance_4: name: "${name} Widerstand 04" cell_resistance_5: name: "${name} Widerstand 05" cell_resistance_6: name: "${name} Widerstand 06" cell_resistance_7: name: "${name} Widerstand 07" cell_resistance_8: name: "${name} Widerstand 08" cell_resistance_9: name: "${name} Widerstand 09" cell_resistance_10: name: "${name} Widerstand 10" cell_resistance_11: name: "${name} Widerstand 11" cell_resistance_12: name: "${name} Widerstand 12" cell_resistance_13: name: "${name} Widerstand 13" cell_resistance_14: name: "${name} Widerstand 14" cell_resistance_15: name: "${name} Widerstand 15" cell_resistance_16: name: "${name} Widerstand 16" total_voltage: name: "${name} total Volt" on_value: then: - output.turn_on: bluetoothled # BT LED blinken bei erfolgreich gelesenem Datensatz - delay: 500ms - output.turn_off: bluetoothled current: name: "${name} Strom" power: name: "${name} Leistung" charging_power: name: "${name} Ladeleistung" discharging_power: name: "${name} Entladeleistung" temperature_sensor_1: name: "${name} Temperatur 1" temperature_sensor_2: name: "${name} Temperatur 2" power_tube_temperature: name: "${name} Temperatur BMS" state_of_charge: name: "${name} SoC" capacity_remaining: name: "${name} Kapazität verbleibend" total_battery_capacity_setting: name: "${name} total battery capacity setting" charging_cycles: name: "${name} Ladezyklen" total_charging_cycle_capacity: name: "${name} Gesamtladezykluskapazität" total_runtime: name: "${name} Gesamtlaufzeit" balancing_current: name: "${name} Balancer Strom" errors_bitmask: name: "${name} errors bitmask" switch: - platform: jk_bms_ble charging: name: "${name} charging" discharging: name: "${name} discharging" balancer: name: "${name} balancer" - platform: ble_client ble_client_id: client0 name: "${name} enable bluetooth connection" text_sensor: - platform: jk_bms_ble errors: name: "${name} errors" total_runtime_formatted: name: "${name} total runtime formatted"
Hier noch die IOBROKER MQTT Einstellunge, da wie syssi schon gesagt hat, Fehler auftreten können, wenn der ioboker zu gesprächig ist.