houseplant-hackathon/nodeapp/src/db.js

80 lines
2.6 KiB
JavaScript
Raw Normal View History

2020-04-13 15:49:56 +00:00
const Sequelize = require('sequelize')
const Op = Sequelize.Op
2020-04-25 21:31:49 +00:00
const message = require('./alert')
// Setup database, using credentials set in .env
const sequelize = new Sequelize('database', process.env.DB_USER, process.env.DB_PASS, {
dialect: 'sqlite',
2020-04-11 19:34:59 +00:00
logging: false,
storage: '.data/database.sqlite'
2020-04-13 15:49:56 +00:00
})
// Define 'readings' table structure
const Readings = sequelize.define('readings', {
timestamp: {
type: Sequelize.DATE
},
reading: {
type: Sequelize.INTEGER
}
}, {
hooks: {
afterCreate: (data, opts) => {
// Fetch all settings
Settings.findAll().then((result) => {
2020-04-25 21:09:59 +00:00
const lowtrigger = parseInt(result.find(o => o.dataValues.key === 'low-trigger').dataValues.value)
const hightrigger = parseInt(result.find(o => o.dataValues.key === 'high-trigger').dataValues.value)
2020-04-25 21:31:49 +00:00
const low = result.find(o => o.dataValues.key === 'low').dataValues.value
2020-04-25 21:07:01 +00:00
const alert = result.find(o => o.dataValues.key === 'low-trigger').dataValues.value
2020-04-25 21:07:01 +00:00
// Reset low moisture flag if it's set, and the reading is greater than high-trigger
2020-04-25 21:09:59 +00:00
if (low !== '0' && data.reading >= hightrigger) {
2020-04-25 21:07:01 +00:00
// Send alert that water was received
2020-04-25 21:31:49 +00:00
message('gotwater')
// Update low to false
2020-04-25 21:07:01 +00:00
Settings.update({ value: false }, { where: { key: 'low' } })
// Update alert to false
2020-04-25 21:07:01 +00:00
Settings.update({ value: false }, { where: { key: 'alert' } })
}
// Set the low moisture flag if it's not set, and the value is less than low-trigger
2020-04-25 21:09:59 +00:00
if (low === '0' && data.reading <= lowtrigger) {
// Update low to true
2020-04-25 21:07:01 +00:00
Settings.update({ value: new Date().toISOString() }, { where: { key: 'low' } })
}
// If the low moisture flag is set but an alert has not yet been sent, determine if an alert is necessarry
2020-04-25 21:07:01 +00:00
if (low !== '0' && alert === '0') {
const lowtriggered = new Date().getTime() - new Date(low).getTime()
const fourdays = 4 * 24 * 60 * 60 * 1000
2020-04-25 21:07:01 +00:00
// If the first low reading was more than 4 days ago, send an alert
if (lowtriggered > fourdays) {
2020-04-25 21:07:01 +00:00
// Send alert that water is needed
2020-05-06 02:20:43 +00:00
message('wantwater')
// Flag that an alert has been sent
2020-04-25 21:07:01 +00:00
Settings.update({ value: new Date().toISOString() }, { where: { key: 'alert' } })
2020-04-25 21:31:49 +00:00
}
}
})
}
}
2020-04-13 15:49:56 +00:00
})
2020-04-13 15:49:56 +00:00
// Define 'settings' table structure
const Settings = sequelize.define('settings', {
key: {
type: Sequelize.STRING,
unique: true
},
value: {
type: Sequelize.STRING
}
})
module.exports = {Op, Readings, Settings}