Giter VIP home page Giter VIP logo

cometblue's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cometblue's Issues

connect: Device or resource busy (16)

After some time, the communiation gets stuck and I have to restart bluetoothd. Any ideas how to fix this?

root@orangepioneplus:~# cometblue -f shell-var device -p 0000 B7:1E:5A:99:BF:21 get temperatures
Traceback (most recent call last):
  File "/usr/local/bin/cometblue", line 10, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/cometblue/cli.py", line 682, in main
    return _main(obj=_ContextObj())
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/cometblue/cli.py", line 622, in real_get_fn
    pin=ctx.obj.pin) as device:
  File "/usr/local/lib/python2.7/dist-packages/cometblue/device.py", line 450, in __enter__
    security_level=self._security_level)
RuntimeError: connect: Device or resource busy (16)
root@orangepioneplus:~# service bluetooth restart
root@orangepioneplus:~# cometblue -f shell-var device -p 0000 B7:1E:5A:99:BF:21 get temperatures
COMETBLUE_CURRENT_TEMP='24.500000'
COMETBLUE_MANUAL_TEMP='24.000000'
COMETBLUE_TARGET_TEMP_L='19.000000'
COMETBLUE_TARGET_TEMP_H='22.000000'
COMETBLUE_OFFSET_TEMP='0.000000'
COMETBLUE_WINDOW_OPEN_DETECTION='4'
COMETBLUE_WINDOW_OPEN_MINUTES='10'
root@orangepioneplus:~# 

ERROR:root:Error parsing

Hi,
I am failing to install cometblue on Raspian Jessie (Raspberry Pi 3) :

sudo python setup.py install
returns error ...

ERROR:root:Error parsing
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/pbr/core.py", line 111, in per
    attrs = util.cfg_to_args(path, dist.script_args)
  File "/usr/local/lib/python2.7/dist-packages/pbr/util.py", line 246, in cfg_to_args
    pbr.hooks.setup_hook(config)
  File "/usr/local/lib/python2.7/dist-packages/pbr/hooks/__init__.py", line 25, in setup_hook
    metadata_config.run()
  File "/usr/local/lib/python2.7/dist-packages/pbr/hooks/base.py", line 27, in run
    self.hook()
  File "/usr/local/lib/python2.7/dist-packages/pbr/hooks/metadata.py", line 26, in hook
    self.config['name'], self.config.get('version', None))
  File "/usr/local/lib/python2.7/dist-packages/pbr/packaging.py", line 725, in get_version
    raise Exception("Versioning for this project requires either an sdist"
Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?
error in setup command: Error parsing /home/pi/cometblue/cometblue-master/setup.cfg: Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed?

for your information

pip install -r requirements.txt

gave no errors

Requirement already satisfied (use --upgrade to upgrade): click in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): gattlib in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): pbr in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): shellescape in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 4))
Requirement already satisfied (use --upgrade to upgrade): six in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): tabulate in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 6))
Cleaning up...

Can anyone please help?

Compilation error

Hello,

I'm struggling to install cometblue package.
Everytime I get compilation error as following:
` Running setup.py install for gattlib ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;file='/tmp/pip-build-ugYcrn/gattlib/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-zqA0pP-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_ext
building 'gattlib' extension
creating build
creating build/temp.linux-armv7l-2.7
creating build/temp.linux-armv7l-2.7/src
creating build/temp.linux-armv7l-2.7/src/bluez
creating build/temp.linux-armv7l-2.7/src/bluez/lib
creating build/temp.linux-armv7l-2.7/src/bluez/attrib
creating build/temp.linux-armv7l-2.7/src/bluez/src
creating build/temp.linux-armv7l-2.7/src/bluez/src/shared
creating build/temp.linux-armv7l-2.7/src/bluez/btio
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -DVERSION="5.25" -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -Isrc/bluez -I/usr/include/python2.7 -c src/gattservices.cpp -o build/temp.linux-armv7l-2.7/src/gattservices.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
src/gattservices.cpp:6:33: fatal error: bluetooth/bluetooth.h: No such file or directory
compilation terminated.
error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1

----------------------------------------

Command "/usr/bin/python -u -c "import setuptools, tokenize;file='/tmp/pip-build-ugYcrn/gattlib/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-zqA0pP-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-ugYcrn/gattlib/`
no matter if I'm installing as root or regular user. Python version 2.7.12/3.5.2

