sciler v0.1.7
sciler (see npm)
Installation
- npm install with
npm install sciler
Using this library
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 optional keys:) instruction(string with the name of the instruction, (special casetime))boolean of whether the instruction could be performed value(any type with a value specific for this instruction) (not in case oftimeinstruction )component_id(string with the name of the component for which the instruction is meant, this can be undefined) (not in case oftimeinstruction )id(in case oftimeinstruction: string id of timer (generalis the main duration of the escape room))duration(in case oftimeinstruction: integer in milliseconds)state(in case oftimeinstruction: string of state of timer (stateActive,stateIdle, orstateExpired) )test()none void reset()none void create a constructor which calls the constructor of
Devicewithsuper(config, logger)where:config is a dictionary which has keys:
key explanation idstring with the id of a device. Write it in camelCase, e.g. "controlBoard" hoststring with the IP address of the host for the broker portint with the port of the host for the broker labelsarray 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
dateis an Date objectlevelis one of the following strings: 'debug', 'info', 'warn', 'error', 'fatal'messageis 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 import lib with
const Device = require("sciler");- in case of:
- angular: add
scilerto 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
See these folders for 2 examples or see the example below
Javascript file:
$(document).ready(function() {
const Device = require("sciler");
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