Giter VIP home page Giter VIP logo

homebridge-teufel's Introduction

Raumfeld and Teufel plugin for Homebridge

This is a plugin to connect Raumfeld/Teufel hardware to Apple's Homekit via the Homebridge system. Many thanks to @ChrisD for his work on Raumfeld (https://github.com/ChriD/node-raumserver).

Currently a prototype

This is also my first node.JS project. It is a plugin for homebridge. You need a running homebridge in order to use this plugin.

  • To prevent changing devices to be removed and added again in Homekit, add option 'frozen' = true to config.json. See config-sample.json. This is BETA!
  • To remove old devices and add new devices, use 'clearcache' = true. This is BETA!

Prerequisites

This plugin requires at least one running Raumfeld/Teufel device in order to work. This plugin needs unique names for your Raumfeld/Teufel devices and rooms.

Installation

First see link above and follow the installation instruction for Homebridge. Afterwards, simply install this plugin (assuming that homebridge is installed globally): sudo npm install -g homebridge-teufel. Now copy the config-sample.json to your homebridge home folder (usually /home/username/.homebridge) and rename it to config.json. Finally, you can the setup with homebridge.

Homebridge should show your devices and one switch called "Virtual Zone". Currently I assume, that there is only one Zone playing music. Will work on that in the future.

HowTo

Start only selected devices with Homekit scene (e.g. Arriving home):

  • Create a new Homekit scene
  • Add Raumfeld/Teufel devices you want to start AND the "Virtual Zone"-device
  • Activate all devices and the "Virtual Zone" in the scene and save

Now only the devices in the scene will start playing (for example, when you arrive at home).

Sleeping or good morning timer:

  • Create a new automation in Homekit (for example by time or by sunrise)
  • Add Raumfeld/Teufel devices AND the "Virtual Zone"-device
  • Activate all devices and the "Virtual Zone" in the scene
  • Now you can choose "deactivate after XX minutes" for the automation and save

Now you devices will start playing on the set automation and will stop playing after the defined time.

homebridge-teufel's People

Contributors

randommetalhead avatar

Stargazers

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

Watchers

 avatar  avatar  avatar

homebridge-teufel's Issues

Running in Docker - Permission Denied when writing log

Logs should go to HOMEBRIDGE_HOME/logs and not the fs-root.

[3/3/2019, 4:14:00 PM] Homebridge is running on port 51826.
info: [Raumkernel] Found raumfeld host on: 192.168.178.23
error: uncaughtException: EACCES: permission denied, open '/app.2019-03-03-1514.log' date=Sun Mar 03 2019 16:14:00 GMT+0100 (Central European Standard Time), pid=21438, uid=1025, gid=100, cwd=/run/s6/services/homebridge, execPath=/usr/local/bin/node, version=v10.15.1, argv=[/usr/local/bin/node, /usr/local/bin/homebridge, -U, /homebridge, -P, /homebridge/node_modules, -C], rss=70402048, heapTotal=39055360, heapUsed=21550552, external=948049, loadavg=[0.55419921875, 0.35986328125, 0.21484375], uptime=397809
Error: EACCES: permission denied, open '/app.2019-03-03-1514.log'

Nullpointer when device is not accessible

I see some Nullpointers in the logs, when removing devices from the list.
This has something todo with the way, how devices are added and removed, introduced in 1.1

Need to fix that!

Devices are not shown at homebridge

Hello devices are not Popping up in Homebridge.
It seems it does not detect any devices.
I already reset room in the Teufel App - but no changes.
I am grateful for any advice.

Some information from the Log:

