System Updates für den Raspberry PI über VIS installieren

Dieser Artikel wurde zuletzt am 02.04.2021 um 15:00 Uhr aktualisiert

Normalerweise nutzt man die VIS Oberfläche um den Status von Geräten oder Aktoren darzustellen oder mit ihnen zu interagieren.
Warum aber sollte man sie nicht auch zur Interaktion von Befehlen nutzen?
Ich stelle Dir hier die Möglichkeit vor, die System Updates, welche für den Raspberry Pi vorliegen, mit einem Klick zu installieren und dies auch in einem Statusfenster zu verfolgen.

Skript

Zuerst erstellst Du ein neues Javascript im Bereich common.
Dieses Skript bitte nicht starten.

/*
 * @copyright 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * @author 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * Dieses Skript dient zur freien Verwendung in ioBroker zur Verbrauchserfassung der Shelly Geräte.
 * Jegliche Verantwortung liegt beim Benutzer. Das Skript wurde unter Berücksichtigung der bestmöglichen Nutzung
 * und Performance entwickelt.
 * Der Entwickler versichert, das keine böswilligen Systemeingriffe im originalen Skript vorhanden sind.
 *
 * Sollte das Skript wider Erwarten nicht korrekt funktionieren, so hast Du jederzeit die Möglichkeit, Dich auf
 * https://www.kreyenborg.koeln
 * für Unterstützung zu melden. Jedes Skript besitzt seine eigene Kommentarseite, auf der,
 * nach zeitlicher Möglichkeit des Autors, Hilfe angeboten wird. Ein Anrecht hierauf besteht nicht!
 * 
 * Ansprüche gegenüber Dritten bestehen nicht. 
 * 
 * Skript Name:		APT Update installieren
 * Skript Version:	1.2
 * Erstell-Datum:	02. April 2021
 * 
 */

// Kommandos
var command_update = "sudo apt update";
var command_anzahl_updates = "apt list --upgradable 2>/dev/null | wc -l | awk '{print $S1-1}'";
var command_upgrade = "sudo apt-get -y upgrade";
var anzahl_updates = 0;

// Datenpunkt anlegen
var DataPoint = 'Systeminfos.ioBroker.raspi_updates_ausgabe';
createState(DataPoint, "", true, {
    name: 'Raspi Updates Ausgabe',
    desc: 'Ausgabe Systemupdates für den Raspi',
    type: 'string',
    unit: '',
    role: 'value'
},
    function () {
        installiere_updates();
    }
);

function installiere_updates() {
    // Paket-Update
    exec(command_update);
    update_datenpunkt("Prüfe auf neue Updates ...");

    // Anzahl neuer Updates
    exec(command_anzahl_updates,
        function (error, stdout, stderr) {
            if (stdout == '0') {
                anzahl_updates = 0;
            } else {
                anzahl_updates = parseInt(stdout);
            }
            if (anzahl_updates > 0) {
                log("Neue Updates: " + anzahl_updates + "<br>Neue Updates werden installiert. Bitte warten ...");
                update_datenpunkt("Neue Updates: " + anzahl_updates + "<br>Neue Updates werden installiert. Bitte warten ...");
                exec(command_upgrade, function (error, stdout, stderr) {
                    if (stdout.includes("autoremove")) {
                        update_datenpunkt("Alle Updates wurden installiert!<br>Es wurden nicht benötigte Pakete gefunden!<br><br>Fenster kann geschlossen werden!");
                    } else {
                        update_datenpunkt("Alle Updates wurden installiert!<br><br>Fenster kann geschlossen werden!");
                    }

                    // Beende Skript
                    setState("javascript.0.Systeminfos.ioBroker.raspi_updates", "0");
                    setState("javascript.0.scriptEnabled.common.APT_Update_installieren", false);
                });
            } else {
                update_datenpunkt("Keine neuen Updates zum Installieren!<br><br>Fenster kann geschlossen werden!");
                // Beende Skript
                setState("javascript.0.Systeminfos.ioBroker.raspi_updates", "0");
                setState("javascript.0.scriptEnabled.common.APT_Update_installieren", false);
            }
        });
}

function update_datenpunkt(text) {
    var tmp_text = getState(DataPoint).val;
    var neuer_text = tmp_text + "<br>" + text;
    setState(DataPoint, neuer_text, true);
}

Nachdem Du das Skript erstellt hast, musst Du die Zeile 68 im Skript auf den Namen anpassen, da dies für die Beendigung notwendig ist. Schaue dazu bitte in den Datenpunkt:

javascript.0.scriptEnabled.common

und kopiere Dir den Namen des Datenpunkt in die Zwischenablage.

Skript Datenpunkt
Skript Datenpunkt

Diesen Datenpunkt fügst Du nun in Zeile 68 ein. Standardmäßig ist dieser auf den Namen de Skripts gesetzt.

setState("javascript.0.scriptEnabled.common.APT_Update_installieren", false);

Dieses Skript dient im weiteren Verlauf zur Darstellung in VIS und beinhaltet das Prüfen auf Updates und das Installieren von Updates.

Integration in VIS

Vorbereitung

Zuerst erstellst Du eine eigene View mit dem Namen “APT_Update”. In diese View ziehst Du ein HTML Widget. Dieses HTML Widget bekommt als Text den Datenpunkt aus Zeile 34. Solltest Du diesen Datenpunkt angepasst haben, so musst Du ihn in VIS auch entsprechend anpassen. Die geschweiften Klammern vorne und hinten müssen zwingend angegeben werden, da sonst nur der Text und nicht der Datenpunkt ausgegeben wird.

{javascript.0.Systeminfos.ioBroker.raspi_updates_ausgabe}
Neue View APT_Update mit HTML Widget
Neue View APT_Update mit HTML Widget

Eigentlicher Aufruf

Damit Du nun diese View aufrufen kannst, benötigst Du in deiner “Haupt”-View ein “jqui – container – Button – view” Widget. Dieses ziehst Du an die Position, von wo aus Du das Update gerne starten wollen würdest.

Folgende Werte habe ich in meinem Widget gesetzt:

Widget Einstellungen

Als Objekt ID gibst Du den Datenpunkt aus Zeile 68 des Skriptes an und als Viewname verwendest Du den Namen der eigentlichen View. In meinem Beispielt ist dies “APT_Update”. Der Knopftext ist frei wählbar und kann heissen, wie Du gerne möchtest 😉

Wenn Du nun deine View aufrufst, kannst mit einem Klick auf den Button den Update Prozess in der VIS Oberfläche auslösen und in der Statusausgabe des Widget verfolgen, was passiert.

APT Update Ausgabe
APT Update Ausgabe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.