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