Giter Club home page Giter Club logo

hass-speakercraftmediaplayer's Introduction

hacs_badge

HASS-SpeakercraftMediaPlayer

Speakercraft MZC Platform for Home Assistant

Repository created for install via HACS based on code by @sjeffrey101 here

Hardware set-up

Desiged to be used via direct connection (using RS232) via the MZC Control Port. (Does not currently work via the RSA-1.0 interface.)

If Home Assistant is not in proximity to SpeakerCraft MZC device then a remote serial device can be used to access the MZC remotely, see bottom of page.

MZC must be at firmware 2.2.8 (latest), if not flash it with EZ tools after downloading firmware from https://speakercraft.com/wp-content/uploads/tools/firmware_updater_03-02-11.exe

While this integration is designed to work and allow replacement of the SpeakerCraft control panels, the zones do need to be set-up via EZ-tools for the integration to function.

Example Configuration.yaml

speakercraft_media:
        zones: 
          1: "Lounge Speakers"
          2: "Kitchen Speakers"
          3: "Den Speakers"
          4: "Outside Speakers"
          5: "Master Speakers"
          6: "bed1 Speakers"
          7: "bed2 Speakers"
          8: "Bathroom Speakers"
        serial_port: "/dev/serial/by-id/usb-1a86_USB2.0-Ser_-if00-port0"
        sources:
          3: "Sr3"
          4: "Sr4"
          5: "Alexa"
        default_volume: 20
        default_source: 5
        power_target: switch.speakercraft # optional parameter for when powering the amplifier or associated equipment via a smart plug

Master Power

As per above config, the entity switch.speakercraft should exist which functions as the main masteroff switch.

This is intended to be used to contol a smart plug powering the amplifier. This allows it to be turned on remotely and automatically turned off when all zone are off (60 second delay implemented)

All Off

There is a button for turning all zones off

Party Mode

A switch is added for each zones for "Party Mode", the entity name is the name of the zone suffixed with "_party"

Tone

There are buttons for bass/treble up/down and number sliders

Logging

If you are having issues or want to see how the component works, you can enable logging for this integration to configuration.yaml with something similar to as follows

logger:
  default: warn
  logs:
    custom_components.speakercraft_media: debug

Remote

Generic remote serial devices are expected to be able to be made to work with this integration.

A confirmed workinging confiuration is documented below:

Description Supplier Part Number Comment URL/Search Terms
RS232 to Ethernet Converter USR IOT Technology Limited USR-TCP232-302 Direct connection prefered as opposed to WiFi for performance
Null Modem Tronix (eBay Seller Tronisoft) Male-Female Serial DB9 All Null Modems should work, but be careful of gender, see below null modem mini male female
Gender Changer C2G DB9 Male to DB9 Male Slimline Adapter Gender changer here needed, woulkdn't be needed if Null Modem was Male/Male db9 mini gender changer
MZC data cable SpeakerCraft ? speakercraft mzc data cable

Serial Port to be setup as 56700 baud, 8 bit, no partity, 1 stop bit. Must be set-up as TCP Server

Serial Server Setup Example

Serial connection string serial_port: socket://192.168.0.7:23?logging=debug

Remote Setup Example

hass-speakercraftmediaplayer's People

Contributors

mattsaxon avatar sjeffrey101 avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

sjeffrey101

hass-speakercraftmediaplayer's Issues

"incorrect checksum" and "throw away early trim" in logs

Hello,

Foremost, big thanks to all contributors who made this possible! Module is great!

After a recent update, those two errors appeared in home assistant:

Source: custom_components/speakercraft_media/speakercraft_media.py:429
Integration: Speakercraft Media Player
First occurred: 18 березня (March) 2022., 16:58:23 (11 occurrences)
Last logged: 13:14:26

incorrect checksum, ignoring 550b20020000ff1113550b check 32 calc 251
incorrect checksum, ignoring 550b20050000ff18111355 check 11 calc 235
incorrect checksum, ignoring 550b20000000ff23000011 check 19 calc 77
incorrect checksum, ignoring 550b2005801113550b2000 check 0 calc 87
incorrect checksum, ignoring 550b20040000ff1400e011 check 19 calc 120

Logger: custom_components.speakercraft_media.speakercraft_media
Source: custom_components/speakercraft_media/speakercraft_media.py:441
Integration: Speakercraft Media Player (documentation, issues)
First occurred: 18 березня (March) 2022 р., 16:58:23 (63 occurrences)
Last logged: 11:54:43

throw away early trim 00
throw away early trim ff
throw away early trim 23
throw away early trim 28
throw away early trim 36

