Update-Check für openHAB

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Update-Check für openHAB

Beitrag 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
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Update-Check für openHAB

Beitrag 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;
  }
}

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Update-Check für openHAB

Beitrag 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?
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Update-Check für openHAB

Beitrag 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:

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Update-Check für openHAB

Beitrag 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;
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Antworten