System architecture:
In this part we will create 2 new models:
- equipment, a complex model with 5 attributes: id, name, hydrometry, temperature and pressed (boolean)
- equipmentList, a model that contains an array of equipments
spinal-model-button/model.js
const spinalCore = require("spinal-core-connectorjs"); // 1: Previously used buttonModel function buttonModel() { buttonModel.super(this); this.add_attr({ pressed: false }); } spinalCore.extend(buttonModel, Model); module.exports = buttonModel; // 2: Equipment model function equipment() { equipment.super(this); // 3: Creating attributes this.add_attr({ id: 0, name: "", hydrometry: 0, temperature: 0, pressed: false }); } // 4: Registering the equipment model in the Spinal system spinalCore.extend(equipment, Model); module.exports = equipment; // 5: equipmentList model function equipmentList() { equipmentList.super(this); // 6: Array of equipments this.add_attr({ equipments: [] }); } // 4: Registering the equipmentList model in the Spinal system spinalCore.extend(equipmentList, Model); module.exports = equipmentList;
With our new models we will now create a list of 2 equipments. We will create an organ for each equipment. Each one will have an automate which changes its hydrometry and temperature.
Equipment 1
~/button-system$ mkdir equipment1 ~/button-system$ cd equipment1 ~/button-system/equipment1$ touch index.js
equipment1/index.js
// 1: Requirement and connection var spinalCore = require('spinal-core-connectorjs'); require('../spinal-model-button/model.js'); console.log("Configuration Environment not found, using default config"); process.env.SPINALHUB_PORT = 7777; process.env.SPINALHUB_IP = "127.0.0.1"; process.env.SPINAL_USER_ID = 168; process.env.SPINAL_PASSWORD = "JHGgcz45JKilmzknzelf65ddDadggftIO98P"; var conn = spinalCore.connect(`http://${process.env.SPINAL_USER_ID}:${process.env.SPINAL_PASSWORD}@${process.env.SPINALHUB_IP}:${process.env.SPINALHUB_PORT}/`); // 2: Tries to load 'List' spinalCore.load(conn, "List", function (list) { // 3: If the list exists but is empty a first equipment is added if (list.equipments.length < 1) addItem(list); // 4: Else the first equipment is pressed else press(list.equipments[0]); }, function () { // 5: If 'List' doesn't exist an empty list is created and its first equipment is pressed var list = new equipmentList(); spinalCore.store(conn, list, "List", function () { addItem(list); }); }); // 6: Creates a new equipement and adds it to the list function addItem(list) { let item = new equipment(); item.id.set(0); item.name.set("equipment0"); list.equipments.push(item); press(item); } // 7: Gives random values to the hydrometry and temperature of an equipment function press(equipment) { let hydro = Math.floor(Math.random() * 100); let degrees = Math.floor(Math.random() * 30); equipment.hydrometry.set(hydro); equipment.temperature.set(degrees); // 8: Repeats every second setTimeout(function () { console.log("equipment 1: has been pressed"); press(equipment); }, 1000); }
You can launch your new organ with node.
~/button-system/equipment1$ node index.js
Go to the admin UI and put 'List' into the inspector and you should see the hydrometry and temperature of equipment0 change every second.
Equipment2
Equipment2 will be almost identical to equipment1 so I suggest you copy start by copying equipment1.
~/button-system/equipement1$ cd .. ~/button-system$ cp -r equipment1 equipment2 ~/button-system$ cd equipment2
There are very few changes to make to index.js.
equipment2/index.js
var spinalCore = require('spinal-core-connectorjs'); require('../spinal-model-button/model.js'); console.log("Configuration Environment not found, using default config"); process.env.SPINALHUB_PORT = 7777; process.env.SPINALHUB_IP = "127.0.0.1"; process.env.SPINAL_USER_ID = 168; process.env.SPINAL_PASSWORD = "JHGgcz45JKilmzknzelf65ddDadggftIO98P"; var conn = spinalCore.connect(`http://${process.env.SPINAL_USER_ID}:${process.env.SPINAL_PASSWORD}@${process.env.SPINALHUB_IP}:${process.env.SPINALHUB_PORT}/`); var list = new equipmentList(); spinalCore.load(conn, "List", function (list) { // 1: An item is created if there are less than 2 equipments in the list if (list.equipments.length < 2) addItem(list); // 2: The second item is pressed (instead of the first) press(list.equipments[1]); }, function () { spinalCore.store(conn, list, "List", function () { addItem(list); }); }); function addItem(list) { let item = new equipment(); item.id.set(0); // 3: The new item is named equipment1 (instead of equipment0) item.name.set("equipment1"); list.equipments.push(item); press(item); } function press(equipment) { let hydro = Math.floor(Math.random() * 100); let degrees = Math.floor(Math.random() * 30); equipment.hydrometry.set(hydro); equipment.temperature.set(degrees); setTimeout(function () { // 4: This message changes console.log("equipment 2: has been pressed"); press(equipment); }, 1000); }
Now launch equipment2 with node.
~/button-system/equipment2$ node index.js
If you go back to the inspector you will notice that a new equipment has appeared in the List.
After the last part you might have noticed that the way we have been launching our organs isn't very effective, you have to launch and stop organs one by one.
This is because this is not the right way to do it. In this part you will learn how to launch your organs effectively.
To do that we need to look at .apps.json. When you open it for the first time it should look like this:
{ "apps": [ { "name": "spinal-core-hub", "script": "spinalhub.js", "cwd": "./nerve-center/" } ] }