As a result of this (or maybe not, idk) all my zones turn themselves off after some minutes or hours.

Confirmations are not explicitly handled

At the moment whilst confirmations are tracked, the code doesn't do anything with them, e.g. resubmit if not received or if an error were to occur.

In testing so far, this hasn't been an issue, but may seen in due course. This issue is hear to track if anyone does have issues with it

Create switch entity during setup

Currently the switch entity that is referenced as the masterpower switch target needs to exist in HA, consider creating this automatically on setup

Ez-Tool link expired

Hello,
Very good project.
the link to the Ez Tool software has expired. Maybe someone can share?

Support for remote serial

Decide how to support a remote MZC device from the HA device.

Consider;

  • Using rfc 2217 (which is supported by pyserial)
  • Using MQTT to a custom firmware on an ESP32

Ideally using rfc2217 is the way to go, but given the chattiness of the (pesudo) xonxoff protocol, this may not be as nice as remote commands via MQTT which should be less chatty

masterpoweroff doesn't function

the masterpoweroff function doesn't appear to work. The masterpoweron does have the desired effect.

@sjeffrey101, what is your intent of this function, is it for notification of status or all to turn all zones on at once?

I wonder if you intent for this master switch could be to use it for Party Mode to any extent? I will be implementing that somehow, but want to do it consistently with your expectations.

Enhancements.

hi matt

ok had a chance to test your code. Works really well. thanks for making this so much better.

i think we should make the following changes. (not in this order or priority) and once i figure out github i can contribute to this.

  • move the device code to pypi
  • move the setup of component to init rather than in media player - this will allow additional entity types to be created easier.
  • get it to register as a device. Not sure if it should be a single device, or multiple to allow for areas for different zones. Gather device info. Unique info could be comport.
  • Add button for All Off.
  • remove all the master on/off power_target - this should be achievable through automations, rather then in the component.
  • fire an event when trying to turn on a zone (so an automation can turn on the smart power socket)
  • change tuner message from warn to debug. (too much in the log)
  • im not sure the default volume is working any more.
  • add input_numbers (sliders) for bass and treble
  • add buttons for terble flat and bass flat
  • independent default source and volume for different zones.
  • setup in configuration.yaml as a platform rather than media_player section, so it can create the media players, switches, buttons etc.
  • eventually setup as gui rather then configuration.yaml

some of these could be breaking changes, or have the potential to, so probably priority would be to do them before getting many users.

what are your thoughts?

kind regards

stuart

Make entities optional.

Add to configuration a way to make features optional.

suggest that by default the following isnt included.

  • master power off button
  • party mode switches
  • tone sliders
  • tone up down buttons
  • tone flat buttons

then we enable by adding to

speakercraft_media:
options:
- master power off button
- party mode switches
- tone sliders
- tone up down buttons
- tone flat buttons

Power on System without keypads connected

Hi Matt

