@ -0,0 +1,10 @@ | |||||
NAME= | |||||
DEBUG=false | |||||
IP= | |||||
PORT=3000 | |||||
JWT_SECRET= | |||||
USER_TOKEN= | |||||
USER_PASSWORD= |
@ -0,0 +1,3 @@ | |||||
{ | |||||
"/public/index.js": "/public/index.js" | |||||
} |
@ -0,0 +1,48 @@ | |||||
const schemas = require('../schemas/state.js') | |||||
/** | |||||
* | |||||
* | |||||
* @author Björn Hase, Tentakelfabrik | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://github.com/tentakelfabrik/fastify-lowdb-riotjs-lessons-learned | |||||
* | |||||
*/ | |||||
module.exports = async function (fastify, opts) { | |||||
/** | |||||
* getting current status of switch | |||||
* | |||||
* | |||||
* @param {object} request | |||||
* @param {object} reply | |||||
* @return {object} | |||||
*/ | |||||
fastify.post('/login', function(request, reply) { | |||||
reply | |||||
.code(200) | |||||
.header('Content-Type', 'application/json; charset=utf-8') | |||||
.send({ | |||||
'name': process.env.NAME | |||||
'power': power | |||||
}) | |||||
}) | |||||
/** | |||||
* turn on | |||||
* | |||||
* @param {object} request | |||||
* @param {object} reply | |||||
* @return {object} | |||||
*/ | |||||
fastify.post('/logout', schemas.putSchema, function(request, reply) { | |||||
reply | |||||
.code(200) | |||||
.header('Content-Type', 'application/json; charset=utf-8') | |||||
.send({ | |||||
'name': process.env.NAME | |||||
'power': power | |||||
}) | |||||
}) | |||||
} |
@ -0,0 +1,6 @@ | |||||
import * as riot from 'riot' | |||||
import TinkerforgePowerButton from './tinkerforge-power-button.riot' | |||||
// register components | |||||
riot.register('tinkerforge-power-button', TinkerforgePowerButton) | |||||
riot.mount('tinkerforge-power-button') |
@ -0,0 +1,40 @@ | |||||
<tinkerforge-power-button> | |||||
<div class="tinkerforge-power-button"> | |||||
<button type="button" onclick={ handleClick }> | |||||
<span if={ state.power }>On</span> | |||||
<span if={ !state.power }>Off</span> | |||||
</button> | |||||
</div> | |||||
<script> | |||||
import axios from 'axios' | |||||
/** | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* | |||||
*/ | |||||
export default { | |||||
state: { | |||||
power: true | |||||
}, | |||||
handleClick(event) { | |||||
if (this.state.power) { | |||||
this.state.power = false | |||||
} else { | |||||
this.state.power = true | |||||
} | |||||
axios.put('/api/state', { | |||||
'power': this.state.power | |||||
}).then((response) => { | |||||
this.update() | |||||
}) | |||||
} | |||||
} | |||||
</script> | |||||
</tinkerforge-power-button> |
@ -0,0 +1,26 @@ | |||||
/** | |||||
* schemas for state routes | |||||
* | |||||
* @author Björn Hase, Tentakelfabrik | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://github.com/tentakelfabrik/fastify-lowdb-riotjs-lessons-learned | |||||
*/ | |||||
const putSchema = { | |||||
schema: { | |||||
params: { | |||||
type: 'object', | |||||
required: ['user_token', 'user_secret'], | |||||
properties: { | |||||
'user_token': { | |||||
type: 'boolean' | |||||
} | |||||
}, | |||||
additionalProperties: false | |||||
} | |||||
} | |||||
} | |||||
module.exports = { | |||||
putSchema: putSchema | |||||
} |
@ -0,0 +1,40 @@ | |||||
const Tinkerforge = require('tinkerforge') | |||||
/** | |||||
* | |||||
* | |||||
* | |||||
* | |||||
*/ | |||||
class TinkerforgePower { | |||||
constructor(power) { | |||||
this.host = 'localhost' | |||||
this.port = 4223 | |||||
this.UID = 'xxx' | |||||
this.power = power | |||||
this.ipcon = new Tinkerforge.IPConnection() | |||||
this.idr = new Tinkerforge.BrickletIndustrialDualRelay(this.UID, this.ipcon); | |||||
this.ipcon.connect(this.host, this.port, (error) => { | |||||
this._handleError(error) | |||||
}) | |||||
this.ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED, (connectReason) => { | |||||
this._handlePower(this.power) | |||||
}) | |||||
} | |||||
_handleError(error) { | |||||
console.log('Error: ' + error) | |||||
} | |||||
_handlePower(connectReason) { | |||||
this.idr.setValue(this.power, this.power) | |||||
} | |||||
} | |||||
module.exports = TinkerforgePower |
@ -0,0 +1,32 @@ | |||||
const mix = require('laravel-mix') | |||||
/* | |||||
|-------------------------------------------------------------------------- | |||||
| Mix Asset Management | |||||
|-------------------------------------------------------------------------- | |||||
| | |||||
| Mix provides a clean, fluent API for defining some Webpack build steps | |||||
| for your Laravel applications. By default, we are compiling the CSS | |||||
| file for the application as well as bundling up all the JS files. | |||||
| | |||||
*/ | |||||
mix.webpackConfig({ | |||||
module: { | |||||
rules: [{ | |||||
test: /\.riot$/, | |||||
use: [{ | |||||
loader: '@riotjs/webpack-loader' | |||||
}] | |||||
} | |||||
]} | |||||
}) | |||||
mix | |||||
.js('src/client/index.js', 'public') | |||||
.options({ | |||||
terser: { | |||||
extractComments: false, | |||||
} | |||||
}) |