Giter Club home page Giter Club logo

node-red-contrib-ocpp's Introduction

node-red-contrib-ocpp

NPM

Node-Red nodes for communicating with the EVSE Charge Points and Central Systems via the Open Charge Point Protocol (hereafter OCPP). These node-red nodes allow you to take on the role of a Central System (CS) or Charge Point (CP).

Based on the OCPP 1.5 and OCPP 1.6 specifications utilizing the Simple Object Access Protocol (hereafter SOAP) and JavaScript Object Notation (hereafter JSON) protocols.

Install

Run the following command in the root directory of your Node-RED install

npm install node-red-contrib-ocpp

Requirements

The package currently requires Node.js 10 or higher.

Nodes

(nodes that begin with CS refer to those that emulate a Central System. Those with CP refer to those that emulate a Charge Point/EVSE)


CS request SOAP

This node allows you to make requests to an EVSE charge point and return a message with the response from that request. The targeted EVSE charge point must support either 1.5 or 1.6 SOAP (this node does not support JSON) It is flexible in that you can either set up a default command and/or data to send when you configure the node, or you may pass in that information to override the defaults via a message payload.

For example, to set up a Reset command request, you can select the Reset command from the nodes configuration dropdown. The Reset command also requires sending a parameter indicating the type of reset to be performed, either hard or soft. In the Command Params field of the configuration, you would provide a JSON formatted object similar to this:

{
    "type": "Soft"
}

Alternatively, you can pass the node a payload which contains a command and/or data to override the defaults. To make a Reset request by passing it a message, the message payload (msg.payload) would look as follows:

{
    "command": "Reset",
    "data" : { "type" : "Hard" }
}

If either the command or the data sections are missing from the message, the defaults that are set up in the node configuration will be used. If you set up an CS request SOAP node with a default command of Reset, you could pass in just the following:

for hard reset

{
    "data": { "type": "Hard" }
}

for soft reset

{
    "data": { "type": "Soft"}
}

User Generated Message IDs

For all request nodes the option exists to also pass in a user generated message ID that will be used to identify the message.

{
    "command": "Reset",
    "data" : { "type" : "Hard" },
    "MessageId": "12345678"
}

This may make it easier for you to identify and track your message throughout your flows. By default, the node modules internally generate a unique id for request messages based on UUID v4

Output

The output returned by the node has the following message format:

{
    "ocpp": {
        "command": "<the command being responded to>",
        "chargeBoxIdentity": "<the name of the EVSE charge box responding>",
        "url": "<the URL of the responding charge box>",
        "data": "<the data that was sent with the command to make the request>"        
    },
    "payload": {
        "command": "<the command being responded to>",
        "key": "value"
    }
}

Example return message from a OCPP 1.5 SOAP

{
    "_msgid":"58c0fa49.ecac14",
    "topic":"",
    "ocpp":{
        "command":"Reset",
        "MessageId":"f58ec0fb-b6fd-48a3-9a0c-2e0cba143388",
        "chargeBoxIdentity":"Chargion6D94",
        "url":"http://204.188.169.51:8080/chargePoint",
        "ocppVer":"1.5s",
        "data":{
            "type":"Soft"
        }
    },
    "payload":{
        "command":"Reset",
        "data":{
            "status":"Accepted"
        }
    }
}

The payload portion varies depending on the command and EVSE charge point vendor specifications.


CP request SOAP

This node is used to emulate an EVSE charge point station and is capable of making requests to a Central System service that supports either protocol 1.5 or 1.6 SOAP. Its behavior is similar to that of the CS request SOAP node.

To emulate a EVSE charge point station that utilizes OCPP 1.6 JSON, use the CP client JSON node.


CS server

The ocpp-server node will listen for incoming requests coming from the EVSE charge points that are targeting its address. It is capable of receiving messages via 1.5 SOAP, 1.6 SOAP, and 1.6 JSON if the protocols are enabled in its configuration. When the ocpp-server node receives a message, it will output a message in the following format:

