bluetooth-devices / govee-ble Goto Github PK
View Code? Open in Web Editor NEWManage Govee BLE devices
License: Apache License 2.0
Manage Govee BLE devices
License: Apache License 2.0
Describe the bug
A clear and concise description of what the bug is.
Just got a new device but it did not get picked up
2022-10-08 12:55:21.733 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] anova-proxy: A4:C1:38:59:40:5B AdvertisementData(manufacturer_data={16473: b'[\x00d\x81 \xff\xff\xff\xff\xff\xff \xff\xff\xff\xff\xff\xff\x00\x00', 76: b'\x02\x15INTELLI_ROCKS_HWPr\xf2\xff\xc2'}, service_uuids=['00005550-0000-1000-8000-00805f9b34fb']) connectable: True match: set() rssi: -56
2022-10-08 12:55:29.409 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] anova-proxy: A4:C1:38:59:40:5B AdvertisementData(manufacturer_data={16473: b'[\x00d\x01 \x1c\x00\xff\xff\xff\xff \xff\xff\xff\xff\xff\xff\x00\x00', 76: b'\x02\x15INTELLI_ROCKS_HWPr\xf2\xff\xc2'}, service_uuids=['00005550-0000-1000-8000-00805f9b34fb']) connectable: True match: set() rssi: -56
To Reproduce
Steps to reproduce the behavior:
Just turn on the device
Additional context
Add any other context about the problem here.
Not sure what other data is needed, hopefully this can be added :) please let me know if I am missing anything.
Describe the bug
Now and then my H5178-REMOTE spikes to exacly 0.1 °C and 99.9%. At that time my H5178 is showing dashes in the display. So these values are considered invalid by the H5178. Perhaps there is a bit indicating an invalid value? It would be nice if Home Assistant would consider these value invalid also, perhaps as Unavailable?
Additional context
-0.89 °C, 91.7%
-0.8 °C, 91.7%
2022-12-17 05:52:31.965 DEBUG (MainThread) [govee_ble.parser] Parsing Govee BLE advertisement data: BluetoothServiceInfoBleak(name='B51782BC8', address='A4:C1:38:75:2B:C8', rssi=-67, manufacturer_data={1: b'\x01\x01\x01\x80"\xd5d\x00\x13', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2'}, service_data={}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], source='atom-bluetooth-proxy-d68078', device=BLEDevice(A4:C1:38:75:2B:C8, B51782BC8), advertisement=AdvertisementData(local_name='B51782BC8', manufacturer_data={1: b'\x01\x01\x01\x80"\xd5d\x00\x13', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2'}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], tx_power=-127, rssi=-67), connectable=True, time=1530196.624098552)
2022-12-17 05:52:31.965 DEBUG (MainThread) [govee_ble.parser] Parsing Govee sensor: 1 b'\x01\x01\x01\x80"\xd5d\x00\x13'
0.1 °C, 99.9%
0.0 °C, 99.9%
2022-12-17 05:53:37.641 DEBUG (MainThread) [govee_ble.parser] Parsing Govee BLE advertisement data: BluetoothServiceInfoBleak(name='B51782BC8', address='A4:C1:38:75:2B:C8', rssi=-66, manufacturer_data={1: b'\x01\x01\x01\x00\x03\xe7\xe4\x00\x01', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2'}, service_data={}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], source='atom-bluetooth-proxy-d68078', device=BLEDevice(A4:C1:38:75:2B:C8, B51782BC8), advertisement=AdvertisementData(local_name='B51782BC8', manufacturer_data={1: b'\x01\x01\x01\x00\x03\xe7\xe4\x00\x01', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2'}, service_uuids=['0000ec88-0000-1000-8000-00805f9b34fb'], tx_power=-127, rssi=-66), connectable=True, time=1530262.301099292)
2022-12-17 05:53:37.642 DEBUG (MainThread) [govee_ble.parser] Parsing Govee sensor: 1 b'\x01\x01\x01\x00\x03\xe7\xe4\x00\x01'
Full log of the last spike with before and after valid values:
govee_ble.txt
Describe the bug
4 of my 6 H5100 have become unavailable in the past few weeks in HA. They were connected with no issues and were reporting perfectly for weeks. Then out of nowhere some of them were no longer connected to HA even though they are connected in the Govee app and to the thermo gateway.
Additional context
I have updated HA multiple times since the issue and reloaded the integration with no fix. The temperature settings have all stayed in the same location since they were first connected and I have even changed the batteries still won't show in HA.
Describe the bug
Shouldn't this be in little endian?
govee-ble/src/govee_ble/parser.py
Line 190 in 432223a
Additional context
HCI dump from custom-components/ble_monitor#467
> 04 3E 19 02 01 04 00 92 E4 21 59 60 E3 0D 0C FF 88 EC 00 BA
0A F5 0F 64 C2 01 01 C5
Will use this code (no local name)
if msg_length == 9 and (
"H5051" in local_name or "H5071" in local_name or mgr_id == 0xEC88
):
self.set_device_type("H5051/H5071")
(temp, humi, batt) = PACKED_hHB.unpack(data[1:6])
self.update_predefined_sensor(
SensorLibrary.TEMPERATURE__CELSIUS, temp / 100
)
self.update_predefined_sensor(
SensorLibrary.HUMIDITY__PERCENTAGE, humi / 100
)
self.update_predefined_sensor(SensorLibrary.BATTERY__PERCENTAGE, batt)
return
In little endian, this makes sense.
BA 0A
--> 2746 / 100 = 27.46 deg
F5 0F
--> 4085 / 100 = 40.85 %
64
--> 100%
However, PACKED_hHB.unpack(data[1:6])
is using big endian PACKED_hHB = struct.Struct(">hHB")
Describe the bug
Hi,
today i tried to get this meat thermometer into home assistant. Via esp bluetooth_proxies, i dont have a bluetooth adaper for my server.
But Govee H5183 is not found by home assistant.
Bluetooth debug log:
DEBUG (MainThread) [homeassistant.components.bluetooth.manager] esp_wintergarten_dachfenster: A4:C1:38:9F:F7:73 AdvertisementData(manufacturer_data={63391: b's\x01\x00\x01\x01\xe4\x00\x80\n\xf0\xff\xff\x00\x00', 76: b'\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\x0c'}, service_uuids=['00008351-0000-1000-8000-00805f9b34fb']) connectable: False match: set() rssi: -71
bluetoothctl:
[CHG] Device A4:C1:38:9F:F7:73 ManufacturerData Key: 0xf79f [CHG] Device A4:C1:38:9F:F7:73 ManufacturerData Value: 73 01 00 01 01 e4 00 80 0a 28 ff ff 00 00 s........(.... [CHG] Device A4:C1:38:9F:F7:73 ManufacturerData Key: 0x004c [CHG] Device A4:C1:38:9F:F7:73 ManufacturerData Value: 02 15 49 4e 54 45 4c 4c 49 5f 52 4f 43 4b 53 5f ..INTELLI_ROCKS_ 48 57 50 75 f2 ff 0c HWPu...
The Govee app finds it as H5183_F773.
Additional context
Govee App device info:
Firmware Version: 1.03.24
Hardware version: 1.00.01
Product: H5183
2023-01-20 13:47:24.958 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xabgcf\x7f\xc0\xf1\xd1\xb1\x8d\xea\xc4\xb3]\x8c3~A\x82\xec'}, tx_power=-127, rssi=-45) match: set()
2023-01-20 13:47:28.745 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xba\xa3\xfe\xc4\xa1\x84\x99`v\xf0\xaaS\xc0\xc7\x89\xbe\x006\x10\x8a'}, tx_power=-127, rssi=-53) match: set()
2023-01-20 13:47:31.822 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xc6\xabV;\xa5\x1d\xc9\xa2\xc9Ye\xb00\xa6\r\xc4\x99H\xea\x0c'}, tx_power=-127, rssi=-64) match: set()
2023-01-20 13:47:33.759 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xce5y\xf5\xc4TS|\n,\x96\x98\xd1J\x8a\xaa\x04F\xb6\xa8'}, tx_power=-127, rssi=-64) match: set()
2023-01-20 13:47:37.649 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xddqz;\xc6\xb7A\xf8\x85_\xb9\xf1&K\xc1lB\xa1\xf0E'}, tx_power=-127, rssi=-57) match: set()
2023-01-20 13:47:39.609 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xe5K\xd6D\xb3\xce\x1f\xa2\xc9\xbdb\xdc\xd7\x0fiC\x95\xbe/k'}, tx_power=-127, rssi=-68) match: set()
2023-01-20 13:47:42.054 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xecI\x87jf\xa7\nHe\xa1\xdc5\x1dQ(\xa2\x07\xab\x86\xbb'}, tx_power=-127, rssi=-63) match: set()
2023-01-20 13:47:43.799 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x00\xf51\n\xaa\xdf\xed\x8ed\xf5(\xfc\xe4\xf7\xd6\xb0*\x8d\xe8\xea\xa2'}, tx_power=-127, rssi=-67) match: set()
2023-01-20 13:47:50.047 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\x0e\t\xec\xed\xe1\x0b\\Z\xe3\xce\xbe>\xe1\xc1\x06\x92\xf75\x1f4'}, tx_power=-127, rssi=-69) match: set()
2023-01-20 13:47:54.964 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01 \xe7-\xb14`\xa9\xac\x15\xef\x81{\xc0V\xca\xc55\xbf\xee\xbe'}, tx_power=-127, rssi=-64) match: set()
2023-01-20 13:48:01.207 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x019\x8d\xb5T\xc5\x17\x8dy\xed|w~\xa2k\xd6\x14*\xdaS\x01'}, tx_power=-127, rssi=-64) match: set()
2023-01-20 13:48:03.868 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01C\xe7 eh8\xdb\xecu\x18\xd4\xf9\x11\x89\x9b\xe2\x92\xac\xb5\xa1'}, tx_power=-127, rssi=-79) match: set()
2023-01-20 13:48:06.940 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01Om\x84{\x02\x04R\x92\xf7\x14\x81>\xf2\x99x\xdd\x04&V^'}, tx_power=-127, rssi=-84) match: set()
2023-01-20 13:48:08.785 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01W3K\x8b\\J\x87\x02=U\xa4F\xba\x17X\x98;{\x00\x7f'}, tx_power=-127, rssi=-71) match: set()
2023-01-20 13:48:10.726 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01^E%UJ\xb2r\t|\xa5\xbb~,\xd0q\xe6Y\x85f\x80'}, tx_power=-127, rssi=-62) match: set()
2023-01-20 13:48:12.477 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01ek\xb0\xfd\x87S\x1b]M\xb3kC8c\xa5j\xbbU\xf5\xae'}, tx_power=-127, rssi=-71) match: set()
2023-01-20 13:48:15.747 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01r;\xd5\x84\x12\xb86z\xc2\xe2\xd1h]\x91\xe1\xe8M\xc3\x18t'}, tx_power=-127, rssi=-66) match: set()
2023-01-20 13:48:17.690 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01z\x0b\xccl\xaaV\x91\x8br\xe8U\xe3(@\xef\n\x96\xed\x8e\xf3'}, tx_power=-127, rssi=-60) match: set()
2023-01-20 13:48:20.973 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\x86\x95=q\xa3\xd5\xb1\xfaj\xab;^\xd1\xa7\x01\x91N\x12rr'}, tx_power=-127, rssi=-70) match: set()
2023-01-20 13:48:22.912 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b"8I\x00\x01\x8d\xd9\xc3h![\xa4\xf8\xa0EU\xb9\x1f\xde'T\x9eG\xe1\x98"}, tx_power=-127, rssi=-74) match: set()
2023-01-20 13:48:28.861 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xa5]\x81\x0e\xa1\xa6\x1d\x17\x0e\xdb\xf2]\x8b\xaa\xf7\x9c\t\xc1k\x93'}, tx_power=-127, rssi=-79) match: set()
2023-01-20 13:48:32.746 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xb3\xa9Rf_&\x8c\x18A\x07\xf4\xf6\x0e\xb65L\x1a\x04\x033'}, tx_power=-127, rssi=-79) match: set()
2023-01-20 13:48:34.911 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xbc\xf5\xa4\x01\xb5\xbc\xb6\xf3\x1a\xd2}c\xfd\xa5\xfc\xe3\xa0{HA'}, tx_power=-127, rssi=-72) match: set()
2023-01-20 13:48:37.464 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xc6\x91\xa6\x0e\xc3\xc6Q\xcf\xe0\xad\xf7\xb6\xaf\xa5P#\xca\xd5\xd1c'}, tx_power=-127, rssi=-73) match: set()
2023-01-20 13:48:40.221 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xd1\xd1\xfdaNz:\xa3`\xd9\x80F\x02\x13[\xa2\x8d\xee\xa3\xe7'}, tx_power=-127, rssi=-67) match: set()
2023-01-20 13:48:42.164 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xd9\x98\x19\xca\xf2\xdc0\xdaZ\xdby\x83\x94)\xe7\xd9\xa6\xc69@'}, tx_power=-127, rssi=-68) match: set()
2023-01-20 13:48:42.368 DEBUG (MainThread) [homeassistant.components.bluetooth.manager] m5stackatomproxy (e8:9f:6d:0a:68:e0) [connectable]: C7:32:37:37:3B:39 AdvertisementData(local_name='GV51233B39', manufacturer_data={61320: b'8I\x00\x01\xda-\xe2U\xaa8t\x81\x9a\x1a\x90\xa8\xacP\x88\x9e\x9c\xc8\xa61'}, tx_power=-127, rssi=-74) match: set()
Describe the bug
I see you have merged #47 without the suggested change in my review.
For H5178 it must be
temp, humi = decode_temp_humid(data[3:6])
just like the old line was
packet_5178 = data[3:6].hex()
Additional context
2022-12-15 10:11:17.492 ERROR (MainThread) [homeassistant.components.govee_ble] Unexpected error updating B51782BC8 data: index out of range
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/bluetooth/passive_update_processor.py", line 124, in _async_handle_bluetooth_event
update = self._update_method(service_info)
File "/usr/local/lib/python3.10/site-packages/bluetooth_sensor_state_data/__init__.py", line 66, in update
self._start_update(data)
File "/usr/local/lib/python3.10/site-packages/govee_ble/parser.py", line 78, in _start_update
self._process_mfr_data(address, local_name, mfr_id, mfr_data, service_uuids)
File "/usr/local/lib/python3.10/site-packages/govee_ble/parser.py", line 172, in _process_mfr_data
temp, humi = decode_temp_humid(data[3:5])
File "/usr/local/lib/python3.10/site-packages/govee_ble/parser.py", line 37, in decode_temp_humid
(temp_humid_bytes[0] << 16) + (temp_humid_bytes[1] << 8) + temp_humid_bytes[2]
IndexError: index out of range
Govee Air Quality Monitor (H5106)
I've added support for this device in BLE monitor (custom-components/ble_monitor#1189).
Just leaving this info here as a reminder to add it here in the future here as well.
Sends temperature, humidity and PM2.5.
Is your feature request related to a problem? Please describe.
I got a Govee humidifier thinking "I'll just have it turn on when my Nest humidify is low!" "It's okay, Google has APIs!" -- little did I realize...
Describe the solution you'd like
I've logged a few packets, but I also notice that HomeBridge has widespread support for Govee devices and I wonder if some of that can be reused: https://github.com/bwp91/homebridge-govee
Additional context
My H7141 humidifier advertises itself with the name ihoment_H7141_XXXX
where XXXX is the last 4 hex digits of its MAC address.
The H7141 seems to be manufacturer ID 0x8802 or 34818, with an manufacturer-specific data of 0xec0001010040, so:
34818: b"\xec\x00\x01\x01\x00\x40",
I also logged packets like this:
b"\xec\x00\x01\x01\x00\x00",
b"\xec\x00\x01\x01\x01\x00",
b"\t\xff\x02\x88\xec\x00\x01\x01\x00\x00",
b"\t\xff\x02\x88\xec\x00\x01\x01\x01@"
In my personal notes using the nRF Android scanner, I also found
Humidifier on: 0xec0001010100
Humidifier off: 0xec0001010000
UUID: 00010203-0405-0607-0809-0a0b0c0d1910
Services: 00010203-0405-0607-0809-0a0b0c0d2b10
00010203-0405-0607-0809-0a0b0c0d2b11
Service 2b10 data:
AA-01-01-00-FF-FF-FF-00-00-00-00-00-00-00-00-00-00-00-00-55
AA-06-31-2E-30-30-2E-32-31-00-00-00-9E
33-B2-00-00-(...)-00-00-81
I plan on doing more sniffing but it's extremely slow going and uninformative and I wonder if the HomeBridge code might give us a leg up.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.