diy solar

diy solar

Monitoring Bluetti Systems

Very interesting work. As far as I could see this relies on the bluetooth connection. Is there a way to connect to e.g. the AC300 via Wifi?

Thanks
 
Oops, just realized I wasn't getting email notifications.

As far as I could see this relies on the bluetooth connection. Is there a way to connect to e.g. the AC300 via Wifi?
@NiklasG I currently have no plans to support wifi. I don't know of any way to connect to the AC300 directly over wifi (it's got open ports on it, but I don't know how to talk to them). The only way I know to control it over wifi is to have it connect to your network, change the DNS server you send it over DHCP to one you control and which publishes an A record to point iot.bluettipower.com to your own server. If you do all these things the communications protocol is nearly identical to the one over bluetooth. I have a working implementation in Ruby, but it's too difficult for a non-technical user to get set up at the moment, so I'm not really interested in supporting it. Is there a particular reason you'd rather control it over wifi?

do you plan a HACS -Integration for home assistant?
@Thanatos Maybe? I considered this when I was starting to write things, but I wasn't sure how many people actually want to place their home assistant server close enough to their Bluetti product to be in bluetooth range. Development has currently slowed because I kinda burned myself out on this spending most weekends working on it for 4 months.

if I can help with development in any way I'd love to!
@jonnycyborg I am definitely not a lawyer, but I have intentionally avoided decompiling any of the app source code because it's fairly clear that even if that act might be legal in some jurisdictions, using the results of the decompilation is much much less so. I'd really rather not set up an opportunity for Bluetti to sue me, and in the US at least, using Wireshark to collect packet traces and reverse engineering that way is legal. If you're interested in helping, providing bluetooth captures of the app talking to the EB3A and doing specific things would be super helpful.

LowerStatusPageParser has a different offset and length
@jonnycyborg Do you mean that the app polls at a different offset and length, or do you mean that when you send a
QueryRangeCommand(0x00, 0x00, 0x46) that you get an error from the EB3A? All the other devices I've seen start at 0x0A, but I didn't see much downside to collecting those extra bytes at the beginning (although I guess it's probably wasteful to poll them if I'm not going to use them).

MidStatusPageParser and ControlPageParser were returning unexpected results so temporarily had to remove from polling
@jonnycyborg Do you mean that they weren't working at all, or just that the data in them didn't look right after parsing? If they were working but had odd data I'd be curious if you can run the bluetti-logger command included in the python package and email/PM me the data. I'm currently not recommending people post full logs anywhere because I don't know whether the device serial numbers are private or not.

Due to the different app/firmware/protocol versions, it'll be quite the task to support all devices, but I hope we can take this info and start adding support for new devices like the EB3A.
I have logs from the EP500, AC300, and AC200M, so it shouldn't be that difficult. The current architecture is clearly not going to scale if I want to support every Bluetti device, but I have some ideas about how to restructure things to make that feasible.
 
@chromedshark
thank you very much for your wonderful work.
Since Bluetti does not offer a logging function, a simple integration via HACS would make a lot of sense.
Anyone who has an AC 300 and home assistant would certainly place both close to each other to connect via Bluetooth.
You put a lot of effort into developing this. With a HACS integration it would be available to all home assistant users and your hard work would be recognized and made available to many users.
For the problem with the low transmission range of Bluetooth, I could try to tinker something that sends the Bluetooth data with an ESP32 via WiFi.
 
Last edited:
I wasn't sure how many people actually want to place their home assistant server close enough to their Bluetti product to be in bluetooth range. Development has currently slowed because I kinda burned myself out on this spending most weekends working on it for 4 months.

@chromedshark - there are a lot of us that certainly appreciate your work

Would you consider a donation or similar page so we could support you ?

Re Home Assistant; perhaps even your own repo on the Add On store, similar to this
 
Last edited:
@chromedshark - Thankyou for pulling this together - very impressive!

While I couldn't follow how you backwards engineered the protocol I was able to get the code running and monitoring my AC200Max which arrived today :)

the values posted to mqtt make sense except for ac_output_mode - are you able to explain what you have defined in class OutputMode:
STOP = 0
INVERTER_OUTPUT = 1
BYPASS_OUTPUT_C = 2
BYPASS_OUTPUT_D = 3
LOAD_MATCHING = 4

STOP is obvious but the others??

Thankyou
 
