Blue Connect pool measurements

Has anyone had success in disassembling the BLE communications from the Blue Connect? If not, can anyone help me buy an Extender? I found a Blue Connect on eBay and getting the Extender in the US seems damn near impossible. I even called Fluidra’s US offices and they were of zero assistance.

Hallo LordMike,
Gibt es irgendwo eine brauchbare Anleitung, wie man das in Node-Red einbaut mit Flows?
Oder die Werte im Home Assistant angezeigt bekommt?
Google übersetzer:
Hello LordMike,
Is there somewhere a useful guide on how to build this into Node-Red with flows?
Or get the values ​​displayed in the Home Assistant?

Hi, I don’t read/write german, but I translated your question and:

All values from my code are sent using MQTT. I have created configurations for Home Assistant to display the values there, but any tool can use the values. Node-red can for example use the MQTT In node to read values from specific topics.

Ich benutze den Google Übersetzer, kann kein Englisch.

I use google translate, can’t speak english.

Translated:

Nun, sind wir nicht großartig.
Hast du meine vergangene Nachricht verstanden?

I don’t see any values ​​in the HomeAssistant either, only this one (see appendix). My data come over the wifi extender. The pool is too far away from the house for Bluetooth.

Try searching for your pool name, or “pool” in the entities/devices tabs.

Each pool is its own device.

Der Pool ist nicht zu finden. Im Protokoll erscheint er aber.
The pool cannot be found. However, it appears in the protocol.

BlueRiiot2MQTT
[11:26:04 INF] Loading extra config file at /data/options.json
[2021-10-14 11:26:04+00:00 INF] [MqttNet.ManagedMqttClient] Started
[2021-10-14 11:26:04+00:00 INF] [MqttNet.MqttClient] Connected.
[2021-10-14 11:26:04+00:00 INF] [Microsoft.Hosting.Lifetime] Application started. Press Ctrl+C to shut down.
[2021-10-14 11:26:04+00:00 INF] [Microsoft.Hosting.Lifetime] Hosting environment: Production
[2021-10-14 11:26:04+00:00 INF] [Microsoft.Hosting.Lifetime] Content root path: /app
[2021-10-14 11:26:05+00:00 INF] [MBW.BlueRiiot2MQTT.Service.BlueRiiotMqttService] Discovered new pool, 'Hanne und Frank' (c2a6b273-b737-4bc2-93c7-111809f7855e)
[2021-10-14 11:26:05+00:00 INF] [MBW.BlueRiiot2MQTT.Service.PoolUpdater.SingleBlueRiiotPoolWeatherUpdater] Delaying till next check on pool 'Hanne und Frank', at 10/14/2021 12:26:05, waiting 01:00:12.9979217
[2021-10-14 11:26:06+00:00 INF] [MBW.HassMQTT.HassMqttManager] Pushed 10 discovery documents, 8 values and 9 attribute changes
[2021-10-14 11:26:06+00:00 INF] [MBW.BlueRiiot2MQTT.Service.PoolUpdater.SingleBlueRiiotPoolUpdater] New data ready for **pool 'Hanne und Frank'** at 10/14/2021 12:31:00 (interval 01:12:00). Waiting 01:06:21.1147089
[2021-10-14 11:26:06+00:00 INF] [MBW.HassMQTT.HassMqttManager] Pushed 10 discovery documents, 11 values and 11 attribute changes

That’s really odd - which entities can you see in Home Assistants Integrations page?

Home assistant → Configuration → Integrations → MQTT, click “devices”.

You should be able to find “Hanne und frank” there.

Da hatte ich Fehler in der Konfiguration, jetzt läuft es.

I had errors in the configuration, now it works. thanks

It has been asked a few times if accessing the Bluetooth data directly is possible. Yes and no.

Unfortunately I have just the Blue Connect basic version and it won’t take automated measurements just twice a day. I was annoyed by this and I have spent some time (maybe too much:)) analyzing the app and the Bluetooth communication.

It is possible to fetch the RAW value from the sensor, but unfortunately I wasn’t able to decode the values. However, the raw values can be uploaded to the cloud and this way you can have as many measurements you like. Bluetooth proximity is an issue especially if you are using a Pi Zero and the sensor is further away.

The RAW value from the sensor (blue connect) is a byte array that in hex looks like this: 23ab093207ab0a7800240e

Unfortunately the only value I was able to decode was the temperature that is ab09 in BIG INDIAN, that means hex 09ab = 2475 = 24.75C. Theoretically the next 2 bytes should be the ph (unsigned short from 2 bytes big_endian), followed by orp another 2 bytes and conductivity.

The application (mobile app) had some logic to decode the raw value but never was really used in the application and the decoding function does not work properly. The app will upload the raw values to the cloud, where the decoding magic will happens. Then, the app will fetch the processed information from the cloud.

