From 718c821dc44a23bda466fa21ca52a65dcd864bc7 Mon Sep 17 00:00:00 2001 From: shining-man Date: Mon, 8 Jul 2024 20:53:28 +0200 Subject: [PATCH 01/14] JK Inv. BMS Funktionszeiger gefixt --- include/defines.h | 2 +- include/params.h | 4 ++-- include/webpages.h | 2 +- src/BscSerial.cpp | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/include/defines.h b/include/defines.h index cef65d09..03b3e59a 100644 --- a/include/defines.h +++ b/include/defines.h @@ -9,7 +9,7 @@ #include "params_dt.h" #include "bscTime.h" -#define BSC_SW_VERSION "V0.6.1_T2" +#define BSC_SW_VERSION "V0.6.1_T3" static const char COMPILE_DATE_TIME[] = ""; diff --git a/include/params.h b/include/params.h index ea6d5ede..f79e4824 100644 --- a/include/params.h +++ b/include/params.h @@ -12,8 +12,8 @@ * ***********************************************************************************/ const char paramSystem[] PROGMEM = R"rawliteral( {"page":[{"name":160,"label":"BSC Benutzer","type":0,"default":"bsc","dt":8,"flash":"1"},{"name":161,"label":"BSC Passwort","type":2,"default":"admin","dt":8,"flash":"1"},{"name":45,"label":"Device Name","type":0,"default":"bsc","minlen":3,"dt":8,"help":"Wird auch als MQTT device name genutzt"},{"name":144,"label":"Display timeout","type":3,"default":5,"min":1,"max":120,"unit":"min","dt":1},{"label":"WLAN","type":13},{"name":40,"label":"WLAN SSID","type":0,"default":"","dt":8},{"name":41,"label":"WLAN Passwort","type":2,"default":"","dt":8},{"name":96,"label":"WLAN connect Timeout","type":3,"unit":"s","default":30,"min":0,"max":3600,"dt":3,"help":"Der Timeout gibt an, nach welcher Zeit ein Verbindungsversuch abgebrochen wird und ein Accesspoint erstellt wird.
0 deaktiviert den Timeout."},{"label":"Static IP","type":13},{"name":36,"label":"IP-Adresse","type":0,"default":"","dt":8,"flash":"1","help":"Wenn die IP-Adresse leer ist, dann ist DHCP aktiv"},{"name":37,"label":"Gateway","type":0,"default":"","dt":8,"flash":"1"},{"name":38,"label":"Subnet","type":0,"default":"255.255.255.0","dt":8,"flash":"1"},{"name":39,"label":"DNS","type":0,"default":"","dt":8,"help":"Optional","flash":"1"},{"label":"MQTT","type":13,"help":"Zum Übernehmen der Settings, muss der BSC neu gestartet werden!"},{"name":44,"label":"MQTT enable","type":10,"default":0,"dt":9},{"name":42,"label":"MQTT Server IP","type":0,"default":"","dt":8},{"name":43,"label":"MQTT Server Port","type":3,"default":1883,"min":1,"max":10000,"dt":3},{"name":86,"label":"Username","type":0,"default":"","dt":8},{"name":87,"label":"Passwort","type":2,"default":"","dt":8},{"name":46,"label":"MQTT Topic Name","type":0,"default":"bsc","dt":8},{"name":133,"label":"MQTT Sendeintervall","unit":"s","type":3,"default":60,"min":30,"max":120,"dt":1},{"label":"NTP","type":13,"help":"Zum Übernehmen der Settings, muss der BSC neu gestartet werden!"},{"name":122,"label":"Server Name/IP","type":0,"default":"pool.ntp.org","flash":"1","dt":8},{"label":"Aufzeichnung","type":13},{"name":143,"label":"Aufzeichnung Periode","type":9,"options":[{"v":0,"l":"Aus"},{"v":1,"l":"24h"}],"default":0,"dt":1},{"label":"Triggername","type":13},{"label":"Trigger description","label_entry":"Trigger","label_offset":1,"groupsize":10,"type":12,"group":[{"name":117,"label":"Trigger","type":0,"default":"","flash":"1","dt":8}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; const char paramBluetooth[] PROGMEM = R"rawliteral( {"page":[{"label":"Bluetooth","label_entry":"BT Device","groupsize":7,"type":12,"help":"Die MAC-Adresse muss klein geschrieben werden!","group":[{"name":4,"label":"Bluetooth","type":9,"options":[{"v":"0","l":"nicht belegt"},{"v":"1","l":"NEEY Balancer 4A (GW-24S4EB)"},{"v":"4","l":"EK-24S4EB"},{"v":"2","l":"JK-BMS [Test]"},{"v":"3","l":"JK-BMS (32S) [Test]"}],"default":"0","dt":1},{"name":5,"label":"MAC-Adresse","type":0,"default":"","dt":8},{"name":126,"label":"Deactivate","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1}]}],"btn":[{"name":"save-btn","label":"Save"}],"timer":[{"type":"text","interval":2000}]} )rawliteral"; -const char paramSerial[] PROGMEM = R"rawliteral( {"page":[{"label":"Serielle Schnitstellen","label_entry":"Serial","help":"To use serial 3-11, the serial extension is required!","groupsize":11,"type":12,"group":[{"name":1,"label":"Serial","type":9,"options":[{"v":"0","l":"nicht belegt"},{"v":"9","l":"BPN (not use)"},{"v":"1","l":"JBD BMS"},{"v":"2","l":"JK BMS"},{"v":"3","l":"Seplos BMS"},{"v":"12","l":"Seplos V3 BMS (Test)"},{"v":"4","l":"DALY BMS"},{"v":"5","l":"Sylcin BMS"},{"v":"7","l":"Gobel RN150 BMS (Test)"},{"v":"11","l":"Gobel PC200 BMS (Test)"},{"v":"6","l":"JK BMS V1.3 (only monitoring)"},{"v":"8","l":"JK BMS - CAN (Test; only monitoring)"},{"v":"10","l":"Victron SmartShunt"}],"default":"0","dt":1}]},{"label":"Seplos, Sylcin, Gobel BMS","type":13},{"name":108,"label":"Anzahl Packs","help":"Die Einstellung betrifft nur das Seplos, Sylcin und Gobel BMS an Serial 2.","type":3,"default":1,"min":1,"max":8,"dt":1},{"label":"Allgemein","type":13},{"name":141,"label":"Anzahl Zellen","type":3,"default":16,"min":4,"max":24,"dt":1},{"label":"Filter","type":13},{"name":121,"label":"Anzahl RX Fehler","help":"Gibt an, nach wievielen fehlerhaften Paketen es als Fehler bewertet wird.","type":3,"default":2,"min":1,"max":125,"flash":"1","dt":1},{"name":120,"label":"Abweichung Zellspannung","help":"0=Filter deaktiviert","unit":"%","type":3,"default":0,"min":0,"max":100,"flash":"1","dt":1},{"label":"Plausibility check","type":13},{"name":132,"label":"Cellvoltage plausibility check","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"label":"Value adjustments","type":13},{"label":"Serielle Schnitstellen","label_entry":"Serial","groupsize":11,"type":12,"group":[{"name":127,"label":"Cellvoltage for SoC 100%","help":"0=deaktiviert","unit":"mV","type":3,"default":0,"min":0,"max":5000,"dt":3},{"name":130,"label":"Cellvoltage for SoC 0%","help":"0=deaktiviert","unit":"mV","type":3,"default":0,"min":0,"max":5000,"dt":3}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; -const char paramAlarmBms[] PROGMEM = R"rawliteral( {"page":[{"label":"BMS Alarmregeln","label_entry":"Alarmregel","groupsize":20,"type":12,"group":[{"name":9,"label":"Zu überwachendes BMS","type":9,"options":[{"v":"127","l":"Aus"},{"v":"0","l":"Bluetooth 0"},{"v":"1","l":"Bluetooth 1"},{"v":"2","l":"Bluetooth 2"},{"v":"3","l":"Bluetooth 3"},{"v":"4","l":"Bluetooth 4"},{"v":"5","l":"Bluetooth 5"},{"v":"6","l":"Bluetooth 6"},{"v":"7","l":"Serial 0"},{"v":"8","l":"Serial 1"},{"v":"9","l":"Serial 2"},{"v":"10","l":"Serial 3"},{"v":"11","l":"Serial 4"},{"v":"12","l":"Serial 5"},{"v":"13","l":"Serial 6"},{"v":"14","l":"Serial 7"},{"v":"15","l":"Serial 8"},{"v":"16","l":"Serial 9"},{"v":"17","l":"Serial 10"}],"default":127,"dt":1},{"label":"Keine Daten vom BMS","type":13},{"name":17,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":12,"label":"Trigger keine Daten","unit":"s","type":3,"default":15,"min":1,"max":255,"dt":1},{"label":"Spannungsüberwachung Zelle Min/Max","type":13},{"name":18,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":14,"label":"Anzahl Zellen Monitoring","type":3,"default":16,"min":1,"max":24,"dt":1},{"name":15,"label":"Zellspannung Min","unit":"mV","type":3,"default":2500,"min":0,"max":5000,"dt":3},{"name":16,"label":"Zellspannung Max","unit":"mV","type":3,"default":3650,"min":0,"max":5000,"dt":3},{"label":"Spannungsüberwachung Gesamt Min/Max","type":13},{"name":19,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":72,"label":"Spannung Min","unit":"V","type":4,"default":48.0,"min":0,"max":60,"dt":7},{"name":73,"label":"Spannung Max","unit":"V","type":4,"default":54.0,"min":0,"max":60,"dt":7},{"name":131,"label":"Hysterese Min/Max","unit":"V","type":4,"default":0.5,"min":0,"max":10,"dt":7}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; +const char paramSerial[] PROGMEM = R"rawliteral( {"page":[{"label":"Serielle Schnitstellen","label_entry":"Serial","help":"To use serial 3-11, the serial extension is required!","groupsize":11,"type":12,"group":[{"name":1,"label":"Serial","type":9,"options":[{"v":"0","l":"nicht belegt"},{"v":"9","l":"BPN (not use)"},{"v":"1","l":"JBD BMS"},{"v":"2","l":"JK BMS"},{"v":"6","l":"JK BMS V1.3 (only monitoring)"},{"v":"8","l":"JK BMS - CAN (Test; only monitoring)"},{"v":"14","l":"JK Inverter BMS"},{"v":"3","l":"Seplos BMS"},{"v":"12","l":"Seplos V3 BMS (Test)"},{"v":"4","l":"DALY BMS"},{"v":"5","l":"Sylcin BMS"},{"v":"7","l":"Gobel RN150 BMS (Test)"},{"v":"11","l":"Gobel PC200 BMS (Test)"},{"v":"15","l":"Pylontech"},{"v":"10","l":"Victron SmartShunt"}],"default":"0","dt":1}]},{"label":"Seplos, Sylcin, Gobel BMS","type":13},{"name":108,"label":"Anzahl Packs","help":"Die Einstellung betrifft nur das Seplos, Sylcin und Gobel BMS an Serial 2.","type":3,"default":1,"min":1,"max":8,"dt":1},{"label":"Allgemein","type":13},{"name":141,"label":"Anzahl Zellen","type":3,"default":16,"min":4,"max":24,"dt":1},{"label":"Filter","type":13},{"name":121,"label":"Anzahl RX Fehler","help":"Gibt an, nach wievielen fehlerhaften Paketen es als Fehler bewertet wird.","type":3,"default":2,"min":1,"max":125,"flash":"1","dt":1},{"name":120,"label":"Abweichung Zellspannung","help":"0=Filter deaktiviert","unit":"%","type":3,"default":0,"min":0,"max":100,"flash":"1","dt":1},{"label":"Plausibility check","type":13},{"name":132,"label":"Cellvoltage plausibility check","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"label":"Value adjustments","type":13},{"label":"Serielle Schnitstellen","label_entry":"Serial","groupsize":11,"type":12,"group":[{"name":127,"label":"Cellvoltage for SoC 100%","help":"0=deaktiviert","unit":"mV","type":3,"default":0,"min":0,"max":5000,"dt":3},{"name":130,"label":"Cellvoltage for SoC 0%","help":"0=deaktiviert","unit":"mV","type":3,"default":0,"min":0,"max":5000,"dt":3}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; +const char paramAlarmBms[] PROGMEM = R"rawliteral( {"page":[{"label":"BMS Alarmregeln","label_entry":"Alarmregel","groupsize":20,"type":12,"group":[{"name":9,"label":"Zu überwachendes BMS","type":9,"options":[{"v":"127","l":"Aus"},{"v":"0","l":"Bluetooth 0"},{"v":"1","l":"Bluetooth 1"},{"v":"2","l":"Bluetooth 2"},{"v":"3","l":"Bluetooth 3"},{"v":"4","l":"Bluetooth 4"},{"v":"5","l":"Bluetooth 5"},{"v":"6","l":"Bluetooth 6"},{"v":"7","l":"Serial 0"},{"v":"8","l":"Serial 1"},{"v":"9","l":"Serial 2"},{"v":"10","l":"Serial 3"},{"v":"11","l":"Serial 4"},{"v":"12","l":"Serial 5"},{"v":"13","l":"Serial 6"},{"v":"14","l":"Serial 7"},{"v":"15","l":"Serial 8"},{"v":"16","l":"Serial 9"},{"v":"17","l":"Serial 10"}],"default":127,"dt":1},{"label":"Keine Daten vom BMS","type":13},{"name":17,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":12,"label":"Trigger keine Daten","unit":"s","type":3,"default":15,"min":1,"max":255,"dt":1},{"label":"Spannungsüberwachung Zelle Min/Max","type":13},{"name":18,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":14,"label":"Anzahl Zellen Monitoring","type":3,"default":16,"min":1,"max":24,"dt":1},{"name":15,"label":"Zellspannung Min","unit":"mV","type":3,"default":2500,"min":0,"max":5000,"dt":3},{"name":16,"label":"Zellspannung Max","unit":"mV","type":3,"default":3650,"min":0,"max":5000,"dt":3},{"label":"Spannungsüberwachung Gesamt Min/Max","type":13},{"name":19,"label":"Aktion bei Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":72,"label":"Spannung Min","unit":"V","type":4,"default":48.0,"min":0,"max":66,"dt":7},{"name":73,"label":"Spannung Max","unit":"V","type":4,"default":54.0,"min":0,"max":66,"dt":7},{"name":131,"label":"Hysterese Min/Max","unit":"V","type":4,"default":0.5,"min":0,"max":10,"dt":7}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; const char paramAlarmTemp[] PROGMEM = R"rawliteral( {"page":[{"label":"Alarm bei Sensorfehler","type":13},{"name":109,"label":"Trigger","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1},{"name":110,"label":"Timeout","unit":"s","type":3,"default":"5","min":5,"max":240,"dt":1},{"label":"Temperatur Überwachung","type":13},{"name":20,"label":"Temperatur Überwachung","label_entry":"Überwachung","groupsize":10,"type":12,"group":[{"name":128,"label":"Quelle","type":9,"options":[{"v":"1","l":"BMS"},{"v":"2","l":"Onewire"}],"default":"1","dt":1},{"name":129,"label":"Zu überwachendes BMS (nur wenn Quelle BMS)","type":9,"options":[{"v":"0","l":"Bluetooth 0"},{"v":"1","l":"Bluetooth 1"},{"v":"2","l":"Bluetooth 2"},{"v":"3","l":"Bluetooth 3"},{"v":"4","l":"Bluetooth 4"},{"v":"5","l":"Bluetooth 5"},{"v":"6","l":"Bluetooth 6"},{"v":"7","l":"Serial 0"},{"v":"8","l":"Serial 1"},{"v":"9","l":"Serial 2"},{"v":"10","l":"Serial 3"},{"v":"11","l":"Serial 4"},{"v":"12","l":"Serial 5"},{"v":"13","l":"Serial 6"},{"v":"14","l":"Serial 7"},{"v":"15","l":"Serial 8"},{"v":"16","l":"Serial 9"},{"v":"17","l":"Serial 10"}],"default":7,"dt":1},{"name":21,"label":"Sensornummer von","type":3,"default":"","min":0,"max":255,"dt":1,"help":"Mögliche Werte:
BMS:0-2
Onewire:0-63"},{"name":22,"label":"Sensornummer bis","type":3,"default":"","min":0,"max":255,"dt":1,"help":"Mögliche Werte:
BMS:0-2
Onewire:0-63"},{"name":27,"label":"Überwachung","type":9,"options":[{"v":"0","l":"nicht belegt"},{"v":"1","l":"Maximalwert-Überschreitung"},{"v":"2","l":"Maximalwert-Überschreitung (Referenz)"},{"v":"3","l":"Differenzwert-Überwachung"}],"default":"0","dt":1,"help":"Maximalwert-Überschreitung: Wert1=Maximale Temperatur
Maximalwert-Überschreitung (Referenz): Wert1=Temperatur Offset
Differenzwert-Überwachung: Wert1=Maximal erlaubte Differenz"},{"name":23,"label":"Referenzsensor","type":3,"default":"","min":0,"max":255,"dt":1},{"name":24,"label":"Wert 1","type":4,"default":"","min":0,"max":70,"dt":7},{"name":25,"label":"Hysterese","type":4,"default":"","min":0,"max":70,"dt":7},{"name":26,"label":"Auslösung","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; const char paramDigitalOut[] PROGMEM = R"rawliteral( {"page":[{"label":"Relaisausgänge","label_entry":"Relaisausgang","groupsize":6,"type":12,"group":[{"name":30,"label":"Auslöseverhalten","type":9,"options":[{"v":"0","l":"Permanent"},{"v":"1","l":"Impuls"}],"default":"0","dt":1},{"name":31,"label":"Impulsdauer","unit":"ms","type":3,"default":500,"min":100,"max":10000,"dt":3},{"name":33,"label":"Verzögerung","unit":"s","type":3,"default":0,"min":0,"max":254,"dt":1},{"name":32,"label":"Auswahl Trigger","type":14,"options":[{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"","dt":3}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; const char paramDigitalIn[] PROGMEM = R"rawliteral( {"page":[{"label":"Digitaleingänge","label_entry":"Digitaleingang","groupsize":4,"type":12,"group":[{"name":34,"label":"Eingang invertieren","type":10,"default":"0","dt":9},{"name":35,"label":"Weiterleiten an","type":9,"options":[{"v":"0","l":"Aus"},{"v":"1","l":"Trigger 1","d":7488},{"v":"2","l":"Trigger 2","d":7489},{"v":"3","l":"Trigger 3","d":7490},{"v":"4","l":"Trigger 4","d":7491},{"v":"5","l":"Trigger 5","d":7492},{"v":"6","l":"Trigger 6","d":7493},{"v":"7","l":"Trigger 7","d":7494},{"v":"8","l":"Trigger 8","d":7495},{"v":"9","l":"Trigger 9","d":7496},{"v":"10","l":"Trigger 10","d":7497}],"default":"0","dt":1}]}],"btn":[{"name":"save-btn","label":"Save"}]} )rawliteral"; diff --git a/include/webpages.h b/include/webpages.h index 5f17a43e..cdba389c 100644 --- a/include/webpages.h +++ b/include/webpages.h @@ -26,7 +26,7 @@ const char htmlPageRoot[] PROGMEM = "" "" "" "
" - "Battery Safety Controller   V0.6.1_T1" + "Battery Safety Controller   V0.6.1_T3" "
" "
Gefällt dir das Projekt? Zeige deine Wertschätzung doch einfach mit einer Spende! Weitere Infos unter " "Unterstützung
" diff --git a/src/BscSerial.cpp b/src/BscSerial.cpp index 1d26a8b4..8d414f07 100644 --- a/src/BscSerial.cpp +++ b/src/BscSerial.cpp @@ -26,6 +26,7 @@ #include "devices/GobelBms_PC200.h" #include "devices/SeplosBmsV3.h" #include "devices/NeeySerial.h" +#include "devices/JkInverterBms.h" #ifdef BPN #include "devices/bpnSerial.h" #endif @@ -295,7 +296,7 @@ void BscSerial::setReadBmsFunktion(uint8_t u8_devNr, uint8_t funktionsTyp) case ID_SERIAL_DEVICE_JKINVERTERBMS: BSC_LOGI(TAG,"setReadBmsFunktion JK Inverter"); setSerialBaudrate(u8_devNr, 115200); - serialDeviceData[u8_devNr].readBms = &SeplosBmsV3_readBmsData; + serialDeviceData[u8_devNr].readBms = &JkInverterBms_readBmsData; break; case ID_SERIAL_DEVICE_PYLONTECH: From bf3a10aa5b2dd66318f7e560ea2a5dab05f5f1b7 Mon Sep 17 00:00:00 2001 From: shining-man Date: Mon, 8 Jul 2024 21:03:07 +0200 Subject: [PATCH 02/14] =?UTF-8?q?JK=20BT=20BMS=20Timing=20=C3=84nderung=20?= =?UTF-8?q?(Test)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BleHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BleHandler.cpp b/src/BleHandler.cpp index 2464ad27..8b985704 100644 --- a/src/BleHandler.cpp +++ b/src/BleHandler.cpp @@ -64,7 +64,7 @@ class ClientCallbacks : public NimBLEClientCallbacks break; case ID_BT_DEVICE_JKBMS_JK02: case ID_BT_DEVICE_JKBMS_JK02_32S: - pClient->updateConnParams(120,120,0,60); + pClient->updateConnParams(20,20,0,60); jkBmsBtDevInit(i); break; } From 5ba37a7898e32c552a4c54b58795f3661483ff0c Mon Sep 17 00:00:00 2001 From: shining-man Date: Wed, 10 Jul 2024 21:14:06 +0200 Subject: [PATCH 03/14] PC200 --- include/defines.h | 2 +- include/webpages.h | 2 +- src/devices/GobelBms_PC200.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/defines.h b/include/defines.h index 03b3e59a..3566c410 100644 --- a/include/defines.h +++ b/include/defines.h @@ -9,7 +9,7 @@ #include "params_dt.h" #include "bscTime.h" -#define BSC_SW_VERSION "V0.6.1_T3" +#define BSC_SW_VERSION "V0.6.1_T4" static const char COMPILE_DATE_TIME[] = ""; diff --git a/include/webpages.h b/include/webpages.h index cdba389c..8f27e5d8 100644 --- a/include/webpages.h +++ b/include/webpages.h @@ -26,7 +26,7 @@ const char htmlPageRoot[] PROGMEM = "" "" "" "
" - "Battery Safety Controller   V0.6.1_T3" + "Battery Safety Controller   V0.6.1_T4" "
" "
Gefällt dir das Projekt? Zeige deine Wertschätzung doch einfach mit einer Spende! Weitere Infos unter " "Unterstützung
" diff --git a/src/devices/GobelBms_PC200.cpp b/src/devices/GobelBms_PC200.cpp index c0133445..26c3f2e4 100644 --- a/src/devices/GobelBms_PC200.cpp +++ b/src/devices/GobelBms_PC200.cpp @@ -190,7 +190,7 @@ static void getDataFromBms(uint8_t address, uint8_t function) u8_lData[3] = function; // CID2 (0x42) u8_lData[4] = (lenid >> 8); // LCHKSUM (0xE0) u8_lData[5] = (lenid >> 0); // LENGTH (0x02) - u8_lData[6] = 0xFF; // INFO + u8_lData[6] = address + 1; //0xFF; // INFO convertByteToAsciiHex(&u8_lSendData[1], &u8_lData[0], frame_len); From edfc2afaa72a52ca20e57374318247ab436210bc Mon Sep 17 00:00:00 2001 From: shining-man Date: Thu, 11 Jul 2024 05:32:33 +0200 Subject: [PATCH 04/14] PC200 Dbg. Message --- src/devices/GobelBms_PC200.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/GobelBms_PC200.cpp b/src/devices/GobelBms_PC200.cpp index 26c3f2e4..140bf811 100644 --- a/src/devices/GobelBms_PC200.cpp +++ b/src/devices/GobelBms_PC200.cpp @@ -449,7 +449,7 @@ Byte | Data setBmsChargePercentage(BT_DEVICES_COUNT + address, (float)((float)u16_lBalanceCapacity / (float)u16_lFullCapacity * 100.0f)); #ifdef GOBELPC200_DEBUG - BSC_LOGD(TAG, "Capacity: %f, %f, soc=%i", u16_lBalanceCapacity, u16_lFullCapacity, getBmsChargePercentage(BT_DEVICES_COUNT + address)); + BSC_LOGD(TAG, "Capacity: %i, %i, soc=%i", u16_lBalanceCapacity, u16_lFullCapacity, getBmsChargePercentage(BT_DEVICES_COUNT + address)); #endif u16_lBalanceCapacity /= 100; u16_lFullCapacity /= 100; From 28f2f7485345f4ea845fa06a71ebb581a88d951d Mon Sep 17 00:00:00 2001 From: shining-man Date: Sun, 21 Jul 2024 06:05:45 +0200 Subject: [PATCH 05/14] =?UTF-8?q?JK=20Inverter=20zu=20den=20Multi=5FRS485?= =?UTF-8?q?=5FBMS=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BmsData.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/BmsData.cpp b/src/BmsData.cpp index ff65b930..7c4e1d80 100644 --- a/src/BmsData.cpp +++ b/src/BmsData.cpp @@ -653,6 +653,7 @@ bool isMultiple485bms(uint8_t bms) case ID_SERIAL_DEVICE_BPN: case ID_SERIAL_DEVICE_GOBELBMS: case ID_SERIAL_DEVICE_GOBEL_PC200: + case ID_SERIAL_DEVICE_JKINVERTERBMS: return true; break; From a4058bc7d03f9ed3e6a49102c719adaf19add9fb Mon Sep 17 00:00:00 2001 From: shining-man Date: Sun, 21 Jul 2024 06:06:15 +0200 Subject: [PATCH 06/14] =?UTF-8?q?JK=20Inverter:=20=C3=84nderung=20beim=20l?= =?UTF-8?q?esen=20der=20Register?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/devices/JkInverterBms.cpp | 57 +++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/src/devices/JkInverterBms.cpp b/src/devices/JkInverterBms.cpp index bd51398c..4e884970 100644 --- a/src/devices/JkInverterBms.cpp +++ b/src/devices/JkInverterBms.cpp @@ -11,7 +11,8 @@ static const char *TAG = "JK_INV_BMS"; -static void parsePackInfo(modbusrtu::ModbusRTU *modbus, uint8_t devNr); +static void parsePackInfoA(modbusrtu::ModbusRTU *modbus, uint8_t devNr); +static void parsePackInfoB(modbusrtu::ModbusRTU *modbus, uint8_t devNr); //static void message2Log(uint8_t * t_message, uint8_t len, uint8_t address); @@ -26,7 +27,7 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin uint8_t jkInvBmsAdr = devData->u8_deviceNr; uint8_t jkInvBmsAdrBmsData = devData->u8_BmsDataAdr + BT_DEVICES_COUNT; - if(u8_mCountOfPacks>1) jkInvBmsAdr += 1; + /*if(u8_mCountOfPacks>1)*/ jkInvBmsAdr += 1; #ifdef JK_INV_DEBUG BSC_LOGI(TAG,"JkInverterBms_readBmsData() devNr=%i, readFromAdr=%i, BmsDataAdr=%i, CountOfPacks=%i",u8_mDevNr,jkInvBmsAdr,jkInvBmsAdrBmsData,u8_mCountOfPacks); @@ -34,10 +35,28 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin modbusrtu::ModbusRTU modbus(port,callback,devNr); - if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1200, 268, response)) + /* Es können nicht alle 268 Bytes gleichzeitig gelesen werden. + * Es kann z.B. in folgenden Teilen gelsensen werden. + * 0x1000: 123 Register + * 0x1200: 123 Register + * 0x127C: 84 Register + * 0x12DA: 42 Register + * 0x12FA: 21 Register + */ + + if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1200, 74, response)) + { + //message2Log(response, 36, 0); + parsePackInfoA(&modbus, jkInvBmsAdrBmsData); + vTaskDelay(pdMS_TO_TICKS(50)); + } + else return false; + + + if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1290, 50, response)) { //message2Log(response, 36, 0); - parsePackInfo(&modbus, jkInvBmsAdrBmsData); + parsePackInfoB(&modbus, jkInvBmsAdrBmsData); // MQTT mqttPublish(MQTT_TOPIC_BMS_BT, jkInvBmsAdrBmsData, MQTT_TOPIC2_TOTAL_VOLTAGE, -1, getBmsTotalVoltage(jkInvBmsAdrBmsData)); @@ -52,7 +71,7 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin } -static void parsePackInfo(modbusrtu::ModbusRTU *modbus, uint8_t devNr) +static void parsePackInfoA(modbusrtu::ModbusRTU *modbus, uint8_t devNr) { // Cellvoltage for(uint8_t i;i<24;i++) setBmsCellVoltage(devNr, i, modbus->getU16ValueByOffset(i*2)); @@ -70,31 +89,43 @@ static void parsePackInfo(modbusrtu::ModbusRTU *modbus, uint8_t devNr) // Min. Cellvoltage setBmsMinVoltageCellNumber(devNr, modbus->getU8ValueByOffset(73)); setBmsMinCellVoltage(devNr, getBmsCellVoltage(devNr, modbus->getU8ValueByOffset(73))); +} + + +static void parsePackInfoB(modbusrtu::ModbusRTU *modbus, uint8_t devNr) +{ + uint8_t byteOffset = 0x90; // Total Voltage - setBmsTotalVoltage_int(devNr, modbus->getU32ValueByOffset(144)/10); + setBmsTotalVoltage_int(devNr, modbus->getU32ValueByOffset(144 - byteOffset) / 10); // Total Current - setBmsTotalCurrent_int(devNr, modbus->getI32ValueByOffset(152)/10); + setBmsTotalCurrent_int(devNr, modbus->getI32ValueByOffset(152 - byteOffset) / 10); // Temperature - setBmsTempatureI16(devNr, 0, modbus->getI16ValueByOffset(156)*10); - setBmsTempatureI16(devNr, 1, modbus->getI16ValueByOffset(158)*10); + setBmsTempatureI16(devNr, 0, modbus->getI16ValueByOffset(156 - byteOffset) * 10); + setBmsTempatureI16(devNr, 1, modbus->getI16ValueByOffset(158 - byteOffset) * 10); // Alarm // ToDo // Bal. Current - setBmsBalancingCurrentI16(devNr, modbus->getI16ValueByOffset(164)/10); + setBmsBalancingCurrentI16(devNr, modbus->getI16ValueByOffset(164 - byteOffset) / 10); // Bal. State - setBmsIsBalancingActive(devNr, modbus->getU8ValueByOffset(166)); + setBmsIsBalancingActive(devNr, modbus->getU8ValueByOffset(166 - byteOffset)); // SoC - setBmsChargePercentage(devNr, modbus->getU8ValueByOffset(167)); + setBmsChargePercentage(devNr, modbus->getU8ValueByOffset(167 - byteOffset)); -} + // FET state charge + if(modbus->getU8ValueByOffset(192 - byteOffset) > 0) setBmsStateFETsCharge(devNr, true); + else setBmsStateFETsCharge(devNr, false); + // FET state discharge + if(modbus->getU8ValueByOffset(193 - byteOffset) > 0) setBmsStateFETsDischarge(devNr, true); + else setBmsStateFETsDischarge(devNr, false); +} From 38de352bf323f92a0b82e15088b9d0722a50ad9f Mon Sep 17 00:00:00 2001 From: shining-man Date: Mon, 22 Jul 2024 20:21:34 +0200 Subject: [PATCH 07/14] =?UTF-8?q?JK=20Inv=20BMS:=20Anzahl=20der=20zu=20les?= =?UTF-8?q?enden=20Register=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/devices/JkInverterBms.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/devices/JkInverterBms.cpp b/src/devices/JkInverterBms.cpp index 4e884970..9dbd32e8 100644 --- a/src/devices/JkInverterBms.cpp +++ b/src/devices/JkInverterBms.cpp @@ -44,16 +44,20 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin * 0x12FA: 21 Register */ - if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1200, 74, response)) + if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1200, 37, response)) { //message2Log(response, 36, 0); parsePackInfoA(&modbus, jkInvBmsAdrBmsData); vTaskDelay(pdMS_TO_TICKS(50)); } - else return false; + else + { + BSC_LOGE(TAG,"Fehler beim lesen von 0x1200"); + return false; + } - if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1290, 50, response)) + if(modbus.readData(jkInvBmsAdr, modbusrtu::ModbusRTU::fCode::READ_CMD_JK, 0x1290, 25, response)) { //message2Log(response, 36, 0); parsePackInfoB(&modbus, jkInvBmsAdrBmsData); @@ -64,7 +68,11 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin vTaskDelay(pdMS_TO_TICKS(25)); } - else return false; + else + { + BSC_LOGE(TAG,"Fehler beim lesen von 0x1290"); + return false; + } return true; From 8fafc788ef6780c4b14cb1bc6d73a6c78ee1ab37 Mon Sep 17 00:00:00 2001 From: shining-man Date: Mon, 22 Jul 2024 20:22:32 +0200 Subject: [PATCH 08/14] =?UTF-8?q?ModbusRTU=20=C3=84nderungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ModbusRTU.hpp | 1 + src/ModbusRTU.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/include/ModbusRTU.hpp b/include/ModbusRTU.hpp index 1a3554f3..f8f2c206 100644 --- a/include/ModbusRTU.hpp +++ b/include/ModbusRTU.hpp @@ -61,6 +61,7 @@ namespace modbusrtu void buildSendMsg(uint8_t addr, fCode cmd, uint16_t startRegister, uint16_t len); bool readSerialData(); + void errorNoData(uint16_t offset); }; } // namespace modbusrtu diff --git a/src/ModbusRTU.cpp b/src/ModbusRTU.cpp index 1eec2996..8a81833d 100644 --- a/src/ModbusRTU.cpp +++ b/src/ModbusRTU.cpp @@ -28,6 +28,27 @@ ModbusRTU::~ModbusRTU() ; } +/*static void message2Log(uint8_t * t_message, uint8_t len, uint8_t address) +{ + String recvBytes=""; + uint8_t u8_logByteCount=0; + BSC_LOGI(TAG,"Dev=%i, RecvBytes=%i",address, len); + for(uint8_t x=0;x>8)&0xff); // CRC + //message2Log(lSendData, 8, addr); + // RX-Buffer leeren for(unsigned long clearRxBufTime = millis(); millis()-clearRxBufTime<100;) { @@ -194,6 +217,11 @@ int16_t ModbusRTU::getI16Value(uint16_t address) uint8_t ModbusRTU::getU8ValueByOffset(uint16_t offset) { + if(offset > retDataLen) + { + errorNoData(offset); + return 0; + } return mRetData[offset]; } @@ -204,6 +232,11 @@ int8_t ModbusRTU::getI8ValueByOffset(uint16_t offset) uint16_t ModbusRTU::getU16ValueByOffset(uint16_t offset) { + if(offset+1 > retDataLen) + { + errorNoData(offset+1); + return 0; + } return (mRetData[offset]<<8) | mRetData[offset+1]; } @@ -214,6 +247,11 @@ int16_t ModbusRTU::getI16ValueByOffset(uint16_t offset) uint32_t ModbusRTU::getU32ValueByOffset(uint16_t offset) { + if(offset+3 > retDataLen) + { + errorNoData(offset+3); + return 0; + } return (mRetData[offset]<<24) | (mRetData[offset+1]<<16) | (mRetData[offset+2]<<8) | mRetData[offset+3]; } @@ -222,4 +260,10 @@ int32_t ModbusRTU::getI32ValueByOffset(uint16_t offset) return (int32_t)getU32ValueByOffset(offset); } + +void ModbusRTU::errorNoData(uint16_t offset) +{ + BSC_LOGE(TAG,"Keine Daten! Lese Byte %i von %i",offset, retDataLen); +} + } // namespace modbusrtu \ No newline at end of file From 702afd07bd2394ca4868eade5dedea95f708dd52 Mon Sep 17 00:00:00 2001 From: shining-man Date: Mon, 22 Jul 2024 20:26:05 +0200 Subject: [PATCH 09/14] PC200 FET-State --- src/devices/GobelBms_PC200.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/devices/GobelBms_PC200.cpp b/src/devices/GobelBms_PC200.cpp index 140bf811..0f4c835e 100644 --- a/src/devices/GobelBms_PC200.cpp +++ b/src/devices/GobelBms_PC200.cpp @@ -165,7 +165,7 @@ bool GobelBmsPC200_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin getDataFromBms(u8_lGobelAdr, 0x44); // Alarms if (recvAnswer(response)) { - //parseMessage_Alarms(response, u8_lGobelAdrBmsData); + parseMessage_Alarms(response, u8_lGobelAdrBmsData); } else ret = false; } @@ -606,6 +606,7 @@ Char A.25 Warn state2 explanation uint32_t u32_alarm = 0; boolean bo_lValue = false; +#if 0 uint8_t u8_lNumOfCells = convertAsciiHexToByte(t_message, 8); // Number of cells #ifdef GOBELPC200_DEBUG BSC_LOGD(TAG, "Number of cells: %d", u8_lNumOfCells); @@ -692,6 +693,17 @@ Char A.25 Warn state2 explanation u32_alarm |= BMS_ERR_STATUS_DSG_UTP; setBmsErrors(BT_DEVICES_COUNT + address, u32_alarm); + #endif + + + // FET state + uint8_t FETstate = convertAsciiHexToByte(t_message, 37); + if(isBitSet(FETstate,1)) setBmsStateFETsCharge(BT_DEVICES_COUNT + address, true); + else setBmsStateFETsCharge(BT_DEVICES_COUNT + address, false); + + if(isBitSet(FETstate,2)) setBmsStateFETsDischarge(BT_DEVICES_COUNT + address, true); + else setBmsStateFETsDischarge(BT_DEVICES_COUNT + address, false); + } uint8_t convertAsciiHexToByte(char a, char b) From c9bb53f4dfb325369a6a4052e279556b872a4e18 Mon Sep 17 00:00:00 2001 From: shining-man Date: Tue, 23 Jul 2024 05:45:22 +0200 Subject: [PATCH 10/14] Add getBitValueByOffset --- include/ModbusRTU.hpp | 1 + src/ModbusRTU.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/ModbusRTU.hpp b/include/ModbusRTU.hpp index f8f2c206..4cf74619 100644 --- a/include/ModbusRTU.hpp +++ b/include/ModbusRTU.hpp @@ -42,6 +42,7 @@ namespace modbusrtu int16_t getI16ValueByOffset(uint16_t offset); uint32_t getU32ValueByOffset(uint16_t offset); int32_t getI32ValueByOffset(uint16_t offset); + bool getBitValueByOffset(uint16_t offset, uint8_t b); private: diff --git a/src/ModbusRTU.cpp b/src/ModbusRTU.cpp index 8a81833d..4ef48d2e 100644 --- a/src/ModbusRTU.cpp +++ b/src/ModbusRTU.cpp @@ -260,6 +260,16 @@ int32_t ModbusRTU::getI32ValueByOffset(uint16_t offset) return (int32_t)getU32ValueByOffset(offset); } +bool ModbusRTU::getBitValueByOffset(uint16_t offset, uint8_t b) +{ + if(offset > retDataLen) + { + errorNoData(offset); + return 0; + } + + return isBitSet(mRetData[offset],b); +} void ModbusRTU::errorNoData(uint16_t offset) { From e312a48a87cadc10bb53714dbd9776d6d084e812 Mon Sep 17 00:00:00 2001 From: shining-man Date: Tue, 23 Jul 2024 05:45:34 +0200 Subject: [PATCH 11/14] Edit BmsData.h --- include/BmsData.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/BmsData.h b/include/BmsData.h index 08507d31..3ccf3ee2 100644 --- a/include/BmsData.h +++ b/include/BmsData.h @@ -38,10 +38,10 @@ struct bmsData_s int16_t bmsBalancingCurrent[BMSDATA_NUMBER_ALLDEVICES]; // x | | | | | | | x | | | | | | x | int16_t bmsTempature[BMSDATA_NUMBER_ALLDEVICES][3]; // 2 | 3 | 3 | 3 | | 3 | 3 | x | 3 | 3 | | | x | x | uint8_t bmsChargePercentage[BMSDATA_NUMBER_ALLDEVICES]; // - | x | x | x | | x | x | - | x | x | x | | x | x | - uint32_t bmsErrors[BMSDATA_NUMBER_ALLDEVICES]; // * | x | x | | | | x | * | x | x | | | x | | + uint32_t bmsErrors[BMSDATA_NUMBER_ALLDEVICES]; // * | x | x | | | | x | * | x | x | | | x | x | uint32_t bmsWarnings[BMSDATA_NUMBER_ALLDEVICES]; // | | | x | | | | | | | | | | | - uint8_t bmsStateFETs[BMSDATA_NUMBER_ALLDEVICES]; // - | x | x | x | x | x | x | - | - | - | | | x | | bit 0=FET charge, bit 1=FET discharge - unsigned long bmsLastDataMillis[BMSDATA_NUMBER_ALLDEVICES]; // x | x | x | x | x | | x | x | x | x | | | x | | + uint8_t bmsStateFETs[BMSDATA_NUMBER_ALLDEVICES]; // - | x | x | x | x | x | x | - | - | - | | | x | x | bit 0=FET charge, bit 1=FET discharge + unsigned long bmsLastDataMillis[BMSDATA_NUMBER_ALLDEVICES]; // x | x | x | x | x | | x | x | x | x | | | x | x | uint16_t bmsCellVoltageCrc[BMSDATA_NUMBER_ALLDEVICES]; // Wird nach dem Holen Daten vom BMS berechnet uint8_t bmsLastChangeCellVoltageCrc[BMSDATA_NUMBER_ALLDEVICES]; // Wird nach dem Holen Daten vom BMS berechnet // // *=Teilweise; -=Nicht verfügbar; c=wird berechnet From 4a3cb1dc01999875ce0107685fea090cb0971398 Mon Sep 17 00:00:00 2001 From: shining-man Date: Tue, 23 Jul 2024 05:49:08 +0200 Subject: [PATCH 12/14] =?UTF-8?q?JK=20Inv=20BMS:=20Errors=20hinzugef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/devices/JkInverterBms.cpp | 55 ++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/devices/JkInverterBms.cpp b/src/devices/JkInverterBms.cpp index 9dbd32e8..30a9e32a 100644 --- a/src/devices/JkInverterBms.cpp +++ b/src/devices/JkInverterBms.cpp @@ -27,7 +27,7 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin uint8_t jkInvBmsAdr = devData->u8_deviceNr; uint8_t jkInvBmsAdrBmsData = devData->u8_BmsDataAdr + BT_DEVICES_COUNT; - /*if(u8_mCountOfPacks>1)*/ jkInvBmsAdr += 1; + jkInvBmsAdr += 1; #ifdef JK_INV_DEBUG BSC_LOGI(TAG,"JkInverterBms_readBmsData() devNr=%i, readFromAdr=%i, BmsDataAdr=%i, CountOfPacks=%i",u8_mDevNr,jkInvBmsAdr,jkInvBmsAdrBmsData,u8_mCountOfPacks); @@ -115,7 +115,34 @@ static void parsePackInfoB(modbusrtu::ModbusRTU *modbus, uint8_t devNr) setBmsTempatureI16(devNr, 1, modbus->getI16ValueByOffset(158 - byteOffset) * 10); // Alarm - // ToDo + uint32_t alarms = 0; + if(modbus->getBitValueByOffset(160 - byteOffset, 0)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 0 AlarmWireRes + if(modbus->getBitValueByOffset(160 - byteOffset, 1)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 1 AlarmMosOTP + if(modbus->getBitValueByOffset(160 - byteOffset, 2)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 2 AlarmCellQuantity + if(modbus->getBitValueByOffset(160 - byteOffset, 3)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 3 AlarmCurSensorErr + if(modbus->getBitValueByOffset(160 - byteOffset, 4)) alarms |= BMS_ERR_STATUS_CELL_OVP; // Bit 4 AlarmCellOVP + if(modbus->getBitValueByOffset(160 - byteOffset, 5)) alarms |= BMS_ERR_STATUS_BATTERY_OVP; // Bit 5 AlarmBatOVP + if(modbus->getBitValueByOffset(160 - byteOffset, 6)) alarms |= BMS_ERR_STATUS_CHG_OCP; // Bit 6 AlarmChOCP + if(modbus->getBitValueByOffset(160 - byteOffset, 7)) alarms |= BMS_ERR_STATUS_CHG_OCP; // Bit 7 AlarmChSCP (ShortCurrentProtection) + + if(modbus->getBitValueByOffset(161 - byteOffset, 0)) alarms |= BMS_ERR_STATUS_CHG_OTP; // Bit 8 AlarmChOTP + if(modbus->getBitValueByOffset(161 - byteOffset, 1)) alarms |= BMS_ERR_STATUS_CHG_UTP; // Bit 9 AlarmChUTP + if(modbus->getBitValueByOffset(161 - byteOffset, 2)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 10 AlarmCPUAuxCommuErr + if(modbus->getBitValueByOffset(161 - byteOffset, 3)) alarms |= BMS_ERR_STATUS_CELL_UVP; // Bit 11 AlarmCellUVP + if(modbus->getBitValueByOffset(161 - byteOffset, 4)) alarms |= BMS_ERR_STATUS_BATTERY_UVP; // Bit 12 AlarmBatUVP + if(modbus->getBitValueByOffset(161 - byteOffset, 5)) alarms |= BMS_ERR_STATUS_DSG_OCP; // Bit 13 AlarmDchOCP + if(modbus->getBitValueByOffset(161 - byteOffset, 6)) alarms |= BMS_ERR_STATUS_DSG_OCP; // Bit 14 AlarmDchSCP + if(modbus->getBitValueByOffset(161 - byteOffset, 7)) alarms |= BMS_ERR_STATUS_DSG_OTP; // Bit 15 AlarmDchOTP + + if(modbus->getBitValueByOffset(162 - byteOffset, 0)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 16 AlarmChargeMOS + if(modbus->getBitValueByOffset(162 - byteOffset, 1)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 17 AlarmDischargeMOS + if(modbus->getBitValueByOffset(162 - byteOffset, 2)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 18 GPSDisconneted + // Bit 19 Modify PWD. in time + if(modbus->getBitValueByOffset(162 - byteOffset, 4)) alarms |= BMS_ERR_STATUS_AFE_ERROR; // Bit 20 Discharge On Failed + if(modbus->getBitValueByOffset(162 - byteOffset, 5)) alarms |= BMS_ERR_STATUS_CHG_OTP; // Bit 21 Battery Over Temp Alarm + + setBmsErrors(devNr, alarms); + // Bal. Current setBmsBalancingCurrentI16(devNr, modbus->getI16ValueByOffset(164 - byteOffset) / 10); @@ -134,27 +161,3 @@ static void parsePackInfoB(modbusrtu::ModbusRTU *modbus, uint8_t devNr) if(modbus->getU8ValueByOffset(193 - byteOffset) > 0) setBmsStateFETsDischarge(devNr, true); else setBmsStateFETsDischarge(devNr, false); } - - - -/*static void message2Log(uint8_t * t_message, uint8_t len, uint8_t address) -{ - String recvBytes=""; - uint8_t u8_logByteCount=0; - BSC_LOGI(TAG,"Dev=%i, RecvBytes=%i",address, len); - for(uint8_t x=0;x Date: Tue, 23 Jul 2024 05:49:29 +0200 Subject: [PATCH 13/14] =?UTF-8?q?Version=20hochgez=C3=A4hlt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/defines.h | 2 +- include/webpages.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/defines.h b/include/defines.h index 3566c410..bbfea4ef 100644 --- a/include/defines.h +++ b/include/defines.h @@ -9,7 +9,7 @@ #include "params_dt.h" #include "bscTime.h" -#define BSC_SW_VERSION "V0.6.1_T4" +#define BSC_SW_VERSION "V0.6.1_T5" static const char COMPILE_DATE_TIME[] = ""; diff --git a/include/webpages.h b/include/webpages.h index 8f27e5d8..bc05322d 100644 --- a/include/webpages.h +++ b/include/webpages.h @@ -26,7 +26,7 @@ const char htmlPageRoot[] PROGMEM = "" "" "" "
" - "Battery Safety Controller   V0.6.1_T4" + "Battery Safety Controller   V0.6.1_T5" "
" "
Gefällt dir das Projekt? Zeige deine Wertschätzung doch einfach mit einer Spende! Weitere Infos unter " "Unterstützung
" From 641c526894976289cd5c92863dc4a2bb48bb3e12 Mon Sep 17 00:00:00 2001 From: shining-man Date: Thu, 25 Jul 2024 20:21:49 +0200 Subject: [PATCH 14/14] JK Inv BMS: Add log messages --- src/devices/JkInverterBms.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/devices/JkInverterBms.cpp b/src/devices/JkInverterBms.cpp index 30a9e32a..c5229aa9 100644 --- a/src/devices/JkInverterBms.cpp +++ b/src/devices/JkInverterBms.cpp @@ -52,7 +52,9 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin } else { + #ifdef JK_INV_DEBUG BSC_LOGE(TAG,"Fehler beim lesen von 0x1200"); + #endif return false; } @@ -70,7 +72,9 @@ bool JkInverterBms_readBmsData(Stream *port, uint8_t devNr, void (*callback)(uin } else { + #ifdef JK_INV_DEBUG BSC_LOGE(TAG,"Fehler beim lesen von 0x1290"); + #endif return false; } @@ -143,6 +147,10 @@ static void parsePackInfoB(modbusrtu::ModbusRTU *modbus, uint8_t devNr) setBmsErrors(devNr, alarms); + #ifdef JK_INV_DEBUG + BSC_LOGI(TAG, "JK Alarms: %i, %i, %i, %i, Errors=%i", modbus->getU8ValueByOffset(160 - byteOffset), modbus->getU8ValueByOffset(161 - byteOffset), + modbus->getU8ValueByOffset(162 - byteOffset), modbus->getU8ValueByOffset(163 - byteOffset), alarms ); + #endif // Bal. Current setBmsBalancingCurrentI16(devNr, modbus->getI16ValueByOffset(164 - byteOffset) / 10);