the values posted to mqtt make sense except for ac_output_mode - are you able to explain what you have defined in class OutputMode
I'm fairly certain that only STOP and INVERTER_OUTPUT apply for the AC200M. The other 3 values have to do with how some of Bluetti's device can pass through AC power direct from the wall. There's a post on the official Bluetti forums detailing the other three modes.
 
Would you consider a donation or similar page so we could support you ?
I'd feel bad accepting money for something that I'm not providing any guarantees for. I'm working on this because I enjoy it, which sometimes means that I need to take a break to keep going.

Another developer submitted a patch to add Home Assistant auto-discovery, and based on my testing today it looks close to something I can release. Personally I spent my Sunday laying the groundwork for EB3A support, with the next thing on my mind being support for multiple attached battery packs. After that I'll have to see what's involved in doing an add-on build for Home Assistant (or maybe somebody will beat me to it).
 
I'm fairly certain that only STOP and INVERTER_OUTPUT apply for the AC200M. The other 3 values have to do with how some of Bluetti's device can pass through AC power direct from the wall. There's a post on the official Bluetti forums detailing the other three modes.
For my my unit I have seen at least 3 of the states in my testing:
  • STOP - ac and dc off
  • INVERTER_OUTPUT - running without the charger connected
  • BYPASS_OUTPUT_C - running with the charger when I first purchased the unit and testing out light loads from DC and AC

This aligns with the definitions in the post you linked!

Would love to see the definitions added to the class or maybe publish some custom attributes like charging, bypass, etc… just an idea… will raise an issue on git and go from there :)

BTW I noticed there are commands to turn AC/DC on and off but in the app we can turn the whole unit off. - did you happen figure out what to write to execute this function?

Thankyou!
 
great tool - due to Bluetti does not provide any logging function out of the box. Many thanks for your excellent work.
I've your tool running on a Raspberry Pi 3B and log the data via iobroker.

1.) My device is a AC300 with two B300 (Pack 2 and Pack 3) and I'm litte bit confused about the output of the tool. Let me shortly explain:

MidStatusPageParser(ac_output_mode=BYPASS_OUTPUT_D, internal_ac_voltage=226.7V, internal_current_one=0.1A, internal_power_one=23W, internal_ac_frequency=50Hz, internal_current_two=1.3A, internal_power_two=299W, ac_input_voltage=225.2V, internal_current_three=1.1A, internal_power_three=223W, ac_input_frequency=50Hz, dc_input_voltage=66.6V, dc_input_power=13W, dc_input_current=0.2, pack_num_max=4, pack_num=4, pack_battery_percent=21%, pack_voltages=[Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')])

App on my Mobile shows: Pack 2: 10% and Pack 3: 32% - total 21%
internal_power_two=299W - this value seems to be right
internal_power_tree=223W - this value must be totally wrong

2.) Also the pack_voltages are always 0

3.) the script sometimes randomly get a "Device disconnected" message and it seems to try to login again. But this seems to fail and
the script does not exit

DEBUG:root:Got a message from BluettiDevice(address='xx:xx:xx:xx:xx:xx', type='AC300', sn='xxx'): ControlPageParser(ups_mode=PV_PRIORITY, pack_num=1, ac_output_on=True, dc_output_on=False, grid_charge_on=False, time_control_on=True, battery_range_start=20%, battery_range_end=100%, auto_sleep_mode=ONE_MINUTE)
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx/service000f/char0013): ['org.bluez.GattCharacteristic1', {'WriteAcquired': <dbus_next.signature.Variant ('b', True)>}, []]
DEBUG:bleak.backends.bluezdbus.client:Write Characteristic 0000ff02-0000-1000-8000-00805f9b34fb | /org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx/service000f/char0013: b'\x01\x03\x00\x00\x00F\xc48'
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx/service000f/char0013): ['org.bluez.GattCharacteristic1', {'WriteAcquired': <dbus_next.signature.Variant ('b', False)>}, []]
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx): ['org.bluez.Device1', {'ServicesResolved': <dbus_next.signature.Variant ('b', False)>, 'Connected': <dbus_next.signature.Variant ('b', False)>}, []]
DEBUG:bleak.backends.bluezdbus.client:Device disconnected (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx)
DEBUG:bleak.backends.bluezdbus.client:_cleanup_all(/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx)
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx/service000f/char0010): ['org.bluez.GattCharacteristic1', {'Notifying': <dbus_next.signature.Variant ('b', False)>}, []]
DEBUG:bleak.backends.bluezdbus.client:Disconnecting (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx)
DEBUG:bleak.backends.bluezdbus.client:already disconnected (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx)
DEBUG:bleak.backends.bluezdbus.client:Connecting to device @ xx:xx:xx:xx:xx:xx with hci0
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx): ['org.bluez.Device1', {'Connected': <dbus_next.signature.Variant ('b', True)>}, []]
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx): ['org.bluez.Device1', {'ServicesResolved': <dbus_next.signature.Variant ('b', True)>}, []]
DEBUG:bleak.backends.bluezdbus.manager:received D-Bus signal: org.freedesktop.DBus.Properties.PropertiesChanged (/org/bluez/hci0/dev_xx_xx_xx_xx_xx_xx/service000f/char0010): ['org.bluez.GattCharacteristic1', {'Notifying': <dbus_next.signature.Variant ('b', True)>}, []]

