Giter Site home page Giter Site logo

openhab / openhab-cloud Goto Github PK

View Code? Open in Web Editor NEW
313.0 36.0 161.0 13.96 MB

Cloud companion for openHAB instances

License: Eclipse Public License 2.0

JavaScript 62.57% CSS 26.34% PHP 1.87% HTML 0.20% Shell 0.34% Dockerfile 0.06% Less 0.01% EJS 8.61%

openhab-cloud's Introduction

openHAB Cloud

openHAB Cloud is a companion cloud service and backend for the openHAB open-source home automation software. The openHAB Cloud backend provides secure remote access and enables openHAB users to remotely monitor, control and steer their homes through the internet, collect device statistics of their openHABs, receive notifications on their mobile devices or collect and visualize data etc. The main core features of openHAB Cloud are an user-management frontend, secure remote access, remote proxy-access, device registry & management, messaging services and data management & persistence. The openHAB Cloud also serves as core backend integration point for cloud-based features (e.g. IFTTT) and provides an OAuth2 application enablement.

Functional Architecture

FunctionalArchitecture

Getting started

openHAB Cloud is mainly based on the following frameworks and technologies:

  • Node.js - Server-side Javascript-framework
  • Express.js - Web application framework for Node.js
  • Nginx - Web server & reverse proxy
  • MongoDB - NoSQL database
  • redis - Session Manager & data structure server
  • Socket.IO - Bi-directional communication between web clients and servers

Quick start

Installing openHAB Cloud on Linux (ubuntu).

First, we need to make sure that the list of packages and dependencies from all repositories are up-to-date:

sudo apt-get update
sudo apt-get upgrade

We need to install redis, mongoDB, Nginx and Python:

sudo apt-get install build-essential redis-server mongodb nginx python

Now you need install git and clone the openHAB Cloud repository to your preferred directory (here: ubuntu) with the following commands:

apt-get install git
cd /home/YOUR-DIR/
git clone https://github.com/openhab/openhab-cloud.git

Clone the openhab-cloud repository and after the completed checkout you should have the directory in your chosen folder:

ls -al
total 32
drwxr-xr-x  5 ubuntu ubuntu 4096 Jun  4 17:06 .
drwxr-xr-x  3 root   root   4096 Jun  4 12:34 ..
-rw-r--r--  1 ubuntu ubuntu  220 Apr  9  2014 .bash_logout
-rw-r--r--  1 ubuntu ubuntu 3637 Apr  9  2014 .bashrc
drwx------  2 ubuntu ubuntu 4096 Jun  4 16:30 .cache
drwxr-xr-x 13 root   root   4096 Jun  4 17:06 openhab-cloud
-rw-r--r--  1 ubuntu ubuntu  675 Apr  9  2014 .profile
drwx------  2 ubuntu ubuntu 4096 Jun  4 12:34 .ssh

Now we need to change into the openhab-cloud directory and check if node is installed:

node --version

If you see the node version, you are fine to continue (Note: openHAB Cloud is based on Node.js version 14).

To run openHAB Cloud you need to install the required software bundles/stacks:

cd openhab-cloud
npm install

and all the module dependencies from package.json will be resolved and needed packages installed.

openHAB Cloud uses redis for session management. To learn more about redis please read here.

To check if redis is installed correctly and running we run this command:

redis-cli ping

Redis will answer with PONG if all is fine.

In the next step you have to rename the system configuration file:

config-production.json -> config.json

Adjust the config parameters according your setup (Note: MongoDB username and password fields should be deleted, if there is no authentication activated).

Now you can run openHAB Cloud by the following command:

sudo node app.js

Point your webbrowser to:

http://localhost:3000

You should be ready with your openHAB Cloud installation!

Setting up Nginx

Optionally you can also setup Nginx as webserver:

For this we have to configure nginx as webserver and copy the openHAB Cloud nginx config, overriding the default config:

sudo cp /home/ubuntu/openhabcloud/etc/nginx_openhabcloud.conf /etc/nginx/sites-available/default

Change the following lines to match your installation. Point server_name to your IP/DNS.