What am I missing?

Regards
Damian

Doesn't work on latest Debian, gattlib exception

Traceback (most recent call last):
File "/usr/local/bin/cometblue", line 6, in
from cometblue.cli import main
File "/usr/local/lib/python3.9/dist-packages/cometblue/cli.py", line 17, in
import cometblue.device
File "/usr/local/lib/python3.9/dist-packages/cometblue/device.py", line 10, in
import gattlib
SystemError: initialization of gattlib raised unreported exception

Compiled on Debian Unstable. Also had to investigate which deps gattlib has, which isn't documented here unfortunately.
(which are: libboost-thread-dev libboost-python-dev libbluetooth-dev)

strace -f cometblue 2>&1 | grep -i gatt

newfstatat(AT_FDCWD, "/usr/local/lib/python3.9/dist-packages/gattlib.cpython-39-x86_64-linux-gnu.so", {st_mode=S_IFREG|0755, st_size=4930568, ...}, 0) = 0
openat(AT_FDCWD, "/usr/local/lib/python3.9/dist-packages/gattlib.cpython-39-x86_64-linux-gnu.so", O_RDONLY|O_CLOEXEC) = 3

python3 -V

Python 3.9.9

Reading values changes them!

Hi,
I'd like to use this nice piece of code to read the temperatures from my house and see if my setting are good (if my house is cooling down when I leave and warming up again before I come back.
I have more foreseen, but one step at a time.
Here's my issue: I did setup a script that "calls" all me devices every 15 minutes and fills a DB with the values. Every time I activate this I have about 50% of my devices loosing their config over a single day. Typically one value is missing: I have 2 open/close cycles and when I open the iOS app, I can only see 3 values instead of 4.
Did anyone experience this?
I was thinking about using only the "backup" command and then splitting the JSON inside my script, but I'm afraid I'll just invest a few hours to come to the same result :(

Hereby my script just in case someone would like to do something similar:

`#!/bin/bash

#read the devices from the DB

declare -A myDevices
deviceCount=0 # I have to keep track of it as my 2D array is simulated and Bash can't really loop them itself
declare -A myMeasures

while read device
do
devices+=("$device")
done < <(mysql -u CometBlue -pCometBluePass -D CometBlue --host localhost -BN -e "select id , '|', MAC, '|', PIN, '|', Name , '|', description from devices;")

#read the array of devices and split the lines to get the details into a bigger 2D table

for device in "${devices[@]}"
do
#echo "Device: " $device
((deviceCount++))
IFS='|' read -r -a array <<< "$device"
#trimming the whitespaces... should probably be done at "read" part rather than here :(
trimmed_ID=$(echo ${array[0]} | xargs)
myDevices[$trimmed_ID, MAC]=$(echo ${array[1]} | xargs)
myDevices[$trimmed_ID, PIN]=${array[2]}
myDevices[$trimmed_ID, Name]=${array[3]}
myDevices[$trimmed_ID, Description]=${array[4]}
done

#read the data from the CometBlues
for ((cptr=1; cptr<=$deviceCount; cptr++))
do
myMeasures[$cptr, MAC]=${myDevices[$cptr, MAC]}
echo ============================================================
echo $cptr - ${myDevices[$cptr, Description]} - ${myDevices[$cptr, MAC]}
echo ============================================================

counter=0
temperatures=""
until [ "$temperatures" ]
do
	((counter++))
	echo "Temperatures, try "$counter
	temperatures=$(cometblue device -p ${myDevices[$cptr, PIN]} ${myDevices[$cptr, MAC]} get temperatures 2>/dev/null)
	if [ $counter -ge 5 ]
		then break
	fi
	
done


#echo "temperatures " $temperatures
myMeasures[$cptr, t_current]=$(echo $temperatures | awk '{print ($3)}')
myMeasures[$cptr, t_manual_mode]=$(echo $temperatures | awk '{print ($9)}')
myMeasures[$cptr, t_target_low]=$(echo $temperatures | awk '{print ($14)}')
myMeasures[$cptr, t_target_high]=$(echo $temperatures | awk '{print ($19)}')
myMeasures[$cptr, t_offset]=$(echo $temperatures | awk '{print ($23)}')
myMeasures[$cptr, W_open_detection]=$(echo $temperatures | awk '{print ($28)}')
myMeasures[$cptr, W_open_minutes]=$(echo $temperatures | awk '{print ($32)}')


counter=0
until [ "${myMeasures[$cptr, Battery]}" ]
do
	((counter++))
	echo "Battery, try "$counter
	myMeasures[$cptr, Battery]=$(cometblue device -p ${myDevices[$cptr, PIN]} ${myDevices[$cptr, MAC]} get battery 2>/dev/null)
	if [ $counter -ge 5 ]
		then break
	fi
done
#remove the % sign
myMeasures[$cptr, Battery]=${myMeasures[$cptr, Battery]//%}



echo "Battery: "${myMeasures[$cptr, Battery]}"%"
echo "T_current: "${myMeasures[$cptr, t_current]}"°C"
echo "T_manual: "${myMeasures[$cptr, t_manual_mode]}"°C"
echo "T_target_low: "${myMeasures[$cptr, t_target_low]}"°C"
echo "T_target_high: "${myMeasures[$cptr, t_target_high]}"°C"
echo "T_offset: "${myMeasures[$cptr, t_offset]}"°C"
echo "W_open_detection: "${myMeasures[$cptr, W_open_detection]}
echo "W_open_miuntes: "${myMeasures[$cptr, W_open_minutes]}" minutes"
SQLInsert="insert into measures (device, t_current, t_manual_mode,  t_target_low, t_target_high, t_offset, W_open_detection, W_open_minutes, Battery) values ((SELECT id from devices WHERE MAC='${myMeasures[$cptr, MAC]}'), '${myMeasures[$cptr, t_current]}', '${myMeasures[$cptr, t_manual_mode]}', '${myMeasures[$cptr, t_target_low]}', '${myMeasures[$cptr, t_target_high]}', '${myMeasures[$cptr, t_offset]}', '${myMeasures[$cptr, W_open_detection]}', '${myMeasures[$cptr, W_open_minutes]}', '${myMeasures[$cptr, Battery]}');"
mysql -u CometBlue -pCometBluePass -D CometBlue --host localhost -BN -e "$SQLInsert"
if [ $? -eq 0 ];then
	echo -ne ""
else
	echo "SQL insert failed: "$SQLInsert
fi

done
`

If someone wants the SQL creation script, just ask :)