4.) internal_power_one=65365W (example)
in the logfile, I can often see, that internal_power_one value is over 65000 - maybe this a negative values?
examples:
internal_power_one=814W,
internal_power_one=842W,
internal_power_one=65344W,
internal_power_one=65354W,
internal_power_one=65365W,
internal_power_one=65343W,
internal_power_one=65367W,
internal_power_one=1074W,
internal_power_one=809W,
internal_power_one=821W,
internal_power_one=65370W,
internal_power_one=65370W,
internal_power_one=65359W,
internal_power_one=65132W,

Please let me know if you need more details and/or a logfile from my device.

Many thanks!
René
 
Last edited:
Thanks for doing this - I'm going to start playing with this - my end goal is putting this information into Home Assistant - would love it if I could figure out how to get this running on a esp32 w/ ESPHome
Hello, everyone

At this point, many thanks again to the programmers of the bluetti-mqtt :giggle:. Is it currently possible to use the code from Github (bluetti-mqtt) with an ESP32? Or does someone know how to set it up?

Thank you for your help.
 
Is it currently possible to use the code from Github (bluetti-mqtt) with an ESP32? Or does someone know how to set it up?
My guess is that it’s not possible. Typically you’d need to use micro python with the ESP32, and there are a lot of things that wouldn’t work there (Bleak & asyncio, just to start). It’s possible the parsing code would run in micro python, but you’d likely need to rewrite everything else.
 
My device is a AC300 with two B300 (Pack 2 and Pack 3) and I'm litte bit confused about the output of the tool
Yeah, I’ve noticed that the ”internal” values I’m pulling sometimes make absolutely no sense, but they’re not always bad or I wouldn’t be bothering. Feel free to ignore them.

The battery voltages are always 0 because I haven’t yet written any code to page through each of the attached batteries. My goal is to do that next.
 
hello, i run the bluetti-mqtt on an raspberry pi ... is it poaaible to run this in backgruond or on startup an backgrount.
at this time the mqtt updates stop when i close the session
 
is it poaaible to run this in backgruond or on startup an backgrount
Linux instructions can be... complicated, but assuming that you're using a modern Raspberry Pi distro, you should be able to use systemd.

You'll want to take the following and write it to a file called /etc/systemd/system/bluetti-mqtt.service, after first modifying the User=your_username_here and adjusting the ExecStart line with the correct config.

Code:
[Unit]
Description=Bluetti MQTT
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=30
TimeoutStopSec=15
User=your_username_here
ExecStart=/home/your_username_here/.local/bin/bluetti-mqtt [MQTT_BROKER_HOST] 00:11:22:33:44:55

[Install]
WantedBy=multi-user.target

Once you've done that, you can run sudo systemctl start bluetti-mqtt to start the service (as well as stop or restart). To configure the service to start automatically at boot, you'll need to run sudo systemctl enable bluetti-mqtt.
 
Great work here! I just signed up here as this may be the only resource at the moment where you can find information on bluettis bluetooth programming. I am currently trying to receive the incoming watts from the DC input via ESP32. However, I am not a bluetooth expert. But I have a small program hull that apparently connects to the Bluetti. However, I don't have a valid 'characteristings' ID, which in my sample code should look something like '"beb5483e-36e1-4688-b7f5-ea07361b26a8"'. I was hoping in the Python code posted here to find this information. In 'ep500p.py' this information seems to be there, but I don't know how to convert it to the above format?

Can anyone help me further?
 