Started Node.js HomeKit Server.
[3/19/2020, 4:10:56 PM] Loaded config.json with 0 accessories and 4 platforms.
[3/19/2020, 4:10:56 PM] ---
[3/19/2020, 4:10:56 PM] Loaded plugin: homebridge-config-ui-x
[3/19/2020, 4:10:56 PM] Registering platform 'homebridge-config-ui-x.config'
[3/19/2020, 4:10:56 PM] ---
[3/19/2020, 4:10:56 PM] Loaded plugin: homebridge-shelly
[3/19/2020, 4:10:57 PM] Registering platform 'homebridge-shelly.Shelly'
[3/19/2020, 4:10:57 PM] ---
[3/19/2020, 4:10:59 PM] Loaded plugin: homebridge-teufel
[3/19/2020, 4:10:59 PM] Registering platform 'homebridge-teufel.Teufel'
[3/19/2020, 4:10:59 PM] ---
[3/19/2020, 4:10:59 PM] Loaded plugin: homebridge-tplink-smarthome
[3/19/2020, 4:10:59 PM] Registering platform 'homebridge-tplink-smarthome.TplinkSmarthome'
[3/19/2020, 4:10:59 PM] ---
[3/19/2020, 4:10:59 PM] Loading 4 platforms...
[3/19/2020, 4:10:59 PM] [Config] Initializing config platform...
[3/19/2020, 4:10:59 PM] [Config] Spawning homebridge-config-ui-x with PID 780
[3/19/2020, 4:10:59 PM] [Shelly] Initializing Shelly platform...
[3/19/2020, 4:10:59 PM] [TplinkSmarthome] Initializing TplinkSmarthome platform...
[3/19/2020, 4:10:59 PM] [TplinkSmarthome] homebridge-tplink-smarthome v4.0.1, node v12.16.1, homebridge v0.4.53
[3/19/2020, 4:10:59 PM] [Teufel] Initializing Teufel platform...
[3/19/2020, 4:11:00 PM] Loading 0 accessories...
[3/19/2020, 4:11:00 PM] [TplinkSmarthome] Configuring cached accessory: [Steckdose] 80066A532F85603668A26215D40A84111A060AF9 668ba3fb-dda1-46c8-8584-1a59c6753e4a
Setup Payload:
X-HM://0024D8MEUJ6G4
Scan this code with your HomeKit app on your iOS device to pair with Homebridge:
...
[3/19/2020, 4:11:00 PM] [Shelly] 5 accessories loaded from cache
[3/19/2020, 4:11:00 PM] Homebridge is running on port 51826.
[3/19/2020, 4:11:00 PM] [Shelly] Admin server is running on port 8080
(node:346) UnhandledPromiseRejectionWarning: Error: send ENETUNREACH 224.0.1.187:5683
at doSend (dgram.js:697:16)
at defaultTriggerAsyncIdScope (internal/async_hooks.js:311:12)
at afterDns (dgram.js:643:5)
at processTicksAndRejections (internal/process/task_queues.js:85:21)
(node:346) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:346) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
[3/19/2020, 4:11:04 PM] [Config] Homebridge Config UI X v4.13.0 is listening on :: port 8081
[3/19/2020, 4:11:10 PM] [TplinkSmarthome] New Device Online: [Steckdose] plug [80066A532F85603668A26215D40A84111A060AF9] 192.168.1.207 9999
[3/19/2020, 4:11:10 PM] [TplinkSmarthome] Adding: [Steckdose] plug [80066A532F85603668A26215D40A84111A060AF9]
homebridge : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/kill -9 1056
pam_unix(sudo:session): session opened for user root by (uid=0)
pam_unix(sudo:session): session closed for user root
[3/19/2020, 4:12:12 PM] [Config] Homebridge restart request received
[3/19/2020, 4:12:12 PM] [Config] Executing restart command: sudo -n systemctl restart homebridge
homebridge : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/systemctl restart homebridge
pam_unix(sudo:session): session opened for user root by (uid=0)
Stopping Node.js HomeKit Server...
[3/19/2020, 4:12:12 PM] Got SIGTERM, shutting down Homebridge...
homebridge.service: Main process exited, code=exited, status=143/n/a
homebridge.service: Failed with result 'exit-code'.
Stopped Node.js HomeKit Server.
homebridge.service: Found left-over process 780 (homebridge-conf) in control group while starting unit. Ignoring.
This usually indicates unclean termination of a previous run, or service implementation deficiencies.
homebridge.service: Found left-over process 1743 (sh) in control group while starting unit. Ignoring.
This usually indicates unclean termination of a previous run, or service implementation deficiencies.
homebridge.service: Found left-over process 1744 (sudo) in control group while starting unit. Ignoring.
This usually indicates unclean termination of a previous run, or service implementation deficiencies.
homebridge.service: Found left-over process 1749 (systemctl) in control group while starting unit. Ignoring.
This usually indicates unclean termination of a previous run, or service implementation deficiencies.
Started Node.js HomeKit Server.
pam_unix(sudo:session): session closed for user root
[3/19/2020, 4:12:19 PM] Loaded config.json with 0 accessories and 4 platforms.
[3/19/2020, 4:12:19 PM] ---
[3/19/2020, 4:12:19 PM] Loaded plugin: homebridge-config-ui-x
[3/19/2020, 4:12:19 PM] Registering platform 'homebridge-config-ui-x.config'
[3/19/2020, 4:12:19 PM] ---
[3/19/2020, 4:12:19 PM] Loaded plugin: homebridge-shelly
[3/19/2020, 4:12:19 PM] Registering platform 'homebridge-shelly.Shelly'
[3/19/2020, 4:12:19 PM] ---
[3/19/2020, 4:12:20 PM] Loaded plugin: homebridge-teufel
[3/19/2020, 4:12:20 PM] Registering platform 'homebridge-teufel.Teufel'
[3/19/2020, 4:12:20 PM] ---
[3/19/2020, 4:12:20 PM] Loaded plugin: homebridge-tplink-smarthome
[3/19/2020, 4:12:20 PM] Registering platform 'homebridge-tplink-smarthome.TplinkSmarthome'
[3/19/2020, 4:12:20 PM] ---
[3/19/2020, 4:12:20 PM] Loading 4 platforms...
[3/19/2020, 4:12:20 PM] [Config] Initializing config platform...
[3/19/2020, 4:12:20 PM] [Config] Spawning homebridge-config-ui-x with PID 1775
[3/19/2020, 4:12:20 PM] [Shelly] Initializing Shelly platform...
[3/19/2020, 4:12:20 PM] [TplinkSmarthome] Initializing TplinkSmarthome platform...
[3/19/2020, 4:12:20 PM] [TplinkSmarthome] homebridge-tplink-smarthome v4.0.1, node v12.16.1, homebridge v0.4.53
[3/19/2020, 4:12:20 PM] [Teufel] Initializing Teufel platform...
[3/19/2020, 4:12:20 PM] Loading 0 accessories...
[3/19/2020, 4:12:20 PM] [TplinkSmarthome] Configuring cached accessory: [Steckdose] 80066A532F85603668A26215D40A84111A060AF9 668ba3fb-dda1-46c8-8584-1a59c6753e4a
Setup Payload:
X-HM://0024D8MEUJ6G4
Scan this code with your HomeKit app on your iOS device to pair with Homebridge:
....
[3/19/2020, 4:12:20 PM] [Shelly] 5 accessories loaded from cache
[3/19/2020, 4:12:20 PM] Homebridge is running on port 51826.
[3/19/2020, 4:12:20 PM] [Shelly] Admin server is running on port 8080
[3/19/2020, 4:12:20 PM] [TplinkSmarthome] New Device Online: [Steckdose] plug [80066A532F85603668A26215D40A84111A060AF9] 192.168.1.207 9999
[3/19/2020, 4:12:20 PM] [TplinkSmarthome] Adding: [Steckdose] plug [80066A532F85603668A26215D40A84111A060AF9]
[3/19/2020, 4:12:23 PM] [Config] Homebridge Config UI X v4.13.0 is listening on :: port 8081