Are you able to switch on the first Zone with out using a key pad?
I have an MZC66 which I can configure by using the EZtools software.
However all the messages I send using the MCZ code emulator tool are ignored (let me know if you don't have this i can send it to you?)
I looks like the system needs an event from keypad or IR to switch the system on , is this correct?

Thanks
Rob

Can't turn on the media_player.lounge_speakers ??

Hi…I am trying to implement your great code…but have come up againt an issue I’m not sure how to get around…
I am using an usb ftdi-rs232 adapter to a 3.5mm plug on the control port. I can update the firmware on the speakercraft amp which is an MZC-66.
I can implement the the controls but when it comes to enabling the zones for example
media_player.lounge_speakers
to turn on it just does not respond. I can get the party zone to work and I can see all the zones switch on by the leds on the amp but I can’t get it to switch on via media_player.. any ideas…?

See my attatched log
New Text Document (5).txt

Trouble getting feedback

I got everything installed and working to a point - if I press say power on for a zone the MZC turns it on but nothing changes in media player card. I can press any button for power on + all zones off and they work but no feedback. I enabled the logging, I can see the commands and confirmation but no status messages.

I've tried both a USB>RS232 and TCP>RS232 with the same results. I run HA in a virtual machine on Proxmox.

One thing I wasn't sure of - do I need to configure keypads even if I do not physically have any connected to the MZC?

Update 1 - Disregard, just got home to try setting the keypads and now it's working both on serial and over network through Proxmox.

Update 2 - Notice delay when using TCP>RS232 vs the USB>RS232 adapter. USB is much faster, any way to improve speed of TCP? My server and MZC will not be close together.

Deprecation warning

Not sure if this is being maintained anymore but I'm getting the following warning using this now. And wondered if it might be addressed. Thank you

Logger: homeassistant.helpers.entity
Source: helpers/entity.py:1637
First occurred: 6:49:04 PM (6 occurrences)
Last logged: 6:49:04 PM

Entity None (<class 'custom_components.speakercraft_media.media_player.SpeakercraftMediaPlayer'>) is using deprecated supported features values which will be removed in HA Core 2025.1. Instead it should use <MediaPlayerEntityFeature.VOLUME_SET|VOLUME_MUTE|TURN_ON|TURN_OFF|VOLUME_STEP|SELECT_SOURCE: 3468>, please create a bug report at https://github.com/mattsaxon/HASS-SpeakercraftMediaPlayer/issues and reference https://developers.home-assistant.io/blog/2023/12/28/support-feature-magic-numbers-deprecation

Quick commands sent at once and fail.

When sending multiple commands at once it only processes the first.

this can be replicated by using and automation to turn on 2 zones at once. or pressing volume up very quickly.

It also means that the default volume doesnt work as it sends the set volume directly after turning off a zone.

What is happening is that the second command is added to the write buffer and then transmitted all together in a single command window. The first command is recognised and confirmed, the following commands are ignored.

Error after adding configuration.yaml

So I have set aside the ESP32 since that seems to be overly complicated when my Pi4 and MZC are beside each other. I used a USB to DB9 to control jack on the MZC. I installed Matt’s SpeakercraftMediaPlayer using HACS - it looks like it installed correctly. I added the configuration.yaml and it save without errors. But I’m getting this error - any ideas why?:

2022-01-31 14:40:17 WARNING (MainThread) [homeassistant.config_entries] Config entry 'HP DeskJet 2600 series [350839]' for ipp integration not ready yet: Invalid response from API: Error occurred while communicating with IPP server.; Retrying in background
2022-01-31 14:40:17 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:40:17 WARNING (MainThread) [homeassistant.config_entries] Config entry 'Fire Tablet 1 fb80b4cb-1b202abf' for fullykiosk integration not ready yet: None; Retrying in background
2022-01-31 14:40:24 WARNING (MainThread) [homeassistant.components.camera] Setup of camera platform environment_canada is taking over 10 seconds.
2022-01-31 14:40:51 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:41:04 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:41:27 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:42:10 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:43:34 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:44:57 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:46:20 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:47:43 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:49:03 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:50:23 ERROR (MainThread) [homeassistant.setup] Unable to prepare setup for platform fullykiosk.binary_sensor: Platform not found (cannot import name 'BinarySensorDeviceClass' from 'homeassistant.components.binary_sensor' (/usr/src/homeassistant/homeassistant/components/binary_sensor/init.py)).
2022-01-31 14:50:24 ERROR (MainThread) [homeassistant.setup] Unable to prepare setup for platform fullykiosk.sensor: Platform not found (cannot import name 'SensorDeviceClass' from 'homeassistant.components.sensor' (/usr/src/homeassistant/homeassistant/components/sensor/init.py)).
2022-01-31 14:50:24 ERROR (MainThread) [homeassistant.setup] Setup failed for button: Integration not found.
2022-01-31 14:50:24 ERROR (MainThread) [homeassistant.setup] Unable to prepare setup for platform fullykiosk.number: Platform not found (cannot import name 'EntityCategory' from 'homeassistant.helpers.entity' (/usr/src/homeassistant/homeassistant/helpers/entity.py)).
2022-01-31 14:52:55 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error requesting 192.168.1.129 deviceInfo data: Server disconnected
2022-01-31 14:53:22 ERROR (MainThread) [homeassistant.components.hassio] The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
2022-01-31 14:53:22 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [547314486816] The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 185, in handle_call_service
await hass.services.async_call(
File "/usr/src/homeassistant/homeassistant/core.py", line 1492, in async_call
task.result()
File "/usr/src/homeassistant/homeassistant/core.py", line 1527, in _execute_service
await handler.job.target(service_call)
File "/usr/src/homeassistant/homeassistant/components/hassio/init.py", line 562, in async_handle_core_service
raise HomeAssistantError(
homeassistant.exceptions.HomeAssistantError: The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
2022-01-31 14:54:55 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:57:25 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 14:58:43 WARNING (SyncWorker_3) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 14:58:55 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 15:01:13 WARNING (SyncWorker_1) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 15:03:28 ERROR (MainThread) [homeassistant.components.hassio] The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
2022-01-31 15:03:28 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [547314486816] The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 185, in handle_call_service
await hass.services.async_call(
File "/usr/src/homeassistant/homeassistant/core.py", line 1492, in async_call
task.result()
File "/usr/src/homeassistant/homeassistant/core.py", line 1527, in _execute_service
await handler.job.target(service_call)
File "/usr/src/homeassistant/homeassistant/components/hassio/init.py", line 562, in async_handle_core_service
raise HomeAssistantError(
homeassistant.exceptions.HomeAssistantError: The system cannot restart because the configuration is not valid: Component error: speakercraft_media - cannot import name 'Platform' from 'homeassistant.const' (/usr/src/homeassistant/homeassistant/const.py)
2022-01-31 15:11:02 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 15:16:04 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 15:17:13 WARNING (SyncWorker_1) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 15:19:43 WARNING (SyncWorker_5) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 15:23:13 WARNING (SyncWorker_6) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 15:30:40 ERROR (MainThread) [custom_components.fullykiosk.coordinator] Error fetching 192.168.1.129 deviceInfo data: Cannot connect to host 192.168.1.129:2323 ssl:default [Connect call failed ('192.168.1.129', 2323)]
2022-01-31 15:39:43 WARNING (SyncWorker_3) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.
2022-01-31 15:40:43 WARNING (SyncWorker_0) [homeassistant.components.rpi_power.binary_sensor] Under-voltage was detected. Consider getting a uninterruptible power supply for your Raspberry Pi.

Support multiple units

Currently the component only supports a single MZC. Some people might have multiple, either independent or linked.

Issue when hex13 (and maybe hex11) in the the info messages

Ive got another issue with the flow control - when the checksum = hex13 (maybe any other byte also) it doesnt read the zone status correctly. i currently have 2 zones which are on, but showing off in HA as it cant read the zone status right, and update the status

incorrect checksum, ignoring 550b200000020200003831 check 85 calc 19
throw away early trim 0b20010000ff140000363655

took me a while to realise but the code is reading decimal 85 from the serial as the checksum (55 hex which is actually the start of next commend) - which then has to be thrown away.

the correct checksum is decimal 19 - hex 13 whcih is end of transmission window. i think the read stream ignores 11 and 13 and doesnt return it in the read even when its in the part of info message.

ive found that when pushing volume up on a couple of zones this will eventually occur, as the checksum reaches this number.

Doesn't recognise when system is off

Absense of messages on RS232 could be used to mark integration as "Unavailable" in the front end.

Though this might impact how we do Master-On

Deprecated methods will cease working in HA 2022.10

Errors from log

2022-10-05 20:54:57.670 WARNING (MainThread) [homeassistant.components.number] custom_components.speakercraft_media.number::SpeakercraftTreble is overriding deprecated methods on an instance of NumberEntity, this is not valid and will be unsupported from Home Assistant 2022.10. Please report it to the custom integration author.
2022-10-05 20:54:57.687 WARNING (MainThread) [homeassistant.components.number] custom_components.speakercraft_media.number::SpeakercraftBass is overriding deprecated methods on an instance of NumberEntity, this is not valid and will be unsupported from Home Assistant 2022.10. Please report it to the custom integration author.

https://developers.home-assistant.io/blog/2022/06/14/number_entity_refactoring/

See similar fix made here https://github.com/AlexxIT/SonoffLAN/pull/903/files

Log Errors

I'm getting some feedback from the mzc66 as far as volume levels but I can't control it. Plus the source lights on my wall panels are flashing when the MZC is connected to my Pi. I'm getting these log errors below - any ideas why?

This error originated from a custom integration.

Logger: custom_components.speakercraft_media.speakercraft_media
Source: custom_components/speakercraft_media/speakercraft_media.py:426
Integration: Speakercraft Media Player (documentation, issues)
First occurred: 7:26:35 PM (31797 occurrences)
Last logged: 7:28:21 PM

throw away early trim 65
throw away early trim 72
throw away early trim 73
throw away early trim 69
throw away early trim 6f


This error originated from a custom integration.

Logger: custom_components.speakercraft_media.speakercraft_media
Source: custom_components/speakercraft_media/speakercraft_media.py:408
Integration: Speakercraft Media Player (documentation, issues)
First occurred: 7:26:43 PM (49 occurrences)
Last logged: 7:27:02 PM

length too long, assume incorrect and find next message 557d

Media Control Options

Is it possible to issue media control commands like play/pause/skip if they are already controllable by the unit for the source?

Speakercraft

Hi,

I'm a HA newby, and some simple question.

I'm using your great speakercraft integration which works great on my MZC-66. Using an Nport for the distance. I made some cards in my gui but i can only switch the channels on, and not off. Do you have some examples how to make one button to turn on or off on channel?

Thanks in advance.

Barry.

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.