BR
Benja

Conceptual problems

I really like the reverse engineering effort and the effort to make the results available to an open source community. Thank you for that!

What I do not like are the dependencies of this project, which makes the package very difficult to use. It uses the (to my mind) unnecessary pygattlib library. Pygattlib is not a wrapper around gatttlib (a tool from the bluez package) but more a fork of it, since it ships and compiles its own (outdated!) version.

To ease the installation I would recommend to make this a pure python package (including dependencies) by just calling gatttlib in a subprocess. This would also make testing much simpler. Check e.g. this library that does the same with a different Ble thermostat device.

Accept Pull Request

Hey,

it would be nice if you could accept the Pull request
#6

I want to use your tool to implement cometblue into the homeassitant home automation hub, but it needs to be python3 and available via pip. @xrucka did a great job so far porting your tool to python3.
please consider to accept his changes.

greetings

Unable to set/read periods that end at 24:00

I'm using both this library and the EUROprog2 app to reprogram my thermostats.

When trying to program the thermostat to heat from 08:00 - 24:00 I issue the following command:
cometblue device --pin <pin> <device> set day sat "08:00:00-"

Both cometblue device --pin <pin> <device> get days and the official app now tell me, that the program for the day is to heat from 08:00 - 23:50. Means the period ends 10 minutes earlier than I expected.

