MQTT Visualisierte Steuerung von Lichtern und Haustüröffner: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=== Voraussetzungen ===
+
=== Voraussetzungen ===
 
Es wird davon ausgegangen, dass Node.js, MQTT und die nötigen Pakete bereits installiert sind.
 
Es wird davon ausgegangen, dass Node.js, MQTT und die nötigen Pakete bereits installiert sind.
  
 
==== Neues Verzeichnis für das Projekt erstellen ====
 
==== Neues Verzeichnis für das Projekt erstellen ====
*'''mkdir home-control'''
+
*'''mkdir /usr/local/home-control'''
*'''cd home-control'''
+
*'''cd /usr/local/home-control'''
  
 
==== Initialisiere das Node.js-Projekt ====
 
==== Initialisiere das Node.js-Projekt ====
Zeile 13: Zeile 13:
  
 
==== Konfiguration des Node.js-Servers ====
 
==== Konfiguration des Node.js-Servers ====
Erstelle die Datei '''server.js''' im Verzeichnis '''home-control''' mit folgendem Inhalt:
+
Erstelle die Datei '''server.js''' im Verzeichnis '''/usr/local/home-control''' mit folgendem Inhalt:
  
 
<pre>
 
<pre>
Zeile 123: Zeile 123:
 
</body>
 
</body>
 
</html>
 
</html>
 +
</pre>
 +
 +
==== systemd-Unit erstellen ====
 +
 +
Erstelle eine Datei '''/etc/systemd/system/home-control.service''' mit folgendem Inhalt:
 +
 +
<pre>
 +
[Unit]
 +
Description=Home Control Center
 +
 +
[Service]
 +
Type=simple
 +
WorkingDirectory=/usr/local/home-control
 +
ExecStart=/usr/bin/node server.js
 +
ExecStartPost=/bin/echo "Home Control Center Start"
 +
 +
[Install]
 +
WantedBy=multi-user.target
 
</pre>
 
</pre>
  
 
==== Server starten ====
 
==== Server starten ====
  
==== Starte den Node.js-Server im Projektverzeichnis ====
+
==== systemd-Service starten ====
*'''node server.js'''
+
*'''systemctl start home-control.service'''
 +
 
 +
==== systemd-Service beim Booten starten lassen ====
 +
*'''systemctl enable home-control.service'''
  
 
==== Öffne deinen Browser und gehe zu ====
 
==== Öffne deinen Browser und gehe zu ====
 
*'''http://localhost:3000'''
 
*'''http://localhost:3000'''
 
  
 
==== MQTT-Nachrichten senden ====
 
==== MQTT-Nachrichten senden ====
Zeile 152: Zeile 172:
 
==== Haustür schließen ====
 
==== Haustür schließen ====
 
*'''mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "geschlossen" -u xinux -P geheim'''
 
*'''mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "geschlossen" -u xinux -P geheim'''
 
  
 
=== Zusammenfassung ===
 
=== Zusammenfassung ===
 
Dieses Projekt ermöglicht die Steuerung von Wohnzimmer, Schlafzimmer, Küchen Lichtern und des Haustüröffners, mit einer visuellen Darstellung des Status über eine farbcodierte Webseite. Die MQTT-Nachrichten steuern die Geräte und zeigen deren aktuellen Zustand an.
 
Dieses Projekt ermöglicht die Steuerung von Wohnzimmer, Schlafzimmer, Küchen Lichtern und des Haustüröffners, mit einer visuellen Darstellung des Status über eine farbcodierte Webseite. Die MQTT-Nachrichten steuern die Geräte und zeigen deren aktuellen Zustand an.

Version vom 25. Oktober 2024, 11:05 Uhr

Voraussetzungen

Es wird davon ausgegangen, dass Node.js, MQTT und die nötigen Pakete bereits installiert sind.

Neues Verzeichnis für das Projekt erstellen

  • mkdir /usr/local/home-control
  • cd /usr/local/home-control

Initialisiere das Node.js-Projekt

  • npm init -y

Installiere die benötigten Pakete

  • npm install mqtt express

Konfiguration des Node.js-Servers

Erstelle die Datei server.js im Verzeichnis /usr/local/home-control mit folgendem Inhalt:

const mqtt = require('mqtt');
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
const client = mqtt.connect('mqtt://localhost:1883', {
  username: 'xinux',
  password: 'geheim'
});

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}`);
});

HTML-Datei erstellen

Erstelle eine Datei index.html im selben Verzeichnis, die den Status der Lichter und des Haustüröffners anzeigt und eine visuelle Darstellung mit Farben bietet:

<!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 erstellen

Erstelle eine Datei /etc/systemd/system/home-control.service mit folgendem Inhalt:

[Unit]
Description=Home Control Center

[Service]
Type=simple
WorkingDirectory=/usr/local/home-control
ExecStart=/usr/bin/node server.js
ExecStartPost=/bin/echo "Home Control Center Start"

[Install]
WantedBy=multi-user.target

Server starten

systemd-Service starten

  • systemctl start home-control.service

systemd-Service beim Booten starten lassen

  • systemctl enable home-control.service

Öffne deinen Browser und gehe zu

MQTT-Nachrichten senden

Zuerst definieren wir die Variable für den MQTT-Server:

Definiere die Variable für den MQTT-Server

  • export MQTTSERVER=10.0.10.97

Licht im Wohnzimmer einschalten

  • mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "on" -u xinux -P geheim

Licht im Wohnzimmer ausschalten

  • mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "off" -u xinux -P geheim

Haustür öffnen

  • mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "offen" -u xinux -P geheim

Haustür schließen

  • mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "geschlossen" -u xinux -P geheim

Zusammenfassung

Dieses Projekt ermöglicht die Steuerung von Wohnzimmer, Schlafzimmer, Küchen Lichtern und des Haustüröffners, mit einer visuellen Darstellung des Status über eine farbcodierte Webseite. Die MQTT-Nachrichten steuern die Geräte und zeigen deren aktuellen Zustand an.