Seite 1 von 1

Update-Check für openHAB

Verfasst: 16. Feb 2025 16:12
von nw378
kleine Spielerei, ich habe mir ein Update-Check zusammengebastelt.

Hierfür wird mittels openhab-cli die installierte Version ermittelt, und via http-Thing und Javascript die letzte verfügbare Version.
Anschließend gleicht die Rule Stelle für Stelle der Versionen ab.

oh_version.sh

Code: Alles auswählen

#! /bin/bash

  LINE=`openhab-cli info | grep Version`
  VERSION=`echo ${LINE} | cut -d' ' -f2`
  echo ${VERSION}
exec-Thing

Code: Alles auswählen

Thing exec:command:openhab_ver  "openHAB version"       [command="/home/oh_version.sh"] 
http-Thing

Code: Alles auswählen

UID: http:url:OH_Version
label: "openHAB: aktuellste Version verfügbar"
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: https://api.github.com/repos/openhab/openhab-core/tags
  delay: 0
  stateMethod: GET
  refresh: 3600
  commandMethod: GET
  contentType: application/json
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: ohversionjsonrawdata
    channelTypeUID: http:string
    label: OH Version RAW
    configuration:
      mode: READONLY
  - id: ohversionlatest
    channelTypeUID: http:string
    label: OH Version Latest
    configuration:
      mode: READONLY
      stateTransformation:
        - JS:latest.js
lastest.js (im Ordner /transform, Dank an Sepp_Huttegger):

Code: Alles auswählen

(function(input) {
    try {
        // Versuche, den JSON-String in ein JavaScript-Objekt umzuwandeln
        var inputData = JSON.parse(input);

        // Überprüfe, ob inputData ein Array ist
        if (!Array.isArray(inputData)) {
            return "Invalid input: inputData must be an array";
        }

        // Filtere die Objekte mit gültigen Zahlen im "name"-Eigenschaft
        var numbersOnly = inputData
            .filter(function(obj) {
                return typeof obj.name === "string" && !isNaN(parseFloat(obj.name));
            })
            .map(function(obj) {
                return obj.name;
            });

        // Überprüfe, ob numbersOnly leer ist
        if (numbersOnly.length === 0) {
            return "No valid numbers found in the inputData";
        }

        // Sortiere das numbersOnly-Array in absteigender Reihenfolge (höchste Zahl zuerst)
        numbersOnly.sort(function(a, b) {
            return b.localeCompare(a, undefined, { numeric: true, sensitivity: 'base' });
        });

        // Gib die höchste Zahl als Ergebnis zurück
        return numbersOnly[0];
    } catch (error) {
        return "Error parsing input: " + error.message;
    }
})(input);
.items

Code: Alles auswählen

Switch OH_ver_run                               {channel="exec:command:openhab_ver:run", autoupdate="false"}
String  OH_Version        "Version [%s]"    {channel="exec:command:openhab_ver:output"}
String  OH_Version_Latest                     {channel="http:url:OH_Version:ohversionlatest"}
.rules

Code: Alles auswählen

rule "openHAB Update-Check"
when
    Time cron "0 0 19 * * ? *" or
    Item OH_Version_Latest changed or
    System started 
then
    val OH_installed = OH_Version.state.toString.replace(".","#").split("#")
    val OH_latest = OH_Version_Latest.state.toString.replace(".","#").split("#")
    var x = 0
    var y = 0
    var boolean update_available = false
    var i = 0
    while (i < 3) {
      x = Integer::parseInt(OH_installed.get(i)) 
      y = Integer::parseInt(OH_latest.get(i))
      if (y > x)
        update_available = true
      i += 1
    }
    if (update_available)
      sendNotification("me@mail.de", "Update für openHAB verfügbar. Installiert: " + OH_Version.state.toString + ". Verfügbar: " + OH_Version_Latest.state.toString)
end

Re: Update-Check für openHAB

Verfasst: 1. Mär 2025 21:02
von Harka
Moin,
danke, sehr schön.
Ich bin gerade beim Stöbern auf diese Lösung gestoßen -> https://community.openhab.org/t/ideas-a ... 160573/603
Bei beiden werden auch Vorversionen getriggert, welche ich nur ungern nutze. Daher habe ich aus beiden Lösungsansätzen mit Hilfe von Blockly ein eigenes JS-Script gebastelt. Dies kann z.B. wöchentlich nach dem Rechten schauen.

Code: Alles auswählen

var sVersionenNetz, i, TeilAusgabe, Version_i, j, sNeuesteVersion, sVersionSystem;
sVersionSystem = org.openhab.core.OpenHAB.version;
sVersionenNetz = (JSON.parse(actions.HTTP.sendHttpGetRequest('https://api.github.com/repos/openhab/openhab-core/tags', 3000))
);
for (var i_index in sVersionenNetz) {
  i = sVersionenNetz[i_index];
  TeilAusgabe = '';
  Version_i = i['name'];
  // Vorversionen erkennen
  var j_list = Version_i.split('.');
  for (var j_index in j_list) {
    j = j_list[j_index];
    TeilAusgabe += String(parseFloat(j));
  }
  if (Version_i.replaceAll('.','') == TeilAusgabe) {
    sNeuesteVersion = Version_i;
    if (sVersionSystem < sNeuesteVersion) {
      console.info((['Update von OH ',sVersionSystem,' auf OH ',sNeuesteVersion,' steht bereit.'].join('')));
      actions.notificationBuilder((['Update von OH ',sVersionSystem,' auf OH ',sNeuesteVersion,' steht bereit.'].join(''))).send()
    }
    break;
  }
}

Re: Update-Check für openHAB

Verfasst: 2. Mär 2025 09:39
von nw378
Auch moin,

das mit den Vorversionen hat mich auch gestört - weil dadurch ja erstmal die aktuellste Version gesucht werden muss.

In dem Verlauf der OH 5.0 Diskussion gibt es auch noch diesen Ansatz:

Code: Alles auswählen

         // Get the installed version
         var rc = ""
	 rc = sendHttpGetRequest("http://localhost:8080/rest/") 
	 var currVersion = transform("JSONPATH", "runtimeInfo.version", rc)
	
	 // Get the latest version 
	 rc = sendHttpGetRequest("https://api.github.com/repos/openhab/openhab-distro/releases/latest")
	 var latestVersion = transform("JSONPATH", "tag_name", rc)
Das erspart die Skripte, exec- und http-Things in meinem Lösungsansatz.

Dein

Code: Alles auswählen

  if (Version_i.replaceAll('.','') == TeilAusgabe)
ist lean. Hatte ich auch dran gedacht, aber verworfen wegen den Meilenstein-Versionen. Führt 5.0.0.M1 nicht zu einem Fehler, oder wie fängst Du das ab?

Re: Update-Check für openHAB

Verfasst: 2. Mär 2025 11:35
von Harka
nw378 hat geschrieben: 2. Mär 2025 09:39 Führt 5.0.0.M1 nicht zu einem Fehler, oder wie fängst Du das ab?
Durch das vorherige parsen der einzelnen Segmente wird dort "500M1" mit "500NaN" verglichen. Gewinnt sicher kein Schönheitswettbewerb, aber ... :lol:

Re: Update-Check für openHAB

Verfasst: 2. Mär 2025 12:52
von nw378
Manchmal muss es auch ein dreckiger Sieg sein... :lol:

Bei mir würde wohl der innere Monk rebellieren.

Da ich generell keine Meilenstein-Releases für das Produktiv-System verwende, fange ich das am Anfang der Rule so ab:

Code: Alles auswählen

if (latestVersion.contains("M")) return;