{
    "ocpp": {
        "ocppVersion": "<protocol version of message: 1.5, 1.6, or 1.6j>",
        "command": "<the command being requested>",
        "chargeBoxIdentity": "<the name of the charge box making the request>",
        "From": "<optional address of the incoming request>",
        "MessageID": "<optional incoming request message id generated by the charge box>",
        "messageType": "<only sent if the message is a JSON message. 2=request, 3=reply>"
    },
    "payload": {
        "command": "<the command being requested>",
        "data": "<arguments received with the incoming request command stored in key/value pairs>"
    }
}

Here is an example of a OCPP 1.6 JSON Heartbeat request message.

{   "ocpp":{
        "ocppVersion": "1.6j",
        "chargeBoxIdentity": "veefil-48310","MessageId": "uuid:f1d11de1-5725-9255-854b-da6542b4d9bb",
        "msgType": 2,
        "command": "Heartbeat"
    },
    "payload":{
        "command": "Heartbeat",
        "data":{}
    },
    "msgId":"e38e0e7f-3db2-4a33-ab80-859175ebfce0","_msgid":"d310afd9.b9de8"
}

The incoming messages require a response (sent through the server response node), and those responses should be sent within a reasonable amount of time. The ocpp-server node will cancel any outstanding responses after a 2 minute time period. The EVSE side may timeout awaiting a response even sooner than that depending on their configuration.


server response

To return a response to an incoming EVSE charge point request, you need to pass your message to the server response node. Since the message coming out of the ocpp-server node contains information about how to return the response, the message itself should be passed as is through the node flow with the exception of the msg.payload section. The msg.payload should be modified to contain the response to the incoming request.

For example, to accept a BootNotification request, set the payload of the response as:

{
    "status": "Accepted",
    "currentTime": new Date().toISOString(),
    "heartbeatInterval": 60
}

(The message being passed from the server contains a unique identifier contained in msg.msgID. This needs to be present in the response message in order for the message to be returned to the proper request)


CP server SOAP

This node emulates an EVSE charge point station server that accepts and responds to OCPP 1.5 or 1.6 SOAP messages being sent from a Central System service. Setup and behavior are similar to that of the CS server. Use this node in conjunction with a server response node to pass responses to requests back to a Central System.

Unlike the CS Server this node does not incorporate or support multiple protocols running concurrently, nor does it support JSON. To emulate an EVSE charge point that supports JSON, use the CP client JSON node.


CP client JSON

Use this node to emulate an EVSE charge point station that supports OCPP protocol 1.6 JSON. Since the OCPP JSON implementation utilizes web sockets, this node makes the initial connection to the defined Central System, and messages are passed back and forth. Therefore it acts like both a server and a client in that it both makes and receives requests to and from the CS.

CS request JSON

Use this node to make requests to an EVSE charge point station that supports OCPP 1.6 JSON. Its behavior and functionality are similar to that of the CS request SOAP node with the exception that it only supports OCPP 1.6 JSON commands.

examples

alt text

In the root of the OCPP node module folder is a folder named examples. This is where you can find example flows that may be useful in setting up your OCCP situation. Currently a single example file exists which you can import into node-red that sets up a Central System node with a few basic Charge Point nodes. This is by no means a full production example, but just a starting point for those who may be interested in a way to set up the nodes.

Authors

Bryan Nystrom

Jason D. Harper

Argonne National Laboratory

node-red-contrib-ocpp's People

Contributors

abkulakli avatar beentherescrewedup avatar bnystrom avatar daviddhauwe avatar dependabot[bot] avatar jamesgol avatar jayharper avatar mingshyanwei avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

node-red-contrib-ocpp's Issues

Sending a single inject event to a CS-req-JSON node generates multiple messages in log

I have a simple flow with an inject node that sends a timestamp to two CS Request JSON nodes, and one node is configured with a TriggerMessage/MeterValues command and the other with a TriggerMessage/StatusNotification command.

I then see this in the log:

