lawtancool / hass-control4 Goto Github PK
View Code? Open in Web Editor NEWControl4 integration for Home Assistant
License: Apache License 2.0
Control4 integration for Home Assistant
License: Apache License 2.0
When I try to configure the modes for my alarm system I get error logs in home assistant. This may be related to #2
For my config options, my control4 instance has 4 options: Stay, Away, Instant, and Maximum and i have mapped them as such in the ui:
Not sure if I am setting my config options correctly or there is something else needed to get this work. All other entities appear as expected (lights and locks).
My Control4 instance is on the following version: 3.1.3.574826-res (May 19 2020)
Category sensors does not exist on this Control4 system, entities from this domain will not be setup.
Logger: custom_components.control4
Source: custom_components/control4/init.py:168
Integration: Control4
First occurred: 2:02:01 PM (94 occurrences)
Category sensors does not exist on this Control4 system, entities from this domain will not be setup.
Traceback (most recent call last):
File "/config/custom_components/control4/init.py", line 168, in get_items_of_category
return_list = await director.getAllItemsByCategory(category)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/pyControl4/director.py", line 112, in getAllItemsByCategory
return_list = await self.sendGetRequest(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/pyControl4/director.py", line 63, in sendGetRequest
await checkResponseForError(await resp.text())
File "/usr/local/lib/python3.11/site-packages/pyControl4/error_handling.py", line 123, in checkResponseForError
raise exception(response_text)
pyControl4.error_handling.InvalidCategory: {
"error": "Invalid category"
}
Error while setting up control4 platform for alarm_control_panel
Logger: homeassistant.components.alarm_control_panel
Source: helpers/entity_platform.py:359
Integration: Alarm control panel (documentation, issues)
First occurred: 2:02:01 PM (94 occurrences)
Last logged: 2:52:01 PM
Error while setting up control4 platform for alarm_control_panel
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 359, in _async_setup_platform
await asyncio.shield(task)
File "/config/custom_components/control4/alarm_control_panel.py", line 225, in async_setup_entry
item_setup_info = await director.getItemSetup(item_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/pyControl4/director.py", line 135, in getItemSetup
return await self.sendPostRequest(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/pyControl4/director.py", line 99, in sendPostRequest
await checkResponseForError(await resp.text())
File "/usr/local/lib/python3.11/site-packages/pyControl4/error_handling.py", line 123, in checkResponseForError
raise exception(response_text)
pyControl4.error_handling.C4Exception: {
"error": "Z6B[Z5e.h5t(...)] is not a function"
}
Hi, I think I'm being thick!!! What user name and password should you use to connect to your c4 controller - I've used all my accounts and non seem to work!
P
Hi.
I have a number of C4 lighting control panels. Some of them are controlling other items such as outdoor heaters, pool pump etc. They are connected to the relays in the lighting control panels as the non-dimming lighting controls support up to 16A per switch pair.
In C4 the dealer must have been able to mark them as something other than a light as they have their own icons (heater / pump etc) and do not show up under lights.
Unfortunately, they do not show in the HA integration, only the lights do. Since they are using the same C4 devices, I'm hoping it's not too far a stretch to pick these devices also and add them as a switch of some kind in HA?
Thanks
Barry
EA-3 running 3.2.4, Qolsys IQPanel2 driver. Works fine from the C4 side. I get this in the logs:
2022-01-22 13:56:36 WARNING (MainThread) [custom_components.control4.alarm_control_panel] Unknown device properties received from Control4: 'details' {'type': 7, 'typeName': 'device', 'name': 'IQPanel2', 'parentId': 1793, 'id': 1794, 'filename': 'securitypanel.c4i', 'proxy': 'securitypanel', 'proxyOrder': 1, 'proxyMeta': [{'proxybindingid': 5001, 'smallSource': 'composer', 'smallImage': 'devices_sm/dsc_16.gif', 'largeSource': 'composer', 'largeImage': 'devices_lg/dsc_32.gif', 'proxy': 'securitypanel'}], 'categories': ['security'], 'siteId': 8, 'siteName': 'Home', 'buildingId': 9, 'buildingName': 'House', 'floorId': 10, 'floorName': 'System', 'roomId': 11, 'roomName': 'System', 'largeImage': 'devices_lg/Security_32.gif', 'smallImage': 'devices_sm/Security_16.gif', 'protocolId': 1793, 'protocolName': 'IQPanel2 Security Panel', 'protocolFilename': 'IQPanel2SecurityPanel.c4z', 'capabilities': {'arm_states': 'Stay,Away,Stay Instant,Away Instant', 'button_A': {'type': 'xml', 'visible': True, 'label': 'Button A Text'}, 'button_B': {'type': 'xml', 'visible': True, 'label': 'Button B Text'}, 'button_C': {'type': 'xml', 'visible': True, 'label': 'Button C Text'}, 'button_D': {'type': 'xml', 'visible': True, 'label': 'Button D Text'}, 'can_activate_partitions': True, 'can_set_time': True, 'has_fire': True, 'has_medical': False, 'has_panic': True, 'has_police': True, 'pound_label': '#', 'star_label': '*', 'ui_version': 2}, 'control': 'securitypanel', 'version': 1, 'created': '09/19/2013', 'modified': '09/19/2013', 'model': '', 'manufacturer': '', 'protocolControl': 'lua_gen', 'deviceOrder': 20, 'allControlBindingsHidden': 1, 'URIs': {'variables': '/api/v1/categories/security/1794/variables', 'network': '/api/v1/categories/security/1794/network', 'commands': '/api/v1/categories/security/1794/commands'}}
2022-01-22 13:56:36 WARNING (MainThread) [custom_components.control4.alarm_control_panel] Unknown device properties received from Control4: 'details' {'type': 7, 'typeName': 'device', 'name': 'Security System', 'parentId': 1793, 'id': 1795, 'filename': 'security.c4i', 'proxy': 'security', 'proxyOrder': 2, 'proxyMeta': [{'proxybindingid': 5001, 'smallSource': 'composer', 'smallImage': 'devices_sm/dsc_16.gif', 'largeSource': 'composer', 'largeImage': 'devices_lg/dsc_32.gif', 'proxy': 'securitypanel'}], 'categories': ['security'], 'siteId': 8, 'siteName': 'Home', 'buildingId': 9, 'buildingName': 'House', 'floorId': 10, 'floorName': 'System', 'roomId': 11, 'roomName': 'System', 'largeImage': 'devices_lg/Security_32.gif', 'smallImage': 'devices_sm/Security_16.gif', 'protocolId': 1793, 'protocolName': 'IQPanel2 Security Panel', 'protocolFilename': 'IQPanel2SecurityPanel.c4z', 'capabilities': {'arm_states': 'Stay,Away,Stay Instant,Away Instant', 'button_A': {'type': 'xml', 'visible': True, 'label': 'Button A Text'}, 'button_B': {'type': 'xml', 'visible': True, 'label': 'Button B Text'}, 'button_C': {'type': 'xml', 'visible': True, 'label': 'Button C Text'}, 'button_D': {'type': 'xml', 'visible': True, 'label': 'Button D Text'}, 'can_activate_partitions': True, 'can_set_time': True, 'has_fire': True, 'has_medical': False, 'has_panic': True, 'has_police': True, 'pound_label': '#', 'star_label': '*', 'ui_version': 2}, 'control': 'security', 'version': 3, 'created': '6/17/2005', 'modified': '11/15/2013', 'model': '', 'manufacturer': '', 'protocolControl': 'lua_gen', 'deviceOrder': 21, 'allControlBindingsHidden': 0, 'URIs': {'variables': '/api/v1/categories/security/1795/variables', 'network': '/api/v1/categories/security/1795/network', 'bindings': '/api/v1/categories/security/1795/bindings', 'commands': '/api/v1/categories/security/1795/commands'}}
2022-01-22 13:56:36 WARNING (MainThread) [custom_components.control4.binary_sensor] Unknown device properties received from Control4: {'type': 7, 'typeName': 'device', 'name': 'Front Door Motion', 'parentId': 473, 'id': 1915, 'filename': 'contactsingle_motionsensor_c4.c4i', 'proxy': 'contactsingle_motionsensor_c4', 'proxyOrder': 1, 'proxyMeta': [{'name': 'contactsingle_motionsensor_c4', 'smallImage': 'devices_sm/contactsingle_motionsensor_close.gif', 'smallSource': 'composer', 'largeImage': 'devices_lg/contactsingle_motionsensor_close.gif', 'largeSource': 'composer'}], 'categories': ['sensors'], 'siteId': 8, 'siteName': 'Home', 'buildingId': 9, 'buildingName': 'House', 'floorId': 467, 'floorName': 'First', 'roomId': 473, 'roomName': 'Entrance', 'largeImage': 'devices_lg/contactsingle_motionsensor_close.gif', 'smallImage': 'devices_sm/contactsingle_motionsensor_close.gif', 'protocolId': 1915, 'protocolName': 'Front Door Motion', 'protocolFilename': 'contactsingle_motionsensor_c4.c4i', 'capabilities': {}, 'events': [{'id': 1, 'description': 'When the NAME senses motion'}, {'id': 2, 'description': 'When the NAME stops sensing motion'}], 'conditionals': {'conditional': [{'id': 0, 'description': 'the NAME is sensing motion'}, {'id': 1, 'description': 'the NAME is not sensing motion'}]}, 'control': 'control4_contactsingle', 'version': 3, 'created': '1/20/2005 2:22:54 PM', 'modified': '12/17/2014 4:23 PM', 'model': 'Motion Sensor', 'manufacturer': 'Generic', 'protocolControl': 'control4_contactsingle', 'deviceOrder': 1, 'allControlBindingsHidden': 0, 'URIs': {'variables': '/api/v1/categories/sensors/1915/variables', 'bindings': '/api/v1/categories/sensors/1915/bindings', 'commands': '/api/v1/categories/sensors/1915/commands'}}
2022-01-22 13:56:36 WARNING (MainThread) [custom_components.control4.alarm_control_panel] Unknown device properties received from Control4: 'details' {'type': 7, 'typeName': 'device', 'name': 'Security System 2', 'parentId': 1793, 'id': 1796, 'filename': 'security.c4i', 'proxy': 'security', 'proxyOrder': 3, 'proxyMeta': [{'proxybindingid': 5001, 'smallSource': 'composer', 'smallImage': 'devices_sm/dsc_16.gif', 'largeSource': 'composer', 'largeImage': 'devices_lg/dsc_32.gif', 'proxy': 'securitypanel'}], 'categories': ['security'], 'siteId': 8, 'siteName': 'Home', 'buildingId': 9, 'buildingName': 'House', 'floorId': 10, 'floorName': 'System', 'roomId': 11, 'roomName': 'System', 'largeImage': 'devices_lg/Security_32.gif', 'smallImage': 'devices_sm/Security_16.gif', 'protocolId': 1793, 'protocolName': 'IQPanel2 Security Panel', 'protocolFilename': 'IQPanel2SecurityPanel.c4z', 'capabilities': {'arm_states': 'Stay,Away,Stay Instant,Away Instant', 'button_A': {'type': 'xml', 'visible': True, 'label': 'Button A Text'}, 'button_B': {'type': 'xml', 'visible': True, 'label': 'Button B Text'}, 'button_C': {'type': 'xml', 'visible': True, 'label': 'Button C Text'}, 'button_D': {'type': 'xml', 'visible': True, 'label': 'Button D Text'}, 'can_activate_partitions': True, 'can_set_time': True, 'has_fire': True, 'has_medical': False, 'has_panic': True, 'has_police': True, 'pound_label': '#', 'star_label': '*', 'ui_version': 2}, 'control': 'security', 'version': 3, 'created': '6/17/2005', 'modified': '11/15/2013', 'model': '', 'manufacturer': '', 'protocolControl': 'lua_gen', 'deviceOrder': 22, 'allControlBindingsHidden': 0, 'URIs': {'variables': '/api/v1/categories/security/1796/variables', 'network': '/api/v1/categories/security/1796/network', 'bindings': '/api/v1/categories/security/1796/bindings', 'commands': '/api/v1/categories/security/1796/commands'}}
Hi, what is the currently best option to control the Control4 Thermostat? I have tried hass-control4, homeassistant-control4, but there is no Climate control. I have tried different repositories, based on itsfrosty 2way driver, but it is still giving me a message, there is no module for control4 climate and also, it is more than 2 years old. This add-on looks as the newest, but it doesnt have the climate or support multiple buttons from keypad dimmers or configurable keypads.
I get this Error, when I try to configure the binary sensors. At the Moment only the Lights work with the integration.
Error while setting up control4 platform for binary_sensor
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 356, in _async_setup_platform
await asyncio.shield(awaitable)
File "/config/custom_components/control4/binary_sensor.py", line 134, in async_setup_entry
item_setup_info = await director.getItemSetup(item_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/pyControl4/director.py", line 135, in getItemSetup
return await self.sendPostRequest(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/pyControl4/director.py", line 99, in sendPostRequest
await checkResponseForError(await resp.text())
File "/usr/local/lib/python3.12/site-packages/pyControl4/error_handling.py", line 123, in checkResponseForError
raise exception(response_text)
pyControl4.error_handling.C4Exception: {
"error": "_0x238377[a19_0x8231(...)] is not a function"
}
I am able to pull all my lights from the C4 controller (running version 3.3.0). However the lights are all pulling in as switches with no dimming options. Although under info I am seeing this. What am I doing wrong?
MINUTES ON
68,413
MINUTES OFF
1,857,867
MINUTES ON TODAY
0
CURRENT POWER
0
ENERGY USED
22,596
ENERGY USED TODAY
0
WATTS
100
MODULE OVERRIDE LEVEL
100
Navigator Dynamic Capabilities
DynamicCapabilities:
dimmer: true
supports_target: false
supports_color: false
supports_color_correlated_temperature: false
color_correlated_temperature_min: 1000
color_correlated_temperature_max: 20000
color_rate_behavior: 1
color_rate_min: 0
color_rate_max: 0
has_extras: false
click_rate_min: 250
click_rate_max: 86400000
hold_rate_min: 1000
hold_rate_max: 86400000
LIGHT STATE
0
Brightness Presets
Brightness Active Presets
light_brightness_active_presets:
preset:
Hey there,
Is it possible to add Media Player support into this version of the C4 integration as it is more complete? Currently this version https://github.com/nalin29/control4RoomMedia supports it, but does not support the other myriad of devices this integration allows.
Let me know and happy to help!
Hi, are there plans to implement relay control to this plugin?
I have a garage door on a Control4 relay (wired into the green relays on the back of the EA3) which isn't visible in the system at all and would like to see how this could be enabled in HomeAssistant.
Thanks.
Using this latest version, lights don't turn on or dim, but states are reported and you can see all the attributes in HA. I updated my control4 today to 3.4.0.681769-res, but that didn't help.
2023-12-09 20:15:50.439 WARNING (MainThread) [homeassistant.helpers.entity] Entity light.abigail_s_bath_lights (<class 'custom_components.control4.light.Control4Light'>) is using self.async_update_ha_state(), without enabling force_update. Instead it should use self.async_write_ha_state(), please create a bug report at https://github.com/lawtancool/hass-control4/issues
Can I add a scene panel to my home assistant?
First of all i want to thank you for the code you shared it really helped !!
Second, i would like to know if there is any plan to add Blind (Shade) since i really want to control that ..
willing to help and share some data if needed ...
Please advise,
Asaf
It doesn't matter where I move the folder custom_components. The configuration validation is still saying: Platform error climate.control4 - No module named 'homeassistant.components.control4.climate'
Why?
Updated the light.py file. After the reintegration, a C4 switch appeared as a unknown device with class light. The lights no longer function correctly. Lights turn On, but the UI displays "Failed to call service light/turn_on 224" when attempting to dim or turn Off. These errors now appear in the log:
2020-08-16 03:19:52 ERROR (MainThread) [homeassistant.components.light] Error while setting up control4 platform for light
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 192, in _async_setup_platform
await asyncio.gather(*pending)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 301, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 474, in _async_add_entity
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 281, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 305, in _async_write_ha_state
sstate = self.state
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 595, in state
return STATE_ON if self.is_on else STATE_OFF
File "/config/custom_components/control4/light.py", line 170, in is_on
return self._coordinator.data[self._idx]["value"] > 0
KeyError: 224
2020-08-16 03:19:52 ERROR (MainThread) [homeassistant.components.light] control4: Error on device update!
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 335, in _async_add_entity
await entity.async_device_update(warning=False)
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 454, in async_device_update
await self.async_update() # type: ignore
File "/config/custom_components/control4/__init__.py", line 224, in async_update
await self._coordinator.async_request_refresh()
File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 125, in async_request_refresh
await self._debounced_refresh.async_call()
File "/usr/src/homeassistant/homeassistant/helpers/debounce.py", line 60, in async_call
await self.hass.async_add_job(self.function) # type: ignore
File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 192, in async_refresh
update_callback()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 281, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 305, in _async_write_ha_state
sstate = self.state
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 595, in state
return STATE_ON if self.is_on else STATE_OFF
File "/config/custom_components/control4/light.py", line 170, in is_on
return self._coordinator.data[self._idx]["value"] > 0
KeyError: 224
2020-08-16 03:19:57 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 118, in _handle_refresh_interval
await self.async_refresh()
File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 192, in async_refresh
update_callback()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 281, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 305, in _async_write_ha_state
sstate = self.state
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 595, in state
return STATE_ON if self.is_on else STATE_OFF
File "/config/custom_components/control4/light.py", line 170, in is_on
return self._coordinator.data[self._idx]["value"] > 0
KeyError: 224
The integration periodically fails because the API token used when invoking C4 expires. A disable/enable of the integration renews the token and restores function.
I suspect the API token comes with a readable expiry date. It'd be great if the integration could either renew the token before that date or renew the token upon receiving an expired token error from an API call.
I pulled the following from the logs:
Evening Lights: Error executing script. Unexpected error for call_service at pos 1: { "error": "Unauthorized", "details": "Expired or invalid token" } 7:34:26 PM – (ERROR) Automation (custom integration) - message first occurred at 7:16:11 PM and shows up 4 times
2022-04-19 04:01:32 WARNING (SyncWorker_3) [homeassistant.loader] We found a custom integration control4 which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant
2022-04-19 04:02:13 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry control4_hc800_000FFFXXXXXX for control4
File "/usr/local/lib/python3.9/site-packages/pyControl4/account.py", line 74, in __sendAccountAuthRequest
File "/config/custom_components/control4/init.py", line 63, in async_setup_entry
File "/config/custom_components/control4/init.py", line 164, in refresh_tokens
File "/usr/local/lib/python3.9/site-packages/pyControl4/account.py", line 147, in getAccountBearerToken
File "/usr/local/lib/python3.9/site-packages/pyControl4/account.py", line 78, in __sendAccountAuthRequest
File "/config/custom_components/control4/config_flow.py", line 196, in async_step_init
Look like token were expired, and all solution righ tnow is not working unforthenetly
Logger: homeassistant.components.websocket_api.http.connection
Source: custom_components/control4/light.py:132
Integration: Home Assistant WebSocket API (documentation, issues)
First occurred: 4:31:19 PM (3 occurrences)
Last logged: 5:47:30 PM
[139866916344512] { "error": "Unauthorized", "details": "Expired or invalid token" }
[139866717870400] { "error": "Unauthorized", "details": "Expired or invalid token" }
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 226, in handle_call_service
await hass.services.async_call(
File "/usr/src/homeassistant/homeassistant/core.py", line 1974, in async_call
response_data = await coro
^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/core.py", line 2011, in _execute_service
return await target(service_call)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/homeassistant/init.py", line 130, in async_handle_turn_service
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/core.py", line 1974, in async_call
response_data = await coro
^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/core.py", line 2011, in _execute_service
return await target(service_call)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 235, in handle_service
return await service.entity_service_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 898, in entity_service_call
task.result() # pop exception if have
^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 1199, in async_request_call
return await coro
^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 942, in _handle_entity_call
result = await task
^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/light/init.py", line 580, in async_handle_light_on_service
await light.async_turn_on(**filter_turn_on_params(light, params))
File "/config/custom_components/control4/light.py", line 132, in async_turn_on
await c4_light.rampToLevel(brightness, transition_length)
File "/usr/local/lib/python3.11/site-packages/pyControl4/light.py", line 51, in rampToLevel
await self.director.sendPostRequest(
File "/usr/local/lib/python3.11/site-packages/pyControl4/director.py", line 99, in sendPostRequest
await checkResponseForError(await resp.text())
File "/usr/local/lib/python3.11/site-packages/pyControl4/error_handling.py", line 114, in checkResponseForError
raise exception(response_text)
pyControl4.error_handling.BadToken: {
"error": "Unauthorized",
"details": "Expired or invalid token"
}
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.