Device removed when using power-button on device

The device will be removed from Homekit, when the power-button on the device directly is used. No issue for Teufel devices, as they don´t have a power button, but a issue for Raumfeld devices.

Can't add my Raumfeld Stereo Cubes

Hi,

thanks for the great plugin which was working most of the time for me. But after reinstalling my Raspi 4, my Stereo Cubes from Teufel (former Raumfeld) won't be added. I've tried different settings like:

{
    "platform": "Teufel",
    "name": "Teufel"
}

{
    "platform": "Teufel",
    "name": "Raumfeld"
}

{
    "platform": "Teufel",
    "name": "stereo-cubes"
}

"stereo-cubes" is the network name of them.

None of these settings will work. Kind of clueless now what to do.

Readme

@RandomMetalhead

Hi Marcus,

can you please describe the installation part a little bit more detailed.
At the moment i have no idea how the homebridge setup should look like.
The switch called "Virtual Zone" is also not available.

config.json

{
"accessories" : [
{
"name" : "Pi Temp",
"accessory" : "RaspberryPiTemperature"
}
],
"bridge" : {
"username" : "CD:22:3D:E3:CE:36",
"name" : "Homebridge",
"pin" : "031-45-215",
"port" : 51826
},
"platforms" : [
{
"name" : "Teufel",
"platform" : "Teufel"
}
]
}

Thanks in advance
Max

TypeError: Cannot read property '0' of undefined

Hi there,

