mjoshd / hyperhdr-ha Goto Github PK
View Code? Open in Web Editor NEWHyperHDR custom component for Home Assistant
Home Page: https://github.com/awawa-dev/HyperHDR
License: MIT License
HyperHDR custom component for Home Assistant
Home Page: https://github.com/awawa-dev/HyperHDR
License: MIT License
Hi, I have 3 instances of Hyper HDR running in my setup and they work great other than the brightness slider in home assistant doesn't work. It seems like it's deactivated. It has no effect if it's set to USB capture or one of the effects. Is anyone else experiencing this? Thank you!
I have been trying the integration and has work ok but there is something that I think isn't posisble (or I don't know how to do it). When you control the led color with the light component, it is not possible to go back to the ambilight mode. maybe add a switch that does this? (or if it already is, how to do it)
Great job and thanks!
Hey @mjoshd, thanks so much for putting this integration together! It's awesome!
I have HyperHDR (version 19) running on a Raspberry Pi Zero 2 W with some APA102 LEDs, it works great and is very responsive. I'm feeding in two USB inputs; one from a HDMI splitter for a FireTV Stick, the other is AV out from the TV that goes into a converter then into the pi. Both are detected fine in the HyperHDR Web UI, but the request/question I had was is there a way adjust the USB device in HA? I can see other options in HAs UI to choose different sources but USB Grabber is as granular as it goes.
In the Hyperion Integration page is does say that you can toggle the USB capture source, so just wondered if that would carry over to the integration that you made as well? And if it controls what USB device is active? I tried setting up different instances but the actual device setting doesnt stick to an instance.
I have an LG TV integration so the ideal would be to setup an automation that updates the capture device in HyperHDR as the TV's source changes, and also turns off with the TV.
Any input here would be hugely appreciated. Thanks.
Updating to 0.6 made all the entities unavailable. I can downgrade to 0.5 but it will only work for a while before becoming unresponsive when triggering an entity.
adding hyperHDR for hyperion classic via Configuration -> Devices & Services -> Integrations -> + Add Integration button -> HperHDR ->IP address of your hyperion classic -> port 19444 ends up with Failed to determine if authorization is required.
That is exactly same behaviour as on standard homeassistant hyperion integration. I assume even hyperHDR than does not support hyperion classic?
By the way no problem to connect with hyperion iOS app or with openHAB.
v0.0.5
no manual configuration created, added hyperHDR as described in bug description.
2022-02-19 12:36:52 INFO (MainThread) [hyperhdr.client] Connected to HyperHDR server: 192.168.9.217:19444
2022-02-19 12:36:52 DEBUG (MainThread) [hyperhdr.client] Send to server (192.168.9.217:19444): b'{"command": "authorize", "subcommand": "tokenRequired", "tan": 1}\n'
2022-02-19 12:36:52 DEBUG (MainThread) [hyperhdr.client] Read from server (192.168.9.217:19444): b'{"error":"Error while validating json: {[root].command: Unknown enum value (allowed values are: [\\"color\\",\\"image\\",\\"effect\\",\\"serverinfo\\",\\"clear\\",\\"clearall\\",\\"transform\\",\\"correction\\",\\"temperature\\",\\"adjustment\\"]) }","success":false}\n'
2022-02-19 12:36:52 WARNING (MainThread) [hyperhdr.client] JSON from HyperHDR (192.168.9.217:19444) did not include expected 'command' parameter, skipping...```
此错误来自自定义集成。
Logger: aiohttp.server
Source: custom_components/hyperhdr/camera.py:202
Integration: HyperHDR (documentation, issues)
First occurred: 00:24:07 (49 occurrences)
Last logged: 11:15:47
Error handling request
Traceback (most recent call last):
File "/config/custom_components/hyperhdr/camera.py", line 209, in _image_streaming
yield await self._start_image_streaming_for_client()
File "/config/custom_components/hyperhdr/camera.py", line 192, in _start_image_streaming_for_client
self.is_streaming = True
AttributeError: can't set attribute
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 435, in _handle_request
resp = await request_handler(request)
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_app.py", line 504, in _handle
resp = await handler(request)
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 117, in impl
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 220, in forwarded_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 78, in ban_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 181, in auth_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 137, in handle
result = await result
File "/usr/src/homeassistant/homeassistant/components/camera/init.py", line 629, in get
return await self.handle(request, camera)
File "/usr/src/homeassistant/homeassistant/components/camera/init.py", line 668, in handle
stream = await camera.handle_async_mjpeg_stream(request)
File "/config/custom_components/hyperhdr/camera.py", line 224, in handle_async_mjpeg_stream
async with self._image_streaming() as is_streaming:
File "/usr/local/lib/python3.9/contextlib.py", line 181, in aenter
return await self.gen.anext()
File "/config/custom_components/hyperhdr/camera.py", line 211, in _image_streaming
await self._stop_image_streaming_for_client()
File "/config/custom_components/hyperhdr/camera.py", line 202, in _stop_image_streaming_for_client
self.is_streaming = False
AttributeError: can't set attribute
Hi,
Hope you can help.
Just finished my projector HyperHDR setup with 1172 LEDS. The HyperHDR is working really well but Home Assistant integration doesn't work.
I have spent a few hours trying to track down the issue and found that as soon as I define more than 891 LEDs, the integration crashes and can no longer connect. Anything up to 891 LEDS works flawlessly.
I am using Rapsberry PI 5 with HyperHDR 20 beta.
The error is HA logs are follows:
Traceback (most recent call last):
File "/usr/local/lib/python3.11/asyncio/streams.py", line 548, in readline
line = await self.readuntil(sep)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/streams.py", line 626, in readuntil
raise exceptions.LimitOverrunError(
asyncio.exceptions.LimitOverrunError: Separator is not found, and chunk exceed the limit
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
resp = await request_handler(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/aiohttp/web_app.py", line 543, in _handle
resp = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/aiohttp/web_middlewares.py", line 114, in impl
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 85, in security_filter_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 233, in auth_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 31, in headers_middleware
response = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 149, in handle
result = await handler(request, **request.match_info)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 63, in with_admin
return await func(self, request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 177, in post
return await super().post(request, flow_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 72, in wrapper
result = await method(view, request, data, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 110, in post
result = await self._flow_mgr.async_configure(flow_id, data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 320, in async_configure
result = await self._async_handle_step(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 416, in _async_handle_step
result: FlowResult = await getattr(flow, method)(user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/hyperhdr/config_flow.py", line 234, in async_step_user
return await self._advance_to_auth_step_if_necessary(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/hyperhdr/config_flow.py", line 141, in _advance_to_auth_step_if_necessary
return await self.async_step_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/hyperhdr/config_flow.py", line 401, in async_step_confirm
async with self._create_client() as hyperhdr_client:
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 149, in aenter
result = await self.async_client_connect()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 369, in async_client_connect
await self.async_client_disconnect()
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 422, in async_client_disconnect
return await self._async_client_disconnect_internal()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 451, in _async_client_disconnect_internal
await self._await_or_stop_task(receive_task, stop_task=True)
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 588, in _await_or_stop_task
await task
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 568, in _receive_task_loop
while await self._async_receive_once():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 608, in _async_receive_once
resp_json = await self._async_safely_read_command(use_timeout=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/hyperhdr/client.py", line 485, in _async_safely_read_command
resp = await asyncio.wait_for(future_resp, timeout=timeout_secs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/tasks.py", line 452, in wait_for
return await fut
^^^^^^^^^
File "/usr/local/lib/python3.11/asyncio/streams.py", line 557, in readline
raise ValueError(e.args[0])
ValueError: Separator is not found, and chunk exceed the limit
I have added the URL to the Custom Repositories and rebooted Home Assistant running on my R Pi 4.
However, when I go to Settings -> Devices & Services -> Add Integration button and search for HyperHDR I can not find it.
Is this because of the new version 2022.5.2 ???
I am new to Home Assistant please advise.
Not really able to provide any logs since it won't integrate with Home Assistant but am running v0.0.5. Verified correct installation through HACS and am able to add this to my integrations via the add integrations page of HA. However upon putting in the IP (which I also verified is correct), it gives 'The HyperHDR Ambilight instance did not report its id' abort error. Have also verified the JSON Server port is the default 19444
Add your logs here.
A clear and concise description of what the bug is.
Add your logs here.
Is it possible to to update to V.20.0.0?
Thanks
I was playing around with Hyperion before trying HyperHDR, it seems so much better. The official Hyperion integration provides a camera entity with the stream.
From what I gathered from #3, the feature was removed because it was not working correctly. Any chance of getting it back?
More people are asking for something similar on awawa-dev/HyperHDR#475.
Maybe a link from the API side is enough for people to set their own camera entities (enabling this to be properly solved via the integration as well).
V0.0.4
When setting up the integration the component asks for host and port. This is what I used:
host: 192.168.1.155
port: 8090
Then I got the error message:
Aborted. Failed to determine if authorization is required.
Sorry. Can't provide detailed logs. I tried setting it up but I couldn't make it work. Any tips or code to do this are very welcome.
Closing this PR as I've just created my own fork of hyperion-py and hyperion-ha that don't rename every constant/variable to "HyperHDR" from "hyperion" as that makes tracking the diffs from the official component way harder. My fork of the official hyperion-ng component synthesizes stuff from this fork as well as hyperhdr-py. It lives at https://github.com/andrew-kennedy/hyperhdr-ha
I'm still having the "none" names issue in entities but it seems to be working.
Originally posted by @andrew-kennedy in #21 (comment)
Got the same Problem as #1
0.0.5
Configuration not working.
Using HA 2022.2.5 same results, HyperHDR isn't in the list.
Also not after trying 0.0.4, 0.0.2 nor restarting HA multiple times or simply waiting for hours.
Something's still wrong with that config routine.
Can you have a look?
Is there a way to configure it manually?
I've checked the logs, there's nothing obvious, only that I have the custom component installed.
I have installed HyperHDR on my LG TV following the guide on the OpenLGTV Discord which works perfectly. This uses a version of HyperHDR called 18.0.0.0beta1 LG webOS compiled by Ambilight FR Discord Community and would like to use your integration with it.
Unfortunately, it looks like your version checking is stopping this...
`Logger: homeassistant.config_entries
Source: custom_components/hyperhdr/init.py:154
Integration: HyperHDR (documentation, issues)
First occurred: 14:22:30 (1 occurrences)
Last logged: 14:22:30
Error setting up entry 192.168.1.161:19444 for hyperhdr
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 335, in async_setup
result = await component.async_setup_entry(hass, self)
File "/config/custom_components/hyperhdr/init.py", line 154, in async_setup_entry
if AwesomeVersion(version) < AwesomeVersion(HYPERHDR_VERSION_WARN_CUTOFF):
File "/usr/local/lib/python3.9/site-packages/awesomeversion/awesomeversion.py", line 145, in lt
raise AwesomeVersionCompareException(
awesomeversion.exceptions.AwesomeVersionCompareException: Can't compare <unknown 18.0.0.0beta1 LG webOS compiled by Ambilight FR Discord Community> and <CalVer 17.0.0.0>`
Anything you can do to help?
0.0.6
Tested with HyperHDR 17.0.0.0 and 18.0.0.0b2
I just wanted to add the integration in the frontend, but it fails to configure.
I can get a token which is shown in HyperHDR but in the next step the integration just shows "error".
Logs
Logger: aiohttp.server
Source: custom_components/hyperhdr/config_flow.py:401
Integration: HyperHDR (documentation, issues)
First occurred: 14:58:16 (2 occurrences)
Last logged: 14:59:28
Error handling request
Traceback (most recent call last):
File "/opt/homebrew/Cellar/[email protected]/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/streams.py", line 540, in readline
line = await self.readuntil(sep)
File "/opt/homebrew/Cellar/[email protected]/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/streams.py", line 635, in readuntil
raise exceptions.LimitOverrunError(
asyncio.exceptions.LimitOverrunError: Separator is found, but chunk is longer than limit
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/server/homeassistant/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 435, in _handle_request
resp = await request_handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/aiohttp/web_app.py", line 504, in _handle
resp = await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 117, in impl
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/request_context.py", line 28, in request_context_middleware
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/ban.py", line 79, in ban_middleware
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/auth.py", line 219, in auth_middleware
return await handler(request)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/view.py", line 137, in handle
result = await result
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/config/config_entries.py", line 205, in post
return await super().post(request, flow_id)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/components/http/data_validator.py", line 62, in wrapper
result = await method(view, request, *args, **kwargs)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/helpers/data_entry_flow.py", line 109, in post
result = await self._flow_mgr.async_configure(flow_id, data)
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/data_entry_flow.py", line 260, in async_configure
result = await self._async_handle_step(
File "/Users/server/homeassistant/lib/python3.9/site-packages/homeassistant/data_entry_flow.py", line 335, in _async_handle_step
result: FlowResult = await getattr(flow, method)(user_input)
File "/Users/server/homeassistant-config/custom_components/hyperhdr/config_flow.py", line 234, in async_step_user
return await self._advance_to_auth_step_if_necessary(
File "/Users/server/homeassistant-config/custom_components/hyperhdr/config_flow.py", line 141, in _advance_to_auth_step_if_necessary
return await self.async_step_confirm()
File "/Users/server/homeassistant-config/custom_components/hyperhdr/config_flow.py", line 401, in async_step_confirm
async with self._create_client() as hyperhdr_client:
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 149, in __aenter__
result = await self.async_client_connect()
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 369, in async_client_connect
await self.async_client_disconnect()
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 422, in async_client_disconnect
return await self._async_client_disconnect_internal()
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 451, in _async_client_disconnect_internal
await self._await_or_stop_task(receive_task, stop_task=True)
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 588, in _await_or_stop_task
await task
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 568, in _receive_task_loop
while await self._async_receive_once():
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 608, in _async_receive_once
resp_json = await self._async_safely_read_command(use_timeout=False)
File "/Users/server/homeassistant/lib/python3.9/site-packages/hyperhdr/client.py", line 485, in _async_safely_read_command
resp = await asyncio.wait_for(future_resp, timeout=timeout_secs)
File "/opt/homebrew/Cellar/[email protected]/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/tasks.py", line 442, in wait_for
return await fut
File "/opt/homebrew/Cellar/[email protected]/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/streams.py", line 549, in readline
raise ValueError(e.args[0])
ValueError: Separator is found, but chunk is longer than limit
Is it possible to have the integration also include the estimated power consumption?
Hi,
i have an problem with the integration. Initially everything works flawlessly but as soon as i unplug the PI running HyperHDR during the night and turn it back on it says host unreachable if i try to control it. I never gets controllable again until i delete an reconfigure the integration. Its configured via hostname, its not the IP that is changing i have checked that aleady. Its controllable via its own webinterface no problem.
Any idea?
Hi @mjoshd -
Im running version 0.0.6 of the integration with version 19 of HyperHDR. Home assistant is 2023.9.2
I have tried to setup logging as per the wiki but I cant see hyperHDR in the list on the drop down in the logs section, is this the right place?
As far as I understand the switch should enable and disable the instance its linked to. I am able to turn the switch on which does indeed enable the instance as I can see it in the web UI. However, when I turn the switch off it doesnt change anything in the Web UI and the instance remains enabled.
If I enable/disable the instance in the HyperHDR web UI, I can see that the switch state in HA updates as expected.
I have also tried disabling the instance using the JSON API and this works fine too.
Is this expected behaviour? Please let me know if you need any further information, I am happy to send the logs but would need some guidance on how to access them. Thanks.
Hi,
I am currently experiencing an issue using HyperHDR Beta8 and Home Assistant.
I have created a button to switch the leds on/off.
Problem is, when I click it, the source ultimately switches from Flatbuffer Webos to Home Assistant (not immediately though). I tried to turn off auto selection off but it doesn't work on the long run.
Any idea what could be wrong ?
Thanks
Logger: homeassistant.config_entries
Source: config_entries.py:711
First occurred: 19:39:57 (4 occurrences)
Last logged: 19:44:59
Error occurred loading configuration flow for integration hyperhdr: cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
getting the above error in home assistant
I have followed the HACS add-on but I'm only getting Hyperion showing in the integration menu.
I've tried changing the DNS server and reinstalling and restarting many times, but nothing.
i have the HyperHDR files also in the config > Custom components sections
Version | core-2022.7.0
Host Operating System | Home Assistant OS 8.2
Supervisor Version | supervisor-2022.07.0
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.