js-scc
v0.0.12
Published
- npm install with ```npm install js-scc```
Downloads
3
Readme
js-scc (see npm)
Installation
- npm install with
npm install js-scc
Using this library
import lib with
const Device = require("js-scc");
create a class that extends
Device
, in order to do this, implement the following methods:| method | parameters | | returns | |------------------------------|----------------------------------|------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------| |
getStatus()
| none | | a dictionary of current status of the device, this should include all input and output as defined in the room_config for the backend | |performInstruction(action)
| action (a dictionary with keys:) |instruction
(string with the name of the instruction) | boolean of whether the instruction could be performed | | | |value
(any type with a value specific for this instruction) | | | | |component_id
(string with the name of the component for which the instruction is meant, this can be undefined) | | |test()
| none | | void | |reset()
| none | | void |create a constructor which calls the constructor of
Device
withsuper(config, logger)
where:- config is a dictionary which has keys:
| key | explanation | |----------|----------------------------------------------------------------------------| |
id
| string with the id of a device. Write it in camelCase, e.g. "controlBoard" | |host
| string with the IP address of the host for the broker | |port
| int with the port of the host for the broker | |labels
| array of strings with all labels this device should also subscribe to |- logger is a function(date, level, message) in which an own logger is implemented where
date
is an Date objectlevel
is one of the following strings: 'debug', 'info', 'warn', 'error', 'fatal'message
is a custom string containing more information
Now on the instantiation of your class which implements
Device
, you can call:| function | arguments | returns | usecase | |-----------------------|-----------------------------------------------------------------------------------|---------|----------------------------------------------------------------------------------| |
start(onStart)
| onStart (a function that gets called once the device is connected or reconnected) | void | call this function in order to connect to sciler | |log(level, message)
| level (one of the following strings: 'debug', 'info', 'warn', 'error', 'fatal') | void | this method can be used to log in the same logger as the library does | | | message (custom string containing more information) | | | |statusChanged()
| none | void | call this function to signal that you updated a status so sciler can be notified |in case of:
- angular: add
js-scc
to dependencies inpackage.json
- browser javascript: (example nodejs serving web page with javascript which includes this library), Browserify your javascript which includes this library.
- angular: add
Example
Javascript file:
$(document).ready(function() {
const Device = require("js-scc");
let display;
class Display extends Device {
constructor(config) {
super(config, timedLogger);
this.hint = "";
this.button = false;
}
// required method for extending Device
getStatus() {
return {
button: this.button,
hint: this.hint
};
}
// required method for extending Device
performInstruction(action) {
switch (action.instruction) {
case "hint": {
this.hint = action.value;
displayText(this.hint);
this.statusChanged();
break;
}
default: {
return false;
}
}
return true;
}
// required method for extending Device
test() {
this.hint = "test";
displayText(this.hint);
}
// required method for extending Device
reset() {
this.hint = "";
this.button = false;
displayText(this.hint);
this.statusChanged();
}
}
// custom logger used in constructor
function timedLogger(date, level, message) {
const formatDate = function(date) {
return (
date.getDate() +
"-" +
date.getMonth() +
1 +
"-" +
date.getFullYear() +
" " +
date.getHours() +
":" +
date.getMinutes() +
":" +
date.getSeconds()
);
};
console.log(
"time=" + formatDate(date) + " level=" + level + " msg=" + message
); // call own logger);
}
// edit the DOM using JQuery to display text
function displayText(text) {
$("#hint").text(text);
}
// when the button is click update status and notify sciler
$("#button").on("click", function() {
display.button = true;
display.statusChanged();
});
// get config file from server
$.get("/display_config.json", function(config) {
display = new Display(JSON.parse(config)); // create new Display object
// connect
display.start(() => {
console.log("connected"); // when connected, do something
});
});
});
Where display_config.json
is:
{
"id": "display-node",
"host": "192.168.178.49",
"labels": ["hint"],
"port": 8083
}
And where index.html
is:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Display</title>
<link rel="icon" type="image/x-icon" href="raccoon.ico">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="bundle.js"></script>
</head>
<body>
hint: <p id="hint"></p>
<button id="button">button</button>
</body>
</html>
And where the room_config.json
looks something like:
{
"general": { },
"cameras": [ ],
"general_events": [ ],
"button_events": [ ],
"puzzles": [ ],
"timers": [ ],
"devices": [
{ },
{
"id": "display-node",
"description": "displays messages",
"input": {
"button": "boolean"
},
"output": {
"display": {
"type": "string",
"instructions": {
"hint": "string"
}
}
}
},
{ }
]
}
Tip reading in config.json in Angular:
When reading in a json file
import * as data from './data.json';
make sure tsconfig.json
has resolveJsonModule: true
:
{
"compilerOptions": {
...
"resolveJsonModule": true,
...
}
then you can use this object in for example ngOnInit
ngOnInit(): void {
this.jsonData = (data as any).default
}
License
GNU GENERAL PUBLIC LICENSE Version 3, see LICENSE.md