Compare commits

..

2 Commits

Author SHA1 Message Date
9e543989b8 Update config to match frontend 2024-08-21 21:16:48 -04:00
673aa2faf5 Logic and MQTT Basics added not tested 2024-08-21 21:01:55 -04:00
4 changed files with 73 additions and 36 deletions

View File

@ -1,7 +1,8 @@
# In Progress # In Progress
1. ~~Strip to bones~~ 1. ~~Strip to bones~~
2. Better commenting 2. Better commenting
2. Add startup and shutdown logic (start half implemented, not tested) 3. Add startup and shutdown logic (implemented, not tested)
4. Connect to MQTT
# Done # Done
1. GPIO Interface 1. GPIO Interface

View File

@ -1,20 +1,13 @@
{ {
"mqtt": { "mqtt": {
"address": "wd://broker-url:port", "address": "wss://mqtt.3411.one",
"subscriptions": [ "username": "hestia",
{ "password": "hestia",
"name": "igniter", "topics": {
"topic": "hestia/status/igniter" "igniter": "hestia/status/igniter",
}, "exhaust": "hestia/status/exhaust",
{ "auger": "hestia/status/auger"
"name": "exhaust",
"topic": "hestia/status/exhaust"
},
{
"name": "auger",
"topic": "hestia/status/auger"
} }
]
}, },
"pins": [ "pins": [
{ {

View File

@ -1,7 +1,7 @@
const dotenv = require('dotenv').config(); const dotenv = require('dotenv').config();
const debug = process.env.DEBUG === "TRUE"; const debug = process.env.DEBUG === "TRUE";
const config = require('./config.json'); const config = require('./config.json');
const { pins } = require('./config.json'); const { pins } = config;
const gpio = require('./VoidGPIO.js'); const gpio = require('./VoidGPIO.js');
const pinMap = new Map(); const pinMap = new Map();
@ -59,10 +59,9 @@ module.exports = {
}); });
break; break;
case 'IN': case 'IN':
gpio.readPin(pin.board, (err, state) => { gpio.readPin(pin.board).then(state => {
if (err) throw err;
module.exports.log(`${pin.key} state: ${state}`); module.exports.log(`${pin.key} state: ${state}`);
}); }).catch(e => console.error(e));
default: default:
break; break;
} }
@ -75,41 +74,77 @@ module.exports = {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
// TODO: Check pin states? // TODO: Check pin states?
// T_DONE: Set pins to default states // Set pins to default states
module.exports.gpio.setDefaults().then(changes => { module.exports.gpio.setDefaults().then(changes => {
module.exports.log(changes); module.exports.log(changes);
}).catch(e => console.error(e)); }).catch(e => console.error(e));
// T_DONE: Power on igniter // Power on igniter
gpio.setPin(pinMap.igniter.board, 1).then(async () => { gpio.setPin(pinMap.igniter.board, 1).then(async () => {
// T_DONE: Wait for igniter preheat // Wait for igniter preheat
await module.exports.sleep(config.power.start.exhaustDelay); await module.exports.sleep(config.power.start.exhaustDelay);
}).catch(e => console.error(e)); }).catch(e => console.error(e));
// T_DONE: Start exhaust // Start exhaust
gpio.setPin(pinMap.exhaust.board, 1).then(async () => { gpio.setPin(pinMap.exhaust.board, 1).then(async () => {
// T_DONE: Finish igniter preheat // Finish igniter preheat
await module.exports.sleep(config.power.start.augerDelay); await module.exports.sleep(config.power.start.augerDelay);
}).catch(e => console.error(e)); }).catch(e => console.error(e));
// Check for vacuum // Check for vacuum
gpio.readPin(pinMap.vacuum.board).then(state => {
if (state === '0') {
// Power off exhaust
gpio.setPin(pinMap.exhaust.board, 0).then(() => {
// Report vacuum failure
reject(new Error('Vacuum failure.'));
return;
}).catch(e => console.error(e));
} else {
// Start auger // Start auger
gpio.setPin(pinMap.auger.board, 1).then(async () => {
// Wait for fire // Wait for fire
await module.exports.sleep(config.power.start.fireCheckDelay);
// Check for fire
// Power off igniter // Power off igniter
gpio.setPin(pinMap.igniter.board, 0).then(() => {
// Check for fire on pof
gpio.readPin(pinMap.pof.board).then(state => {
if (state === '0') {
// Power off auger
gpio.setPin(pinMap.auger.board, 0).then(() => {
// Report failed ignition
reject(new Error('Failed ignition.'));
}).catch(e => console.error(e));
} else {
// Power off auger
gpio.setPin(pinMap.auger.board, 0).then(() => {
// Report successful ignition // Report successful ignition
resolve('Successful ignition.');
}).catch(e => console.error(e));
}
}).catch(e => console.error(e));
}).catch(e => console.error(e));
}).catch(e => console.error(e));
}
}).catch(e => console.error(e));
}); });
} }
}, },
stop: { stop: {
init() { init() {
return new Promise(async (resolve, reject) => {
// Power off auger
gpio.setPin(pinMap.auger.board, 0).then(async () => {
// Wait for exhaust shutdown delay
await module.exports.sleep(config.power.stop.exhaustDelay);
// Power off exhaust
gpio.setPin(pinMap.exhaust.board, 0).then(() => {
// Report successful shutdown
resolve('Successful shutdown.');
}).catch(e => console.error(e));
}).catch(e => console.error(e));
});
} }
} }
} }

View File

@ -2,8 +2,16 @@
const gpio = require('./custom_modules/VoidGPIO.js'); const gpio = require('./custom_modules/VoidGPIO.js');
const { pins } = require('./custom_modules/config.json'); const { pins } = require('./custom_modules/config.json');
const fn = require('./custom_modules/functions.js'); const fn = require('./custom_modules/functions.js');
const { State, Communicator } = require('./custom_modules/HestiaClasses.js');
const psState = new State(config);
const comms = new Communicator(psState);
comms.init(psState, config);
fn.gpio.debugInit(); fn.gpio.debugInit();
// Sensor detection loop
setInterval(() => { setInterval(() => {
for (const pin of pins) { for (const pin of pins) {
if (pin.mode === 'IN') { if (pin.mode === 'IN') {