Giter VIP home page Giter VIP logo

risco-service's Introduction

What is this?

This is a server (NodeJS) that connect to Risco Cloud Alarm Security System. Integration works only when proper Ethernet module is added to your Risco Unit and you are able to arm & disarm your system via https://www.riscocloud.com/ELAS/WebUI.

The purpose of this service was to separate Risco API endpoints from Homebridge. During my tests Homebridge was quite unresponsive and prone to strange behaviours / delays. If you're already have a hardware where you run Homebridge, you can also install separate service for Risco Alarm, that handle all logic inside and expose only http endpoint where from Homebridge / any other platform you can read / arm / disarm your Risco. Polling is enabled by default.

Service by default saves last known status (if changed) into file. That way even if service is restarted - last status from file is read.

Available methods

  • GET /alarm/check - get Risco Status (3 - disarmed, 1 - armed)
  • GET /alarm/arm/:state - set :state to away to arm your Risco, set to any other to disarm.
  • GET /alarm/bypass/:id/state - set sensor with provided id to be omitted during next arm cycle
  • GET /alarm/bypass/:id - get bypass value for requested sensor

Raspberry Pi: how to start service automatically

For this we should create new service in /lib/systemd/system/ Instructions can be found here: https://www.paulaikman.co.uk/nodejs-services-raspberrypi/

Service control

sudo systemctl start|stop|restart risco.service sudo systemctl restart risco.service

Config file

Before you run this service, make sure you update config.json file.

  "RISCO_USER":   Risco User, usually your email address
  "RISCO_PASS":   Your Password to Risco system
  "RISCO_PIN":    Your PIN
  "RISCO_SITEID": Your Risco SiteID

How to get your riscoSiteId

To get your riscoSiteId, login to riscocloud via ChromeBrowser (first login screen), and before providing your PIN (second login page), display source of the page and find string: <div class="site-name" ... it will look like:

<div class="site-name" id="site_12345_div"></div>

In that case "12345" is your siteId which should be placed in new config file.

Docker

Docker compose could be used, a docker-compose.yml for development is included. The service can also be installed from Docker Hub, see examples below.

For example, docker compose for local development (docker build not needed):

docker compose up

For example, manual building and running:

docker build -t risco-service .
docker run --init --name my-risco-service -p 8889:8889 -v $(pwd)/config.json:/home/node/code/config.json risco-service

For example, installing from Docker Hub (make sure to set up config.json first):

docker run -d --restart unless-stopped --name my-risco-service -p 8889:8889 -v $(pwd)/config.json:/home/node/code/config.json mdworld/risco-service

Use with Domoticz

Based on: https://gabor.heja.hu/blog/2020/01/16/domoticz-http-https-poller-and-json/

  • Setup > Hardware > Add a device:
    • name Risco Cloud
    • type HTTP/HTTPS poller
    • method GET
    • ContentType: application/json
    • URL: http://localhost:8889/alarm/check
    • Command: risco_cloud.lua
    • Refresh: 60 This is in seconds, do not set to lower than 12 seconds
  • Setup > Hardware > Risco Cloud > Create Virtual Sensors
    • Name Risco State
    • Sensor Type: Selector Switch
  • Setup > Devices > Search Risco State should show it, copy the Idx, e.g. 2053
  • Switches > Find Risco State and edit it.
    • Rename selector levels:
      • 0 disconnected
      • 10 disarmed
      • 20 partarmed
      • 30 armed
      • 40 ALARM
    • Set Protected to true
    • Change "Switch Icon" to Generic On/Off switch
  • On the filesystem, in the Domoticz dir create config/scripts/lua_parsers/risco_cloud.lua with:
local idx = 2053
local alarm_status = request['content']

-- 0 -  Characteristic.SecuritySystemTargetState.STAY_ARM:
-- 1 -  Characteristic.SecuritySystemTargetState.AWAY_ARM:
-- 2 -  Characteristic.SecuritySystemTargetState.NIGHT_ARM:
-- 3 -  Characteristic.SecuritySystemTargetState.DISARM:
-- 4 -  OngoingAlarm

if (alarm_status == "0")
then
  print ("0=stay_arm, setting to 30")
  domoticz_updateDevice(idx, '' , 30)
elseif (alarm_status == "1")
then
  print ("1=away_arm, setting to 30")
  domoticz_updateDevice(idx, '' , 30)
elseif (alarm_status == "2")
then
  print ("2=night_arm, setting to 20")
  domoticz_updateDevice(idx, '' , 20)