10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "d5671934-f188-4cf1-85f0-e6f9f3060ae2", "TriggerMessage", {"requestedMessage":"MeterValues"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "f771e77c-0777-4b79-8138-1fdf96681547", "TriggerMessage", {"requestedMessage":"MeterValues"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "726b3691-a755-473a-9276-a19f13fbfde9", "TriggerMessage", {"requestedMessage":"MeterValues"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "8f4c9285-12aa-457f-9dbb-4ef1b46b37cb", "TriggerMessage", {"requestedMessage":"StatusNotification"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "9ee6c8be-094f-4f31-b39e-3c0f5baa4842", "TriggerMessage", {"requestedMessage":"StatusNotification"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: request   data: [2, "9a66c4f9-b4fa-475f-8a4f-ba136c43860a", "TriggerMessage", {"requestedMessage":"StatusNotification"}]
10/1/2023, 4:25:10 PM    node: OCPP Server Port 9595     type: replied   data: [3, "726b3691-a755-473a-9276-a19f13fbfde9", {"status":"Accepted"}]

Is there a reason I see three lines of the send request for each command in the log file? I would've expected only one message per command in the log file.

It seems like the CP only responds to one of them, and doesn't respond to the rest. I'm assuming this is some kind of debounce behavior on the CP

This seems like a bug to me. Are you able to reproduce?

If it matters, I'm using a ChargeAmps Halo firmware version 169, hardware version 3 charger.

Using node-red-contrib-ocpp version 1.3.6 with Node-RED 3.0.2.

Smart Charging functions?

Do you plan to ad smart charging functions like control the charging current of a charging station?

If we would have this function it should be possible to realise a load management in node-red what would make it very flexible to connect it to different systems over different manufacturer brands.

CS server two meessage at a time

HEllo I have a strange beahaviour of the node CS server.
I have received a mix a two messages in one. For instance the followinf message is a mix of Heartbeat and MeterValues (it is the output of CS server):

{"ocpp":{"chargeBoxIdentity":"etrel-coe-lab3","MessageId":"205","msgType":2,"command":"MeterValues"},"payload":{"command":"Heartbeat","data":{}},"msgId":"f72582d9-6d18-4476-acec-25dfc458dfb4","_msgid":"14bba25a13fc5245","topic":"Heartbeat","_event":"node:900ee78985ce3d30","data":{"command":"MeterValues","data":{"connectorId":1,"meterValue":[{"timestamp":"2023-07-04T05:59:59.826Z","sampledValue":[{"value":"25777.234397","context":"Sample.Clock","measurand":"Energy.Active.Import.Register","unit":"kWh"}]}]}}}

cbId field in msg.payload

Good morning,

Is there a way to define the "cbId" field in the "CP Client JSON" by means of a payload? It would be useful to not have too many nodes for each loader.

Thank you!

Crash of node red after short time due to uncaught exception in json handling

I get errors like:
SyntaxError: Unexpected token <various like \n or ]> in JSON at position ???
every few hours leading to a restart of node red.
I added a pull request fix #34 with further detail which worked for me in the past without any restarts and good connectivity to the wall box.
Basically, a try/catch statement was added and removeAllListeners on ws close. No further changes were necessary (although the pull request diff looks ugly to to whitespace changes).

Regards
Lars

Charge box virtual physical chargers no connect to CS

I have installed the latest version (1.3.5) and the version of node is v19.9.0, nodered is 3.0.2, npm is 9.6.3.
What happens is the following: it does not establish communication with virtual cacheboxes, just as it does not establish communication with physical cacheboxes.

I am testing example1, the centralsystem server logs are:
6/20/2023, 2:13:18 PM node: CentralSystem@9090 type: info data: Ready to receive websocket requests on /ocpp/:cbid
6/20/2023, 2:22:33 PM node: CentralSystem@9090 type: info data: Ready to receive websocket requests on /ocpp/:cbid

How can i run the server?

Hello,

i dont understand ocpp-server.js is work or not i just write node ocpp-server.js nothing happend
someone help me how can start server ?

thanks

Not really an issue - where to specify the CP ip address or don't we need to?

Hi,

I haven't any issue to report however i'm just not clear on the following things. I went through the documentation as well as the examples and object explanations multiple times but i'm just not able to get it. I own an Alfen NG9xx CP that i'm trying to connect with. It uses 1.6 OCPP-j so therefore I'm using the different JSON components as you also included in the example:

  • I've specified the cbid (ChargeBoxId) to match the name that I had sent in my CP itself, but still I don't think this is enough to make a connection to my CP. Wouldn't the JSON CP also require an url/ip destination that it would try to connect with or can it really connect without knowing the CP IP address?
  • The sample includes a 'HeartbeatInterval' request it also includes a 'GetConf response' function. This function seems to return a result for the 'HeartBeatInterval', I was expecting this would be returned by the actual CP instead. Is this function there just to demo a dummy scenario and wouldn't you need this function when you run 'real' scenarios or do we always need it and do we need to extend the function with any other getconfig or changeconfig parameters we want to pass?

I'm sorry for asking for these things, I just wasn't able to get my head around this eventhough it must be very straightforward for most people.

Kind regards,

Tim

Cannot read properties of undefined (reading 'cbid')

Hi,

After upgrading to version 1.3.5 I get following error and node-red restarts due to an Uncaught Exception:
[error] TypeError: Cannot read properties of undefined (reading 'cbid')
at WebSocketServer.connection (/data/node_modules/node-red-contrib-ocpp/ocpp/ocpp-server.js:226:58)
at WebSocketServer.emit (node:events:525:35)
at WebSocketServer.completeUpgrade (/data/node_modules/ws/lib/websocket-server.js:358:5)
at WebSocketServer.handleUpgrade (/data/node_modules/ws/lib/websocket-server.js:271:10)
at Server.upgrade (/data/node_modules/ws/lib/websocket-server.js:107:16)
at Server.emit (node:events:513:28)
at onParserExecuteCommon (node:_http_server:772:14)
at onParserExecute (node:_http_server:686:3)

Dinamically edit CS request SOAP

Hello.

First of all, thank u for the amazing job you are doing.

Im trying to set an ocpp server using this library, so i would like to ask, is there a way to dinamically change the properties of the node so i don't have to make a node for each station that i wish to include? I already have saved every station on a mysql database so i can access to each ip.

Sorry in advice for my english, as its not my first languaje.

implement client CP JSON node

i'm trying to use the node of JSON cp, but i don't know how to imlpement on my dashboard.

what i has to write for command authorize. When i use this comando and use authoraze configuration, my server retorn messege error, becausa this comand is not correct.

follow the server error

10/07/18 14:08:29:203 : 001 :
Request recieved from 001 : [2,"6593f3c0-bb31-492f-a1f1-b95655c601f9",null,{}]
10/07/18 14:08:29:219 : CentralSystem0 :
Sending response to 001 : [4,"6593f3c0-bb31-492f-a1f1-b95655c601f9","whois.ripe.net","Unknown action: null","{}"]

Not able to start/stop a Charging session

Hi,

I've tried to initiate charging session with an ID(Charging Card ID).
I've deployed the example Project with my Keba P30x and OCPP 1.6(Soap) and almoast everything works. I get the heartbeat, the charging station also states, that the connections is working fine, but i'm not able to start a charging session.
I've also setup the steve project and everything works fine. I'm able to initiate a session with the cardId "ABCD12".

For the Node Red implementation I can't figure out the right syntax. I've tried the "CS Request Soap" with the "RemoteStartTransaction" and the ID
{ "connectorId":1, "idTag":"ABCD12" }

which just ends in a reboot of the docker container…

CleanShot 2023-08-05 at 15 18 22@2x

I've tried also the "CS Request Soap" with:
{ "command": "RemoteStopTransaction", "data": { "connectorId": [ 1 ], "idTag": [ "ABCD12" ] } }
which results in
Error: undefined: undefined

I'm pretty frustrated, because I don't want to always use my card for activating... I want to auto enable it via a remote trigger from Loxone…
Pls help

Node CS Serve

I have difficulty to connect node CS serve.
i tryied connect my server JSON "software EURISCO" with this node, but always return error.

the node not start path.

when my server ask to the station my server always report this error.

26/07/18 10:02:58:691 : A started Central System with path: ws://192.168.0.2:9080/ocppj16, was not found!

i configured path on config table, with "ocppj16".

No connection to CentralSystem@8834

Trying to install node red ocpp on the latest Raspbian and Node-red. I cannot get the CentralSystem@8834 node to show anything else than "Waiting..." despite using the example in the import menu.

Node-RED version: v3.0.2
Node.js version: v18.13.0 (also tried other versions without success)
Linux 6.2.0-1004-raspi arm LE
node-red-contrib-ocpp 1.3.4

I have an older node-red-contrib-ocpp 1.0.11 on an Ubuntu install with node js 19.3.0 that works fine, so I am a bit confused to what is wrong.

The listener is running according to ss -tulpn | grep LISTEN:

tcp LISTEN 0 511 0.0.0.0:1880 0.0.0.0:* users:(("node-red",pid=737,fd=21))
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=503,fd=14))
tcp LISTEN 0 4096 127.0.0.54:53 0.0.0.0:* users:(("systemd-resolve",pid=503,fd=16))
tcp LISTEN 0 4096 *:22 : users:(("sshd",pid=631,fd=3),("systemd",pid=1,fd=68))
tcp LISTEN 0 511 *:8834 : users:(("node-red",pid=737,fd=20))

Update:
The log shows:
node: CentralSystem@8834 type: info data: Ready to recieve websocket requests on /ocpp/:cbid

Force "CS request JSON" to reconnect after charger power cycle?

Hello!

I'm having an issue where the "CS request JSON" nodes seem to lose their connection to an EV charger if the charger is power cycled / taken offline by a power interruption. The nodes get a status of "Not connected to " and are no longer able to send messages. I still receive messages via the "CS server" node. Redeploying the flow re-establishes the connection, so I was wondering if there was a way to force these nodes to re-establish a connection without a redeploy.

Not Connected to CP after ~24 hours

Running latest master (7c60fac) on Node Red v3.0.2, although this has been going on for at least a year with previous versions of both.
I was following issue 4 and commenting out the removeListeners() code, but this did not fix the issue for me, nor does the latest commit (1.3.4 or tip of master).

Incoming messages from the CP are received fine, but when it comes time to start / stop a charge or change the charge current, I find that the command is ignored.

Looking at the flow graph, it says "Not Connected to XXXXX" in grey under the CP node.
There is not output at all in the console log to suggest what has gone wrong.
Restarting the flows is the only way I can recover from this state.

What information can I gather, or what debug logging can I add to help resolve this issue?

Many thanks :-)

Update OCPP 2.0

Hi laboratory team,

many thanks to providing this awesome Node Red flow!

Are planning to update to OCCP 2.0 and also supporting OSCP 2.0?

Many thanks in advance!

Best Regards
Steffen

WebSocket is not open: readyState 3

Hello, I'm currently testing the 'CS server' with 2 chargebox connected. When I send command over 'CS request JSON' node, occasionally it gives "error: WebSocket is not open: readyState 3 (CLOSED)" and I had to restart the flow.

Any idea?

Feature request: Improved JSON debugging

Whenever I send an invalid command to the CP I'm getting this information in the log:

10/1/2023, 1:44:08 PM    node: OCPP Server Port 9595     type: ERROR     data: Unexpected token
 in JSON at position 96

First of all, the token part (when looked in a hex editor) is the symbol ^@, which I'm not sure what represents.

When I try to determine which part of of the message is wrong, by copying the message I think is the problem into a text editor and find the position mentioned, it is commonly outside the end of the string. It makes it quite non-trivial to use this message for anything else than knowing there was an error, but not really where in your syntax the error was.

Is it possible to improve this? Maybe include some characters before or after the position mentioned, and using maybe a special symbol injected into the position to symbolize from where the issue started.

If this is an error message coming from the CP (which obviously can't be modified), is it possible to dump the unaltered JSON that caused the error to the log at the same time as you output the error, so it's easier to debug?

Cannot disconnect a connected CP client JSON Node After Deploy

To Reproduce:

  1. Connect a CP Client JSON node with
{
    "msgType": 99,
    "command": "connect",
    "data": { }
}
  1. Deploy changes
  2. Disconnect the CP Client JSON node with (Because it seems still connected)
{
    "msgType": 99,
    "command": "close",
    "data": ""
}

Result: Client still connected
Expected Result: Client Disconnected

Feature request: Log levels, log file UTC timestamps and logfmt formatting

While working with the log file, I've noticed that it has some things that could be improved.

Would it be possible to implement log levels, so that you can e.g. only see warnings and errors instead of everything?

Would it be possible to use ISO8601 UTC timestamps (e.g. 2023-10-01T13:23:05.156Z) instead of local time? It's so much better if you're ingesting the log into a log aggregator. Another benefit is that they're always fixed width.

Is it possible to use logfmt formatting instead of the custom log format you're using now? That is semi-structured format that is easy to read and has a defined syntax. It also makes it easier to handle multi-line messages, as you can use a separate key in the log line to indicate which part of the log line you're outputting (if multiple lines). With this in place you don't need to make your JSON dumps a single line, or you can make compacting them an option for those that prefer it.

Example: line=2/5 msg="This is my partial log line"

Flow crashes when using wrong URL

When you are using the "CP client JSON" Node and type in the wrong URL for the central system the whole flow crashes. Then you have to change the URL in the JSON file before you can restart Node-Red.

Unable to update/install

I am unable to update the node from 1.2.1000 to 1.3.4 and cant even install the fresh palette.
running v3.0.2

new example - charging speed modification

Hello,
your code and examples are great. I was able to configure and remotely start or stop charging of my car using Node-red and your plugin. My PV plat currently also communicate with Node red. My final intention is to store excess PV energy inside EV battery. The excess energy varies in time, so I need to pause charging or modify charging current few times per hour.

... Such functionality should be possible, somehow, as:
"...the back office can send a charging profile or kW limit to the charging station via OCPP 1.6. More precisely, OCPP 1.6 gives you the possibility to send either a single limit or a time series of data (=charging profile)." ...source

I tryied myself a lot of various code variants, but I was not sucessfull. My unprofessional OCPP 1.6j code was refused by charger to modify charging speed limit. No answer. Maybe whole idea, code failiure or some other problem, I do not know...

The following code should change the charger current to 7A.
{ "connectorId": 1, "csChargingProfiles": [ { "chargingProfileId": 1, "chargingProfilePurpose": "TxProfile", "chargingProfileKind": "Absolute", "chargingSchedule": { "duration": 0, "startSchedule": "2023-07-13T10:00:00Z", "chargingRateUnit": "A", "chargingSchedulePeriod": [ { "startPeriod": 0, "limit": 7 } ] } } ] }

Please could you create for people like me a new, very basic but working example for the ability to change the charging speed / energy consumption of an EV? I have no idea, as if some ChargingProfiles defining is necessary. Is there a simplest way, for such case?
Thank you very much. Jan

How to determine the status connectivity of the charger whether it is connected or disconnected ?

is there a way for me to determine whether the charger is still connected or disconnected from the server ? because when the charger has been successfully connected to the central server , there are no indicators for me to know the charger connectivity status whether it is online or offline . we can only determine from here only

image

I would like to have a message sent to the debug node to indicate that the charger is connected or disconnected . Is there a way for me to Implement this features ? Thank you

CS-Request-JSON not connecting to physical charger

Hi!

I am trying to send commands to a physical charger with CS-Request-JSON but it keeps saying the charger (identified by bcId) is not connected, even though the CS Server can connect perfectly

using contrib- ocpp 1.3.6 and nodered 3.0.2

any idea what the problem might be?

image
image

Thanks

OCPP Server uses IPV6 on Ubuntu

It would be nice to have a way of specifying the address to listen on as well as the port in the node-red UI.

Hi,

As title, running on Ubuntu the OCPP server listens on [::]:port by default, rather than 0.0.0.0:port. I think this is because 'localhost' gets an ipv6 address rather than an ipv4 one.

Obviously my car charger doesn't have a clue about ipv6, and won't connect using it.

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.