0x4a616e / homebridge-smartthings-ac Goto Github PK
View Code? Open in Web Editor NEWControl your Samsung SmartThings Air Conditioner with HomeKit
License: Apache License 2.0
Control your Samsung SmartThings Air Conditioner with HomeKit
License: Apache License 2.0
Describe The Bug:
ERROR after installing
Logs:
[6/30/2023, 1:17:30 AM] ====================
[6/30/2023, 1:17:30 AM] ERROR LOADING PLUGIN homebridge-smartthings-ac:
[6/30/2023, 1:17:30 AM] Error: Cannot find module 'hap-nodejs/dist/lib/definitions'
Require stack:
- /homebridge/node_modules/homebridge-smartthings-ac/dist/platformAccessory.js
- /homebridge/node_modules/homebridge-smartthings-ac/dist/platform.js
- /homebridge/node_modules/homebridge-smartthings-ac/dist/index.js
- /homebridge/node_modules/homebridge/lib/plugin.js
- /homebridge/node_modules/homebridge/lib/pluginManager.js
- /homebridge/node_modules/homebridge/lib/server.js
- /homebridge/node_modules/homebridge/lib/cli.js
- /homebridge/node_modules/homebridge/bin/homebridge
Hi, first of all, thank you very much and excellent Plug in!
I would like to ask if it is possible to control the fan speed. Currently in my AC only the temperature can be moved, but there is no way to change the fan speed.
Additionally, if the app could read the current speed and not move it when adjusting the temperature, that would be great.
Currently when I change the temperature it changes the fan speed to Auto, it even changes the speed to Auto the moment I enter the AC in the Home application. (I usually use my AC on low speed or Windfree).
One last request, do you think that later on, you can put a switch to turn the Windfree mode on and off?
Thank you!
Describe Your Problem:
Plugin installs properly. Token added to config. Plugin starts properly. Plugin finds all my Smartthings devices but skips all of them.
Logs:
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Master Bedroom Fan
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device********----******** Living Room Fan
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Samsung Room A/C
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Living Room Fan Winter Mode
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Master Bedroom Fan Winter Mode
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Master Bedroom Fan
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- ********** Hub
7/30/2021, 12:14:08 PMSmartThings Ac BridgeHomebridgeSmartThingsACSkipping device ---- Living Room Fan
Show the Homebridge logs here, remove any sensitive information.
Plugin Config:
{
"accessories": [],
"platforms": [
{
"platform": "HomebridgeSmartThingsAC",
"token": "----",
"minTemperature": 16,
"maxTemperature": 30,
"updateInterval": 15
}
]
}
Show your Homebridge config.json here, remove any sensitive information.
Screenshots:
Environment:
It will be great if you add support of the Windfree settings and control of the air flow direction
Describe The Bug:
After installing the plugin and restarting Homebridge I get an error which prevents it from loading. I also manually installed hap-nodejs as per: #3 (comment)
Logs:
[28/02/2022, 18:31:35] ====================
[28/02/2022, 18:31:35] ERROR LOADING PLUGIN homebridge-smartthings-ac:
[28/02/2022, 18:31:36] Error: Cannot find module 'hap-nodejs/dist/lib/definitions'
Require stack:
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/platformAccessory.js
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/platform.js
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/index.js
- /usr/local/lib/node_modules/homebridge/lib/plugin.js
- /usr/local/lib/node_modules/homebridge/lib/pluginManager.js
- /usr/local/lib/node_modules/homebridge/lib/server.js
- /usr/local/lib/node_modules/homebridge/lib/cli.js
- /usr/local/lib/node_modules/homebridge/bin/homebridge
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/usr/local/lib/node_modules/homebridge-smartthings-ac/src/platformAccessory.ts:2:1)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
[28/02/2022, 18:31:36] ====================
[28/02/2022, 18:31:36] Loading 3 platforms...
[28/02/2022, 18:31:36] [Config] Initializing config platform...
[28/02/2022, 18:31:36] [Config] Running in Service Mode
[28/02/2022, 18:31:36] [Shelly] Initializing Shelly platform...
[28/02/2022, 18:31:36] No plugin was found for the platform "HomebridgeSmartThingsAC" in your config.json. Please make sure the corresponding plugin is installed correctly.
Plugin Config:
{
"bridge": {
"name": "Homebridge 9797",
"username": "XX:XX:XX:XX:XX:XX",
"port": XXXXX,
"pin": "XXX-XX-XXX"
},
"accessories": [],
"platforms": [
{
"name": "Config",
"port": XXXX,
"platform": "config"
},
{
"name": "Shelly",
"admin": {
"enabled": true
},
"devices": [
{
"id": "XXXXXXXXXXX",
"name": "Finestra",
"type": "windowCovering"
},
{
"id": "XXXXXXXXXXX",
"name": "Portafinestra",
"type": "windowCovering"
}
],
"platform": "Shelly"
},
{
"token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"minTemperature": 16,
"maxTemperature": 30,
"updateInterval": 15,
"platform": "HomebridgeSmartThingsAC"
}
]
}
Screenshots:
Environment:
Describe The Bug:
The temperature limits currently in place will only work for Celsius.
To Reproduce:
Expected behavior:
Logs:
Show the Homebridge logs here, remove any sensitive information.
Plugin Config:
Show your Homebridge config.json here, remove any sensitive information.
Screenshots:
Environment:
Describe Your Problem:
Hi,
iam using RasberryPi with IOBroker. I installed the Homebridge Adapter and the Plugin "homebridge-smartthings-ac". Than i made a token and changed the config.jason with "token". Without "" i get an error.
When i start the Plugin i get an error " info | found 0 vulnerabilities". On my phone the AC is showing correct and i can change everything. Does any one see my mistake?
Thank you very much for your help!
Describe Your Problem:
After installing your plugin and restarting Homebridge it fails to load.
Logs:
[8/3/2021, 8:28:20 AM] ====================
[8/3/2021, 8:28:20 AM] ERROR LOADING PLUGIN homebridge-smartthings-ac:
[8/3/2021, 8:28:20 AM] Error: Cannot find module 'hap-nodejs/dist/lib/definitions'
Require stack:
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/platformAccessory.js
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/platform.js
- /usr/local/lib/node_modules/homebridge-smartthings-ac/dist/index.js
- /usr/local/lib/node_modules/homebridge/lib/plugin.js
- /usr/local/lib/node_modules/homebridge/lib/pluginManager.js
- /usr/local/lib/node_modules/homebridge/lib/server.js
- /usr/local/lib/node_modules/homebridge/lib/cli.js
- /usr/local/lib/node_modules/homebridge/bin/homebridge
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
at Function.Module._load (internal/modules/cjs/loader.js:725:27)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (/usr/local/lib/node_modules/homebridge-smartthings-ac/src/platformAccessory.ts:2:1)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19)
[8/3/2021, 8:28:20 AM] ====================
Plugin Config:
{
"bridge": {
"name": "Homebridge 7839",
"username":
"port": 51947,
"pin":
},
"accessories": [],
"platforms": [
{
"name": "Config",
"port": 8581,
"auth": "form",
"theme": "auto",
"tempUnits": "f",
"lang": "auto",
"platform": "config"
},
{
"name": "Home Alarm",
"auth": {
"username":
"password":
},
"cameras": true,
"sensorRefresh": 15,
"persistAccessories": true,
"resetSimpliSafeId": false,
"cameraOptions": {
"enableHwaccelRpi": false
},
"excludedDevices": [
"00641345"
],
"_bridge": {
"username":
"port": 53845
},
"platform": "homebridge-simplisafe3.SimpliSafe 3"
},
{
"email":
"password":
"name": "Garage",
"platform": "myQ",
"_bridge": {
"username":
"port": 31943
}
},
{
"token": "a68ccd6f-3a09-4461-b3d2-d490f40e4f5f",
"minTemperature": 16,
"maxTemperature": 30,
"updateInterval": 15,
"platform": "HomebridgeSmartThingsAC"
}
]
}
Screenshots:
Environment:
Would it be possible to hide / skip certain devices (AC) to be loaded?
I see in the log all other things within the smartthings eco are found but skipped. So I figure there probably must be a way to do this manually too?
I have an AC that I don't want to show up.
Describe The Bug:
Plugin fails to initialize and start itself
To Reproduce:
Logs:
[18/08/2022, 02:43:36] ====================
[18/08/2022, 02:43:36] ERROR LOADING PLUGIN homebridge-smartthings-ac:
[18/08/2022, 02:43:36] Error: Cannot find module 'hap-nodejs/dist/lib/definitions'
Require stack:
- /var/lib/homebridge/node_modules/homebridge-smartthings-ac/dist/platformAccessory.js
- /var/lib/homebridge/node_modules/homebridge-smartthings-ac/dist/platform.js
- /var/lib/homebridge/node_modules/homebridge-smartthings-ac/dist/index.js
- /var/lib/homebridge/node_modules/homebridge/lib/plugin.js
- /var/lib/homebridge/node_modules/homebridge/lib/pluginManager.js
- /var/lib/homebridge/node_modules/homebridge/lib/server.js
- /var/lib/homebridge/node_modules/homebridge/lib/cli.js
- /var/lib/homebridge/node_modules/homebridge/bin/homebridge
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/var/lib/homebridge/node_modules/homebridge-smartthings-ac/src/platformAccessory.ts:2:1)
at Module._compile (node:internal/modules/cjs/loader:1105:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
[18/08/2022, 02:43:36] ====================
[18/08/2022, 02:43:36] No plugin was found for the platform "HomebridgeSmartThingsAC" in your config.json. Please make sure the corresponding plugin is installed correctly.
Plugin Config:
{
"token": "(redacted)",
"minTemperature": 16,
"maxTemperature": 30,
"updateInterval": 15,
"platform": "HomebridgeSmartThingsAC"
}
Environment:
Hi, thanks for the amazing plugin before I start talking about my issue/request.
I am on the latest version on HB, Node and the plugin. Logs I am getting is obviously from smartthings server, because their server sucks, i know for many years now :) but my question is since I am getting this quite often and it fills up the HB logs, can we consolidate this like if you get "Request failed with status code 500" return "Smarthings server sucks so it failed" :) instead of erroring and logging all components of the plugin requests? :) See the portion of logs below. thanks
[2/21/2022, 8:25:47 PM] [HomebridgeSmartThingsAC] Error while updating device status Error: Request failed with status code 500: {"requestId":"XXXX","error":{"code":"UnexpectedError","message":"A non-recoverable error condition occurred.","details":[]}}
at createError (/usr/lib/node_modules/homebridge-smartthings-ac/node_modules/axios/lib/core/createError.js:16:15)
at settle (/usr/lib/node_modules/homebridge-smartthings-ac/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/usr/lib/node_modules/homebridge-smartthings-ac/node_modules/axios/lib/adapters/http.js:269:11)
at IncomingMessage.emit (node:events:532:35)
at endReadableNT (node:internal/streams/readable:1346:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
config: {
url: 'https://api.smartthings.com/devices/xxx/status',
method: 'get',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json;charset=utf-8',
Authorization: 'Bearer xxxxxx',
'User-Agent': 'axios/0.21.4'
},
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
paramsSerializer: [Function: paramsSerializer],
timeout: 0,
adapter: [Function: httpAdapter],
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
validateStatus: [Function: validateStatus],
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
data: undefined
},
request: <ref *1> ClientRequest {
_events: [Object: null prototype] {
abort: [Function (anonymous)],
aborted: [Function (anonymous)],
connect: [Function (anonymous)],
error: [Function (anonymous)],
socket: [Function (anonymous)],
timeout: [Function (anonymous)],
prefinish: [Function: requestOnPrefinish]
},
_eventsCount: 7,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
maxRequestsOnConnectionReached: false,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
_closed: false,
socket: TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
secureConnecting: false,
_SNICallback: null,
servername: 'api.smartthings.com',
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object: null prototype],
_eventsCount: 10,
connecting: false,
_hadError: false,
_parent: null,
_host: 'api.smartthings.com',
_readableState: [ReadableState],
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: [TLSWrap],
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: [Circular *1],
[Symbol(res)]: [TLSWrap],
[Symbol(verified)]: true,
[Symbol(pendingSession)]: null,
[Symbol(async_id_symbol)]: 2007399,
[Symbol(kHandle)]: [TLSWrap],
[Symbol(kSetNoDelay)]: false,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(connect-options)]: [Object],
[Symbol(RequestTimeout)]: undefined
},
_header: 'GET /devices/xxxx/status HTTP/1.1\r\n' +
'Accept: application/json\r\n' +
'Content-Type: application/json;charset=utf-8\r\n' +
'Authorization: Bearer xxxxx\r\n' +
'User-Agent: axios/0.21.4\r\n' +
'Host: api.smartthings.com\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: nop],
agent: Agent {
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
defaultPort: 443,
protocol: 'https:',
options: [Object: null prototype],
requests: [Object: null prototype] {},
sockets: [Object: null prototype],
freeSockets: [Object: null prototype] {},
keepAliveMsecs: 1000,
keepAlive: false,
maxSockets: Infinity,
maxFreeSockets: 256,
scheduling: 'lifo',
maxTotalSockets: Infinity,
totalSocketCount: 2,
maxCachedSessions: 100,
_sessionCache: [Object],
[Symbol(kCapture)]: false
},
socketPath: undefined,
method: 'GET',
maxHeaderSize: undefined,
insecureHTTPParser: undefined,
path: '/devices/xxx/status',
_ended: true,
res: IncomingMessage {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 3,
_maxListeners: undefined,
socket: [TLSSocket],
httpVersionMajor: 1,
httpVersionMinor: 1,
httpVersion: '1.1',
complete: true,
rawHeaders: [Array],
rawTrailers: [],
aborted: false,
upgrade: false,
url: '',
method: null,
statusCode: 500,
statusMessage: 'Internal Server Error',
client: [TLSSocket],
_consuming: false,
_dumped: false,
req: [Circular *1],
responseUrl: 'https://api.smartthings.com/devices/xxxx/status',
redirects: [],
[Symbol(kCapture)]: false,
[Symbol(kHeaders)]: [Object],
[Symbol(kHeadersCount)]: 22,
[Symbol(kTrailers)]: null,
[Symbol(kTrailersCount)]: 0,
[Symbol(RequestTimeout)]: undefined
},
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'api.smartthings.com',
protocol: 'https:',
_redirectable: Writable {
_writableState: [WritableState],
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_options: [Object],
_ended: true,
_ending: true,
_redirectCount: 0,
_redirects: [],
_requestBodyLength: 0,
_requestBodyBuffers: [],
_onNativeResponse: [Function (anonymous)],
_currentRequest: [Circular 1],
_currentUrl: 'https://api.smartthings.com/devices/xxxx/status',
[Symbol(kCapture)]: false
},
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype] {
accept: [Array],
'content-type': [Array],
authorization: [Array],
'user-agent': [Array],
host: [Array]
}
},
response: {
status: 500,
statusText: 'Internal Server Error',
headers: {
date: 'Mon, 21 Feb 2022 19:25:47 GMT',
'content-type': 'application/json',
'content-length': '156',
connection: 'close',
server: 'openresty',
'x-ratelimit-limit': '350',
'x-ratelimit-remaining': '348',
'x-ratelimit-reset': '15920',
'access-control-allow-origin': '',
'access-control-allow-methods': 'GET, POST, PUT, DELETE, OPTIONS',
'access-control-allow-headers': 'DNT,Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Accept,Authorization,X-ST-Client,X-ST-Api-Version,X-ST-Client-AppVersion,X-ST-Client-OS,X-ST-Client-DeviceModel'
},
config: {
url: 'https://api.smartthings.com/devices/xxxx/status',
method: 'get',
headers: [Object],
transformRequest: [Array],
transformResponse: [Array],
paramsSerializer: [Function: paramsSerializer],
timeout: 0,
adapter: [Function: httpAdapter],
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
validateStatus: [Function: validateStatus],
transitional: [Object],
data: undefined
},
request: <ref *1> ClientRequest {
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: false,
maxRequestsOnConnectionReached: false,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
_closed: false,
socket: [TLSSocket],
_header: 'GET /devices/xxxx/status HTTP/1.1\r\n' +
'Accept: application/json\r\n' +
'Content-Type: application/json;charset=utf-8\r\n' +
'Authorization: Bearer xxxxx\r\n' +
'User-Agent: axios/0.21.4\r\n' +
'Host: api.smartthings.com\r\n' +
'Connection: close\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: nop],
agent: [Agent],
socketPath: undefined,
method: 'GET',
maxHeaderSize: undefined,
insecureHTTPParser: undefined,
path: '/devices/xxxxx/status',
_ended: true,
res: [IncomingMessage],
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'api.smartthings.com',
protocol: 'https:',
_redirectable: [Writable],
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype]
},
data: {
requestId: 'xxxxxx',
error: [Object]
}
},
isAxiosError: true,
toJSON: [Function: toJSON]
}
I have a mixed Samsung AC system. A Samsung "Wifi-Kit" which exposes a system AS plus three wall units.
Problem is the wall units do not work well when added via the Wifi-Kit. And there's no way to have the Wifi-Kit NOT add them to Smartthings. No way to remove them individually either.
The wall units can be added to Smartthings via their own internal wifi and work much better. Currently I've got them all added again, but they are duplicated in Smartthings.
Which means they get duplicated into Homebridge and then into Homekit.
Most HB bridge plugins seem to have a way to exclude individual devices from exposure via HomeBridge, and I'd sure love that ability!
Thanks!
Hi, first of all: great work! your implementation is way faster than event the official iOS app!
Do you think is possibile to add the missing modes(Fan, Dry) and maybe separate buttons for the wind free and air purification modes?
For what regards the missing modes they are getting trough to home bridge, I have this errors showing:
[HomebridgeSmartThingsAC] Received unknown heater-cooler state wind
[HomebridgeSmartThingsAC] Received unknown heater-cooler state dry
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.