I am running the Home Assistant natively on an Intel NUC which has got a Bluetooth built in.
Is there a way to run the Bluetti_MQTT also natively on that Intel NUC to have all in one Box ?
If not on which hardware/software environment are you running it ? If you use an USB-Stick for Bluetooth, what model ?
BTW: i have a Bluetti EP500 Pro which has 2 DC Inputs, DC1 and DC2 but the Bluetti App only displays the summary as PV-Input.
Only on the LCD Display I can view the 2 different DC Inputs.
Since I have 2 different PV Strings attached to the DC inputs it would be interesting to have a separate history.
Did you see in your traces also Values from multiple DC inputs ? DC1 and DC2 ?
 

Attachments

  • IMG_1689.jpeg
    IMG_1689.jpeg
    589.7 KB · Views: 3
I just updated my Raspberry PI to the latest software and then tried to install the package, but if I understand it right it does not support my python 3.7.3 ?
Or is something else missing on the PI ?

pi@raspberrypi:~ $ python3 --version
Python 3.7.3
pi@raspberrypi:~ $ pip install bluetti_mqtt
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bluetti_mqtt
Downloading https://files.pythonhosted.org/pack...3d4663b95e59c6aa0572c/bluetti_mqtt-0.1.tar.gz
Collecting bleak (from bluetti_mqtt)
Downloading https://files.pythonhosted.org/pack...e618d8dfa40/bleak-0.15.1-py2.py3-none-any.whl (123kB)
100% |████████████████████████████████| 133kB 1.1MB/s
Collecting crcmod (from bluetti_mqtt)
Downloading https://files.pythonhosted.org/pack...18e0b7f6826a043ca1245dd4e5b/crcmod-1.7.tar.gz (89kB)
100% |████████████████████████████████| 92kB 1.1MB/s
Collecting typing-extensions>=4.2.0 (from bleak->bluetti_mqtt)
Could not find a version that satisfies the requirement typing-extensions>=4.2.0 (from bleak->bluetti_mqtt) (from versions: 3.6.2, 3.6.2.1, 3.6.5, 3.6.6, 3.7.2, 3.7.4, 3.7.4.1, 3.7.4.2, 3.7.4.3, 3.10.0.0, 3.10.0.1, 3.10.0.2)
No matching distribution found for typing-extensions>=4.2.0 (from bleak->bluetti_mqtt)
 
I am currently trying to receive the incoming watts from the DC input via ESP32
@Tinkerpete Normally with a BLE device you can just read a specific characteristic to get the data you want, but the Bluetti is unfortunately more complicated than that.

There are two characteristics I've been using to communicate with the device. Commands are written to the write characteristic "0000ff02-0000-1000-8000-00805f9b34fb", and the response is received as a notification on the notify characteristic '0000ff01-0000-1000-8000-00805f9b34fb' (both of these can be found in client.py).

The basic algorithm for collecting the information you want is to register for notifications on the notify characteristic, build the command payload to request the data you want, write that to the write characteristic, and then wait until you receive the data you asked for (or a myriad things go wrong and you have to retry sending the command). If all you want is the "dc_input_power", you should be able to use QueryRangeCommand(0x00, 0x24, 1) to get what you want, and because this payload response should fit in a single packet you wouldn't have to deal with re-assembly.
 
if I understand it right it does not support my python 3.7.3 ?
Or is something else missing on the PI
I'm still a bit of a novice with Python, but I think if you run pip install 'bleak==0.14.3' it'll install a version of Bleak that is compatible with Python 3.7. Once that's done you should be able to run pip install bluetti_mqtt?
 
Since I have 2 different PV Strings attached to the DC inputs it would be interesting to have a separate history.
Did you see in your traces also Values from multiple DC inputs ? DC1 and DC2 ?
As far as I can tell only DC1 details are available over bluetooth. In theory there might be some way to switch it from reporting DC1 to DC2 to get both, but I haven't been able to figure out how to do that.
 
I'm still a bit of a novice with Python, but I think if you run pip install 'bleak==0.14.3' it'll install a version of Bleak that is compatible with Python 3.7. Once that's done you should be able to run pip install bluetti_mqtt?

Did not work:
pip install 'bleak==0.14.3'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bleak==0.14.3
Downloading https://files.pythonhosted.org/pack...31bfa9447f5/bleak-0.14.3-py2.py3-none-any.whl (113kB)
100% |████████████████████████████████| 122kB 1.2MB/s
Collecting dbus-next; platform_system == "Linux" (from bleak==0.14.3)
Could not find a version that satisfies the requirement dbus-next; platform_system == "Linux" (from bleak==0.14.3) (from versions: )
No matching distribution found for dbus-next; platform_system == "Linux" (from bleak==0.14.3)