first of all, thanks for creating this plugin!

I installed in on homebridge but only get the following error. I use the default config from example. Any hint what could be the root cause?

My setup:
Raumfeld system with 3 rooms, all second Generation Raumfeld
Node v14.16.1

I use node-raumkernel in the same network together with Raumbar, there it works without issues.

Thanks!
Uli

[14/04/2021, 23:13:57] [Config] Initializing config platform...
[14/04/2021, 23:13:57] [Config] Running in Service Mode
[14/04/2021, 23:13:58] [Hue] Initializing Hue platform...
[14/04/2021, 23:13:58] [Hue] homebridge-hue v0.13.5, node v14.16.1, homebridge v1.3.4
[14/04/2021, 23:13:58] [Hue] warning: recommended version: node v14.16.0 LTS
[14/04/2021, 23:13:58] [Hue] config.json: nupnp: invalid key
[14/04/2021, 23:13:59] [Teufel] Initializing Teufel platform...
[14/04/2021, 23:14:05] [Hue] Philips hue: Signify Netherlands B.V. BSB002 bridge v1943185030, api v1.43.0
[14/04/2021, 23:14:10] TypeError: Cannot read property '0' of undefined
    at TeufelPlatform.addAccessory (/usr/local/lib/node_modules/homebridge-teufel/index.js:65:51)
    at Raumkernel.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/index.js:55:25)
    at Raumkernel.emit (events.js:315:20)
    at Raumkernel.setSystemReady (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:125:18)
    at Raumkernel.onMediaServerRaumfeldAdded (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:189:14)
    at DeviceManager.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:92:124)
    at DeviceManager.emit (events.js:315:20)
    at DeviceManager.createMediaServerRaumfeld (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.manager.deviceManager.js:561:14)
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.manager.deviceManager.js:408:34
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.external.upnp-device-client.js:48:5
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.external.upnp-device-client.js:670:7
    at ConcatStream.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/node_modules/concat-stream/index.js:37:43)
    at ConcatStream.emit (events.js:327:22)
    at finishMaybe (/usr/local/lib/node_modules/homebridge-teufel/node_modules/readable-stream/lib/_stream_writable.js:630:14)
    at afterWrite (/usr/local/lib/node_modules/homebridge-teufel/node_modules/readable-stream/lib/_stream_writable.js:492:3)
    at processTicksAndRejections (internal/process/task_queues.js:82:21)
error: uncaughtException: Cannot read property '0' of undefined date=Wed Apr 14 2021 23:14:10 GMT+0200 (Central European Summer Time), pid=14200, uid=1000, gid=1000, cwd=/var/lib/homebridge, execPath=/usr/local/bin/node, version=v14.16.1, argv=[/usr/local/bin/node, /usr/local/lib/node_modules/homebridge/bin/homebridge, -C, -Q, -U, /var/lib/homebridge, -I], rss=77283328, heapTotal=38191104, heapUsed=35142300, external=2103971, arrayBuffers=329278, loadavg=[2.33, 2.12, 1.65], uptime=3932531
TypeError: Cannot read property '0' of undefined
    at TeufelPlatform.addAccessory (/usr/local/lib/node_modules/homebridge-teufel/index.js:65:51)
    at Raumkernel.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/index.js:55:25)
    at Raumkernel.emit (events.js:315:20)
    at Raumkernel.setSystemReady (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:125:18)
    at Raumkernel.onMediaServerRaumfeldAdded (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:189:14)
    at DeviceManager.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:92:124)
    at DeviceManager.emit (events.js:315:20)
    at DeviceManager.createMediaServerRaumfeld (/usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.manager.deviceManager.js:561:14)
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.manager.deviceManager.js:408:34
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.external.upnp-device-client.js:48:5
    at /usr/local/lib/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.external.upnp-device-client.js:670:7
    at ConcatStream.<anonymous> (/usr/local/lib/node_modules/homebridge-teufel/node_modules/concat-stream/index.js:37:43)
    at ConcatStream.emit (events.js:327:22)
    at finishMaybe (/usr/local/lib/node_modules/homebridge-teufel/node_modules/readable-stream/lib/_stream_writable.js:630:14)
    at afterWrite (/usr/local/lib/node_modules/homebridge-teufel/node_modules/readable-stream/lib/_stream_writable.js:492:3)
    at processTicksAndRejections (internal/process/task_queues.js:82:21)
