Coder Social home page Coder Social logo

sfeakes / sprinklerd Goto Github PK

View Code? Open in Web Editor NEW
25.0 6.0 4.0 7.71 MB

Sprinkler controller for use with home automation hubs, HomeKit & MQTT

License: Other

C 95.63% Makefile 0.24% C++ 0.71% Shell 1.46% HTML 1.95%
raspberypi mqtt-client sprinkler-controller sprinkler api smarthub home-automation

sprinklerd's Introduction

SprinklerD

More details & pics to come

linux daemon to control sprinklers.

  • This daemon is designed to be small, efficient and fail safe.

The sprinkler zone control is done through GPIO pins, so simply connect a relay board to the GPIO pins, and the realys to your sprinkler valves & power supply. Provides web UI, MQTT client & HTTP API endpoints. So you can control your pool equiptment from any phone/tablet or computer, and should work with just about Home control systems, including Apple HomeKit, Samsung, Alexa, Google, etc home hubs. It is not designed to be a feature rich solution with elaborate UI, but rather a solution that can be completley controlled from smart hubs. It can run completley self contained without any automation hub as it does have a web UI and calendar for scheduling zone runtimes, rain day delay etc. But advanced features like integrated rain censors and web forecast delays should be done through your smart hub, or the supplied scripts. It does support a master valve or pump. (ie turn on a master device with every zone).

It does not provide any layer of security. NEVER directly expose the device running this software to the outside world, only indirectly through the use of Home Automation hub's or other securty measures, e.g. VPNs.

Builtin WEB Interface.


In Apple Home app.

  • Full support for Irrigation Valve in Homekit.

The Setup I use.

Pi Zero W, 8 channel relay board & 2 channel relay board.

All rain delays are set directly from my home automation hub, and not any locally connected sensors. (see included scripts in the config section below) ie :-

  • if rain sensor detects rain, cancel any running zones & delay 24h.
  • if rain sensor accumulates more than 5mm rain in 24hours, delay sprinklers for 48 hours.
  • Poll DarySkys API if rain forecast is higher than 50% enable 24h delay.

Valves for each zone are connected to the relays, and relays connected to a 24vac power adapter, similar to wiring in the image below.

TL;DR Install

Quick instal if you are using Raspberry PI

  • There is a chance the pre-compiled binary will run, copy the git repo and run the install.sh script from the release directory. ie from the install directory sudo ./release/install.sh
  • try to run it with :-
    • sudo sprinklerd -v -d -c /etc/sprinklerd.conf
    • If it runs, then start configuring it to your setup.
    • If it fails, try making the execuatable, below are some instructions.

Making & Install

  • Get a copy of the repo using git.
  • run make
  • run sudo make install
  • edit /etc/sprinklerd.conf to your setup
  • Test every works :-
    • sudo sprinklerd -d -c /etc/sprinklerd.conf
    • point a web browser to the IP of the box running sprinklerd
  • If all is good enable as service
    • sudo systemctl start sprinklerd

More Advanced make

  • sprinklerd uses it's own GPIO interaction. This may not be enough for all types of relay boards, especially ones that require the use of the GPIO's internal pull-up or pull-down resistor. So sprkinlerd can make use or WiringPi which is a far more powerful GPIO library with tons of support.
  • To use WiringPi :-
  • install WiringPI first http://wiringpi.com/download-and-install/
  • Make sprinklerd with the below flag
  • make USE_WIRINGPI=1
  • Make sure to use the WPI_PIN and not GPIO_PIN in the configuration for the pin numbers.
  • you can also use GPIO_PULL_UPDN option in the configuration.

Note:-