cd /etc/nginx/sites-enabled
sudo vi default
server {
#listen *:443;
listen *:80;
#ssl on;
# ssl_certificate /etc/nginx/ssl/YOUR-KEY.crt;
# ssl_certificate_key /etc/nginx/ssl/YOUR-KEY.key;
#ssl_certificate /etc/nginx/ssl/YOUR-CER.crt;
#ssl_certificate_key /etc/nginx/ssl/YOUR-KEY.key;

server_name YOUR-DNS-NAME;

#if ( $scheme = "http" ) {
#    rewrite ^/(.*)$    https://$host/$1 permanent;
#}

charset utf-8;

access_log /var/log/nginx/openhabcloud.org-access.log;
error_log /var/log/nginx/openhabcloud-error.log;
client_max_body_size 300m;

location /css {
    alias  /home/ubuntu/openhabcloud/public/css;
    }
location /js {
    alias /home/ubuntu/openhabcloud/public/js;
    }
location /img {
    alias /home/ubuntu/openhabcloud/public/img;
    }
location /bootstrap {
    alias /home/ubuntu/openhabcloud/public/bootstrap;
    }
location /font-icons {
    alias /home/ubuntu/openhabcloud/public/font-icons;
    }
location /fonts {
    alias /home/ubuntu/openhabcloud/public/fonts;
    }
location /js-plugin {
    alias /home/ubuntu/openhabcloud/public/js-plugin;
    }
location /staff/js-plugin {
    alias /home/ubuntu/openhabcloud/public/js-plugin;
    }
location /downloads {
    alias /home/ubuntu/openhabcloud/public/downloads;
    }
location / {
    proxy_pass http://localhost:3000;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Real-IP $remote_addr ;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
        proxy_set_header X-Forwarded-Proto https;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

You need to restart nginx:

sudo service nginx restart

Docker compose

See docker-compose README.md for instructions on how to run openhab-cloud using docker-compose.

Installing openHAB Cloud on Amazon Web Services (AWS)

Getting started with EC2

To install openHAB Cloud in the AWS cloud, you first need to create an account at Amazon Web Services. Sign up for an AWS account here.

When you have created an account, you should be able to navigate to the the AWS Management Console which is a simple web interface for managing your virtual server instances.

Make sure that your account has access to EC2 and click on Services -> EC2 link to open the EC2 dashboard.

AWS_1

The EC2 dashboard will look something like the image below:

AWS_2.png

We now need to setup a virtual server to install and run the openHAB Cloud application on the node. Amazon calls the virtual servers instances. The EC2 instance is similar to a regular unmanaged web-server.

How to create and launch the openHAB Cloud instance on AWS:

  • As mentioned before select EC2 (Amazon’s Elastic Compute Cloud) from the list of services:

  • In the menu bar, on the right corner you will find an item labelled “Region”: Click to select your nearest region or chose a preferred region where you want to locate your virtual server. We will use the AWS Free Tier, which includes services with a free tier available for 12 months following your AWS sign-up date. AWS cost varies between regions (be aware that is only free for the first year).

AWS_4.png

  • After choosing your region click the blue “Launch Instance” button:

  • Select an Amazon Machine Image (AMI) as base for openHAB Cloud node: The AMI is a template that contains the virtual server software configuration (operating system, application server, and applications) required to launch your instance. You can select an Amazon AMI, from the user community or you can select one of your own AMIs.

We are going to use a free tier and therefor select the Ubuntu Server, 64-bit by clicking on the blue "Select" button:

AWS_6.png

You will see under the Ubuntu logo that there is a free tier eligible, what we want to use. In our guide, we are using the following AMI: Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - AMI ID: ami-fce3c696

AWS_7.png

Leave the default selection with t2.micro where the green label says "Free tier eligible" and click on "Next: Configure Instance Details" to open the instance details page.

AWS_7.png

Just go ahead since we will use the default values on the "Configure Instance Details" page. Click on the button "Next: Add Storage".

On the following page, you see the storage device settings for your instance. Just continue by clicking "Next: Tag Instance", since the default storage will be fine for us.

We don't need to Tag our Instance and we continue by clicking on "Next: Configure Security Group"

In the Configure Security Group page, leave the selected option for "Create a new security group" and add rules for protocols and ports by clicking "Add Rule" like in the image below:

AWS_8.png

We will add SSH to access and admin the instance (virtual server) by your console. The next two rules a pretty straight forward and depends how you want to run openHAB Cloud on your node. We recommend to use only HTTPS for Security reason. In this example, you also see that we added HTTP.

AWS_8.png

After setting up the Security Group, go ahead by clicking the blue "Review and Launch" button.

You will see a summary of your Instance Launch, which will look like this image:

AWS_9.png

Just hit the blue "Launch" button and you will be prompted to select or create a key pair to connect securely to your instance.

Select the "Create a new key pair" option from the dropdown menu and enter a name for your key pair (public and private key) and download your .pem file. Warning: Don't loose this file, you will not be able to download it again!

AWS_10.png

The key file must not be publicly viewable for SSH to work. Open a terminal window and use this command to restrict access rights to the .pem file:

chmod 400 YOUR-PEM-FILENAME.pem

Finally, under Instance you can see your instance starting up and running.

AWS_11.png

There you will find all the needed info to ssh into your node. The important info is your Public DNS / Public IP address.

AWS_13.png

You can ssh to your instance with the user "ubuntu", see here for more info on user accounts on linux instances. In terminal window run this command with your instance infos:

ssh -l ubuntu -i YOUR-PEM-FILENAME.pem YOUR-AWS-EC2-PUBLIC-DNS

Now you should be ready with your instance and see the welcome information of ubuntu.

As next step go to back to the Quickstart and follow the installation steps. You should jump to the Setting up Nginx section and follow the instructions.

You are ready to start the openHAB Cloud service.

You can run openHAB Cloud as background service:

sudo nohup node app.js &

You can also use the systemd startup script under:

/etc/openhabcloud.service

You should now point your webbrowser to:

http://YOUR-AWS-EC2-IP

or

http://YOUR-AWS-EC2-PUBLIC-DNS

You should be ready with your openHAB Cloud installation!

Release-Notes

1.0.5

  • When upgrading from older versions, please run the ./scripts/deleteDuplicateUserDevices.js script, start openhab-cloud once (and shut it down again) and then execute the following statement in your MongoDB collection:
    use <YOUR_DB>
    db.userdevices.reIndex()
    
    This is necessary to ensure a unique index on the collection.

openhab-cloud's People

Contributors

alackmann avatar andibraeu avatar arevindh avatar beachcoffee avatar cniweb avatar cweitkamp avatar dependabot[bot] avatar derfetzer avatar deroetzi avatar digitaldan avatar electraport avatar floriansw avatar itn3rd77 avatar jasonxh avatar javaded avatar jsetton avatar kaikreuzer avatar maniac103 avatar mapled avatar marziman avatar mherbst avatar mikejmajor avatar mueller-ma avatar ryanrdetzel avatar spolette avatar thokas avatar wborn 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  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  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  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

openhab-cloud's Issues

Account page returns a 500 error for some users

occasionally when a user creates an account, it does't get completely populated in mongo. We have a "user" and "account" entry but no entry in "openhabs" for them. This is causing the account page to error.

Adding items does not work

Per the subject, clicking on the button to add a new item (the blue + under "Configuration > New Item") does not work when working through the Cloud.

Doing the same operation directly on the OH2 instance works fine, so the setup of the snapshot should be ok.

Moreover, both instances (OH2 and Cloud) are in this case on my laptop (so this means localhost:8080 and localhost:3000, respectively).

Timestamps on events (and elsewhere) are incorrect

If you browse to https://myopenhab.org/events to view the list of events, it will show dates associated with the various events. For example:
Yesterday at 8:00 PM Switch_OutsideGarageDoorLights ON

The "Yesterday" portion of the text is wrong. In the above example, the event only happened 16 minutes ago (the current time is 8:16 PM EST).

I'm guessing that it has something to do with timezones, but that's just a guess.

The same issue shows up elsewhere where relative dates are shown. For example, when viewing associated "Applications" the "authorized at" field has the same problem.

v7.5 issue with emails

Sending emails does not work with 7.5, below is a error output

Feb 16 03:27:13 ubuntu openhabcloud[19667]: mn=23, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/lib/main.js, function=batchCheck, line=158, method=null, native=false, column=17, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/lib/main.js, function=null, line=229, method=null, native=false, column=17, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js, function=null, line=251, method=null, native=false, column=19, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js, function=done, line=132, method=null, native=false, column=16, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js, function=null, line=32, method=null, native=false, column=21, file=/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js, function=null, line=248, method=null, native=false], stack=[TypeError: Path must be a string. Received undefined,     at assertPath (path.js:7:11),     at Object.extname (path.js:1431:5),     at Object.render (/home/openhabcloud/openhabcloud/node_modules/email-templates/lib/templateManager.js:35:26),     at /home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:246:17,     at /home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:122:13,     at _each (/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:46:13),     at async.each (/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:121:9),     at _asyncMap (/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:245:13),     at Object.map (/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:216:23),     at Object.EmailTemplate.render (/home/openhabcloud/openhabcloud/node_modules/email-templates/lib/main.js:71:11),     at batchCheck (/home/openhabcloud/openhabcloud/node_
Feb 16 03:27:13 ubuntu openhabcloud[19667]: modules/email-templates/lib/main.js:158:23),     at /home/openhabcloud/openhabcloud/node_modules/email-templates/lib/main.js:229:17,     at /home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:251:17,     at done (/home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:132:19),     at /home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:32:16,     at /home/openhabcloud/openhabcloud/node_modules/email-templates/node_modules/async/lib/async.js:248:21]

Installing Problem on Ubuntu 14.04

Hi

i am stack at : Now you need install git and clone the openHAB Cloud repository to your preferred directory (here: ubuntu) with the following commands:

apt-get install git
cd /home/YOUR-DIR/
git clone https://github.com/openhab/openhab-cloud.git

with terminal i made mkdir /home/ubuntu
then i go to cd /home/ubuntu/

then i use the git clone with root rights

this works but the next in the installation tut isnt working

`admin@ubuntu-hd:$ sudu su
bash: sudu: command not found
admin@ubuntu-hd:
$ sudo su
[sudo] password for admin:
root@ubuntu-hd:/home/admin# cd openhabcloud
bash: cd: openhabcloud: No such file or directory
root@ubuntu-hd:/home/admin# cd /home/ubuntu/
root@ubuntu-hd:/home/ubuntu# cd openhabcloud
bash: cd: openhabcloud: No such file or directory
root@ubuntu-hd:/home/ubuntu# cd /openhabcloud
bash: cd: /openhabcloud: No such file or directory
root@ubuntu-hd:/home/ubuntu# git clone https://github.com/openhab/openhab-cloud.git
fatal: destination path 'openhab-cloud' already exists and is not an empty directory.
root@ubuntu-hd:/home/ubuntu# cd openhabcloud
bash: cd: openhabcloud: No such file or directory
root@ubuntu-hd:/home/ubuntu# ls -d */
openhab-cloud/
root@ubuntu-hd:/home/ubuntu# cd openhab-cloud
root@ubuntu-hd:/home/ubuntu/openhab-cloud# node -v
bash: node: command not found
root@ubuntu-hd:/home/ubuntu/openhab-cloud# node --version
bash: node: command not found
root@ubuntu-hd:/home/ubuntu/openhab-cloud# npm install
bash: npm: command not found

`

myopenhab change uuid and secret after saving old value are shown

I purged my old openhab version and installed a new one.
So I also have to change the uuid and secret in myopenhab.org.
After I have clicked Update the old values are shown again, also if you browse z.b. to events and back to account the old values are shown. Only if you logout and login again the new values where shown.

New passsword does not work for login

Found during code review of PR: #86

If the user changes the password using the change password funcionatlity of openhab-cloud, the password is changed successfully, however, the user can not login with this new password. Instead, the old password is still valid, until openhab-cloud is restarted or the cache period is exceeded.

Steps to reproduce:

  1. Register a new account with an arbitrary password
  2. Go to /account and set a new password (different from the old one)
  3. Logout
  4. Try to login with the new password from step 2

Expected result:
The login should succeed.

Current result:
openhab-cloud tells the user, that it could find the user or the password is incorrect. Instead, the old password is stil valid for login.

iOS devices not showing up in the myopenHAB.org device list

Ever since the change over to myopenHAB.org, my apple devices have not shown up in the devices list under my account. My android device shows up, and the apple devices all work fine through the remote URL. They just don't show up in the devices list. I tried uninstalling and reinstalling the app on a couple of the devices but that did not help. I am using iOS app version 1.7.4 on a couple of different versions of iOS with the most current being 10.2.

rest API result returns https urls, even if http was used in the first place

Given, that openhab-cloud is configured to listen on a tcp port 3000 for an IP address (or domain) using http, instead of https, a request to http://ip-address:3000/rest/sitemaps returns the list of sitemaps, however, the links to the sitemaps will use https:

[{"name":"default","label":"My home automation","link":"https://192.168.178.27:3000/rest/sitemaps/default","homepage":{"link":"https://192.168.178.27:3000/rest/sitemaps/default/demo","leaf":false,"widgets":[]}},{"name":"test","label":"My home automation","link":"https://192.168.178.27:3000/rest/sitemaps/test","homepage":{"link":"https://192.168.178.27:3000/rest/sitemaps/test/demo","leaf":false,"widgets":[]}},{"name":"_default","label":"Home","link":"https://192.168.178.27:3000/rest/sitemaps/_default","homepage":{"link":"https://192.168.178.27:3000/rest/sitemaps/_default/_default","leaf":false,"widgets":[]}}]

This is problematic, as the openhab-cloud instance does not listen on the https port.

I'm not sure, if this is an issue with openhab-cloud or the openhabcloud addon for openhab, but I'll investigate :)