Unless someone can figure out how to convert the RAW values to real numbers, connecting to the device via Bluetooth will not solve much.

Some example for RAW data and corresponding values from the cloud:

23ab093207ab0a7800240e
"salinity":4.9,"conductivity":8742,"temperature":24.8,"ph":7.93,"orp":685

23a6093007b70a78001e0e
"salinity":4.9,"conductivity":8742,"temperature":24.7,"ph":7.94,"orp":688,

23ab093407980a7b00240e
"salinity":4.8,"conductivity":8528,"temperature":24.8,"ph":7.92,"orp":680

Thought I would add a comment for anyone in Australia, and in particular Sydney who is interested in purchasing a Blue Connect. I just got one but have been worried as I was unable to get an extender, no one had any stock. Completely unexpected, the Sigfox wireless works, at least for me in the north west of Sydney.

Connected without issue and is sending about 20 readings a day. Extremely impressed.

I’m using the BlueRiiot2MQTT add-on, again it just works. Couldn’t have been easier to setup and after a very long time trying I have the chemical balance and temperature of my pool available.

1 Like

I initially had luck getting sigfox coverage but it went down to a couple updates a day, and sometimes nothing for a few days. I bought the extender (around $100aud) and it’s been really good.

First blue connect failed (no readings and couldn’t connect to the unit) but fluidra/astral replaced it under warranty, no questions asked.

I have decoded all the hex values, except salinity, which escapes me as I think the data is not direct, but in part derived from others.
For the rest I think I have it 99% right, based on a lot of tests, and it matches yours above, except for some reason my ORP calculation from hex is 2 points lower than your cloud data - does your cloud data match what the official app says? For the first case I decode to 682.75 rather than your 685. I’m surprised as my code for ORP always matches my official app values.

In any case, how did you get that much precision from the cloud data? On lordmike’s polling I’m only getting the same precision as the app, which is not much (one decimal place for ph).

Can you share how you managed the bluetooth connection and data retrieval? I tried for some time and so far could only get the raw dump by background logging the app connection, but cannot get to trigger the reading myself. I’m happy to share my hex decode code.

hi @ggggg ,

I got the numbers directly form the cloud api. There is an endpoint that will return historical measurements. (swimming_pool/{swimming_pool_id}/blue/{blue_device_serial}/lastMeasurements?)

This is how I managed to get the raw values from the device. pseudo code:

blue_device = blueClient.searchDevice(name=BLUE_DEVICE_NAME)
BLUE_TAKE_MEASURE_SERVICE = "F3300003-F0A2-9B06-0C59-1BC4763B5C00"
blueClient.enableNotifications(blue_device, BLUE_TAKE_MEASURE_SERVICE)   # write \x01\x00 to this characteristics

blueClient.setNotificationCallback(myNotificationCallback) 

# get sensor characteristic
BLUE_REQUEST_SENSOR_DATA = "F3300002-F0A2-9B06-0C59-1BC4763B5C00"
blueClient.requestMeasurements(BLUE_REQUEST_SENSOR_DATA)


def myNotificationCallback(client, characteristic, data):
    print("Notification received ...")
    print(data.hex())
    print("Sending results up to the cloud ...")
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait([asyncio.ensure_future(
        uploadMeasurements(data.hex()))]))
    loop.close()

I choose to search directly for the device name, you can enumerate all Bluetooth devices and search for the service “F3300001-F0A2-9B06-0C59-1BC4763B5C00” but that’s quite slow.

I am keen to see how you decoded the hex values.

PS: even with the raw values I would still use lordmike’s integration because that will pull much more information from the web. The raw values would be useful for someone who doesn’t want to use the cloud integration at all.

Thanks, I’ll try that!
Can you check if this works for you for ORP values?
((HEX2DEC(*7th_hex_pair*))*64)+(HEX2DEC(*6th_hex_pair*)/4)
for example in your third case:
((HEX2DEC("0a"))*64)+(HEX2DEC("98")/4) = 678.00
It matches exactly the values on my app, but surprised your value is 2 points off.

Try that one and check and I can follow up with ph values, which are not as clean a formula, but work for me.

Regarding the cloud api, do you mean the values returned from lordmike’s code? I can’t find that path in the mqtt messages I get.

The cloud api endpoint is directly from the mobile app.

For others trying to find Extenders, they seem to be readily available on German eBay. I had to use a reshipping service like myGermany, and that cost another $50, but I was able to get an Extender shipped and installed at my house.

23d4088307ab0a7d00270e → in the app I have 685.

Interesting! maybe there’s some sort of offset for each device. Mine is spot on with that formula.

Sorry again, when you say the cloud api endpoint is directly from the app, do you mean you took the url from the app code? Is that url available somewhere? I thought that’s what lordmike’s code did, but it doesn’t expose that specific data on my mqtt messages