The install script is designed for systemd / systemctl to run as a service or daemon. If you are using init / init-d then don't run the install script, install manually and the init-d script to use is in the xtras directory. Manual install for init-d systems

  • copy ./release/sprinklerd to /usr/local/bin
  • copy ./release/sprinklerd.conf to /etc
  • copy ./release/sprinklerd.service.avahi to /etc/avahi/services/sprinklerd.service
  • copy ./extras/sprinklerd.init.d to /etc/init-d/sprinklerd
  • copy recuesivley ./web/* to /var/www/sprinklerd/
  • sudo update-rc.d sprinklerd defaults

Hardware

You will need relays connected to the PI. (add some crap about how to do that here)

Raspberry Pi Zero is the perfect device for this software. But all Raspberry PI's are inherently unstable devices to be running 24/7/365 in default Linux configrations. This is due to the way they use CF card, a power outage will generally cause CF card coruption. My recomendation is to use what's calles a "read only root" installation of Linux. Converting Raspbian to this is quite simple, but will require some Linux knoladge. There are two methods, one uses overlayfs and if you are not knolagable in Linux this is the easiest option. There are a some downsides to this method on a PI, so my prefered method is to simply use tmpfs on it's own without overlayfs ontop, this is easier to setup initially, but will probably require a few custom things to get right as some services will fail. Once you are up and running, You should search this topic, and there are a plenty of resources, and even some scripts the will do everything for you. But below are two links that explain the process.

Good overlayfs tutorial on PI Forums

My prefered way to impliment

I have my own scripts to do this for me, and probably won't ever document or publish them, but thay are very similar to the 2nd link above.

sprinklerd Configuration

Please see the sprinklerd.conf example in the release directory. Many things are turned off by default, and you may need to enable or configure them for your setup. Specifically, make sure you configure your MQTT, Pool Equiptment Labels & Domoticz ID's in there, looking at the file it should be self explanatory.

Included scripts in extras directory.

sprinklerDarkskys.sh Script to check the chance of rain from darkskys forecast API, if it's greater than a configured percentage then enable the 24h rainDelay on SprinklerD. Simply edit the scrips with your values, and use cron to run it 30mins before your sprinkelrs are due to turn on each day. If the chance of rain is over your configured % it will enable SprinklerD's 24h rain delay, which will stop the sprinklers running that day, and the 24h delay will timeout before the sprinklers are due to run the next day. (or be enabeled again if the chance of rain is high) You can also use this script to simply sent the 'chance or rain today' to SprinklerD, and allow SprinklerD to make the decision if to enable rain delay, depending on options configured in the UI.

sprinklerOpenWeather.sh Exactly the same as above (sprinklerDarkskys.sh) but uses OpenWeather forecast API.

sprinklerMeteohub.sh Script to pull daily rain total from Meteohub and send it to SprinklerD. SprinklerD will then turn on rain dalys (14h or 48h) depending on rain threshold.

sprinklerRainDelay.sh Script to enable extended rain delays. i.e. I have my weatherstation triger this script when it detects rain. The script will cancel any running zones and enable a rain delay. You can use a number on command line parameter to enable long delays, (number represents number of days). So if my rainsensor logs over 5mm rain in any 24h period it will call this script with a 2 day delay, or 3 day delay if over 15mm of rain.

Configuration with home automation hubs

Apple HomeKit (prefered way)

You need to install 3 things MQTT broker, Homebridge & Homebridge-sprinklerd.If you already have any of them install, just skip that section.

Install MQTT Broker (mosquitto)

sudo apt-get install mosquitto

Install Homebridge

Follow the instructions in this URL :- https://github.com/nfarina/homebridge

Install HomeBridge-SprinklerD

See https://github.com/sfeakes/homebridge-sprinklerd for package content

sudo npm install -g homebridge-sprinklerd

Configure as you would any other homebridge accessory. i.e Add the platform details to homebridge config.json

"platforms": [
        {
            "platform": "sprinklerd",
            "name": "sprinklerd",
            "server": "my-server-or-ip-running-sprinklerd",
            "port": "80",
            "mqtt": {
              "host": "my-mqtt-server",
              "port": 1883,
              "topic": "sprinklerd"
            }
       }
    ],
  • See bottom for old homekit integration using Homebridge2MQTT.

All other hubs

Two interfaces are offered, MQTT and WEB APIs, take your pick as the the best option for your own setup, details of each and some generic setups are below.

MQTT

sprinklerd supports generic MQTT implimentations, as well as specific Domoticz one described above. To enable, simply configure the main topic in sprinklerd.conf.

mqtt_topic = sprinklerd

Then status messages will be posted to the sub topics listed below, with appropiate information.

  Status of stuff (message is 1=on 0=off)
  sprinklerd/zone/1
  sprinklerd/zall
  sprinklerd/24hdelay
  sprinklerd/calendar

To turn something on, or set information, simply add set to the end of the above topics, and post 1 or 0 in the message for a button. Topics sprinklerd will act on.

Turn stuff on/off (1 is on, 0 is off, but can use txt if you want)
sprinklerd/zone/1/set 1
sprinklerd/zone/zall/set 1   // Cycle all zones using default runtimes.
sprinklerd/24hdelay/set 1
sprinklerd/calendar/set 1
sprinklerd/chanceofrain/set 29  // % chance of rain for today
sprinklerd/raintotal/set 0.3    // Set rain total in inches.

All other hubs (excluding Apple HomeKit) Amazon,Samsung,Google etc

Obviously details will be diferent on each device, and I won't document them all. Basic idea is create a switch for item you want to control (zone(s), 24hdelay, calendar schedule etc). Then add the following URL to program the switching of each device. If you use a hub on you local lan like smartthings, then this is super simple. If you use cloud only device, like Alexa then you need to make a connection from your lan to amazon cloud since you should not put this web interface on the internet (since there is no security). There are 1001 ways to do this, but a MQTT bridge may be the easiest, search MQTT to <my cloud-based hub> bridge and pick one you like.

http://sprinklerd.ip.address:port?type=option&option=24hdelay&state=off
* // Info options
<host>?type=firstload               // JSON status Include cal schedule
<host>?type=read                    // JSON status no need to include cal schedule
<host>?type=json                    // JSON full array style, need full parser to pass.

*  // Cfg options
<host>?type=option&option=calendar&state=off    // turn off calendar
<host>?type=option&option=24hdelay&state=off    // turn off 24h delay
<host>?type=option&option=24hdelay&state=reset  // reset time on 24h delay
<host>?type=option&option=24hdelay&state=reset&time=1529328782  // reset custom time on delay (utime in seconds)

*  // Calendar
<host>?type=calcfg&day=3&zone=&time=07:00      // Add day schedule and use default water zone times
<host>?type=calcfg&day=2&zone=1&time=7         // Change water zone time (0 time is off)
<host>?type=calcfg&day=3&zone=&time=           // Delete day schedule
  
*  // Run options
<host>?type=option&option=allz&state=on        // Run all zones default times (ignore 24h delay & calendar settings)
<host>?type=zone&zone=2&state=on&runtime=3     // Run zone 2 for 3 mins (ignore 24h delay & calendar settings)
<host>?type=zone&zone=2&state=off              // Turn off zone 2
<host>?type=zone&zone=2&state=flip             // Flip state of zone 2, Turn off if on, Turn on if off 
<host>?type=zrtcfg&zone=2&time=10              // change zone 2 default runtime to 10
<host>?type=cron&zone=1&runtime=12&state=on'   // Run zone 1 for 12 mins (calendar & 24hdelay settings overide this request)

* // Sensor config options
<host>?type=config&option=raindelaychance&value=50  // Enable 24h rain delay is % change or rain today is higher than this value
<host>?type=config&option=raindelaytotal1&value=0.5 // Enable 24h rain delay is total rain was greater than this value
<host>?type=config&option=raindelaytotal2&value=1.5 // Enable 48h rain delay is total rain was greater than this value

* // Sensor options (remote sensors posting to SprinklerD)
* // These are used to determin if to enable rain delay and cancel running zones.
<host>?type=sensor&sensor=chanceofrain&value=87  // Set % chance of rain for today to 87%
<host>?type=sensor&sensor=raintotal&value=0.34   // Set rain total for todaye to 0.34"

The JSON that's returned is completley flat, this is so it can be passed with really small lightweight passers, even grep and awk. If you want a full JSON with arrays that's easier to use with full json parsers you can use the below

<host>?type=json

Apple HomeKit (old way)

For the moment, native Homekit support has been removed, it will be added back in the future under a different implimentation. Recomended option for HomeKit support is to make use of the MQTT interface and use HomeKit2MQTT to bridge between sprinklerd and you Apple (phone/tablet/tv & hub).

  • If you don't already have an MQTT broker Installed, install one. Mosquitto is recomended, this can usually be installed with apt-get
  • Install HomeKit2MQTT. (see webpage for install)
  • Then copy the homekit2mqtt configuration file found in the extras directory homekit2mqtt.json

You can of course use a myriad of other HomeKit bridges with the URL endpoints listed in the All other hubs section, or MQTT topics listed in the MQTT section. The majority of them (including HomeBridge the most popular) use Node and HAP-Node.JS, neither of which I am a fan of for the RaspberryPI. But HomeKit2MQTT seemed to have the least overhead of them all. So that's why the recomendation.

Domoticz

Does naivety support domoticz, need to add documentation.

  • enable MQTT in domoticz
  • add virtual censor for every zone and buton
  • add the domoticz ID's in he sprinklerd config.

License

Non Commercial Project

All non commercial projects can be run using our open source code under GPLv2 licensing. As long as your project remains in this category there is no charge. See License.md for more details.

sprinklerd's People

Contributors

sfeakes 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

sprinklerd's Issues

MASTER_VALVE=0

I set on sprinklerd.config MASTER_VALVE=0 but the master relay still turning ON. This is normal?

cron.d file permissions

Hi!
My sprinklers weren't running on the schedule and I found the following error when checking: service cron status
cron[1072]: (*system*sprinklerd) INSECURE MODE (group/other writable) (/etc/cron.d/sprinklerd)

I found a fix by running: sudo chmod 644 /etc/cron.d/sprinklerd

I'm running on an RPI 4b with with RPI Raspberry Pi OS Lite image + manual install of home bridge & sprinklerd

cycle all zones hangs: possible homebridge issue

Hi Sean,

Unusual activity in log, Sprinklerd didnt get beyond Zone3. What is rngd[398] referenced below? must be something that is interfering with Sprinklerd because its not the first time its happened. Funnily enough, if it doesnt occur, the 'cycle all zones'' manages to work though all zones successfully.

Feb 4 19:59:45 Homebridge sprinklerd: Turning on Zone 1
Feb 4 19:59:45 Homebridge sprinklerd: Turning on Zone 0
Feb 4 20:00:29 Homebridge vncserver-x11[426,root]: Connections: disconnected: 192.168.0.40::52980 (TCP) ([ViewerClosed] VNC Viewer closed)
Feb 4 20:00:45 Homebridge sprinklerd: Turning off Zone 1
Feb 4 20:00:45 Homebridge sprinklerd: Turning on Zone 2
Feb 4 20:01:45 Homebridge sprinklerd: Turning off Zone 2
Feb 4 20:01:45 Homebridge sprinklerd: Turning on Zone 3
Feb 4 20:04:16 Homebridge rngd[398]: stats: bits received from HRNG source: 80064
Feb 4 20:04:16 Homebridge rngd[398]: stats: bits sent to kernel pool: 34848
Feb 4 20:04:16 Homebridge rngd[398]: stats: entropy added to kernel pool: 34848
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2 successes: 4
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2 failures: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Monobit: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Poker: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Runs: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Long run: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Continuous run: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: HRNG source speed: (min=645.960; avg=754.343; max=809.418)Kibits/s
Feb 4 20:04:16 Homebridge rngd[398]: stats: FIPS tests speed: (min=3.887; avg=5.806; max=7.112)Mibits/s
Feb 4 20:04:16 Homebridge rngd[398]: stats: Lowest ready-buffers level: 2
Feb 4 20:04:16 Homebridge rngd[398]: stats: Entropy starvations: 0
Feb 4 20:04:16 Homebridge rngd[398]: stats: Time spent starving for entropy: (min=0; avg=0.000; max=0)us
Feb 4 20:17:01 Homebridge CRON[2962]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Feb 4 21:04:16 Homebridge rngd[398]: stats: bits received from HRNG source: 120064
Feb 4 21:04:16 Homebridge rngd[398]: stats: bits sent to kernel pool: 64608
Feb 4 21:04:16 Homebridge rngd[398]: stats: entropy added to kernel pool: 64608
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2 successes: 6
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2 failures: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Monobit: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Poker: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Runs: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Long run: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS 140-2(2001-10-10) Continuous run: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: HRNG source speed: (min=645.960; avg=772.373; max=812.076)Kibits/s
Feb 4 21:04:16 Homebridge rngd[398]: stats: FIPS tests speed: (min=3.887; avg=6.174; max=7.112)Mibits/s
Feb 4 21:04:16 Homebridge rngd[398]: stats: Lowest ready-buffers level: 2
Feb 4 21:04:16 Homebridge rngd[398]: stats: Entropy starvations: 0
Feb 4 21:04:16 Homebridge rngd[398]: stats: Time spent starving for entropy: (min=0; avg=0.000; max=0)us

sorry for the stupid question

hi,
kind of noob so... sorry
my homebridge is on a pi server
my watering system is far away
if i got this right then all i have to do in the server is to install 3 packages and update the platform and its ip in the configuration file. is this right? this means that the server has no idea how much zones there are and he pulls that information from the pi that is connected to the valves.
did i get the architecture correct in my head?
thanks!!!

Web front end zones switch on but gui switch doesn't

When I click ON in the GUI the zone is turned on (pin is toggled) but the GUI shows off still. When the timer finishes there is no MQTT sent of zone turning off just timer complete is this the intended operation?

Just check with a LED on the GPIO no Power toggling on GPIO. Permissions?

need help on schedule

I did I clean install this week in 2 raspberry pizero.
Turn ON and OFF manually is working OK, but schedule not working in both PI.
I did:
sudo nano /etc/default/cron
#EXTRA_OPTS='-l' change to EXTRA_OPTS='-l'

Step by step raspberry pi and HomeKit

Hi thanks for developing this great sprinkler system! I be very happy if you can do step by step installation for raspberry pi and HomeKit. Plus if have YouTube video to. I don’t know much coding so be super super helpful for me. Thank you.

Error when triggering 24hr sprinkler delay Darkskys

Hi Sean,

Getting following error when triggering 24hr sprinkler delay Darkskys:

pi@raspberrypi:~/SprinklerD/extras $ sh sprinklerDarkskys.sh
sprinklerDarkskys.sh: 35: [: 0.29: unexpected operator
Probability of rain today is 29.00%sprinklerDarkskys.sh: 45: sprinklerDarkskys.sh: 0: not found

Installed bc and jq. Are there other ways to do it as Dark Sky is cutting all existing subscribers off at the end of 2021.

Segfault when enabling MQTT

HI, I think I'm getting a segfault when MQTT is enabled.

The intHandler() is getting called at line 356 of sprinkler.c with a SEGFAULT signal. This only happens when I enable MQTT as follows:

10 # mqtt stuff (address and topic are mandatory if you want to use MQTT)
11 MQTT_ADDRESS = 192.168.1.19:1883
12 MQTT_USER = pi
13 MQTT_PASSWD = pi
14 MQT_TOPIC = sprinklerd

Any help appreciated. I'm happy to debug further.

Wiring 8 channel 5v relays to Pi3b

Hi. Very keen to give this project a go. I have a Pi3b and was wondering what the wiring schematic should be? Also, if only powering 24v sprinkler solenoids do I need to connect external power to the relay board. A little confused 😐

NODEJS 13.9

Once upgraded to NodeJs 13.9, sprinklerd still starts, can still switch on/off the arduino relay board zones via the GPIOs, and the 'My Sprinklers' button illuminates in Homekit.
However, the individual zone buttons themselves no longer work and if manually triggered they display 'Idle'. this is also the case for 'run on calendar', and 'cycle all zones'.

Is there something that I need to recompile Sean or rebuild?
(had to upgrade NodeJS as other plugins needed later than 8.x)

Scheduling assistance

Hi. The schedule is accessible via the web browser and when i enter start times for each zone, the start time passes without the program starting the zones. fyi, i can see the zones and manually activate them via the browser.

Web service and sprinklerd stops working

Hi again Sean. Upon boot i am getting the error of duplicate UUID again:
image
Previously i have deleted all files in /accessories and /persist yet the problem resurfaces. Homebridge proceeds to start ok, sprinklerd as well. Scheduler starts the zones correctly, but when it gets to the last zone, it fails.. cant control via homebridge and cant access via browser. reboot gets it going again. other unusual part of boot is:
image

/etc/cron.d: scheduler appears to be working properly and cron writes changes that i make in the browser or via homebridge.
is it possible that other accessories when they get added obtain the same uuid?

"Include in status"

It would be very handy to see the status of the sprinklers in the banner at the top of Homekit. Can the "My Sprinklers' button display its status or even better the individual zones?
thumbnail_IMG_2040

Request future

I want be able to have push buttons to start watering manually. One button for each zone, push onence start watering,push one more time stop watering.

You think this is possible?

Thank you! :)

upgrading to HB1.3.0 produces 'model' error on boot

[23/02/2021, 7:04:56 pm] [homebridge-sprinklerd] This plugin threw an error from the characteristic 'Model': Error: [Model] characteristic must have a length of more than 1 character otherwise HomeKit will reject this accessory. Ignoring new value.
at Characteristic.validateUserInput (/usr/lib/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:1991:38)
at Characteristic. (/usr/lib/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:1457:21)
at step (/usr/lib/node_modules/homebridge/node_modules/tslib/tslib.js:143:27)
at Object.next (/usr/lib/node_modules/homebridge/node_modules/tslib/tslib.js:124:57)
at /usr/lib/node_modules/homebridge/node_modules/tslib/tslib.js:117:75
at new Promise ()
at Object.__awaiter (/usr/lib/node_modules/homebridge/node_modules/tslib/tslib.js:113:16)
at Characteristic.handleGetRequest (/usr/lib/node_modules/homebridge/node_modules/hap-nodejs/dist/lib/Characteristic.js:632:24)
at Characteristic. (/usr/lib/node_modules/homebridge/node_modules/hap-nodejs/src/lib/Characteristic.ts:2127:22)
at step (/usr/lib/node_modules/homebridge/node_modules/tslib/tslib.js:143:27) See https://git.io/JtMGR for more info.

Feature request

Would be perfect if the software allowed no usage of Rpi GPIO and only Domoticz IDX devices as switches (i guess it only supports triggering from Domoticz not to domoticz) . I have all valves controlled by Domoticz but this applications integrations against homekit is so much cleaner since it uses "valves"

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.