SOLVED
For Windows 10 use the BLED112 Bluetooth Low Energy dongle.
I have used pygatt (
https://github.com/peplin/pygatt)
also useful
https://sigrok.org/wiki/EEVBlog_121GW121GW firmware 2.02
Example Python code (Python 3.

from binascii import hexlify
from datetime import datetime
import pygatt
import logging
import time
# logging.basicConfig()
# logging.getLogger('pygatt').setLevel(logging.DEBUG)
# The BGAPI backend will attempt to auto-discover the serial device name of the
# attached BGAPI-compatible USB adapter.
# GATTTool only works under Linux
# adapter = pygatt.backends.GATTToolBackend()
# adapter = pygatt.BGAPIBackend()
adapter = pygatt.BGAPIBackend(serial_port='COM3')
def callback_func(handle, data):
global count
global prevTimeStamp
timestamp = datetime.now()
timeDelta = (timestamp - prevTimeStamp).microseconds
print("§§§ in callback: handle:", handle)
print("§§§ in callback: raw data:", data)
# print("§§§ in callback: hex data: %s" % hexlify(data))
print("§§§ in callback: str data:", hexlify(data).decode('utf-8'))
print("§§§ in callback: str data length:", len(hexlify(data).decode('utf-8')))
print("§§§ timedelta: ", timeDelta)
prevTimeStamp = timestamp
count = count + 1
print("§§§ count:", count)
print("")
prevTimeStamp = datetime.now()
print(prevTimeStamp)
count = 0
try:
print("§§§ before start")
adapter.start()
"""
result = adapter.scan(timeout=5)
for item in result:
scan_name = item['name']
scan_rssi = item['rssi']
scan_address = item['address']
print(scan_address, scan_name, scan_rssi)
"""
print("§§§ after start. adapter: ", adapter)
device = adapter.connect('88:6B:0F:D3:0C:CF')
print("§§§ after connect. device: ", device)
print("§§§ rssi:", device.get_rssi())
# uuid here has to be a characteristic, like 121GW multimeter custom characteristic:
# you cannot read this characteristic directly. it is WRITE, INDICATE. you have to subscribe it.
uuid = "e7add780-b042-4876-aae1-112855353cc1"
print("§§§ read handle:", device.get_handle(uuid))
device.subscribe(uuid, callback=callback_func, indication=True)
print("§§§ after subscribe")
print("§§§ before sleep")
time.sleep(5)
print("§§§ after sleep")
finally:
adapter.stop()
With the 7th reading you get a stable sequence of one reading returns 0xf2 and the following 0x17... (36 char)
With the first byte 0xf2: primary display: byte 6 mode, byte 7 range, byte 8 & 9 value; secondary display: byte 10: mode, byte 11: range?, bytes 12 & 13 value
Range is 0x02 corresponds with the 3rd range in the datasheet. If the reading would be negative the range would be 42 not 02
mode 01 = VDC
mode 03 = mVDC
mode 04 = mVAC
mode 09 = ohm
not complete...
example
volt DC 1.2940 to hex 0x328c , sec display temp 22.0 hex 0xdc, range to 5VDC, range 0x00, mode 0x01
example = 'f2178000000100328c640100de00060a40002d'