anbei möchte ich euch eine kleine Spielerei zur Verfügung stellen in Form eines Skripts, welches überprüft, ob eine installierte Custom-Card von Lovelace noch aktuell ist resp. ein Update zur Verfügung steht.
Es wird auf das Github Repo des DEV zugegriffen und per Request ausgelesen.
Das einzige was manuell eingetragen werden muss ist die Versionsnummer der aktuell installierten Custom-Card.
Für die Testzwecke läuft das Skript NOCH alle 5 Minuten - mehr Sinn macht es einmal am Tag zu prüfen
Dazu einfach den Cron im Skript ändern... (siehe Kommentare).
Prinzipiell lässt sich das auf jede Karte anwenden.
Vielleicht brauch das ja jemand:
// Skript zur Update-Überprüfung der vorhandenen Lovelace-Cards V.0.1
// Lediglich die Versionsnummer der aktuellen Card muss eingegeben werden und nach Update sollte die Version angepasst werden
// Datenpunkte anlegen (einmalig)
createState("0_userdata.0.Lovelace.Cards.ApexCharts.current_version", "", {name: 'ApexCharts - current version', type: 'string'});
createState("0_userdata.0.Lovelace.Cards.ApexCharts.latest_version", "", {name: 'ApexCharts - latest version', type: 'string'});
createState("0_userdata.0.Lovelace.Cards.ApexCharts.url", "", {name: 'ApexCharts - URL', type: 'string'});
createState("0_userdata.0.Lovelace.Cards.ApexCharts.name", "", {name: 'ApexCharts - Name', type: 'string'});
createState("0_userdata.0.Lovelace.Cards.ApexCharts.update", "", {name: 'ApexCharts - Update', type: 'boolean'});
// Zum Testen alle 5 Minuten
schedule("*/5 * * * *", async function () {
var request = require('request');
var options = {url: 'https://api.github.com/repos/RomRider/apexcharts-card/releases/latest', method: 'GET', headers: { 'User-Agent': 'request', 'Accept': 'application/vnd.github.v3+json' }};
request(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
var info = JSON.parse(body); // info ist ein Objekt
var latest = info.name; // eine Eigenschaft des Objektes info
var url = info.html_url;
var assetsFileName = info.assets[0].name;
latest = latest.replace( 'v', '' );
var current = getState("0_userdata.0.Lovelace.Cards.ApexCharts.current_version").val;
var newerVersion = ( isNewerVersion(current, latest) );
setState('0_userdata.0.Lovelace.Cards.ApexCharts.latest_version', (latest));
setState('0_userdata.0.Lovelace.Cards.ApexCharts.url', (url));
setState('0_userdata.0.Lovelace.Cards.ApexCharts.name', (assetsFileName));
setState('0_userdata.0.Lovelace.Cards.ApexCharts.update', (newerVersion));
}
});
// Eine Funktion die Versionsnummern überprüft
function isNewerVersion (oldVer, newVer) {
const oldParts = oldVer.split('.')
const newParts = newVer.split('.')
for (var i = 0; i < newParts.length; i++) {
const a = ~~newParts[i] // parse int
const b = ~~oldParts[i] // parse int
if (a > b) return true
if (a < b) return false
}
return false
}
});
Zum Timer der Bewässerung: Ich lasse den Timer maximal 30 Minuten laufen (noch nie benutzt) eher so 5-15 Minuten... Der Timer zählt dann von 300 Sekunden auf 0 runter.
Bei der Waschmaschine zählt er von 0-x rauf/hoch - dort habe ich zusätzlich ein Skript laufen, was mir die Sekunden in Std und Minuten umschreibt (allerdings wird nur einmal die Minute aktualisiert).
Du brauchst in jedem Fall unter Userdata folgende DP-Struktur:
Die role der DP richtet sich nach der Vorgabe des Devices/Geräte-Adapter.
Und dann brauchst du ein JavaScript, welches dir die Werte auf deine richtigen Lampen (1-x) überträgt:
on({id: '0_userdata.0.Lovelace.Test_-_virtuell.on', val: true}, function (obj) {
//on Datenpunkt aus DeConz
setState('deconz.0.Lights.21.on', true);
setState('deconz.0.Lights.32.on', true);
setState('deconz.0.Lights.35.on', true);
});
on({id: '0_userdata.0.Lovelace.Test_-_virtuell.on', val: false}, function (obj) {
//on Datenpunkt aus DeConz
setState('deconz.0.Lights.21.ct', false);
setState('deconz.0.Lights.32.ct', false);
setState('deconz.0.Lights.35.ct', false);
});
on({id: '0_userdata.0.Lovelace.Test_-_virtuell.level', change: "any"}, function (obj) {
// Wert holen von level
let level = getState('0_userdata.0.Lovelace.Test_-_virtuell.level').val;
//level Datenpunkt aus DeConz
setState('deconz.0.Lights.21.level', (level));
setState('deconz.0.Lights.32.level', (level));
setState('deconz.0.Lights.35.level', (level));
});
// warmweiss/kaltweiss -> Farbtemperatur
on({id: 'alias.0.Licht.Balkon_-_virtuell.ct', change: "any"}, function (obj) {
// Wert holen von ct
let ct = getState('0_userdata.0.Lovelace.Test_-_virtuell.ct').val;
//ct Datenpunkt aus DeConz
setState('deconz.0.Lights.21.ct', (ct));
setState('deconz.0.Lights.32.ct', (ct));
setState('deconz.0.Lights.35.ct', (ct));
});
// RGB -> Farbe
on({id: 'alias.0.Licht.Balkon_-_virtuell.rgb', change: "any"}, function (obj) {
// Wert holen von ct
let rgb = getState('0_userdata.0.Lovelace.Test_-_virtuell.rgb').val;
//ct Datenpunkt aus DeConz
setState('deconz.0.Lights.21.rgb', (rgb));
setState('deconz.0.Lights.32.rgb', (rgb));
setState('deconz.0.Lights.35.rgb', (rgb));
});
Ich habe das eben ohne zu testen nachgebaut - also bitte schreiben, wenn was nicht laufen sollte.
Natürlich muss das virtuelle Gerät aus dem Devices-Adapter in Lovelace eingebunden werden.
Solltest du keine RGB Lampen haben, sondern z.B. Hue, dann ist entsprechend eine Änderung in den Devices nötig.
Hoffe, du kannst damit was anfangen.
Außerdem kannst du bei den "setStates" weniger oder mehr Datenpunkte = Lampen steuern.
Sollte jemand Verbesserungen haben, dann gerne immer her damit (bin halt kein DEV!).
Bei mir wird mdui-state im Frontend nicht angezeigt.
Ich nutze das MDSimple - dort die States mit Vorgabe der Werteliste.
Im VIS-Editor sieht alles super aus - nur halt im VIS-Frontend nicht.
ich habe mein nun doch etwas älteres ioBroker System angefangen auf die aktuellen Adapterversionen zu bringen.
NPM und Node wurden aktualisiert.
Nach Update des Z2M Adapters erhalte ich jedoch folgende Meldungen im LOG: (auth_token aktiviert oder deaktiviert - das macht keinen Unterschied)
Natürlich wurde der auth_token OHNE Sonderzeichen versehen - ungefähr so: ichbindertokenundsehrsicher
Kann jemand helfen?
host.phoscon
2024-04-19 16:17:27.145 info Restart adapter system.adapter.zigbee2mqtt.0 because enabled
host.phoscon
2024-04-19 16:17:27.145 error instance system.adapter.zigbee2mqtt.0 terminated with code 1 (JS_CONTROLLER_STOPPED)
host.phoscon
2024-04-19 16:17:27.145 error Caught by controller[0]: Node.js v18.20.2
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: }
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: code: 'ERR_INVALID_ARG_VALUE'
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at Object.<anonymous> (/opt/iobroker/node_modules/iobroker.zigbee2mqtt/node_modules/@iobroker/adapter-core/build/cjs/controllerTools.js:34:22) {
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at require (node:internal/modules/helpers:177:18)
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at Module.require (node:internal/modules/cjs/loader:1231:19)
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at Module._load (node:internal/modules/cjs/loader:1019:12)
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at Module.load (node:internal/modules/cjs/loader:1203:32)
host.phoscon
2024-04-19 16:17:27.144 error Caught by controller[0]: at Module._extensions..js (node:internal/modules/cjs/loader:1422:10)
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: at Module._compile (node:internal/modules/cjs/loader:1364:14)
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: at Object.<anonymous> (/opt/iobroker/node_modules/iobroker.zigbee2mqtt/node_modules/@iobroker/adapter-core/build/cjs/helpers.js:36:53)
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: at createRequire (node:internal/modules/cjs/loader:1501:13)
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: at new NodeError (node:internal/errors:405:5)
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: TypeError [ERR_INVALID_ARG_VALUE]: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received 'file:// /opt/iobroker/node_modules/iobroker.zigbee2mqtt/node_modules/@iobroker/adapter-core/build/cjs/helpers.js'
host.phoscon
2024-04-19 16:17:27.143 error Caught by controller[0]: ^
host.phoscon
2024-04-19 16:17:27.142 error Caught by controller[0]: throw new ERR_INVALID_ARG_VALUE('filename', filename,
host.phoscon
2024-04-19 16:17:27.142 error Caught by controller[0]: node:internal/modules/cjs/loader:1501
host.phoscon
2024-04-19 16:17:26.566 info instance system.adapter.zigbee2mqtt.0 started with pid 20151
host.phoscon
2024-04-19 16:16:56.342 info Restart adapter system.adapter.zigbee2mqtt.0 because enabled