Power Queen bluetooth BMS uitlezen
In dit artikel hebben we beschreven hoe je eenvoudig een thuisbatterij kunt maken. Hiervoor gebruiken we accu’s van Power Queen met bluetooth-functionaliteit. In dit artikel zullen we uitleggen hoe je het BMS eenvoudig kunt uitlezen en gegevens naareen virtueel device in Domoticz kunt sturen.
Power Queen geeft tijdelijk een korting van maar liefst 6% op alle producten. Ga hiervoor naar de website van Power Queen en gebruik kortingscode EHOCO.NL
De scripts voor de thuisbatterij heb je waarschijnlijk op een Raspberry Pi (of soortgelijk apparaat gezet). De Raspberry Pi is ook prima geschikt voor het BMS uit te lezen (eigenlijk is ieder apparaat met bluetooth en linux geschikt).
We maken gebruik van de Python library van Dmytro Tsepilov.
Kloon en maak een virtuele Python-omgeving:
1 2 3 4 |
git clone https://github.com/dmytro-tsepilov/pq_bms_bluetooth.git cd ./pq_bms_bluetooth python -m venv venv source venv/bin/activate |
Installeer requirements:
1 |
pip install -r requirements.txt |
Installeer bluez:
1 |
sudo apt install bluez |
Zoek nu met een app als Bluetooth Finder & BLE Scanner het MAC-adres van de accu op. De naam begint met PQ-24100B (als je een 24V 100A accu hebt). Schrijf het MAC-adres op, dat hebben we dadelijk nodig.
Vraag de BMS-gegevens op (uiteraard moet je hier jouw MAC-adres neerzetten):
1 |
python main.py 12:34:56:78:AA:CC --bms |
Als alles goed gegaan is dan krijg je een output als (kan wel een half minuutje duren):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "packVoltage": 25530, "voltage": 25651, "batteryPack": { "1": 3.206, "2": 3.205, "3": 3.206, "4": 3.207, "5": 3.208, "6": 3.206, "7": 3.207, "8": 3.206 }, "current": 0, "remainAh": 14.47, "factoryAh": 113.0, "cellTemperature": 21, "mosfetTemperature": 21, "heat": 0, "protectState": 0, "failureState": 0, "equilibriumState": 0, "batteryState": 1, "SOC": "12%", "SOH": "113%", "dischargesCount": 12, "dischargesAHCount": 1296, "firmwareVersion": "1.0.0", "manfactureDate": "2023-12-20", "hardwareVersion": "T40-11T40-10" } |
Is het allemaal gelukt? Dan is het nu tijd om in Domoticz virtuele devices aan te maken. In dit voorbeeld hebben we 3 percentage-devices en 3 counter-devices aangemaakt.
Maak nu een Shell script aan:
1 |
nano bms.sh |
Kopieer onderstaand script in jouw lege script (bms.sh). Pas regel 4, 7, 8, 13, 14, 15, 21, 22 en 23 aan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#!/bin/bash # Zorg ervoor dat het script altijd vanuit de oorspronkelijke map start BASE_DIR="/home/pi" # Volledig pad opgeven # Definieer Domoticz-configuratie DOMOTICZ_IP="192.168.30.208" # Pas dit aan naar jouw Domoticz IP-adres DOMOTICZ_PORT="8080" # Pas dit aan naar jouw Domoticz poort # Definieer een array van apparaten en bijbehorende IDX declare -A devices devices=( ["12:34:56:78:AA:BB"]=1525 # IDX voor SOC van accu 1 ["12:34:56:78:AA:CC"]=1526 # IDX voor SOC van accu 2 ["12:34:56:78:AA:DD"]=1527 # IDX voor SOC van accu 3 ) # Definieer een array voor remainAH devices en bijbehorende IDX declare -A remainAh_devices remainAh_devices=( ["12:34:56:78:AA:BB"]=1528 # IDX voor remainAH van accu 1 ["12:34:56:78:AA:CC"]=1529 # IDX voor remainAH van accu 2 ["12:34:56:78:AA:DD"]=1530 # IDX voor remainAH van accu 3 ) # Terug naar de basisdirectory cd "$BASE_DIR" || exit 1 # Ga naar de pq_bms_bluetooth directory en voer de commando's uit cd /home/pi/pq_bms_bluetooth || exit 1 python3 -m venv venv source venv/bin/activate # Loop door elk apparaat en stuur SOC-waarde naar Domoticz for MAC in "${!devices[@]}"; do IDX="${devices[$MAC]}" REMAIN_AH_IDX="${remainAh_devices[$MAC]}" # Verkrijg de JSON-output voor dit specifieke apparaat JSON_OUTPUT=$(python3 main.py "$MAC" --bms) # Controleer of JSON-output geldig is en extract de SOC waarde zonder '%' teken SOC=$(echo "$JSON_OUTPUT" | jq -r '.SOC' | tr -d '%') REMAIN_AH=$(echo "$JSON_OUTPUT" | jq '.remainAh') # Controleer of SOC niet leeg of null is if [[ -n "$SOC" && "$SOC" != "null" ]]; then # Verstuur de SOC-waarde naar het juiste virtuele apparaat in Domoticz curl -s "http://$DOMOTICZ_IP:$DOMOTICZ_PORT/json.htm?type=command¶m=udevice&idx=$IDX&nvalue=0&svalue=$SOC" else echo "Apparaat $MAC niet gevonden of geen geldige SOC-waarde, overslaan..." fi # Controleer of remainAH niet leeg of null is if [[ -n "$REMAIN_AH" && "$REMAIN_AH" != "null" ]]; then # Verstuur de remainAH-waarde naar het juiste virtuele apparaat in Domoticz curl -s "http://$DOMOTICZ_IP:$DOMOTICZ_PORT/json.htm?type=command¶m=udevice&idx=$REMAIN_AH_IDX&nvalue=0&svalue=$REMAIN_AH" else echo "Apparaat $MAC niet gevonden of geen geldige remainAH-waarde, overslaan..." fi done deactivate |
Geef het script de juiste rechten:
1 |
chmod +x bms.sh |
Uiteaard wil je dat het scrip automatisch loopt, ook na een reboot. Open de crontab:
1 |
sudo crontab -e |
Voeg onderstaande regel toe:
1 |
*/2 * * * * /bin/bash /home/pi/bms.sh >> /home/pi/bms.log 2>&1 |
Start de Raspberry Pi opnieuw op:
1 |
sudo reboot |
Nu zal het script automatisch starten en om de 2 minuten uitgevoerd worden.
Liever een Python script?
Mocht je liever een Python script gebruiken, dan kan dat natuurlijk ook!
Maak nu een Python script aan:
1 |
nano bms.py |
Kopieer onderstaand script in jouw lege script (bms.py). Pas regel 8, 9, 10, 14, 15, 16, 19, 20 en 21 aan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#!/usr/bin/python3 import os import requests import json import subprocess BASE_DIR = "/home/pi" # Volledig pad opgeven DOMOTICZ_IP = "192.168.30.208" # Pas aan naar jouw Domoticz IP-adres DOMOTICZ_PORT = "8080" # Pas aan naar jouw Domoticz poort # Definieer een dictionary van apparaten en bijbehorende IDX devices = { "C8:47:80:10:B6:CB": 1525, "C8:47:80:0D:EF:BE": 1526, "C8:47:80:12:D7:E5": 1527 } remainAh_devices = { "C8:47:80:10:B6:CB": 1528, "C8:47:80:0D:EF:BE": 1529, "C8:47:80:12:D7:E5": 1530 } def send_to_domoticz(idx, value): url = f"http://{DOMOTICZ_IP}:{DOMOTICZ_PORT}/json.htm?type=command¶m=udevice&idx={idx}&nvalue=0&svalue={value}" requests.get(url) def main(): os.chdir(BASE_DIR) # Ga naar de pq_bms_bluetooth directory en activeer de virtuele omgeving direct bij aanroep os.chdir("/home/pi/pq_bms_bluetooth") subprocess.run(["python3", "-m", "venv", "venv"]) for mac, idx in devices.items(): remainAh_idx = remainAh_devices.get(mac) # Voer het commando uit binnen de virtuele omgeving result = subprocess.run( ["venv/bin/python3", "main.py", mac, "--bms"], capture_output=True, text=True ) json_output = result.stdout.strip() try: data = json.loads(json_output) SOC = data.get("SOC", "").replace('%', '') if SOC: send_to_domoticz(idx, SOC) if remainAH is not None: send_to_domoticz(remainAh_idx, remainAH) except json.JSONDecodeError: print(f"Fout bij het verwerken van JSON voor apparaat {mac}, overslaan...") if __name__ == "__main__": main() |
Geef het script de juiste rechten:
1 |
chmod +x bms.py |
Uiteaard wil je dat het scrip automatisch loopt, ook na een reboot. Open de crontab:
1 |
sudo crontab -e |
Voeg onderstaande regel toe:
1 |
*/2 * * * * sudo python3 /home/pi/bms.py >> /home/pi/bms.log 2>&1 |
Start de Raspberry Pi opnieuw op:
1 |
sudo reboot |
Nu zal het script automatisch starten en om de 2 minuten uitgevoerd worden.
Uiteraard kun je het script naar eigen wens uitbreiden en alle van onderstaande waarden naar Domoticz wegschrijven.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "packVoltage": 25530, "voltage": 25651, "batteryPack": { "1": 3.206, "2": 3.205, "3": 3.206, "4": 3.207, "5": 3.208, "6": 3.206, "7": 3.207, "8": 3.206 }, "current": 0, "remainAh": 14.47, "factoryAh": 113.0, "cellTemperature": 21, "mosfetTemperature": 21, "heat": 0, "protectState": 0, "failureState": 0, "equilibriumState": 0, "batteryState": 1, "SOC": "12%", "SOH": "113%", "dischargesCount": 12, "dischargesAHCount": 1296, "firmwareVersion": "1.0.0", "manfactureDate": "2023-12-20", "hardwareVersion": "T40-11T40-10" } |
Power Queen geeft tijdelijk een korting van maar liefst 6% op alle producten. Ga hiervoor naar de website van Power Queen en gebruik kortingscode EHOCO.NL