But I think the error-message is regarding "typing-extensions", so I tried to install the Version from the error message (If I don't specify a version, then typing-extensions-3.10.0.2 is installed and that still doesn't allow to install the Bluetti Matt)
pip install 'typing-extensions==4.2.0'
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting typing-extensions==4.2.0
Could not find a version that satisfies the requirement typing-extensions==4.2.0 (from versions: 3.6.2, 3.6.2.1, 3.6.5, 3.6.6, 3.7.2, 3.7.4, 3.7.4.1, 3.7.4.2, 3.7.4.3, 3.10.0.0, 3.10.0.1, 3.10.0.2)
No matching distribution found for typing-extensions==4.2.0
 
There are two characteristics I've been using to communicate with the device. Commands are written to the write characteristic "0000ff02-0000-1000-8000-00805f9b34fb", and the response is received as a notification on the notify characteristic '0000ff01-0000-1000-8000-00805f9b34fb' (both of these can be found in client.py).

The basic algorithm for collecting the information you want is to register for notifications on the notify characteristic, build the command payload to request the data you want, write that to the write characteristic, and then wait until you receive the data you asked for (or a myriad things go wrong and you have to retry sending the command).
@chromedshark: Thank you for the quick reply! The two characteristics you mentioned help me a bit. Anyway, now I get a complete connect done!

But I'm afraid, I have to deal with the procedure in more detail, since I'm programming in C++. Unfortunately I forgot to mention this in my original request.

Since I don't know Python that well, any details you can give me would be greatly appreciated.
 
Did not work:
I had success with:

C:\Users\Thomas\AppData\Local\Programs\Python\Python310>python.exe -m pip install --upgrade pip
C:\Users\Thomas\AppData\Local\Programs\Python\Python310\Scripts>pip install 'bleak'
C:\Users\Thomas\AppData\Local\Programs\Python\Python310\Scripts>pip install bluetti_mqtt
 
Last edited:
I had success with:

C:\Users\Thomas\AppData\Local\Programs\Python\Python310>python.exe -m pip install --upgrade pip
C:\Users\Thomas\AppData\Local\Programs\Python\Python310\Scripts>pip install 'bleak'
C:\Users\Thomas\AppData\Local\Programs\Python\Python310\Scripts>pip install bluetti_mqtt
I tried the same on my Raspberry, no luck. Still the same error message:

pi@raspberrypi:~ $ pip install --upgrade pip
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pip
Downloading https://files.pythonhosted.org/pack...d2d02789accf7/pip-20.3.4-py2.py3-none-any.whl (1.5MB)
100% |████████████████████████████████| 1.5MB 250kB/s
Installing collected packages: pip
Successfully installed pip-20.3.4


pi@raspberrypi:~ $ pip install 'bleak'
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bleak
Downloading bleak-0.16.0-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 1.3 MB/s
ERROR: Could not find a version that satisfies the requirement typing-extensions>=4.2.0 (from bleak) (from versions: 3.6.2, 3.6.2.1, 3.6.5, 3.6.6, 3.7.2, 3.7.4, 3.7.4.1, 3.7.4.2, 3.7.4.3, 3.10.0.0, 3.10.0.1, 3.10.0.2)
ERROR: No matching distribution found for typing-extensions>=4.2.0 (from bleak)
pi@raspberrypi:~ $
pi@raspberrypi:~ $ pip install bluetti_mqtt
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bluetti_mqtt
Using cached bluetti_mqtt-0.1.tar.gz (5.8 kB)
Collecting bleak
Using cached bleak-0.16.0-py2.py3-none-any.whl (125 kB)
Collecting crcmod
Using cached crcmod-1.7.tar.gz (89 kB)
ERROR: Could not find a version that satisfies the requirement typing-extensions>=4.2.0 (from bleak->bluetti_mqtt) (from versions: 3.6.2, 3.6.2.1, 3.6.5, 3.6.6, 3.7.2, 3.7.4, 3.7.4.1, 3.7.4.2, 3.7.4.3, 3.10.0.0, 3.10.0.1, 3.10.0.2)
ERROR: No matching distribution found for typing-extensions>=4.2.0 (from bleak->bluetti_mqtt)
 

diy solar

diy solar
Back
Top