elseif (alarm_status == "3")
then
  print ("3=disarm, setting to 10")
  domoticz_updateDevice(idx, '' , 10)
elseif (alarm_status == "4")
then
  print ("4=ongoing_alarm, setting to 40")
  domoticz_updateDevice(idx, '' , 40)
else
  print ("invalid state, setting to 0, state was:", alarm_status)
  domoticz_updateDevice(idx, '' , 0)
end

Use with Homebridge

I use this service with Http-SecuritySystem npm package dedicated for Homebridge https://www.npmjs.com/package/homebridge-http-securitysystem

My config for this plugin:

  "accessory": "Http-SecuritySystem",
  "name": "Home security",
  "debug": false,
  "username": "",
  "password": "",
  "immediately": false,
  "polling": true,
  "pollInterval": 10000,
  "http_method": "GET",
  "urls": {
      "stay": {
          "url": "http://localhost:8889/alarm/arm/stay",
          "body": "stay"
      },
      "away": {
          "url": "http://localhost:8889/alarm/arm/away",
          "body": "away"
      },
      "night": {
          "url": "http://localhost:8889/alarm/arm/night",
          "body": "night"
      },
      "disarm": {
          "url": "http://localhost:8889/alarm/arm/disarm",
          "body": ""
      },
      "readCurrentState": {
          "url": "http://localhost:8889/alarm/check",
          "body": ""
      },
      "readTargetState": {
          "url": "http://localhost:8889/alarm/check",
          "body": ""
      }
  }

Thank you

If you like it, any BTC donation will be great. My BTC Wallet: 3Ma1KEEfvNbvfAEyvRvmGHxNs61qZE7Jew Zrzut ekranu 2021-10-12 o 11 19 06

risco-service's People

Contributors

mdvanes avatar szlaskidaniel avatar

Stargazers

Fabien Marchewka avatar Bruno Monteiro avatar Per von Rosen avatar  avatar  avatar

Watchers

Bruno Monteiro avatar  avatar Dorian Eydoux avatar

Forkers

mdvanes

risco-service's Issues

Keep getting incorrect credentials error

I have installed this on an Ubuntu VM with node 16.17 by checking out the GitHub repository.
I created the service which start by "bash -c 'exec /usr/bin/node /home/myuser/risco-service/risco.js'"

My config.json looks as follows

{
  "RISCO_USER": "[email protected]",
  "RISCO_PASS": "thisismypassword",
  "RISCO_PIN": "XXX",
  "RISCO_SITEID": "YYYYYY"
}

I can login into the Risco UI by copying and pasting from the json just fine so the info is correct.
The SiteID is extract from Chrome as instructed

<div class="site-name" id="site_ YYYYYY_div">
                                            <label for="site_ YYYYYY_rb" id="site_ YYYYYY_label_name" class="jcf-label-active">ThisistheUIsiteidwhichIdontuse</label>
                                            <br>
                                            <label for="site_ YYYYYY_rb" id="site_ YYYYYY_label_authority" style="font-size: x-small">User</label>
                                        </div> 

However I always get the error of incorrect login credentials .Am I missing something or did the something change on the risco side which breaks the code?


[winston] Attempt to write logs with no transports {"message":"login() to RiscoCloud","level":"info"}
[winston] Attempt to write logs with no transports {"message":3,"level":"debug"}
[winston] Attempt to write logs with no transports {"message":"Status Code: 200","level":"error"}
[winston] Attempt to write logs with no transports {"message":"login  error:\n                                    Username/Password mismatch\r\n                                        <br />This is attempt 4 out of 5 before account lock out                         ","level":"error"}
login  error:
                                    Username/Password mismatch
                                        <br />This is attempt 4 out of 5 before account lock out                         
[winston] Attempt to write logs with no transports {"message":"failed to relogin.","level":"error"}'

When I use the docker image from https://hub.docker.com/r/mdworld/risco-service with the same config.json it works fine. However when i checkout the GitHub repository from mdworld I have the same invalid credentials issue. Not sure how I can explain this.

Needs .AspNetCore.Antiforgery cookie

It looks like the most recent version of the UI requires an anti-CSRF Token (e.g. ".AspNetCore.Antiforgery.########"); for instance, when requesting /Detectors/Get without this token, the following response is returned:

HTTP/2 200
content-type: application/json
content-length: 28
strict-transport-security: max-age=15724800; includeSubDomains
x-content-type-options: nosniff

{"error":3,"detectors":null}

Docker image

Hi, thanks for your project!

I'm testing it out now, and if you don't mind I'll publish a Docker image for it. If you prefer to publish a Docker image yourself, let me know.

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.