MQTT Visualisierte Steuerung Aktor: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 164: Zeile 164:
  
 
==== Licht im Wohnzimmer ausschalten ====
 
==== Licht im Wohnzimmer ausschalten ====
* mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "off" -u xinux -P geheim
+
* mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "off"  
  
 
==== Haustür öffnen ====
 
==== Haustür öffnen ====
* mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "offen" -u xinux -P geheim
+
* mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "offen"  
  
 
==== 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"
  
 
=== 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 30. Oktober 2024, 09:56 Uhr

Voraussetzungen

Neues Verzeichnis für das Projekt erstellen

  • mkdir /usr/local/control
  • cd /usr/local/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/control mit folgendem Inhalt:

const mqtt = require('mqtt');
const express = require('express');
const path = require('path');
const app = express();
const port = 3000;

let status = {
  livingRoom: 'off',
  bedroom: 'off',
  kitchen: 'off',
  frontDoor: 'closed'
};

// MQTT-Verbindung herstellen
const client = mqtt.connect('mqtt://mqtt.dkbi.int:1883', {
  // username: 'xinux',
  // password: 'secret'
});

client.on('connect', () => {
  console.log('Connected to the broker');
  client.subscribe('home/+/status', (err) => {
    if (!err) {
      console.log('Subscribed to all topics');
    }
  });
});

client.on('message', (topic, message) => {
  const room = topic.split('/')[1];
  status[room] = message.toString();
  console.log(`Status of ${room}: ${status[room]}`);
});

// API route to get the status of the lights and front door
app.get('/status', (req, res) => {
  res.send(status);
});

// Serve static directory for the web interface
app.use(express.static(path.join(__dirname)));

// Start the web server
app.listen(port, () => {
  console.log(`Control Center is running at http://0.0.0.0:${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="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Control Center</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('livingRoom').className = 'device ' + (data.livingRoom === 'on' ? 'on' : 'off');
          document.getElementById('bedroom').className = 'device ' + (data.bedroom === 'on' ? 'on' : 'off');
          document.getElementById('kitchen').className = 'device ' + (data.kitchen === 'on' ? 'on' : 'off');
          document.getElementById('frontDoor').className = 'device ' + (data.frontDoor === 'open' ? 'open' : 'closed');
        });
    }

    setInterval(fetchStatus, 1000); // Fetch status every second
  </script>
</head>
<body>
  <h1>Control Center</h1>
  <div id="livingRoom" class="device off">Living Room Light: Off</div>
  <div id="bedroom" class="device off">Bedroom Light: Off</div>
  <div id="kitchen" class="device off">Kitchen Light: Off</div>
  <div id="frontDoor" class="device closed">Front Door: Closed</div>
</body>
</html>

systemd-Unit erstellen

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

[Unit]
Description=Home Control Center

[Service]
Type=simple
WorkingDirectory=/usr/local/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 control.service

systemd-Service beim Booten starten lassen

  • systemctl enable 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=mqtt.dkbi.int

Licht im Wohnzimmer einschalten

  • mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "on"

Licht im Wohnzimmer ausschalten

  • mosquitto_pub -h $MQTTSERVER -t home/wohnzimmer/status -m "off"

Haustür öffnen

  • mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "offen"

Haustür schließen

  • mosquitto_pub -h $MQTTSERVER -t home/haustuer/status -m "geschlossen"

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.