+-----+-------+---------------------+---------------------+-------------+-------------+
|   N | Day   | Period #1           | Period #2           | Period #3   | Period #4   |
|-----+-------+---------------------+---------------------+-------------+-------------|
|   6 | Sat   | 08:00:00 - 23:50:00 |                     |             |             |
+-----+-------+---------------------+---------------------+-------------+-------------+

As the app allows me to set the end time 10 minutes further (to 24:00 sharp) I use the app to reissue the command to heat from 08:00 - 24:00.

Now the app and the display on the thermostat show me that the thermostat will heat from 08:00 - 24:00, but cometblue device --pin <pin> <device> get days will not return any periods for that day.

+-----+-------+---------------------+---------------------+-------------+-------------+
|   N | Day   | Period #1           | Period #2           | Period #3   | Period #4   |
|-----+-------+---------------------+---------------------+-------------+-------------|
|   6 | Sat   |                     |                     |             |             |
+-----+-------+---------------------+---------------------+-------------+-------------+

There seems to be a problem with setting a period until the end of the day at 24:00 via the library and retrieving a period that has been set to last until 24:00 with the app via the library.

Device info:

  • device_name = Comet Blue
  • firmware_revision = 0.0.10
  • firmware_revision2 = COBL0133
  • flags = 0b0 0b0 0b0
  • manufacturer_name = Eurotronic GmbH
  • model_number = Comet Blue
  • software-revision = 0.0.10

Change from "Auto" to "Manual"

Dear authors,

I quite like this project. So far everything in examples is working as expected.
Except - I do not see option for switching thermostat operational mode from "auto" to "manual".
As when thermostat is in auto mode and you set manual temperature it will go back to auto (when time for auto change has arrive).
Do you have any solution for that? Currently only option I see it to have thermostat only in manual mode and control it over bluetooth when temperatures need to change.

Can't install on debian 9.5 stable/stretch

Hi
(and first of all thanks for all your efforts!)
I cant get Cometblue to install on my Debian 9.5 :(
Here's what I get:
root@rack:/home/benjalien/Downloads/pygattlib# pip install cometblue
Requirement already satisfied: cometblue in /usr/local/lib/python2.7/dist-packages
Requirement already satisfied: click in /usr/lib/python2.7/dist-packages (from cometblue)
Collecting gattlib (from cometblue)
Using cached https://files.pythonhosted.org/packages/be/2f/5b1aecec551b42b59d8b399ad444b5672972efb590ca83d784dbe616a3e1/gattlib-0.20150805.tar.gz
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 1, in
File "/tmp/pip-build-SzpHky/gattlib/setup.py", line 12, in
"pkg-config --cflags glib-2.0".split()).decode('utf-8')
File "/usr/lib/python2.7/subprocess.py", line 212, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 390, in init
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

----------------------------------------

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-SzpHky/gattlib/

From what I understand I can't get gattlib to install.
Any hint?

Thanks!
Benjamin

I cannot read characteristics.

Hi,
Looks that I cannot read characteristics from cometblue device from Lidl FW 0.0.9.silvercres.
Via gatttoll I'm able read all characteristics.
So I don't know, if I'm using some bad library or where is problem. How can I test reading characteristics by pygattlib?

OS: raspbian jessie 8.0
HW: Raspberry PI zero W

root@mm_pi0w:~/cometblue/cometblue# cometblue -L debug discover
 I|2017-08-28 18:36:19,500|15631:-1225265152| Starting discovery on adapter "hci0" with 10 seconds timeout...
 D|2017-08-28 18:36:29,580|15631:-1225265152| All discovered devices: {'B4:C9:4C:84:97:DE': 'Comet Blue'}
 I|2017-08-28 18:36:29,586|15631:-1225265152| Connecting to device "B4:C9:4C:84:97:DE"...
 D|2017-08-28 18:36:33,630|15631:-1225265152| Discovering characteristics for "B4:C9:4C:84:97:DE"...
 D|2017-08-28 18:37:48,635|15631:-1225265152| Skipping device `"`Comet Blue" ("B4:C9:4C:84:97:DE") because of exception: RuntimeError('Device is not responding!',)
 I|2017-08-28 18:37:48,638|15631:-1225265152| Discovery finished

