Hi,
Ich hatte ein ähnliches Problem. Bei einem Neustart sollte ein Befehl an raspberry gesendet werden. Das PW sollte dabei mitgegeben werden. Mit blockly habe ich es nicht hinbekommen, mit Java gings.
Das Skript macht folgendes. Es überprüft den Datenpunkt mpd info connect auf false. Ist dieser auf false, wird sich auf dem raspberry mit pw eingeloggt jnd der sudo Befehl abgewendet.
Vielleicht hilft dir das Skript weiter. Habe dir noch einige Anmerkungen reingeschri3ben
const { Client } = require('ssh2'); // Importiere die ssh2 Bibliothek
// Konfiguration für den Raspberry Pi MPD (IP, Benutzername und Passwort)
const raspberryMPDConfig = {
host: '192.168.XXX.XX', // IP-Adresse von Raspberry Pi MPD
port: 22,
username: 'pi', // Benutzername auf Raspberry Pi MPD
password: 'XXX' // Passwort für den Benutzer
};
let sshErrorLogged = false; // Flag, um Fehler nur einmal zu protokollieren
// Funktion, die den Befehl an Raspberry Pi MPD sendet
function sendCommandToRaspberryMPD() {
const conn = new Client();
// Verbindung zu Raspberry Pi MPD herstellen
conn.on('ready', () => {
// Den Befehl "sudo service mpd start" ausführen
conn.exec('sudo service mpd start', (err, stream) => {
if (err) {
if (!sshErrorLogged) {
console.error('Fehler beim Ausführen des Befehls:', err); // Fehler nur einmal loggen
sshErrorLogged = true; // Fehler flag setzen
}
conn.end();
return;
}
stream.on('data', () => {
// Keine Ausgabe mehr aufzeichnen
});
stream.on('close', () => {
conn.end(); // Verbindung schließen
});
});
}).on('error', () => {
if (!sshErrorLogged) {
console.error('Fehler bei der SSH-Verbindung.'); // Fehler nur einmal loggen
sshErrorLogged = true; // Fehler flag setzen
}
}).connect(raspberryMPDConfig);
}
// Event-Listener für den Datenpunkt mpd.0.info.connection
on({ id: 'mpd.0.info.connection', val: false }, async (obj) => {
let value = obj.state.val; // Der aktuelle Wert des Datenpunkts
let oldValue = obj.oldState.val; // Der vorherige Wert des Datenpunkts
if (value === false) {
sendCommandToRaspberryMPD();
} else {
sshErrorLogged = false; // Fehlerflag zurücksetzen, wenn der Wert nicht mehr false ist
}
});