working bits

This commit is contained in:
Karl Hudgell 2020-09-28 10:50:23 +01:00
parent eda16c123b
commit a262fef79c
9 changed files with 192 additions and 74 deletions

59
app.js
View File

@ -11,28 +11,44 @@ async function main() {
await lcd.intro()
menu.home()
const heatingSwitch = new Gpio('17', 'in', 'both');
const functionSwitch = new Gpio('17', 'in', 'both');
const appSwitch = new Gpio('23', 'in', 'both');
heatingSwitch.watch(async (err, value) => {
functionSwitch.watch(async (err, value) => {
if (err) {
console.log('Error', err);
}
if (value === 1) {
console.log('Water Switch')
if (globalVars.waterOn === 'true') {
await common.request(0)
await common.pause(2000)
menu.water()
} else {
await common.request(1)
await common.pause(2000)
menu.water()
switch (globalVars.currentPage) {
case 'water':
console.log('Water Switch')
if (globalVars.waterOn === 'true') {
await common.request(0)
await common.pause(2000)
await menu.water()
} else {
await common.request(1)
await common.pause(2000)
await menu.water()
}
break;
case 'heating':
if (globalVars.heatingPageS === 1) {
clearInterval(globalVars.heatingPolling)
globalVars.heatingPageS = 2
} else {
clearInterval(globalVars.heatingPolling)
globalVars.heatingPageS = 1
}
await menu.heating(globalVars.heatingPageS)
break;
default:
break;
}
}
})
const arr = ['water', 'heating', 'mainMenu']
const arr = ['water', 'heating', 'pihole', 'mainMenu']
arrLength = arr.length
let i = 0
appSwitch.watch(async (err, value) => {
@ -42,18 +58,36 @@ async function main() {
if (value === 1) {
switch (arr[i]) {
case 'water':
globalVars.currentPage = arr[i]
clearInterval(globalVars.waterPolling)
clearInterval(globalVars.heatingPageSwitch)
clearInterval(globalVars.heatingPolling)
await menu.water()
break;
case 'mainMenu':
globalVars.currentPage = arr[i]
clearInterval(globalVars.waterPolling)
clearInterval(globalVars.heatingPageSwitch)
clearInterval(globalVars.heatingPolling)
led.set('off')
await menu.home()
break;
case 'heating':
globalVars.currentPage = arr[i]
clearInterval(globalVars.waterPolling)
clearInterval(globalVars.heatingPageSwitch)
clearInterval(globalVars.heatingPolling)
led.set('off')
await menu.heating()
break;
case 'pihole':
globalVars.currentPage = arr[i]
clearInterval(globalVars.waterPolling)
clearInterval(globalVars.heatingPageSwitch)
clearInterval(globalVars.heatingPolling)
led.set('off')
await menu.piHole()
break;
default:
break;
}
@ -74,4 +108,5 @@ process.on('SIGINT', function () {
process.exit(1)
});
setInterval(lcd.time, 55000)
main()

View File

@ -4,6 +4,11 @@ class globalVariables {
waterPolling = "";
heatingNextEvent = "";
heatingPolling = "";
currentPage = "";
heatingPageSwitch = "";
heatingPageSwitchActive = "";
heatingPageS = 1;
piHolePolling = "";
}
module.exports = new globalVariables();

View File

@ -2,6 +2,7 @@ const LCD = require('raspberrypi-liquid-crystal');
const common = require('./common')
const globalVars = require('./globalVars')
const clock = require('./clock');
var commaNumber = require('comma-number')
const lcd = new LCD(1, 0x27, 20, 4);
@ -18,7 +19,7 @@ module.exports = {
},
intro: async () => {
lcd.clearSync();
lcd.printLineSync(1, 'MiGenie Status')
lcd.printLineSync(1, 'House Status')
lcd.setCursorSync(13, 2);
lcd.printSync('By Karl')
await common.pause(3000)
@ -29,7 +30,8 @@ module.exports = {
lcd.printSync(title)
},
time: async () => {
console.log('get time')
let t = new Date().toUTCString()
console.log(t + ' get time')
lcd.setCursorSync(15, 0);
lcd.printSync(await clock.time())
},
@ -48,46 +50,47 @@ module.exports = {
lcd.printSync(input)
},
NextEvent: async (input) => {
if (globalVars.waterOn === "true") {
if (input === 'Not Set') {
lcd.setCursorSync(0, 3)
lcd.printSync("Switch Off=")
lcd.setCursorSync(11, 3);
lcd.printSync(' ')
lcd.setCursorSync(11, 3);
lcd.printSync(input)
lcd.printSync("Always Off")
} else {
lcd.setCursorSync(0, 3)
lcd.printSync("Switch On=")
lcd.setCursorSync(10, 3);
lcd.printSync(' ')
lcd.setCursorSync(10, 3);
lcd.printSync(input)
if (globalVars.waterOn === "true") {
lcd.setCursorSync(0, 3)
lcd.printSync("Switch Off=")
lcd.setCursorSync(11, 3);
lcd.printSync(' ')
lcd.setCursorSync(11, 3);
lcd.printSync(input)
} else {
lcd.setCursorSync(0, 3)
lcd.printSync("Switch On=")
lcd.setCursorSync(10, 3);
lcd.printSync(' ')
lcd.setCursorSync(10, 3);
lcd.printSync(input)
}
}
},
currentRoomTemp: async (temp) => {
lcd.setCursorSync(0, 1);
let icon = '\xDF'
temp = temp + icon
lcd.printSync('CT:' + temp);
lcd.printLineSync(2, 'Current Temp:' + temp + '\xDF')
},
lastSetTemp: async (temp) => {
lcd.setCursorSync(14, 1);
let icon = '\xDF'
temp = temp + icon
lcd.printSync('LT:' + temp);
lcd.printLineSync(3, 'Last Set Temp:' + temp + '\xDF')
},
heatingPageOne: async (heatingStatus, measuredRoomTemp, lastTimerSetPoint, heatingNextEvent) => {
module.exports.currentRoomTemp(measuredRoomTemp)
module.exports.lastSetTemp(lastTimerSetPoint)
module.exports.NextEvent(heatingNextEvent)
module.exports.heatingStatus(heatingStatus)
heatingPageOne: async (heatingStatus, heatingNextEvent) => {
await module.exports.NextEvent(heatingNextEvent)
await module.exports.heatingStatus(heatingStatus)
},
heatingPageTwo: async (measuredRoomTemp, lastTimerSetPoint) => {
module.exports.currentRoomTemp(measuredRoomTemp)
module.exports.lastSetTemp(lastTimerSetPoint)
await module.exports.currentRoomTemp(measuredRoomTemp)
await module.exports.lastSetTemp(lastTimerSetPoint)
},
waterPageOne: async (waterStatus, waterNextEvent) => {
module.exports.NextEvent(waterNextEvent)
module.exports.waterStatus(waterStatus)
await module.exports.NextEvent(waterNextEvent)
await module.exports.waterStatus(waterStatus)
},
piHolePage: async (domainsBeingBlocked, queriesToday, queriesBlockedToday, percentageBlocked) => {
lcd.printLineSync(2, 'Queries=' + commaNumber(queriesToday))
lcd.printLineSync(3, 'Blocked=' + commaNumber(queriesBlockedToday) + ' (' + percentageBlocked.toFixed() + '%)')
}
}

View File

@ -6,15 +6,16 @@ const lcd = require('../libs/lcd')
module.exports = {
getStatus: () => {
getStatus: (page) => {
var rest_options = {
host: '192.168.4.5',
port: 2020,
path: '/heating/status',
method: 'GET'
};
console.log('heating request')
var request = http.request(rest_options, function (response) {
let t = new Date().toUTCString()
console.log(t + ' heating request')
request = http.request(rest_options, function (response) {
var content = "";
// Handle data chunks
@ -29,33 +30,34 @@ module.exports = {
var time = await common.nextEvent(data.nextScheduleEventUtcTime)
globalVars.waterNextEvent = time
globalVars.heatingNextEvent = time
let m = await common.time(data.nextScheduleEventUtcTime)
if (globalVars.heatingOn === "" || globalVars.heatingOn === "error") {
if (heatingOn === 'true') {
globalVars.heatingOn = heatingOn
lcd.heatingPageOne('On', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.waterNextEvent)
lcd.heatingPageOne('On', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.heatingNextEvent)
led.set('red')
} else {
globalVars.heatingOn = heatingOn
lcd.heatingPageOne('Off', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.waterNextEvent)
lcd.heatingPageOne('Off', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.heatingNextEvent)
led.set('blue')
}
} else {
// if (waterOn != globalVars.waterOn) {
if (heatingOn === 'true') {
globalVars.heatingOn = heatingOn
lcd.heatingPageOne('On', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.waterNextEvent)
lcd.heatingPageOne('On', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.heatingNextEvent)
led.set('red')
} else {
if (page === 1) {
await lcd.heatingPageOne('Off', globalVars.heatingNextEvent)
} else {
await lcd.heatingPageTwo(data.measuredRoomTemp, data.lastTimerSetPoint)
}
globalVars.heatingOn = heatingOn
// lcd.heatingPageOne('Off', data.measuredRoomTemp, data.lastTimerSetPoint, globalVars.waterNextEvent)
lcd.heatingPageTwo(data.measuredRoomTemp, data.lastTimerSetPoint)
led.set('blue')
}
// }
}
});
});

View File

@ -8,31 +8,51 @@ var requireDir = require('require-dir');
var modules = requireDir('../modules');
module.exports = {
home: () => {
home: async () => {
clearInterval(globalVars.waterPolling);
screen.clearScreen()
screen.heading('Main Menu')
screen.time()
setInterval(screen.time, 55000)
clearInterval(globalVars.heatingPolling)
clearInterval(globalVars.piHolePolling)
await screen.clearScreen()
await screen.heading('Main Menu')
await screen.clearLine(2)
await screen.clearLine(3)
await screen.clearLine(4)
await screen.time()
},
water: () => {
screen.clearScreen()
screen.heading('Hot Water')
screen.time()
setInterval(screen.time, 55000)
modules.water.getStatus()
water: async () => {
clearInterval(globalVars.waterPolling);
clearInterval(globalVars.heatingPolling)
clearInterval(globalVars.piHolePolling)
await screen.clearScreen()
await screen.heading('Hot Water')
await screen.time()
await modules.water.getStatus()
globalVars.waterPolling = setInterval(() => {
modules.water.getStatus()
}, 60000);
},
heating: () => {
screen.clearScreen()
screen.heading('Heating')
screen.time()
setInterval(screen.time, 55000)
modules.heating.getStatus()
globalVars.heatingPolling = setInterval(() => {
modules.heating.getStatus()
heating: async () => {
clearInterval(globalVars.waterPolling);
clearInterval(globalVars.heatingPolling)
clearInterval(globalVars.piHolePolling)
await screen.clearScreen()
await screen.heading('Heating')
await screen.time()
await modules.heating.getStatus(globalVars.heatingPageS)
globalVars.heatingPolling = setInterval(async () => {
await modules.heating.getStatus(globalVars.heatingPageS)
}, 60000);
},
piHole: async () => {
clearInterval(globalVars.waterPolling);
clearInterval(globalVars.heatingPolling)
clearInterval(globalVars.piHolePolling)
await screen.clearScreen()
await screen.heading('PiHole')
await screen.time()
await modules.pihole.getStatus()
globalVars.piHolePolling = setInterval(() => {
modules.pihole.getStatus()
}, 30000);
}
}

46
modules/pihole.js Normal file
View File

@ -0,0 +1,46 @@
const http = require('http')
const globalVars = require('../libs/globalVars')
const led = require('../libs/led')
const common = require('../libs/common')
const lcd = require('../libs/lcd')
module.exports = {
getStatus: () => {
var rest_options = {
host: '192.168.4.5',
port: 80,
path: '/admin/api.php',
method: 'GET'
};
let t = new Date().toUTCString()
console.log(t + ' piHole request')
var request = http.request(rest_options, function (response) {
var content = "";
// Handle data chunks
response.on('data', function (chunk) {
content += chunk;
});
// Once we're done streaming the response, parse it as json.
response.on('end', async function () {
var data = JSON.parse(content);
let domainsBeingBlocked = data.domains_being_blocked
let queriesToday = data.dns_queries_today
let queriesBlockedToday = data.ads_blocked_today
let percentageBlocked = data.ads_percentage_today
lcd.piHolePage(domainsBeingBlocked, queriesToday, queriesBlockedToday, percentageBlocked)
});
})
// Report errors
request.on('error', function (error) {
led.set('green')
lcd.heatingStatus('Error No Data')
globalVars.heatingOn = 'error'
});
request.end();
}
}

View File

@ -13,7 +13,8 @@ module.exports = {
path: '/water/status',
method: 'GET'
};
console.log('water request')
let t = new Date().toUTCString()
console.log(t + ' water request')
var request = http.request(rest_options, function (response) {
var content = "";

5
package-lock.json generated
View File

@ -206,6 +206,11 @@
"delayed-stream": "~1.0.0"
}
},
"comma-number": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/comma-number/-/comma-number-2.0.1.tgz",
"integrity": "sha512-hrxY6UjA+tSUV5uZS2iOF8+/q7AACiq/zc9R6SO61MmOhrzNC0qXXh7g/jNYTm09fp6T40vQg15zkCmTJVA8Ww=="
},
"component-bind": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",

View File

@ -9,6 +9,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"comma-number": "^2.0.1",
"fs": "0.0.1-security",
"got": "^11.6.2",
"homeassistant": "^0.2.0",