iOS devices not registering on myopenhab.org

I am having the same issues as #27. My iPhone 7 is on the list of devices, but it was attached to my.openhab.org before. My iPad Air won't register, and my wife's iPhone 6S, under a different user will also not register. I am able to view site maps remotely on all devices though.

Remote server is set to https://myopenhab.org. I've also noticed under Openhab info that the uuid and secret is not listed, just a dash.

Device Name not editable on Website

I have several devices which broadcast the same hostname over the network and have no possibility to edit the name.
On myopenhab website, it is not possible to register more than one device under a specific name. Trying the "edit" button next to the "delete" button leads to "nothing".

issue on windows

i have configured every required application.but server not running

Getting frequently Disconnects and 504 Gateway-Timeout permanently

Hi,

I've setup a new OH2 Installation and I installed the openhab cloud connector. After setting up connection to myopenhab.org I recognized that I get the following errors in /var/log/openhab2/openhab.log:

2017-02-02 06:56:45.312 [INFO ] [io.openhabcloud.internal.CloudClient] - Disconnected from the openHAB Cloud service (UUID = 9838aa4d-ec6b-44b6-ae07-5c4572300f7d, base URL = http://localhost:8080)
2017-02-02 06:56:46.767 [INFO ] [io.openhabcloud.internal.CloudClient] - Connected to the openHAB Cloud service (UUID = 9838aa4d-ec6b-44b6-ae07-5c4572300f7d, base URL = http://localhost:8080)

The errors occurs frequently, every few minute in the log file.

I also get a 504 Gateway-Timeout, when I try to connect to https://home.myopenhab.org .

I think the 504 error occurs regarding the error messages in openhab.log.

My openhab2 system is shown "Online" in the myopenhab.org Startscreen.

Has anyone an idea what I can do to get a "stable" myopenhab installation.

504 Gateway Time-out on REST PUT

Summary:
Attempting to use the paper-ui remotely through myopenhab to modify a few channels, and it appears that most of the paper-ui works fine, except for PUTs.

Tried issuing the same post through the REST docs ui, but end up with the same response.

The paper-ui works fine when locally, so this appears likely to be bug with the routing rules between the nginx accepting frontend and whatever service is relaying that post back to the local instance.

Sanitized Request headers:

PUT /rest/links/zwave_device_963cad32_node37_meter_watts/zwave:device:963cad32:node37:meter_watts HTTP/1.1
Host: home.myopenhab.org
Connection: keep-alive
Content-Length: 111
Authorization: Basic <redacted>
Accept: application/json, text/plain, */*
Origin: https://home.myopenhab.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: https://home.myopenhab.org/paperui/index.html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8
Cookie: <redacted>

Response:

HTTP/1.1 504 Gateway Time-out
Server: nginx/1.10.0 (Ubuntu)
Date: Thu, 19 Jan 2017 16:28:33 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 594
Connection: keep-alive

In devices page, point user towards how to register a device

Using a myopenhab.org URL as an example... https://myopenhab.org/devices

If you have no registered devices, the page only says,
"You currently have no devices registered with openHAB Cloud."
It is not clear how a device becomes registered. I believe some users (me included) would expect registration to be done the system that is taking the registration, the cloud instance web site in this case. But counter-intuitively, registration instead is done from the device. So it would help to nudge the user in the right direction for how to resolve the "no devices registered" problem that we know they are encountering when they see that message.

It would be better if it said something like,
"You currently have no devices registered with openHAB Cloud. To register a device, set the remote URL, myopenhab.org username, and myopenhab.org password in the device's app. The remote URL should be set to https://myopenhab.org."
...replacing the URL reference with whatever the proper base URL is for the particular cloud instance.

Could not accsess https://home.myopenhab.org/start/index

Hi,

I can log into https://myopenhab.org/ and my device appears online, but when I klick the Link (You are using openHAB 2.x. Click here to access your openHAB's dashboard) it returns a HTTP Status Code 500 with the message openHAB connection error: Connection refused.

Is the service operational? Because the status page shows no Incidents.

Regars,

Christian

Node goes to 100% cpu and stops accepting connections

At some point the node process will eat up 100% of cpu and stop accepting new connections. While load over time causes this to happen, high load itself is not the issue as restarting the process and taking on the previous load will clear the issue for a few days.

The register form for new user doesn't show up

Hello,

I'm new to Openhab Cloud and try to deploy one for my system. I followed the Installation instruction (and stop at step [Setting up Nginx]. From the log of my console, it seems that I don't have any issue. However, I also post it here if I am wrong.

d2d_user@d2d:~/Downloads/openhab-cloud$ sudo node app.js
2017-05-19T00:32:07.112Z - info: openHAB-cloud: Backend service is starting up...
2017-05-19T00:32:07.128Z - info: openHAB-cloud: Backend logging initialized...
2017-05-19T00:32:08.450Z - info: openHAB-cloud: Initializing XMPP connection to GCM
2017-05-19T00:32:09.773Z - info: openHAB-cloud: Mailer will emulate sending in development environment
2017-05-19T00:32:10.181Z - info: openHAB-cloud: Connecting ro Redis at 127.0.0.1:6379
2017-05-19T00:32:11.146Z - info: opneHAB-cloud: Trying to connect to mongodb at: mongodb://127.0.0.1/openhab?poolSize=100
2017-05-19T00:32:11.178Z - info: openHAB-cloud: Scheduling a statistics job (every 5 min)
express deprecated app.configure: Check app.get('env') in an if statement app.js:223:5
express deprecated app.configure: Check app.get('env') in an if statement app.js:227:5
express deprecated app.configure: Check app.get('env') in an if statement app.js:230:5
connect deprecated multipart: use parser (multiparty, busboy, formidable) npm module instead node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:56:20
connect deprecated limit: Restrict request size at location of read node_modules/express/node_modules/connect/lib/middleware/multipart.js:86:15
connect deprecated methodOverride: use method-override npm module instead app.js:239:21
2017-05-19T00:32:11.557Z - info: openHAB-cloud: IFTTT is configured, app handling IFTTT capabilities...
Option polling duration is not valid. Please refer to the README.
2017-05-19T00:32:11.600Z - info: openHAB-cloud: express server listening on port 3000
2017-05-19T00:32:11.613Z - info: openHAB-cloud: Redis connect response: OK
2017-05-19T00:32:11.616Z - info: Redis is ready
node_redis: Warning: Redis server does not require a password, but a password was supplied.
2017-05-19T00:32:11.658Z - info: openHAB-cloud: Successfully connected to mongodb
2017-05-19T00:32:11.871Z - warn: openHAB-cloud: GCM XMPP error: XMPP authentication failure
2017-05-19T00:32:13.338Z - info: openHAB-cloud: Authorizing incoming openHAB connection
2017-05-19T00:32:13.351Z - info: openHAB-cloud: openHAB b9ac46cd-c977-40b8-9bcb-749a3c12d5e1 not found
2017-05-19T00:33:11.180Z - debug: openHAB-cloud: Checking for offline openHABs (0)
2017-05-19T00:33:11.181Z - debug: openHAB-cloud: Checking orphaned rest requests (0)
2017-05-19T00:34:11.183Z - debug: openHAB-cloud: Checking for offline openHABs (0)
2017-05-19T00:34:11.183Z - debug: openHAB-cloud: Checking orphaned rest requests (0)
2017-05-19T00:35:00.219Z - info: openHAB-cloud: every5min statistics collection job started
2017-05-19T00:35:00.275Z - info: openHAB-cloud: every5min statistics collection job finished
2017-05-19T00:35:11.186Z - debug: openHAB-cloud: Checking for offline openHABs (0)

My problem is that I don't see the registration form for new user when accessing to http://localhost:3000. Could someone please give me some advice?

Thanks,

oph

login (e-mail address) should not be case sensitive

There is a huge number of users that get the case wrong when trying to log in with their e-mail address.

As email addresses aren't case sensitive, it imho does not make sense to treat them as case sensitive on the login screen either - this change would for sure reduce the support efforts.

JSONObject["sitemap"] not a string

I have the an error please help.

2016-12-20 21:02:54.444 [ERROR] [o.o.i.o.internal.CloudClient ] - JSONObject["sitemap"] not a string.

Anyone have a idea what could be wrong. It seems to happen at an update of item states to the myopenHAB Cloud.

I'm using/testing the version org.openhab.io.openhabcloud_1.9.0.201612192331.jar

[development mode] error: uncaughtException: Cannot read property 'password'

I copied config-development.json to config.json and tried to run the app and it results in below error.

$ sudo node app.js
2017-01-04T13:21:11.358Z - info: openHAB-cloud: Backend service is starting up...
2017-01-04T13:21:11.364Z - info: openHAB-cloud: Backend logging initialized...
2017-01-04T13:21:12.647Z - info: openHAB-cloud: Mailer will emulate sending in development environment
2017-01-04T13:21:12.944Z - error: uncaughtException: Cannot read property 'password' of undefined date=Wed Jan 04 2017 13:21:12 GMT+0000 (UTC), pid=25076, uid=0, gid=0, cwd=/home/ubuntu/openhab-cloud, execPath=/usr/local/bin/node, version=v0.10.48, argv=[node, /home/ubuntu/openhab-cloud/app.js], rss=81817600, heapTotal=69575168, heapUsed=41610520, loadavg=[0.06689453125, 0.015625, 0.00439453125], uptime=795580.377863331, trace=[column=42, file=/home/ubuntu/openhab-cloud/gcmsender.js, function=, line=7, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false, column=10, file=module.js, function=Object.Module._extensions..js, line=474, method=Module._extensions..js, native=false, column=32, file=module.js, function=Module.load, line=356, method=load, native=false, column=12, file=module.js, function=Function.Module._load, line=312, method=Module._load, native=false, column=17, file=module.js, function=Module.require, line=364, method=require, native=false, column=17, file=module.js, function=require, line=380, method=null, native=false, column=17, file=/home/ubuntu/openhab-cloud/routes/devices.js, function=, line=10, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false, column=10, file=module.js, function=Object.Module._extensions..js, line=474, method=Module._extensions..js, native=false, column=32, file=module.js, function=Module.load, line=356, method=load, native=false, column=12, file=module.js, function=Function.Module._load, line=312, method=Module._load, native=false, column=17, file=module.js, function=Module.require, line=364, method=require, native=false, column=17, file=module.js, function=require, line=380, method=null, native=false, column=24, file=/home/ubuntu/openhab-cloud/app.js, function=, line=55, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false], stack=[TypeError: Cannot read property 'password' of undefined, at Object. (/home/ubuntu/openhab-cloud/gcmsender.js:7:42), at Module._compile (module.js:456:26), at Object.Module._extensions..js (module.js:474:10), at Module.load (module.js:356:32), at Function.Module._load (module.js:312:12), at Module.require (module.js:364:17), at require (module.js:380:17), at Object. (/home/ubuntu/openhab-cloud/routes/devices.js:10:17), at Module._compile (module.js:456:26), at Object.Module._extensions..js (module.js:474:10), at Module.load (module.js:356:32), at Function.Module._load (module.js:312:12), at Module.require (module.js:364:17), at require (module.js:380:17), at Object. (/home/ubuntu/openhab-cloud/app.js:55:24), at Module._compile (module.js:456:26)]
2017-01-04T13:21:12.945Z - error:

Improper password strength controls

Description:
A strong password is a key requirement to protect against password guessing attacks. The application does not implement a strong password policy, as users can create an account with a password of one character.

Steps to reproduce (A):

  1. Authenticate
  2. Go to /account
  3. Enter a new password of one character, e.g. 'a'.
  4. Save
  5. Logout
  6. Authenticate with the same user and the new password. Observe that this worked.

More information: https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Implement_Proper_Password_Strength_Controls

Incorrect URL when listening for sitemap events

I have a switch that is used to hide a sitemap frame. When clicking it though openhab-cloud it didn't work.
I received the following error message in my web console:

Firefox can't establish a connection to the server at https://home.openhab.org/rest/sitemaps/events/0982595d-9132-4bb5-800b-bacf5925cf96?sitemap=test&pageid=test.1smarthome.js:1:18688

h

I assume the address should be home.myopenhab.org rather than home.openhab.org

Docker image

A docker image with all the necessary dependencies installed for you would be a great way to get up and running quickly.

Special characters in password cause login problems

I have a password which contains characters (slashes, brackets, angle brackets, tildes and semicolons). Everything works fine when I login via https://myopenhab.org/, but when I use Android app or log out and go directly to the sitemap (e.g. https://home.myopenhab.org/basicui/app), the password is not accepted.

I created another user and set its password to only letters and numbers and it works fine.

By the way, changing the password in question didn't work yesterday, but this may be related to #92.

OpenRedirect when obtaining an oauth2 authorization code

Problem Description:
It seems that the redirectURI where the authorization code is delivered is not verified. This may lead to the following two problems:

  • an attacker may obtain the authorization code by providing an uri to an attacker controlled domain. This code may be subsequently be exchanged for an access token (assuming that the attacker is able to obtain the client secret).
  • an attacker may redirect the user to any other domain

Steps to reproduce

  1. Ensure that an oauth2 client has been registered and scope has been created.
  2. Authenticate as any user to the openhab-cloud.
  3. Browse to /oauth2/authorize?response_type=code&redirect_uri=<attacker_controlleddomain>&scope=&client_id=
    Replace the values with valid values.
  4. Get the consent form
    image
  5. Click Allow.
  6. Observe that the user is redirected to the attacker's controlled website.
    image

Solution:

  • require a pre-registered redirectURI per client (make it part of the client schema, and insert it upon client registration)
  • only redirect to the pre-registered uri by modifying the grant code to something like
if(client.redirect_uri !== redirectURI) {
     return done(null, false);
}
//rest of code

More information: https://tools.ietf.org/html/rfc6819#section-4.2.4

openHAB considered offline for missing error handler in socket.io

After some time, the following error messages occured in the openHAB-cloud log:

2017-05-03T07:11:17.108Z - debug: openHAB-cloud: Checking orphaned rest requests (0)
^[[0mGET /basicui/app?w=0102&sitemap=erster_versuch ^[[33m401 ^[[0m6.521 ms - -^[[0m
^[[0mGET /basicui/app?w=0102&sitemap=erster_versuch ^[[32m200 ^[[0m124.317 ms - 7921^[[0m
Missing error handler on `socket`.
TypeError: Cannot read property 'openhab' of undefined
    at Socket.<anonymous> (/opt/openhab_cloud/app.js:1079:64)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at Socket.onevent (/opt/openhab_cloud/node_modules/socket.io/lib/socket.js:330:8)
    at Socket.onpacket (/opt/openhab_cloud/node_modules/socket.io/lib/socket.js:290:12)
    at Client.ondecoded (/opt/openhab_cloud/node_modules/socket.io/lib/client.js:193:14)
    at Decoder.Emitter.emit (/opt/openhab_cloud/node_modules/component-emitter/index.js:134:20)
    at Decoder.add (/opt/openhab_cloud/node_modules/socket.io-parser/index.js:247:12)
    at Client.ondata (/opt/openhab_cloud/node_modules/socket.io/lib/client.js:175:18)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at Socket.onPacket (/opt/openhab_cloud/node_modules/engine.io/lib/socket.js:99:14)
    at emitOne (events.js:82:20)
    at WebSocket.emit (events.js:169:7)
    at WebSocket.Transport.onPacket (/opt/openhab_cloud/node_modules/engine.io/lib/transport.js:91:8)
    at WebSocket.Transport.onData (/opt/openhab_cloud/node_modules/engine.io/lib/transport.js:102:8)
    at WebSocket.onData (/opt/openhab_cloud/node_modules/engine.io/lib/transports/websocket.js:75:30)
    at emitTwo (events.js:87:13)
    at WebSocket.emit (events.js:172:7)
    at Receiver.ontext (/opt/openhab_cloud/node_modules/engine.io/node_modules/ws/lib/WebSocket.js:816:10)
    at /opt/openhab_cloud/node_modules/engine.io/node_modules/ws/lib/Receiver.js:477:18
    at Receiver.applyExtensions (/opt/openhab_cloud/node_modules/engine.io/node_modules/ws/lib/Receiver.js:364:5)
2017-05-03T07:11:43.039Z - info: openHAB-cloud: Disconnected e08ef154-e1af-493f-9a16-d555039eff47
^[[0mGET /icon/temperature?state=17.2&format=svg ^[[33m401 ^[[0m17.802 ms - -^[[0m
^[[0mGET /icon/slider?state=NULL&format=svg ^[[33m401 ^[[0m17.045 ms - -^[[0m
^[[0mGET /icon/switch?state=NULL&format=svg ^[[33m401 ^[[0m15.335 ms - -^[[0m
^[[0mGET /icon/number?state=NULL&format=svg ^[[33m401 ^[[0m14.168 ms - -^[[0m
^[[0mGET /chart?items=FL_HT_GT_Temp&period=h&t=1493795503027 ^[[33m401 ^[[0m13.161 ms - -^[[0m
^[[0mGET /chart?items=FL_HT_GT_Temp&period=m&t=1493795503028 ^[[33m401 ^[[0m12.566 ms - -^[[0m
^[[0mGET /chart?items=FL_HT_GT_Temp&period=W&t=1493795503028 ^[[33m401 ^[[0m11.919 ms - -^[[0m
2017-05-03T07:12:17.110Z - debug: openHAB-cloud: Checking for offline openHABs (1)
2017-05-03T07:12:17.110Z - debug: openHAB-cloud: Checking orphaned rest requests (14)

After that, the openHAB instance was considered as offline and won't come back online, until the app is restarted. I'm not sure, where the exact error comes from (so, why the openhab uuid does not match with the uuid of the request), however, the app shouldn't simply throw an unhandled error and stops working for this openHAB instance.

Old password not required on password change

Description:
Password change should require the old password. Without the old password, an attacker who is able to execute an XSS attack (or with physical access to the computer) may be able to impersonate the user.

Steps to reproduce:

  1. Authenticate.
  2. Go to /account
  3. Enter the new password twice. Click on 'Change'.
  4. Observe that the password has been successfully changed.

Mitigation:
Asks users for their old password and verify it before changing the password.

More info: https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Require_Re-authentication_for_Sensitive_Features

Note: It would be nice if there is a way to send security issues to openhab via an alternate communication channel (e.g. [email protected]). This avoids that attackers are able to get knowledge of more serious security issues before they are fixed.

Paper UI not working

Hi,
I´ve installes an own Openhab Cloud but when I try to open PaperUI the following Error comes up:

Cannot GET /paperui/index.html

Regards
Kobelka

Allow access to multiple instance

It would be useful to have the possibility to have one account and several instances of OH(home, cabin, summerhouse etc..) and that all of them can communicate with each other and that the different sitemaps can be accessed within the same android app.

User enumeration

An attacker is able to enumerate usernames. This is one of the two pieces of information required to authenticate.

Steps to reproduce:

  1. Go to /lostpassword
  2. Enter an email address that does not exist. Observe the error message.
    image
  3. Enter an email address that exists. Observe the message.
    image
  4. As both messages are different, an attacker is able to obtain a list of usernames.

Mitigation:
Change the message to something like 'We sent a password reset link to your email address if it exists'. Redirect to the same URI when finished.

More info: https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Authentication_and_Error_Messages

v7.5 issue with error logger

an error message is being thrown about logger.err not being a function, not sure what this is breaking (GCM functionality?) , but needs to be addressed.

Feb 16 03:25:41 ubuntu openhabcloud[19667]: m_readable.js, function=endReadableNT, line=974, method=null, native=false, column=11, file=internal/process/next_tick.js, function=_combinedTickCallback, line=74, method=null, native=false, column=9, file=internal/process/next_tick.js, function=process._tickCallback, line=98, method=_tickCallback, native=false], stack=[TypeError: logger.err is not a function,     at /home/openhabcloud/openhabcloud/gcm-xmpp.js:95:48,     at /home/openhabcloud/openhabcloud/node_modules/node-gcm/lib/sender.js:35:24,     at Request._callback (/home/openhabcloud/openhabcloud/node_modules/node-gcm/lib/sender.js:163:24),     at Request.self.callback (/home/openhabcloud/openhabcloud/node_modules/node-gcm/node_modules/request/request.js:186:22),     at emitTwo (events.js:106:13),     at Request.emit (events.js:192:7),     at Request.<anonymous> (/home/openhabcloud/openhabcloud/node_modules/node-gcm/node_modules/request/request.js:1081:10),     at emitOne (events.js:96:13),     at Request.emit (events.js:189:7),     at IncomingMessage.<anonymous> (/home/openhabcloud/openhabcloud/node_modules/node-gcm/node_modules/request/request.js:1001:12),     at Object.onceWrapper (events.js:291:19),     at emitNone (events.js:91:20),     at IncomingMessage.emit (events.js:186:7),     at endReadableNT (_stream_readable.js:974:12),     at _combinedTickCallback (internal/process/next_tick.js:74:11),     at process._tickCallback (internal/process/next_tick.js:98:9)]
Feb 16 03:25:41 ubuntu openhabcloud[19667]: 2017-02-16T03:25:41.904Z - error:

error: uncaughtException: Cannot find module './config.json'

Hi,

I followed the Quickstart guide to install openhab-cloud on ubuntu 16.04. But I am getting below error while starting the app.

$ node --version

v0.10.48

$ sudo node app.js

2017-01-04T12:41:35.479Z - info: openHAB-cloud: Backend service is starting up...
2017-01-04T12:41:35.484Z - info: openHAB-cloud: Backend logging initialized...
2017-01-04T12:41:35.489Z - error: uncaughtException: Cannot find module './config.json' date=Wed Jan 04 2017 12:41:35 GMT+0000 (UTC), pid=24452, uid=0, gid=0, cwd=/home/ubuntu/openhab-cloud, execPath=/usr/local/bin/node, version=v0.10.48, argv=[node, /home/ubuntu/openhab-cloud/app.js], rss=17514496, heapTotal=9293056, heapUsed=3399584, loadavg=[0.02001953125, 0.13427734375, 0.076171875], uptime=793202.923608907, trace=[column=15, file=module.js, function=Function.Module._resolveFilename, line=338, method=Module._resolveFilename, native=false, column=25, file=module.js, function=Function.Module._load, line=280, method=Module._load, native=false, column=17, file=module.js, function=Module.require, line=364, method=require, native=false, column=17, file=module.js, function=require, line=380, method=null, native=false, column=14, file=/home/ubuntu/openhab-cloud/app.js, function=, line=35, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false, column=10, file=module.js, function=Object.Module._extensions..js, line=474, method=Module._extensions..js, native=false, column=32, file=module.js, function=Module.load, line=356, method=load, native=false, column=12, file=module.js, function=Function.Module._load, line=312, method=Module._load, native=false, column=10, file=module.js, function=Function.Module.runMain, line=497, method=Module.runMain, native=false], stack=[Error: Cannot find module './config.json', at Function.Module._resolveFilename (module.js:338:15), at Function.Module._load (module.js:280:25), at Module.require (module.js:364:17), at require (module.js:380:17), at Object. (/home/ubuntu/openhab-cloud/app.js:35:14), at Module._compile (module.js:456:26), at Object.Module._extensions..js (module.js:474:10), at Module.load (module.js:356:32), at Function.Module._load (module.js:312:12), at Function.Module.runMain (module.js:497:10)]
2017-01-04T12:41:35.490Z - error: code=MODULE_NOT_FOUND

error: uncaughtException: Object function Object() { [native code] } has no method 'assign'

Hi,

I updated the old code by git pull and did npm install, now I am getting below error.

$ node -v
v0.10.48

$ sudo node app.js

2017-05-12T10:51:41.798Z - info: openHAB-cloud: Backend service is starting up...
2017-05-12T10:51:41.805Z - info: openHAB-cloud: Backend logging initialized...
2017-05-12T10:51:42.297Z - error: uncaughtException: Object function Object() { [native code] } has no method 'assign' date=Fri May 12 2017 10:51:42 GMT+0000 (UTC), pid=7783, uid=0, gid=0, cwd=/home/ubuntu/openhab-cloud, execPath=/usr/local/bin/node, version=v0.10.48, argv=[node, /home/ubuntu/openhab-cloud/app.js], rss=36888576, heapTotal=31139328, heapUsed=15028000, loadavg=[0.080078125, 0.0166015625, 0.00537109375], uptime=11845809.731648784, trace=[column=8, file=/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/node_modules/@xmpp/xml/index.js, function=, line=10, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false, column=10, file=module.js, function=Object.Module._extensions..js, line=474, method=Module._extensions..js, native=false, column=32, file=module.js, function=Module.load, line=356, method=load, native=false, column=12, file=module.js, function=Function.Module._load, line=312, method=Module._load, native=false, column=17, file=module.js, function=Module.require, line=364, method=require, native=false, column=17, file=module.js, function=require, line=380, method=null, native=false, column=15, file=/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/lib/Connection.js, function=, line=6, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false, column=10, file=module.js, function=Object.Module._extensions..js, line=474, method=Module._extensions..js, native=false, column=32, file=module.js, function=Module.load, line=356, method=load, native=false, column=12, file=module.js, function=Function.Module._load, line=312, method=Module._load, native=false, column=17, file=module.js, function=Module.require, line=364, method=require, native=false, column=17, file=module.js, function=require, line=380, method=null, native=false, column=18, file=/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/index.js, function=, line=3, method=null, native=false, column=26, file=module.js, function=Module._compile, line=456, method=_compile, native=false], stack=[TypeError: Object function Object() { [native code] } has no method 'assign', at Object. (/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/node_modules/@xmpp/xml/index.js:10:8), at Module._compile (module.js:456:26), at Object.Module._extensions..js (module.js:474:10), at Module.load (module.js:356:32), at Function.Module._load (module.js:312:12), at Module.require (module.js:364:17), at require (module.js:380:17), at Object. (/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/lib/Connection.js:6:15), at Module._compile (module.js:456:26), at Object.Module._extensions..js (module.js:474:10), at Module.load (module.js:356:32), at Function.Module._load (module.js:312:12), at Module.require (module.js:364:17), at require (module.js:380:17), at Object. (/home/ubuntu/openhab-cloud/node_modules/node-xmpp/node_modules/node-xmpp-core/index.js:3:18), at Module._compile (module.js:456:26)]
2017-05-12T10:51:42.298Z - error:

Can't access paperui

When running my own instance I get an error when trying to access the openhab dashboard. Habadmin works fine but the paper ui does not.

Cannot GET /paperui/index.html

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.