| @ -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, | |||||
| } | |||||
| }) | |||||