root@mm_pi0w:~/cometblue/cometblue# gatttool -b B4:C9:4C:84:97:DE -I
[B4:C9:4C:84:97:DE][LE]> connect
Attempting to connect to B4:C9:4C:84:97:DE
Connection successful
[B4:C9:4C:84:97:DE][LE]> characteristics
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb
handle: 0x0008, char properties: 0x02, char value handle: 0x0009, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x22, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x001a, char properties: 0x0a, char value handle: 0x001b, uuid: 47e9ee01-47e9-11e4-8939-164230d1df67
handle: 0x001c, char properties: 0x0a, char value handle: 0x001d, uuid: 47e9ee10-47e9-11e4-8939-164230d1df67
handle: 0x001e, char properties: 0x0a, char value handle: 0x001f, uuid: 47e9ee11-47e9-11e4-8939-164230d1df67
handle: 0x0020, char properties: 0x0a, char value handle: 0x0021, uuid: 47e9ee12-47e9-11e4-8939-164230d1df67
handle: 0x0022, char properties: 0x0a, char value handle: 0x0023, uuid: 47e9ee13-47e9-11e4-8939-164230d1df67
handle: 0x0024, char properties: 0x0a, char value handle: 0x0025, uuid: 47e9ee14-47e9-11e4-8939-164230d1df67
handle: 0x0026, char properties: 0x0a, char value handle: 0x0027, uuid: 47e9ee15-47e9-11e4-8939-164230d1df67
handle: 0x0028, char properties: 0x0a, char value handle: 0x0029, uuid: 47e9ee16-47e9-11e4-8939-164230d1df67
handle: 0x002a, char properties: 0x0a, char value handle: 0x002b, uuid: 47e9ee20-47e9-11e4-8939-164230d1df67
handle: 0x002c, char properties: 0x0a, char value handle: 0x002d, uuid: 47e9ee21-47e9-11e4-8939-164230d1df67
handle: 0x002e, char properties: 0x0a, char value handle: 0x002f, uuid: 47e9ee22-47e9-11e4-8939-164230d1df67
handle: 0x0030, char properties: 0x0a, char value handle: 0x0031, uuid: 47e9ee23-47e9-11e4-8939-164230d1df67
handle: 0x0032, char properties: 0x0a, char value handle: 0x0033, uuid: 47e9ee24-47e9-11e4-8939-164230d1df67
handle: 0x0034, char properties: 0x0a, char value handle: 0x0035, uuid: 47e9ee25-47e9-11e4-8939-164230d1df67
handle: 0x0036, char properties: 0x0a, char value handle: 0x0037, uuid: 47e9ee26-47e9-11e4-8939-164230d1df67
handle: 0x0038, char properties: 0x0a, char value handle: 0x0039, uuid: 47e9ee27-47e9-11e4-8939-164230d1df67
handle: 0x003a, char properties: 0x0a, char value handle: 0x003b, uuid: 47e9ee2a-47e9-11e4-8939-164230d1df67
handle: 0x003c, char properties: 0x0a, char value handle: 0x003d, uuid: 47e9ee2b-47e9-11e4-8939-164230d1df67
handle: 0x003e, char properties: 0x0a, char value handle: 0x003f, uuid: 47e9ee2c-47e9-11e4-8939-164230d1df67
handle: 0x0040, char properties: 0x0a, char value handle: 0x0041, uuid: 47e9ee2d-47e9-11e4-8939-164230d1df67
handle: 0x0042, char properties: 0x0a, char value handle: 0x0043, uuid: 47e9ee2e-47e9-11e4-8939-164230d1df67
handle: 0x0044, char properties: 0x1a, char value handle: 0x0045, uuid: 47e9ee40-47e9-11e4-8939-164230d1df67
handle: 0x0047, char properties: 0x08, char value handle: 0x0048, uuid: 47e9ee30-47e9-11e4-8939-164230d1df67```

B.R.
Martin Mikala

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.