MQTT Visualisierte Steuerung Sensor: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „=== Voraussetzungen === *Voraussetzungen für Node.js-Projekt ==== Neues Verzeichnis für den Steuerungsserver erstellen ==== *'''mkdir /usr/local/contr…“) |
(kein Unterschied)
|
Version vom 30. Oktober 2024, 09:46 Uhr
Voraussetzungen
Neues Verzeichnis für den Steuerungsserver erstellen
- mkdir /usr/local/control-switch
- cd /usr/local/control-switch
Initialisiere das Node.js-Projekt
- npm init -y
Installiere die benötigten Pakete
- npm install mqtt express
Konfiguration des Steuerungsservers
Erstelle die Datei switch-server.js im Verzeichnis /usr/local/control-switch mit folgendem Inhalt:
const mqtt = require('mqtt');
const fs = require('fs');
const express = require('express');
const path = require('path');
const app = express();
const port = 3000;
let status = {
wohnzimmer: 'off',
schlafzimmer: 'off',
kueche: 'off',
haustuer: 'geschlossen'
};
// MQTT-Verbindung herstellen über TLS
const options = {
port: 1883,
host: 'mqtt.dkbi.int',
//protocol: 'mqtts',
//username: 'xinux',
//password: 'geheim',
//ca: fs.readFileSync('./ca.crt') // Pfad zur ca.crt
};
const client = mqtt.connect(options);
client.on('connect', () => {
console.log('Verbunden mit dem Broker');
client.subscribe('home/+/status', (err) => {
if (!err) {
console.log('Alle Topics abonniert');
}
});
});
client.on('message', (topic, message) => {
const room = topic.split('/')[1];
status[room] = message.toString();
console.log(`Status von ${room}: ${status[room]}`);
});
// API-Route für den Status der Lichter und Haustür
app.get('/status', (req, res) => {
res.send(status);
});
// Statisches Verzeichnis für die Webseite
app.use(express.static(path.join(__dirname)));
// Starte den Webserver
app.listen(port, () => {
console.log(`Webserver läuft auf http://localhost:${port}`);
});
Die HTML Datei index.html
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Haussteuerung</title>
<style>
.device {
margin: 20px;
padding: 10px;
border-radius: 10px;
text-align: center;
font-size: 1.5em;
}
.on {
background-color: green;
color: white;
}
.off {
background-color: red;
color: white;
}
.open {
background-color: blue;
color: white;
}
.closed {
background-color: gray;
color: white;
}
</style>
<script>
function fetchStatus() {
fetch('/status')
.then(response => response.json())
.then(data => {
document.getElementById('wohnzimmer').className = 'device ' + (data.wohnzimmer === 'on' ? 'on' : 'off');
document.getElementById('schlafzimmer').className = 'device ' + (data.schlafzimmer === 'on' ? 'on' : 'off');
document.getElementById('kueche').className = 'device ' + (data.kueche === 'on' ? 'on' : 'off');
document.getElementById('haustuer').className = 'device ' + (data.haustuer === 'offen' ? 'open' : 'closed');
});
}
setInterval(fetchStatus, 1000); // Alle 1 Sekunde den Status abrufen
</script>
</head>
<body>
<h1>Haussteuerung</h1>
<div id="wohnzimmer" class="device off">Wohnzimmer Licht: Aus</div>
<div id="schlafzimmer" class="device off">Schlafzimmer Licht: Aus</div>
<div id="kueche" class="device off">Küchen Licht: Aus</div>
<div id="haustuer" class="device closed">Haustür: Geschlossen</div>
</body>
</html>
systemd-Unit für den Steuerungsserver erstellen
Erstelle die Datei /etc/systemd/system/control-switch.service mit folgendem Inhalt:
[Unit] Description=Home Control Switch Server [Service] Type=simple WorkingDirectory=/usr/local/control-switch ExecStart=/usr/bin/node server.js ExecStartPost=/bin/echo "Schalt-Server gestartet" [Install] WantedBy=multi-user.target
Steuerungsserver starten und beim Booten aktivieren
- systemctl start control-switch.service
- systemctl enable control-switch.service
Steuerung der Geräte über HTTP
Nun können die Geräte über den separaten Server gesteuert werden:
- Wohnzimmerlicht einschalten: `http://localhost:3001/toggle/wohnzimmer` - Schlafzimmerlicht einschalten: `http://localhost:3001/toggle/schlafzimmer` - Küchenlicht einschalten: `http://localhost:3001/toggle/kueche` - Haustür öffnen: `http://localhost:3001/toggle/haustuer`
Der Server ist für die Steuerung der Geräte per HTTP zuständig und sendet die entsprechenden MQTT-Nachrichten.