[14/04/2021, 23:14:14] Got SIGTERM, shutting down Homebridge...

Cannot read property '0' of undefined

Hey,
I'm getting the following error:

[10/4/2019, 12:19:00 PM] TypeError: Cannot read property '0' of undefined
    at TeufelPlatform.addAccessory (/homebridge/node_modules/homebridge-teufel/index.js:57:51)
    at Raumkernel.<anonymous> (/homebridge/node_modules/homebridge-teufel/index.js:48:22)
    at Raumkernel.emit (events.js:198:13)
    at Raumkernel.onZoneConfigurationChanged (/homebridge/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:235:14
    at ZoneManager.<anonymous> (/homebridge/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.raumkernel.js:106:124)
    at ZoneManager.emit (events.js:198:13)
    at /homebridge/node_modules/homebridge-teufel/node_modules/node-raumkernel/lib/lib.manager.zoneManager.js:134:22
    at Parser.<anonymous> (/homebridge/node_modules/homebridge-teufel/node_modules/xml2js/lib/parser.js:306:18)
    at Parser.emit (events.js:198:13)
    at SAXParser.onclosetag (/homebridge/node_modules/homebridge-teufel/node_modules/xml2js/lib/parser.js:264:26)
    at emit (/homebridge/node_modules/homebridge-teufel/node_modules/sax/lib/sax.js:639:35)
    at emitNode (/homebridge/node_modules/homebridge-teufel/node_modules/sax/lib/sax.js:644:5)
    at closeTag (/homebridge/node_modules/homebridge-teufel/node_modules/sax/lib/sax.js:903:7)
    at SAXParser.write (/homebridge/node_modules/homebridge-teufel/node_modules/sax/lib/sax.js:1436:13)
    at Parser.exports.Parser.Parser.parseString (/homebridge/node_modules/homebridge-teufel/node_modules/xml2js/lib/parser.js:325:31)
    at Parser.parseString (/homebridge/node_modules/homebridge-teufel/node_modules/xml2js/lib/parser.js:5:59)
error: uncaughtException: Cannot read property '0' of undefined date=Fri Oct 04 2019 12:19:20 GMT+0000 (Coordinated Universal Time), pid=2832, uid=1000, gid=1000, cwd=/run/s6/services/homebridge, execPath=/usr/local/bin/node, version=v10.16.3, argv=[/usr/local/bin/node, /usr/local/bin/homebridge, -U, /homebridge, -P, /homebridge/node_modules, -C], rss=50663424, heapTotal=33116160, heapUsed=15576584, external=62743, loadavg=[0.96044921875, 1.17626953125, 1.1826171875], uptime=4384

I also attempted to run the plugin inside a completely fresh docker-homebridge container, but got the same result.

I own a single Raumefeld One M.

TypeError: Winston.transports.DailyRotateFile is not a constructor

Homebridge: 0.4.50 (via HOOBS 3.1.22)
Node: 12.13.1
homebridge-teufel: 0.4.4

Error:
[Homebridge] [3/4/2020, 19:37:03] TypeError: Winston.transports.DailyRotateFile is not a constructor at Logger.initExternalLogger (/home/hoobs/.hoobs/node_modules/node-raumkernel/lib/lib.logger.js:64:21) at new Logger (/home/hoobs/.hoobs/node_modules/node-raumkernel/lib/lib.logger.js:28:14) at Raumkernel.createLogger (/home/hoobs/.hoobs/node_modules/node-raumkernel/lib/lib.raumkernel.js:49:25) at new TeufelPlatform (/home/hoobs/.hoobs/node_modules/homebridge-teufel/index.js:34:21) at Server._loadPlatforms (/home/hoobs/.hoobs/node_modules/@hoobs/homebridge/lib/server.js:293:34) at Server.run (/home/hoobs/.hoobs/node_modules/@hoobs/homebridge/lib/server.js:74:14) at module.exports (/home/hoobs/.hoobs/node_modules/@hoobs/homebridge/lib/cli.js:90:12) at Object.<anonymous> (/home/hoobs/.hoobs/node_modules/@hoobs/homebridge/bin/homebridge:10:63) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10) at internal/main/run_main_module.js:17:11

Every instance of homebridge creats a button and zone

Hey homebridge automatically creates a button and a zone without being called in config.json. Now I have 8 buttons and zones, because I have 8 instances. You have to improve that urgently. Otherwise this plugin is useless.

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.