NEWS
[Vorlage]offene Updates in einer Multihostumgebung
-
Falls es auch jemand gebrauchen kann.
Das Skript muss jeweils in einer Javascript-Instanz eines Hosts laufen.
// fragt die angebotenen Updates von ioBroker ab // Abfrage dauert etwas (ca. 1 Minute) // // Repository muss in den ioBroker Einstellungen richtig gepflegt sein // Übersicht der ioBroker Consolen-Kommandos: // https://github.com/ioBroker/ioBroker/wiki/Console-commands var master = true; // true: Parse Fehler und Adapter, die nciht in der Repo sind werden mit in der Update-Liste ausgegeben var logOn = true; // Logausgabe im Skript var forecreation = false; // true: Datenpunkte werden überschrieben (ween z.B. Bezeichnungen geändert wurden) var pfad = "Systeminfos.iobroker" + "."; // Pfad in dem die Datenpunkte angelegt werden // #### ab hier kann bei Änderungen der Code in die Slaves kopiert werden #### // Datenpunktnamen: var idListOK = pfad + 'update_liste_verfuegbar'; var idUpdateList = pfad + "update_liste"; var idUpdateCount = pfad + "Adapter_updates"; var idStatusTime = pfad + "status_datum"; var idAvailableCount = pfad + "Adapter_verfuegbar"; var idInstalledCount = pfad + "Adapter_installiert"; var idAktivRepo = pfad + "Repo_aktiv"; var idAktivRepoUrl = pfad + "Repo_url"; var idHostUpdate = pfad + "Host_Update_verfuegbar"; var idBeta = pfad + "Adapter_Anzahl_Betaversionen"; var idparseErr = pfad + "Adapter_Anzahl_Parse_Error"; var idAdapterGesamt = pfad + "Adapter_installiert_gesamt"; var idAdapterGesamtJSON = pfad + "Adapter_installiert_gesamt_json"; var idAdapterErrorJSON = pfad + "Adapter_mit_parse_error_json"; var idAdapterNotInRepoJSON = pfad + "Adapter_nicht_in_Repo_json"; // regelmässige Wiederholungen der Abfrage var cronStr = "57 */2 * * *"; var abfrageUpdates = 'iobroker update'; var abfrageRepo = 'iobroker repo'; var abfrageAdapter = 'iobroker list adapters'; // ----------------------------------------------------------------------------- createState(idListOK, false, forecreation, { name: 'iobroker update Liste konnte gelesen werden', desc: 'iobroker update Liste konnte gelesen werden', type: 'boolean', unit: '', role: 'value' }); createState(idUpdateList, "initalisiert", forecreation, { name: 'Liste der verfügbaren Updates aus Repo', desc: 'Liste der verfügbaren Updates aus Repo', type: 'string', unit: '', role: 'value' }); createState(idUpdateCount, 0, forecreation, { name: 'Anzahl verfügbarer Updates aus Repo', desc: 'Anzahl verfügbarer Updates der installierten Adapter aus Repo', type: 'number', unit: '', role: 'value' }); createState(idAvailableCount, 0, forecreation, { name: 'Anzahl verfügbarer Adapter im Repo', desc: 'Anzahl verfügbarer Adapter im Repo', type: 'number', unit: '', role: 'value' }); createState(idInstalledCount, 0, forecreation, { name: 'Anzahl installierter Adapter aus Repo', desc: 'Anzahl installierter Adapter aus Repo', type: 'number', unit: '', role: 'value' }); createState(idStatusTime, now(), forecreation, { name: 'Zeitpunkt der letzten Statusabfrage', desc: 'Zeitpunkt der letzten Statusabfrage', type: 'string', unit: '', role: 'value' }); createState(idAktivRepo, "initalisiert", forecreation, { name: 'Als aktiv eingestelltes Repo', desc: 'Als aktiv eingestelltes Repo', type: 'string', unit: '', role: 'value' }); createState(idAktivRepoUrl, "initalisiert", forecreation, { name: 'url des aktiven Repo', desc: 'url des aktiven Repo', type: 'string', unit: '', role: 'value' }); createState(idHostUpdate, false, forecreation, { name: 'iobroker Host update verfügbar', desc: 'iobroker Host update verfügbar', type: 'boolean', unit: '', role: 'value' }); createState(idBeta, 0, forecreation, { name: 'Anzahl installierte Betaversionen', desc: 'Anzahl installierte Betaversionen', type: 'number', unit: '', role: 'value' }); createState(idAdapterGesamt, 0, forecreation, { name: 'Anzahl installierter Adapter gesamt (Repo und Sonstige)', desc: 'Anzahl installierter Adapter gesamt (Repo und Sonstige)', type: 'number', unit: '', role: 'value' }); createState(idAdapterGesamtJSON, "initalisiert", forecreation, { name: 'Liste der installierten Adapter gesamt (Repo und Sonstige)', desc: 'Liste der installierten Adapter gesamt (Repo und Sonstige)', type: 'string', unit: '', role: 'value' }); createState(idparseErr, 0, forecreation, { name: 'Anzahl Adapter mit Parse Error', desc: 'Anzahl Adapter mit Parse Error (Cannot read or parse)', type: 'number', unit: '', role: 'value' }); createState(idAdapterErrorJSON, "initalisiert", forecreation, { name: 'Liste der Adapter mit Parse Error', desc: 'Liste der Adapter mit Parse Error (cannot read or parse)', type: 'string', unit: '', role: 'value' }); createState(idAdapterNotInRepoJSON, "initalisiert", forecreation, { name: 'Liste der installierten Adapter, die nicht in der Repo sind', desc: 'Liste der installierten Adapter, die nicht in der Repo sind', type: 'string', unit: '', role: 'value' }); // ----------------------------------------------------------------------------- function now() { return formatDate(new Date(), "hh:mm:ss, YYYY-MM-DD"); } function writeJson(json) { return JSON.stringify(json); // JSON in String umwandeln, damit das JSON in einem Datenpunkt geschrieben werden kann } function readJson(dp) { // lese ein JSON aus einem Datenpunkt var json = getState(dp).val; if (json === "") return []; try { list = JSON.parse(json); } catch (ex) { list = []; } if(!list) list = []; return list; } function checkBeta(installiertStr,updateStr) { var installiertArr = /(\d+).(\d+).(\d+)/g.exec(installiertStr); var updateArr = /(\d+).(\d+).(\d+)/g.exec(updateStr); var i; for ( i=1; i<4; i++ ) { if(parseInt(updateArr[i]) < parseInt(installiertArr[i])) return true; if(parseInt(updateArr[i]) > parseInt(installiertArr[i])) return false; } return false; } function findAdapter(json,name) { for (var i=0; i < json.length; i++) { if (json[i].adapter == name) return true; } return false; } function checkInRepo(repoJson,installJson) { if(installJson === 'undefined' || installJson === null || installJson.length < 1) { log("keine Daten für Adapter in der Installation vorhanden","warn"); return; } if(repoJson === 'undefined' || repoJson === null || repoJson.length < 1) { log("keine Daten für Adapter in der Repo vorhanden","warn"); return; } var adapterNichtInRepoJson = []; for ( i=0; i<installJson.length; i++ ) { if(!findAdapter(repoJson,installJson[i].adapter)) { adapterNichtInRepoJson.push({ adapter: installJson[i].adapter, update: "-", version: installJson[i].version, beta: "nicht in Repo" }); } } return adapterNichtInRepoJson; } // fragt die möglichen Updates ab function abfrageConsoleUpdates() { exec(abfrageUpdates, function(err, stdout, stderr) { if(logOn) log("Abfrage: "+abfrageUpdates); if (err) { log("Fehler ioBroker Statusabfrage: " + err,"error"); return; } var out = stdout.toString(); //log(out); if(out.match("Error: 404: Not Found") || out.match("Cannot download json")) { setState(idUpdateList,"ioBroker Repository nicht gefunden"); log("ioBroker Repository nicht gefunden","warn"); setState(idListOK,false); return; } var arrInstalled = out.match(/.+installed.+\n/g); var arrUpdates = out.match(/Adapter.+Updateable.+\n/g); var arrContrUpdate = out.match(/Controller.+Updateable.+\n/g); var arrAvailable = out.match(/Adapter /g); var arrRepo = out.match(/Adapter.+: \d+\.\d+\.\d+/g); var arrParseErr = out.match(/Cannot read or parse.+\n/g); var updates = 0; var ContrUpdate = 0; var installiert = -1; var verfuegbar = -1; var updateJson = []; var repoJson = []; var parsErrJson = []; var beta = 0; var parseErr = 0; var i; if(typeof arrInstalled !== 'undefined' && arrInstalled !== null && arrInstalled.length > 0) installiert = arrInstalled.length; if(typeof arrUpdates !== 'undefined' && arrUpdates !== null && arrUpdates.length > 0) updates = arrUpdates.length; if(typeof arrContrUpdate !== 'undefined' && arrContrUpdate !== null && arrContrUpdate.length > 0) ContrUpdate = 1; if(typeof arrAvailable !== 'undefined' && arrAvailable !== null && arrAvailable.length > 0) verfuegbar = arrAvailable.length; if(typeof arrParseErr !== 'undefined' && arrParseErr !== null && arrParseErr.length > 0) parseErr = arrParseErr.length; // ermittelt Adapter, die einen Fehler (parse error) erzeugt haben // Beispiel: // Cannot read or parse /opt/iobroker/node_modules/iobroker.js-controller/lib/../node_modules/iobroker.daswetter/io-package.json: SyntaxError: Unexpected token if(parseErr > 0) { for ( i=0; i<parseErr; i++ ) { var arrParseErrLine = /Cannot read or parse.+\/(.+)\/io-.+:.(.+)\n/g.exec(arrParseErr[i]); parsErrJson.push({ adapter: arrParseErrLine[1], update: "-", error: arrParseErrLine[2], beta: "parse error" }); } } if(logOn) log(writeJson(parsErrJson),"warn"); // ermittelt das JSON für die im Repo enthaltenen Adapter for ( i=0; i<arrRepo.length; i++ ) { var arrInRepo = /Adapter.+"(.+)".+(\d+\.\d+\.\d+)/g.exec(arrRepo[i]); repoJson.push({ adapter: arrInRepo[1], version: arrInRepo[2] }); } if(ContrUpdate > 0) { if(logOn) log("** HOST Update verfügbar **"); if(logOn) log("arrContrUpdate: " + arrContrUpdate); var arrController = /.+"(.+)".+(\d+.\d+.\d+).+(\d+.\d+.\d+)/g.exec(arrContrUpdate[0]); if(logOn) log("arrController: " + arrController); if(checkBeta(arrController[3],arrController[2])) beta = beta +1; updateJson.push({ adapter: arrController[1], update: arrController[2], version: arrController[3], beta: (checkBeta(arrController[3],arrController[2]) ? "beta" : "UPDATE") }); } if(updates > 0) { for ( i=0; i<updates; i++ ) { var arrUpdate = /.+"(.+)".+(\d+.\d+.\d+).+(\d+.\d+.\d+)/g.exec(arrUpdates[i]); if(checkBeta(arrUpdate[3],arrUpdate[2])) beta = beta +1; updateJson.push({ adapter: arrUpdate[1], update: arrUpdate[2], version: arrUpdate[3], beta: (checkBeta(arrUpdate[3],arrUpdate[2]) ? "Beta" : "") }); } } updates = updates + ContrUpdate - beta; var notInRepoJson = checkInRepo(repoJson,readJson(idAdapterGesamtJSON)); setState(idUpdateCount ,updates); setState(idAvailableCount ,verfuegbar); setState(idInstalledCount ,installiert); if(updateJson.length === 0) updateJson.push({adapter:"",update:"",version:""}); setState(idUpdateList ,(master ? writeJson(updateJson.concat(parsErrJson,notInRepoJson)) : writeJson(updateJson))); setState(idListOK ,true); setState(idStatusTime ,now()); setState(idHostUpdate, (ContrUpdate > 0 ? true : false)); setState(idBeta, beta); setState(idparseErr, parseErr); setState(idAdapterErrorJSON,writeJson(parsErrJson)); setState(idAdapterNotInRepoJSON,writeJson(notInRepoJson)); log("Anzahl Adapter mit Fehler (Cannot read or parse): " + parseErr,"warn"); if(logOn) log("Anzahl Adapter in Repo verfügbar: " + verfuegbar); if(logOn) log("Anzahl Adapter aus Repo installiert: " + installiert); if(logOn) log("Anzahl Adapter mit Updates: " + updates); if(logOn) log("Anzahl Adapter als Beta installiert: " + beta); }); } // fragt das aktive Repository ab function abfrageConsoleRepo() { exec(abfrageRepo, function(err, stdout, stderr) { if(logOn) log("Abfrage: "+abfrageRepo); if (err) { log("Fehler ioBroker Statusabfrage: " + err,"error"); return; } var out = stdout.toString(); if(logOn) log(stdout); var aktivRepo = stdout.match(/Active repo: (.+)/)[1]; if(logOn) log("Aktive Repo: " + aktivRepo); var regex = new RegExp("^"+aktivRepo+": (.+)", "gm"); var aktivRepoUrl = stdout.match(/^online: (.+)/gm).toString().replace(aktivRepo+": ",""); if(logOn) log("Aktive Repo url: " + aktivRepoUrl); setState(idAktivRepo,aktivRepo); setState(idAktivRepoUrl,aktivRepoUrl); }); } // fragt alle installiertenAdapter ab, auch die, die nicht in der Repo vorhanden sind function abfrageInstallierteAdapter() { exec(abfrageAdapter, function(err, stdout, stderr) { if(logOn) log("Abfrage: "+ abfrageAdapter); if (err) { log("Fehler ioBroker Abfrage installierte Adapter: " + err,"error"); return; } var out = stdout.toString(); //if(logOn) log(stdout); var arrAdapter = out.match(/:.+\n/g); var installJSON = []; var i; for ( i=0; i<arrAdapter.length; i++ ) { var arrInstall = /: (\S+) +- (\d+\.\d+\.\d+)/g.exec(arrAdapter[i]); installJSON.push({ adapter: arrInstall[1], version: arrInstall[2] }); } // if(logOn) log("arrAdapter: " + arrAdapter); if(logOn) log("arrAdapter.length: " + arrAdapter.length); // if(logOn) log("installJSON: " + writeJson(installJSON)); setState(idAdapterGesamt, arrAdapter.length); setState(idAdapterGesamtJSON, writeJson(installJSON)); }); } function abfragen() { abfrageConsoleRepo(); abfrageInstallierteAdapter(); setTimeout(abfrageConsoleUpdates,2000); } // regelmässige Wiederholungen // ----------------------------------------------------------------------------- schedule(cronStr, abfragen); // main // ----------------------------------------------------------------------------- function main() { abfragen(); } // Start Skript: // ----------------------------------------------------------------------------- setTimeout(main, 500);
Visualisiert in einer Multihostumgebung mit einem Master und zwei Satelliten:
Folgende Datenpunkte werden je Host angelegt:
[EDIT 31.03.2017] Skript:
-Fehlerkorrekturen[EDIT 01.04.2017] Skript:
- Höhere Versionen als im Repo werden nicht als Updates gezählt
- JSON um das Attribut Beta erweitert (zur Kennzeichnung höhere Versionen als im Repo)
- Zähler für die Anzahl der installierten "Beta"-Versionen hinzugefügt
[EDIT 02.04.2017] Skript: - Fehlerkorrekturen
- Ausgabe von Adaptern, die nicht in der Repo enthalten sind
- Ausgabe von Adaptern, die einen Pause Error erzeugen
- zusätzliche Datenpunkte
- Screenshot Visualisierung erneuert
- Screenshot Datenpunkte hinzugefügt
-
Ich glaube das geht einfacher …
Unter system.adapter.<aapter>. <instance>die Objektbeschreibung abholen (getObject oder so). Dort gibt es dann "obj.installedVersion" und "obj.common.version" (=verfügbare Version) ...</instance></aapter>
-
Danke Klingt interessant. Ich habe es aber nicht ganz verstanden. Vielleicht kannst Du das noch einmal näher erläutern.
Dann müsste man aber jedes Objekt für jeden Adapter abfragen, den man installiert hat.
Über die Konsole bekommt man auch die Anzahl der im Repo verfügbaren Adapter. Wenn die sich erhöht, gibt es offiziell was Neues.
Dann kann das Skript das Repo öfter abfragen, als es normalerweise der Fall ist.
Wenn ich mir das RAW vom System.adapter.tankerkoenig.0 ansehe, finde ich dort folgenden Inhalt:
! ````
{
"_id": "system.adapter.tankerkoenig.0",
"type": "instance",
"common": {
"name": "tankerkoenig",
"title": "Tankerkönig Spritpreise",
"desc": {
"en": "Tankerkoenig Spritpreise",
"de": "Tankerkönig Spritpreise",
"ru": "Tankerkoenig Spritpreise - translate to russian, please"
},
"version": "1.0.0",
"mode": "schedule",
"schedule": "*/5 * * * *",
"platform": "javascript/Node.js",
"loglevel": "info",
"keywords": [
"fuel",
"gas",
"tankerkoenig",
"Tankerkönig",
"Sprit",
"Spritpreis",
"Tankstelle",
"Diesel",
"Benzin"
],
"main": "main.js",
"authors": [
"Pix"
],
"license": "MIT",
"readme": "https://github.com/Pix---/ioBroker.tankerkoenig/blob/master/README.md",
"icon": "tankerkoenig.png",
"extIcon": "https://raw.githubusercontent.com/Pix---/ioBroker.tankerkoenig/master/admin/tankerkoenig.png",
"allowInit": true,
"type": "common adapters",
"config": {
"width": 850,
"height": 650,
"minWidth": 650,
"minHeight": 400
},
"installedVersion": "1.0.0",
"enabled": false,
"host": "ubuntu1604server"
},
"native": {
"apikey": "xxxxxxx",
"station0": "xxxxxx",
"stationname0": "xxxxxx",
"station1": "xxxxxx",
"stationname1": "xxxxxxxx",
"station2": "",
"stationname2": "",
"station3": "",
"stationname3": "",
"station4": "",
"stationname4": "",
"station5": "",
"stationname5": "",
"station6": "",
"stationname6": "",
"station7": "",
"stationname7": "",
"station8": "",
"stationname8": "",
"station9": "",
"stationname9": "",
"stationsarray": [
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
],
[
"",
""
]
]
},
"acl": {
"object": 1638
}
}Darin finde ich zwar:
"installedVersion": "1.0.0",
Aber nicht die Verfügbare Version. Oder ist das nicht das Objekt, welches ich unter Admin/Objekte mir anzeigen lassen kann? Ich glaube allerdings, dass ich Dich nicht verstanden habe.
-
tankerkoenig ist offiziell noch die 1.0.0 verfügbar … die 1.0.4 gibts erst seit 4h also noch nicht im offiziellen Repo
Es gibt auch noch system.repositories wo auch Daten drin stehen zum Repository drin stehen... aber auch da wird die 1.0.4 erst mit dem nächsten Repo-Update drin ... Das passiert glaube ich einmal am Tag oder so
Ingo F
-
Das passiert glaube ich einmal am Tag oder so `
oder so:http://www.iobroker.net/?page_id=6227&l … positories
Gruß
Rainer
-
man lernt nie aus. Danke für die Infos
-
Moin,
Visualisiert in einer Multihostumgebung mit einem Master und zwei Satelliten `
ich stehe mir gerade selber im Weg …. wie hast Du das mit dem Overlay-Fenster mir der Detail-Darstellung hinbekommen?An der Stelle ist meine Gedächtnispartition irgendwie defekt ...
Danke und Gruß,
Eric
-
Hallo eric,
das sieht nach einem Dialog Fenster aus. HTML Dialog oder ein Dialog mit einer eigenen View.
Gruß
Pix
-
Hi,
@pix:das sieht nach einem Dialog Fenster aus. HTML Dialog oder ein Dialog mit einer eigenen View. `
stimmt - hab's auch gerade gefunden. Habe es als "Dialog mit View" umgesetzt.Danke und Gruß,
Eric
-
Ihr seid ja schnell
Wollte gerade antworten.
Ja, es ist ein Dialog mit View in dem drei Widgets mit den JSON-Listen drin ist.
-
Sowas habe ich gesucht. Kannst du mal bitte ein Widget als Beispiel reinstellen?
-
mache ich, sobald ich zurück bin:-)
Gesendet von iPhone mit Tapatalk
-
Hab das Skript bei mir auch am Laufen.
Das einzige was mich stört ist, dass wenn man eine Version hat, die noch nicht offiziell ist, dass es als updatebar dargestellt wird.
Das ist ja generell so. Vielleicht kann man sowas im Skript abfangen?
Als Beispiel: ich habe vis 0.12.6 installiert, es wird angegeben, dass Update 0.10.15 vorfügbar ist.
-
mache ich, sobald ich zurück bin:-)
Gesendet von iPhone mit Tapatalk `
Kannst du bitte noch das Widget reinstellen?[emoji2] -
mache ich, sobald ich zurück bin:-)
Gesendet von iPhone mit Tapatalk
Kannst du bitte noch das Widget reinstellen?"Das Widget" besteht aus einem View:
{ "settings": { "style": { "background": "transparent", "background_class": "" }, "theme": "redmond", "sizex": "", "sizey": "", "gridSize": "", "snapType": null }, "widgets": { "e00001": { "tpl": "tplTableBody", "data": { "visibility-cond": "==", "visibility-val": 1, "static_value": "[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]", "gestures-offsetX": 0, "gestures-offsetY": 0, "signals-cond-0": "==", "signals-val-0": true, "signals-icon-0": "/vis/signals/lowbattery.png", "signals-icon-size-0": 0, "signals-blink-0": false, "signals-horz-0": 0, "signals-vert-0": 0, "signals-hide-edit-0": false, "signals-cond-1": "==", "signals-val-1": true, "signals-icon-1": "/vis/signals/lowbattery.png", "signals-icon-size-1": 0, "signals-blink-1": false, "signals-horz-1": 0, "signals-vert-1": 0, "signals-hide-edit-1": false, "signals-cond-2": "==", "signals-val-2": true, "signals-icon-2": "/vis/signals/lowbattery.png", "signals-icon-size-2": 0, "signals-blink-2": false, "signals-horz-2": 0, "signals-vert-2": 0, "signals-hide-edit-2": false, "table_oid": "javascript.2.Systeminfos.iobroker.update_liste", "colCount": "3", "colWidth1": "440px", "colWidth2": "80px", "detailed_wid": "", "colWidth3": "80px", "colAttr3": "update", "colWidth4": "100px", "colName5": "", "colWidth5": "100px", "colWidth6": "100px", "colWidth7": "100px", "visibility-groups-action": "hide", "colName1": "Master: Adapter", "colName2": "Version", "colName3": "Update", "colAttr2": "version", "show_scroll": false, "new_on_top": false, "colAttr1": "adapter", "max_rows": "" }, "style": { "left": "0px", "top": "0px", "width": "600px", "height": "240px" }, "widgetSet": "basic" }, "e00002": { "tpl": "tplTableBody", "data": { "visibility-cond": "==", "visibility-val": 1, "static_value": "[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]", "gestures-offsetX": 0, "gestures-offsetY": 0, "signals-cond-0": "==", "signals-val-0": true, "signals-icon-0": "/vis/signals/lowbattery.png", "signals-icon-size-0": 0, "signals-blink-0": false, "signals-horz-0": 0, "signals-vert-0": 0, "signals-hide-edit-0": false, "signals-cond-1": "==", "signals-val-1": true, "signals-icon-1": "/vis/signals/lowbattery.png", "signals-icon-size-1": 0, "signals-blink-1": false, "signals-horz-1": 0, "signals-vert-1": 0, "signals-hide-edit-1": false, "signals-cond-2": "==", "signals-val-2": true, "signals-icon-2": "/vis/signals/lowbattery.png", "signals-icon-size-2": 0, "signals-blink-2": false, "signals-horz-2": 0, "signals-vert-2": 0, "signals-hide-edit-2": false, "table_oid": "javascript.4.Systeminfos.iobroker_rasp31.update_liste", "colCount": "3", "colWidth1": "440px", "colWidth2": "80px", "detailed_wid": "", "colWidth3": "80px", "colAttr3": "update", "colWidth4": "100px", "colName5": "", "colWidth5": "100px", "colWidth6": "100px", "colWidth7": "100px", "visibility-groups-action": "hide", "colName1": "Rasp 31: Adapter", "colName2": "Version", "colName3": "Update", "colAttr2": "version", "show_scroll": false, "colAttr1": "adapter" }, "style": { "left": "0px", "top": "240px", "width": "600px", "height": "180px" }, "widgetSet": "basic" }, "e00003": { "tpl": "tplTableBody", "data": { "visibility-cond": "==", "visibility-val": 1, "static_value": "[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]", "gestures-offsetX": 0, "gestures-offsetY": 0, "signals-cond-0": "==", "signals-val-0": true, "signals-icon-0": "/vis/signals/lowbattery.png", "signals-icon-size-0": 0, "signals-blink-0": false, "signals-horz-0": 0, "signals-vert-0": 0, "signals-hide-edit-0": false, "signals-cond-1": "==", "signals-val-1": true, "signals-icon-1": "/vis/signals/lowbattery.png", "signals-icon-size-1": 0, "signals-blink-1": false, "signals-horz-1": 0, "signals-vert-1": 0, "signals-hide-edit-1": false, "signals-cond-2": "==", "signals-val-2": true, "signals-icon-2": "/vis/signals/lowbattery.png", "signals-icon-size-2": 0, "signals-blink-2": false, "signals-horz-2": 0, "signals-vert-2": 0, "signals-hide-edit-2": false, "table_oid": "javascript.5.Systeminfos.iobroker_rasp33.update_liste", "colCount": "3", "colWidth1": "440px", "colWidth2": "80px", "detailed_wid": "", "colWidth3": "80px", "colAttr3": "update", "colWidth4": "100px", "colName5": "", "colWidth5": "100px", "colWidth6": "100px", "colWidth7": "100px", "visibility-groups-action": "hide", "colName1": "Rasp 33: Adapter", "colName2": "Version", "colName3": "Update", "colAttr2": "version", "colAttr1": "adapter" }, "style": { "left": "0px", "top": "420px", "width": "600px", "height": "180px" }, "widgetSet": "basic" } }, "name": "vUpdates", "rerender": false, "filterList": [] }
Und in meinem Fall drei Widgets in dem View:
[{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"table_oid":"javascript.2.Systeminfos.iobroker.update_liste","colCount":"3","colWidth1":"440px","colWidth2":"80px","detailed_wid":"","colWidth3":"80px","colAttr3":"update","colWidth4":"100px","colName5":"","colWidth5":"100px","colWidth6":"100px","colWidth7":"100px","visibility-groups-action":"hide","colName1":"Master: Adapter","colName2":"Version","colName3":"Update","colAttr2":"version","show_scroll":false,"new_on_top":false,"colAttr1":"adapter","max_rows":""},"style":{"left":"0px","top":"0px","width":"600px","height":"240px"},"widgetSet":"basic"},{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"table_oid":"javascript.4.Systeminfos.iobroker_rasp31.update_liste","colCount":"3","colWidth1":"440px","colWidth2":"80px","detailed_wid":"","colWidth3":"80px","colAttr3":"update","colWidth4":"100px","colName5":"","colWidth5":"100px","colWidth6":"100px","colWidth7":"100px","visibility-groups-action":"hide","colName1":"Rasp 31: Adapter","colName2":"Version","colName3":"Update","colAttr2":"version","show_scroll":false,"colAttr1":"adapter"},"style":{"left":"0px","top":"240px","width":"600px","height":"180px"},"widgetSet":"basic"},{"tpl":"tplTableBody","data":{"visibility-cond":"==","visibility-val":1,"static_value":"[{\"Title\": \"first\", \"Value\": 1, \"_Description\": \"Value1\"}, {\"Title\": \"second\", \"Value\": 2, \"_Description\": \"Value2\"}]","gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"table_oid":"javascript.5.Systeminfos.iobroker_rasp33.update_liste","colCount":"3","colWidth1":"440px","colWidth2":"80px","detailed_wid":"","colWidth3":"80px","colAttr3":"update","colWidth4":"100px","colName5":"","colWidth5":"100px","colWidth6":"100px","colWidth7":"100px","visibility-groups-action":"hide","colName1":"Rasp 33: Adapter","colName2":"Version","colName3":"Update","colAttr2":"version","colAttr1":"adapter"},"style":{"left":"0px","top":"420px","width":"600px","height":"180px"},"widgetSet":"basic"}]
Das Skript im ersten Post hatte leider noch Fehler drin. Das korrigierte Skript ist im ersten Post abgelegt.
-
[EDIT] versehentlich den Post editiert, statt neu gepostet
Das Skript enthielt leider noch ein paar böse Fehler.
Es wurde im ersten Post erneuert und um einige Zusatzinformationen ergänzt.
-
Das Skript enthielt leider noch ein paar böse Fehler.
Es wurde im ersten Post erneuert und um einige Zusatzinformationen ergänzt.
-
Hallo zusammen,
das Script oben funktioniert leider nicht, hat das noch jemand im Einsatz, oder gibt es dafür eine andere Lösung?
-
@Oliver-Böhm
Ist vom umzug des forums ein wenig deformiert worden.Muss repariert werden, kann ich am handy aber nicht
-
vielen Dank für die Antwort