Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. fastfoot

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    F
    • Profile
    • Following 0
    • Followers 4
    • Topics 15
    • Posts 2024
    • Best 344
    • Groups 4

    fastfoot

    @fastfoot

    433
    Reputation
    223
    Profile views
    2024
    Posts
    4
    Followers
    0
    Following
    Joined Last Online

    fastfoot Follow
    Developer Pro Starter Most Active

    Best posts made by fastfoot

    • RE: Wie schön war alles früher

      @mickym nun ja, die aktuelle ioBroker version als Beta wenn nicht Alpha zu bezeichnen ist ein Schlag ins Gesicht derjenigen die sich in der Vergangenheit(und immer noch!) den Allerwertesten aufgerissen haben um ioBroker zu dem zu machen was er jetzt ist. Und Gleiches gilt für die Aussage über die Community die so aktiv ist wie nie. Es ist schlicht eine Frechheit ein paar Pauschalaussagen zu posten und dann Verständnis zu erwarten. Wie Du da Sympathien entwickeln kannst wird eins meiner ungelösten Rätsel bleiben. Gerade Du, welcher sich in endlosen Threads die Finger wund geschrieben hat um seinen sehr guten und manchmal auch weniger guten Argumenten Gehör zu verschaffen. Deinen Frust kann ich teils nachvollziehen und verstehe auch nicht ganz warum man auf die Andorderungen des MQTT Protokolls nicht näher eingehen will oder kann. Deine Aversion gegen Admin 5 werde ich auch nicht mehr verstehen aber wenigstens nutzt du Argumente und keine pauschalen Diffamierungen.

      Sollte man jetzt deinen Beitrag negativ bewerten? Ich finde nein, aber mit der positiv-Bewertung für den TE drückst du doch nur deinen Frust aus und nicht deine Bewertung für den Post als solches, denn der ist unterirdisch.

      posted in ioBroker Allgemein
      F
      fastfoot
    • RE: VIS -> keine gültige Lizenz gefunden

      @haselchen sagte in VIS -> keine gültige Lizenz gefunden:

      @chaot

      Bin ich total bei Dir.
      Hat was von In App Käufe.
      Die Community "beschwert" sich über den Ausfall bei Internetverlust und schon wird ne kostenlose VIS quasi kostenpflichtig.
      Vielleicht kann @Bluefox mal auflisten, wie er auf den Betrag kommt bzw. wie er sich zusammensetzt.
      Fast jeder einzelne Entwickler wird schon von der Community mit Spenden unterstützt.
      Ich denken, dass sollte auch so bleiben und jeder für sich entscheiden.

      Also dem muss ich jetzt mal widersprechen! Bluefox hat seine Beweggründe für sein Modell ganz klar geschildert, für mich klingt das sehr glaubhaft. Auch hat er gezeigt, wie er diese Gelder verwendet. Nein, er fährt nicht in Urlaub davon, sondern steckt es in die Entwicklung von... ja, genau, iobroker! Von ganz vielen der core-Entwickler hier habe ich das Gefühl, dass sie ihre gesamte Freizeit für das iobroker aufbringen, völlig unentgeltlich! Als Dank kommt nur Gemaule...

      die vis Lizenz wird auch nicht quasi kostenpflichtig, sondern besteht unverändert so weiter wie bisher. Auf Wunsch Einiger wurde schnellste Abhilfe geschaffen was die Prüfung dieser Lizenz betrifft, zu einem sehr moderaten Preis. Hier wird nicht nur eine Lösung verlangt, sondern auch gleich ein voll durchdachtes Regelwerk dazu. Das halte ich persönlich für ... nun ja... unverschämt

      Warum sollte Bluefox offenlegen wie er auf den Preis kommt? Dazu ist er nicht verpflichtet, auch nicht 'moralisch'. Verlangst du das auch bei anderen Anbietern?

      Als ich zu Beginn meiner iobroker Nutzung von der Lizenz gelesen hatte kam mir das zunächst etwas suspekt vor. Mittlerweile denke ich da komplett anders, da ich mitbekomme welche immense Arbeit und KnowHow dahintersteckt und das wissen doch die Meisten hier ebenso

      Letztlich, ich werde mir wohl auch diese neue Lizenz besorgen, nicht weil ich sie für mich als notwendig erachte, sondern um das Projekt etwas zu unterstützen

      posted in Error/Bug
      F
      fastfoot
    • RE: Admin5: Ich kann keine Objekte mehr manuell anlegen

      @mickym sagte in Admin5: Ich kann keine Objekte mehr manuell anlegen:

      Und ja wenn so ein Script von @Dutchman "Nicht existierenden Objekten" den Typ "folder" spendiert ist es ja gut.

      @Dutchman kann das sicher besser, aber das hier funktioniert auch. Dennoch, beim Rumfummeln am System empfiehlt sich immer ein Backup

      Vorraussetzung: In den Settings der Javascript-Instanz muss setObject erlaubt sein

      • Das Setzen des Stammordners erfolgt in Zeile 12
      • Als Stammordner werden javascript.x und 0_userdata.0 unterstützt, man könnte oder sollte es evtl. noch auf alias.0 erweitern(Zeile 17)

      /**
      * Zweck:       Korrigiert übergeordnete Ordnerstrukturen eines Datenpunkts
      * Datum:      07.08.2021
      * Autor:       @fastfoot
      */
      
      //              In den Settings der Javascript-Instanz muss setObject erlaubt sein!!!
      
      let arr = [],
         id = '';
      
      const ids = $('0_userdata.0.*');
      ids.each(idTmp => {
         arr=idTmp.split('.');
         arr.splice(arr.length-1);
         id=arr.join('.');
         if(arr[0] === '0_userdata' || arr[0] === 'javascript'){
             correctObject(id, arr);
         }
      })
      
      function correctObject(id,arr){
         if(arr.length === 2) return;
         if(!existsObject(id)){
             let obj = {};
             obj = {
                 type: 'folder',
                 common:{
                     name: arr[arr.length - 1]
                 }
             }
             extendObject(id, obj, e => {
                 if (e) log('Fehler beim Schreiben des Objektes: '+ id + ' ' + e);
             })
         }
         arr.splice(arr.length - 1);
         id = arr.join('.');
         correctObject(id, arr);
      }
      

      posted in ioBroker Allgemein
      F
      fastfoot
    • RE: iobroker Probleme beim stoppen etc.

      @Solear sagte in iobroker Probleme beim stoppen etc.:

      Ich möchte iobroker (das Dockerimage von buanet) auf meinem unraid server laufen lassen.
      Stoppe ich dort jedoch iobroker mit "pkill io", stoppt der unraid vnc /das terminal) ebenfalls und ich kann kein restore durchführen.

      Was nun? Wie komme ich da ran? Mit Putty komme ich ja auch nicht rein mangels Logindaten.

      Ist Buanet übrehaupt noch aktuell? Seine Seite ist ja schon eine Weile tot...

      Seit Node 12 funktioniert pkill io nicht mehr wie erwartet. Benutze stattdessen pkill node oder pkill -u iobroker

      posted in Error/Bug
      F
      fastfoot
    • [Skript] Wiederherstellen und Auflisten von Skripten

      Das Skript kann aus diversen Backupdateien

      • Skripte wiederherstellen
        • als Importdatei im Dateisystem, restoreToFilesystem im Standard false
        • direkt in die Objektdatenbank, restoreToSystemDB im Standard false
          • zur 'Sicherheit' und zum Schutz vor Überschreiben kann an den Namen das Suffix scriptSuffix angegeben werden, im Standard ist es auf '_rcvr' gesetzt
      • Skripte auflisten
        • als Datei, generateListing im Standard true, wird in outputPath gespeichert
        • als JSON Tabelle in einem Datenpunkt zur Verwendung in VIS, generateTable im Standard true
          • der DP wird in idBase und idJson angegeben und wird vom Skript erstellt falls generateTable true ist.
      • Backupdateien können sein
        • Backup der Objektdatenbank in /opt/iobroker/iobroker-data/backup-objects
        • Backupdateien des BackitUp Adapters in /opt/iobroker/backups
        • Exportdatei des Javascript Adapters
        • Einzelne Skriptdatei

      hierzu dienen verschiedene Filter-Arrays mit denen man die Ergebnisse einschränken kann. Groß- Kleinschreibung ist dabei egal, Teilausdrücke sind erlaubt, es sind reguläre Ausdrücke möglich. Die Filter können kombiniert werden

      • Namenfilter scriptFilter
        • ['wetter', '^a'] findet Skripte mit wetter im Namen oder die mit a oder A beginnen
      • Inhaltsfilter contentFilter
        • ['0_userdata.myState', 'sendTo'] findet Skripte welche im Code 0_userdata.myState oder sendTo enthalten
      • Typfilter typeFilter
        • ['Blockly', '^R'] findet nur Blockly- und Rules Skripte
      • Ordnerfilter includeFolders
        • ['tools', 'Forum'] findet nur Skripte in den Ordnern Tools und Forum und deren Unterordnern
      • Ordnerfilter excludeFolders
        • ['/'] oder ['root'] Nur Skripte welche in Ordnern sind werden gefunden
        • ['Forum', 'Tools'] Skripte in diesen Ordnern und ihren Unterordnern werden ignoriert

      Es macht keinen Sinn die beiden Ordnerfilter zu kombinieren!

      Anleitung:
      Mit den Standardsettings(inputFile = autoObjects) kann das Skript ohne weitere Einstellungen sofort gestartet werden. In einem neu aufgesetzten System funktioniert das jedoch nicht da ja noch keine Backupdateien existieren und die wohl auch keine Skripte enthalten

      • Ordner für die Backupdatei anlegen und in inputPath angeben. Standard ist /home/iobroker/scriptInput
      • Die Datei in den Ordner inputPath kopieren und in inputFile angeben. Bei Verwendung eines der drei autoxxxxxxxx Namen kann die Erstellung des inputPath entfallen
        • autoObjects - das zuletzt vom JS-Controller erstellte Backup wird verwendet
        • autoBackup - die letzte Backupdatei des BackitUp Adapters wird verwendet
        • autoScript - die letzte Backupdatei für Skripte des BackitUp Adapters wird verwendet
      • Ausgabeordner in outputPath benennen, Standard ist /home/iobroker/scriptOutput. Der Ordner wird bei Skriptstart erstellt bzw. geleert.
      • Skript starten, das Listing befindet sich in outputPath

      /**
      * Name:            scriptRecovery
      * Zweck:           Wiederherstellen/Auflisten von Skripten aus verschiedenen Quellen
      * Datum:           24.01.2023
      * Autor:           @fastfoot
      * Forum:           https://forum.iobroker.net/post/930558
      * 
      * Changelog:       24.01.2023 - verbessertes Error-Handling
      *                  21.01.2023 - Windows/Mac kompatibel
      */
      
      /*                                                        Einstellungen                                               */
      
      // zusätzliche Meldungen, dafür unbedingt auch in der JS-Instanz den Debug-Modus aktivieren!!!
      const dbg = false;
      
      // hier wird die JSON Tabelle gespeichert, der DP wird erstellt wenn generateTable true ist
      const idBase = "0_userdata.0.scriptRecovery";
      const idJson = "jsonTable";
      
      // erzeugt eine JSON Tabelle der gefundenen Skripte für eine evtl. VIS
      const generateTable = true;
      
      // erzeugt ein Listing der gefundenen Skripte(__Listingxxx.json)
      const generateListing = true;
      
      // Dateien ins Filesystem schreiben, false = brauchbar wenn man nur ein Listing will
      const restoreToFilesystem = false;
      
      // Extension für importierte Skripte, zur Unterscheidung von existierenden Skripten.
      const scriptSuffix = "_rcvr";
      
      // Skripte werden sofort ins System geladen(Endung: wie in scriptSuffix) ACHTUNG: AUF EIGENE GEFAHR!!!!
      // existierende Skripte werden nicht überschrieben
      const restoreToSystemDB = false;
      
      // Array Skriptnamen-Filter, wenn vorhanden werden nur diese  Skripte behandelt z.B. ['script 1','script 2']
      // Nur Teil-Namens sind erlaubt und Groß- Kleinschreibung ist egal
      // const scriptFilter = ['^[abc]', '[xyz0-9]$', 'script'];// Skripte beginnen mit a,b oder c oder enden mit x,y,z oder einer Zahl oder haben <<script>> im Namen
      const scriptFilter = [''];
      
      // Array Inhaltsfilter z.B. ['0_userdata.0.example_state', 'Wetter'] zum Suchen nach bestimmten Begriffen
      // const contentFilter = ['0_user', 'sql', 'sendto'];
      const contentFilter = [''];
      
      // Array - Skripte in diesen Ordnern werden nicht berücksichtigt(für rootFolder 'root' oder '/')
      // const excludeFolders = ['/','global', 'löschen'];
      const excludeFolders = [''];
      
      // Array - Nur Skripte in diesen Ordnern und deren Unterordnern werden berücksichtigt(für NUR rootFolder 'root' oder '/')
      // const includeFolders = ['/','tools', 'forum'];
      const includeFolders = [''];
      
      // Array Typ Filter um nur bestimmte Typen zu berücksichtigen (Blockly, Javascript, Rules, Typescript)
      // const typeFilter = ['Blockly','javas'];// findet Blockly- oder Javascript Skripte
      const typeFilter = [''];
      
      // hier liegt die in inputFile definierte Datei, entweder Archiv oder bereits extrahierte Datei
      let inputPath = "../../scriptInput";
      
      // hier landen die extrahierten Skripte und die Listing-Datei, wird bei Skriptstart geleert und angelegt wenn nicht vorhanden
      const outputPath = "../../scriptOutput";
      
      // Datei mit den Skripten(autoObjects = letzte objects.json[l], autoBackup = letzte backupdatei, autoScripts = letztes Skript Backup)
      let inputFile = "";
      
      //                                                       Beispiele für mögliche Dateien
      // letzte Dateien JS-Controller und BackitUp-Adapter
      inputFile = "autoObjects";
      // inputFile = "autoBackup";
      // inputFile = "autoScripts";
      
      // Backup von JS-Controller
      // inputFile = '2023-01-23_13-30_objects.jsonl.gz';
      // inputFile = "objects.jsonl";
      // inputFile = "2022-12-19_12-18_objects.json.gz";
      // inputFile = "objects.json";
      
      // BackitUp-Adapter
      // inputFile = "iobroker_2023_01_23-13_34_49_backupiobroker.tar.gz";
      // inputFile = "backup.json";
      // inputFile = "javascripts_2023_01_23-13_35_04_backupiobroker.tar.gz";
      // inputFile = "script.json";
      
      // Konsole: 'iobroker backup'
      // inputFile = "2023_01_23-13_36_02_backupiobroker.tar.gz";
      
      // JS-Adapter Export
      // inputFile = "2023-01-24-scripts.zip";
      // inputFile = "FullBackup-scripts_2023-01-11.zip";
      
      // Einzelskript
      // inputFile = 'sqlBlockly.js';
      
      /* **************************************************************************************
      * *******************                                                *******************
      * *******************       Ab hier keine Änderungen vornehmen       *******************
      * *******************                                                *******************
      * **************************************************************************************
      */
      // @ts-ignore
      const fse = require("fs-extra");
      const Path = require("path");
      // @ts-ignore
      const tar = require('tar');
      // @ts-ignore
      const JSZip = require('jszip');
      const zlib = require('node:zlib');
      const { pipeline } = require('node:stream');
      // const os = require("os");
      
      // hier werden die aus evtl. Archiven(tar.gz, gz, zip) extrahierten Skripte temporär abgelegt. Wird bei Skriptstart angelegt wenn nicht vorhanden
      const tmpRoot = '../../scriptTmp';// os.tmpdir();
      const tmpPath = Path.resolve(tmpRoot, scriptName.slice(10));
      
      // Ignoriert Fehler in der JSONL Datenbank
      const ignoreJsonlErrors = true;
      
      // komprimiere JSONL Datenbank beim Einlesen
      const compressJsonl = false;
      
      // wichtig damit der mirrorPath nicht überschrieben wird und somit alle Skripte gelöscht werden
      const mirrorPath = getObject("system.adapter.javascript.0").native.mirrorPath;
      
      start();
      
      async function start() {
         if (dbg) console.error('Debugmode aktiv, unbedingt auch in der JS-Instanz den Debug-Modus aktivieren!!!');
         fse.ensureDirSync(tmpPath);
         fse.emptyDirSync(tmpPath);
         fse.ensureDirSync(outputPath);
      
         if (outputPath != mirrorPath) {
             fse.emptyDirSync(outputPath);
         }
         try { await main(); }
         catch (e) { return console.error('Ein Fehler ist aufgetreten!') }
      
         stopScript(scriptName);
      }
      
      async function main() {
         let dataFile = '';
         let allScripts = {};
         switch (inputFile.toLocaleLowerCase()) {
             case 'autoobjects':
                 inputPath = '../../iobroker-data/backup-objects';
                 inputFile = await getNewestFile(inputPath, /objects\.jsonl\.gz/);//await getLatestObjects();
                 break;
             case 'autobackup':
                 inputPath = '../../backups';
                 inputFile = await getNewestFile(inputPath, /^[2i.+\.tar\.gz]/);//await getLatestBackup();
                 break;
             case 'autoscripts':
                 inputPath = '../../backups';
                 inputFile = await getNewestFile(inputPath, /^javascript.+\.tar\.gz/);//await getLatestScripts();
                 break;
             default:
         }
      
         if (inputFile === '' || inputFile === undefined) {
             return console.error(`[main()] - Keine Datei in ${inputPath} gefunden!`);
         }
      
         if (!(await fse.pathExists(Path.resolve(inputPath, inputFile)))) {
             return console.error(`[main()] - Die Datei ${inputFile} in ${inputPath} wurde nicht gefunden!`);
         }
      
         const fullArchiveName = Path.resolve(inputPath, inputFile);
         if (inputFile.indexOf('.tar.gz') > 0) {
             dataFile = await tarExtract(fullArchiveName);
      
             if (dataFile.endsWith('backup.json')) {
                 allScripts = await handleBackup(dataFile);
             } else if (dataFile.endsWith('script.json')) {
                 allScripts = await handleJson(dataFile);
             }
         } else if (inputFile.endsWith('backup.json')) {
             allScripts = await handleBackup(fullArchiveName);
         } else if (inputFile.endsWith('script.json')) {
             allScripts = await handleJson(fullArchiveName);
         } else if (inputFile.indexOf('.jsonl.gz') > 0) {
             dataFile = await gzipExtract(fullArchiveName);
             allScripts = await handleJsonl(dataFile);
         } else if (inputFile.endsWith('objects.jsonl')) {
             allScripts = await handleJsonl(fullArchiveName);
         } else if (inputFile.indexOf('.json.gz') > 0) {
             dataFile = await gzipExtract(fullArchiveName);
             allScripts = await handleJson(dataFile);
         } else if (inputFile.endsWith('objects.json')) {
             allScripts = await handleJson(fullArchiveName);
         } else if (inputFile.indexOf('.zip') > 0) {
             dataFile = await zipExtract(fullArchiveName);
             if (dataFile)
                 allScripts = await handleExport(dataFile);
             else
                 return console.warn('Keine passenden Dateien gefunden, Filter prüfen!');
         } else if (inputFile) {
             try {
                 let b = fse.lstatSync(fullArchiveName).isDirectory()
             } catch (e) {
                 return console.error('[main()] - Fehler: ' + e);
             }
             allScripts = await handleExport(inputFile, inputPath);
         } else {
             return console.error('[main()] - Fehler: Variable inputFile falsch belegt')
         }
         if (dbg) {
             console.debug('[main()] - datafile = ' + (dataFile != '' ? dataFile : inputFile))
         };
         handleScripts(allScripts);
      }
      
      async function handleScripts(allScripts) {
         let res = {};
         let tableData = [];
      
         for (let key in allScripts) {
             let fileExtension = "";
             let script = allScripts[key];
             const keyNew = key + scriptSuffix;
             const folder = key.replace('script.js.', '').replace(script.common.name, '').replace(/\.$/, '');
      
             // exclude Filter
             if (isExcludedFolder(folder)) continue;
             // folder Filter
             if (!isIncludedFolder(folder)) continue;
             // script Filter
             if (!isName(script.common.name)) continue;
             // Typ Filter
             if (!isType(script.common.engineType)) continue;
             // Inhalts Filter
             if (!isContent(script.common.source)) continue;
      
             script.common.enabled = false;
             script.common.debug = false;
             script.common.verbose = false;
             script.common.expert = false;
      
             if (!existsObject(keyNew) && restoreToSystemDB) {
                 if (dbg) console.debug('[handleSripts()] - Key: ' + key);
                 const oldName = script.common.name;
                 script.common.name += scriptSuffix;
                 await createScriptFolder(keyNew.slice(0, keyNew.length - script.common.name.length - 1));
                 await setObjectAsync(keyNew, { type: "script", common: script.common, native: {} });
      
                 script.common.name = oldName;
             }
             if (restoreToFilesystem) {
                 let data = script.common.source;
      
                 switch (script.common.engineType.toLowerCase()) {
                     case "blockly":
                         fileExtension = ".xml";
                         if (script.common.source.length)
                             data = handleBlockly(data);
                         else console.warn("217 Leeres Skript: " + script.common.name);
                         break;
                     case "rules":
                         fileExtension = ".js";
                         break;
                     case "javascript/js":
                         fileExtension = ".js";
                         break;
                     case "typescript/ts":
                         fileExtension = ".ts";
                         break;
                     default:
                         fileExtension = ".js";
                 }
      
                 if (data && data.length) {
                     if (dbg) console.debug('[handleSripts()] - Key: ' + key);
                     if (dbg) console.debug('[handleSripts()] - Pfad: ' + Path.resolve(outputPath, key.substring(10)));
                     let scriptName = key.split('.').pop();
                     let scriptPfad = key.slice(10, key.length - scriptName.length - 1).replace(/\./g, '/');
                     scriptPfad = Path.resolve(outputPath, scriptPfad);
                     fse.ensureDirSync(scriptPfad);
                     fse.writeFile(
                         Path.resolve(scriptPfad, scriptName) + fileExtension,
                         data,
                         (e) => {
                             if (e) console.error("[handleSripts()] - Fehler beim Schreiben der Datei:" + e.code);
                         }
                     );
                 } else {
                     if (dbg) console.debug('[handleSripts()] - No source data: ' + key);
                 }
             }
      
             if (generateTable) {
                 tableData = generateJsonTable(script, tableData);
             }
             if (dbg) console.debug('[handleSripts()] - Key: ' + key)
             res[key.substring(10)] = script.common.engineType;
         }
      
         if (generateTable) {
             if (!tableData.length) {
                 tableData.push({ Warnung: 'Keine Daten vorhanden, Filter prüfen!' });
             } else {
                 tableData.sort((a, b) => a.Name.localeCompare(b.Name));
                 let no = 0;
                 tableData.forEach(rec => rec.Nr = ++no);
             }
             if (await createDatapoints(idBase)) {
                 setState(`${idBase}.${idJson}`, JSON.stringify(tableData));
             }
         }
      
         if (generateListing) {
             let b = {};
             if (Object.keys(res).length) {
                 // sortieren
                 let a = Object.keys(res).sort();
                 for (let i = 0; i < a.length; i++) {
                     b[i + 1 + " " + a[i]] = res[a[i]];
                 }
             } else {
                 b.Warnung = 'Keine Daten vorhanden, Filter prüfen!';
             }
             const fullFileName = Path.resolve(outputPath, '__Listing_' + inputFile + ".json");
             fse.writeFile(fullFileName, JSON.stringify(b, null, 3), (e) => {
                 if (e) console.error("[handleSripts()] - Schreibfehler bei Ergebnisdatei");
             });
         }
      }
      
      /* extrahiere Skripte aus iobroker Datenbank (neueste Version JSONL)*/
      async function handleJsonl(dataFile) {
         const allScripts = {};
         // @ts-ignore
         const DB = require("@alcalzone/jsonl-db").JsonlDB;
         const dbOptions = {
             autoCompress: { onOpen: compressJsonl },
             ignoreReadErrors: ignoreJsonlErrors,
         };
         const db = new DB(dataFile, dbOptions);
         try {
             await db.open();
         } catch (e) {
             console.error(`[handleJsonl()] - Fehler beim Öffnen der Datenbank ${dataFile} in ${inputPath}` + e);
         }
         db.forEach((obj, key) => {
             if (obj.type === "script") {
                 allScripts[key] = obj;
             }
         });
         await db.close();
      
         return allScripts;
      }
      
      /* extrahiere Skripte aus iobroker Datenbank (ältere Version JSON)*/
      async function handleJson(dataFile) {
         let allData = '';
         const allScripts = [];
         let allObjects = new Object();
         try {
             allData = fse.readFileSync(dataFile, "utf8");
         } catch (e) {
             console.error(`[handleJson()] - Fehler beim Lesen von ${inputFile} in ${inputPath}: ` + e);
         }
         try {
             allObjects = JSON.parse(allData);
         } catch (e) {
             console.error("[handleJson()] - Fehlerhafte Daten: ==> " + e);
         }
         for (let prop in allObjects) {
             const obj = allObjects[prop];
             if (obj.type === "script") {
                 allScripts[prop] = obj;
             }
         }
         return allScripts;
      }
      
      /* extrahiere Skripte aus backup.json des Backitup-Adapers */
      async function handleBackup(dataFile) {
         let allData = '';
         const allScripts = {};
         let allObjects = [];
         try {
             allData = fse.readFileSync(dataFile, "utf8");
         } catch (e) {
             console.error(`[handleBackup()] - Fehler beim Lesen von ${inputFile} in ${inputPath}: ` + e);
         }
         try {
             allObjects = JSON.parse(allData).objects;
         } catch (e) {
             console.error('[handleBackup()] - Fehlerhafte Daten: ==> ' + e);
         }
      
         for (let obj of allObjects) {
             if (obj.value.type === 'script') {
                 allScripts[obj.id] = obj.value;
             }
         }
         return allScripts;
      }
      
      /* bearbeite Skripte */
      async function handleExport(scriptListx, dir = tmpPath) {
         const allScripts = {};
         const scriptList = scriptListx.trim().split(' ');
         let fileObj = {};
         let sourceData = '';
      
         scriptList.forEach((file) => {
             const scriptObj = {
                 "_id": "script.js.",
                 "common": {
                     "name": "",
                     "engineType": "JavaScript/js",
                     "engine": "system.adapter.javascript.0",
                     "source": "",
                     "enabled": false,
                     "debug": false,
                     "verbose": false
                 },
                 "type": "script",
                 "native": {},
                 "ts": 0,
             }
             const scriptNam = getFileName(file);
             if (dbg) console.debug('[handleExport()] - File: ' + file);
             if (dbg) console.debug('[handleExport()] - Name: ' + scriptNam);
             let scriptData;
             scriptData = fse.readFileSync(Path.resolve(dir, file), 'utf8');
             const regExport = new RegExp(/\/\* -- do not edit/);
             if (regExport.test(scriptData)) {
                 const regObj = new RegExp(/(\{.+\})(?:\n-- do not edit prev)/s);
                 sourceData = scriptData.substring(scriptData.indexOf('END --*/') + 9);
                 if (regObj.test(scriptData)) {
                     try {
                         fileObj = JSON.parse(regObj.exec(scriptData)[1]) || '{}';
                     } catch (e) {
                         console.error('[handleExport()] - Fehler');
                     }
                 }
             } else {
                 sourceData = scriptData;
             }
             const engineType = getEngineType(sourceData);
             if (dbg) console.debug('[handleExport()] - ' + engineType);
             if (dbg) console.debug('[handleExport()] - Type: ' + engineType);
             if (dbg) console.debug('[handleExport()] - File: ' + file);
             if (dbg) console.debug('[handleExport()] - Id: ' + file.replace(/\//g, '.').replace(/.json$/, ''));
             scriptObj._id = `script.js.${file.replace(/\//g, '.').replace(/.json$|.js$/, '')}`;
             scriptObj.ts = fileObj.ts || Date.now();
             scriptObj.common.name = scriptNam;
             scriptObj.common.source = sourceData;
             scriptObj.common.engineType = fileObj.engineType || engineType;
             scriptObj.common.engine = fileObj.engine || 'system.adapter.javascript.0';
             scriptObj.common.enabled = fileObj.enabled || false;
             scriptObj.common.debug = fileObj.debug || false;
             scriptObj.common.verbose = fileObj.verbose || false;
             if (fileObj && fileObj.engineType && fileObj.engineType.toLowerCase() === 'typescript/ts') {
                 scriptObj.common.sourceHash = fileObj.sourceHash;
                 scriptObj.common.compiled = fileObj.compiled;
             }
      
             allScripts[scriptObj._id] = scriptObj;
      
         })
      
         return allScripts;
      }
      
      function generateJsonTable(scriptData, tableData) {
         const data = scriptData.common.source;
         const dt = scriptData.ts && new Date(scriptData.ts) || 0;
      
         let Zweck = '-',
             Autor = '-',
             Datum = dt && dt.getFullYear() + '-' + dt.getMonth() + 1 + '-' + dt.getDate() || '-',
             Instance = scriptData.common.engine.split('.').pop(),
             sName = scriptData.common.name
      
         if (/(Zweck|Purpose):\s+(.*)/.test(data)) {
             if (dbg) console.debug('[generateJsonTable()] - Zweck: ' + /(Zweck|Purpose):\s+(.*)/.exec(data))
             Zweck = /(Zweck|Purpose):\s+(.*)/.exec(data)[2];
         }
         if (/(Autor|Author):\s+(.*)/.test(data)) {
             Autor = /(Autor|Author):\s+(.*)/.exec(data)[2];
         }
         if (/(Datum|Date):\s+(.*)/.test(data)) {
             Datum = /(Datum|Date):\s+(.*)/.exec(data)[2].replace(/(\d+).(\d+).(\d+)/, "$3-$2-$1");
         }
         let p = scriptData._id.lastIndexOf('.');
         let ps = '';
         if (p === 9) ps = '/';
         else ps = '/' + scriptData._id.slice(10, p);
         tableData.push({
             Nr: 0,
             Name: sName,
             Pfad: ps,
             Zweck: Zweck,
             Autor: Autor,
             Datum: Datum,
             Instanz: Instance,
             Typ: scriptData.common.engineType.split('/')[0]
         })
      
         return tableData;
      }
      
      function isName(name) {
         if (dbg) console.debug('[isName()] - Name: ' + name);
         const regExp = new RegExp(scriptFilter.slice(0).join("|"), "i");
         return regExp.test(name);
      }
      
      function isExcludedFolder(folder) {
         if (folder === '') folder = 'root/';
         const filter = excludeFolders.slice(0).join("|") || '&&&';
         if (dbg) console.debug('[isExcludedFolder()] -  Folder: ' + folder);
         if (dbg) console.debug('[isExcludedFolder()] - Filter: ' + filter);
         const regExp = new RegExp(filter, "i");
         return regExp.test(folder);
      }
      
      function isIncludedFolder(folder) {
         if (folder === '') folder = 'root/';
         const filter = includeFolders.slice(0).join("|");
         if (dbg) console.debug('[isIncludedFolder()] - Folder: ' + folder);
         if (dbg) console.debug('[isIncludedFolder()] - Filter: ' + filter);
         const regExp = new RegExp(filter, "i");
         return regExp.test(folder);
      }
      
      function isType(typ) {
         const regExp = new RegExp(typeFilter.slice(0).join("|"), "i");
         return regExp.test(typ);
      }
      
      function isContent(source) {
         const regExp = new RegExp(contentFilter.slice(0).join("|"), "i");
         return regExp.test(source);
      }
      
      function handleBlockly(source) {
         const pos = source.lastIndexOf("\n");
         if (pos !== -1) {
             source = source.substring(pos + 3);
             if (source.indexOf("JTNDeG1sJTIweG1") > -1) {
                 source = decodeURIComponent(
                     Buffer.from(source, "base64").toString("utf8")
                 );
                 return prettifyXml(source);
             }
         } else return prettifyXml(source);
      
         //from Stackoverflow
         function prettifyXml(xml) {
             var reg = /(>)\s*(<)(\/*)/g;
             xml = xml.replace(/\r|\n/g, ''); //deleting already existing whitespaces
             xml = xml.replace(reg, "$1\r\n$2$3");
             return xml;
         }
      }
      
      const tarList = async file => {
         const filenames = []
         await tar.list({
             file,
             onentry: entry => {
                 if (/script.json|backup.json/.test(entry.path)) {
                     filenames.push(entry.path)
                 }
             },
         })
         return filenames
      }
      
      const tarExtract = async archive => {
         const fileList = await tarList(archive);
         const strip = fileList.includes('backup/backup.json') ? 1 : 0;
         if (dbg) console.debug(strip + '   ' + fileList);
         const opts = {
             file: archive,
             strip,
             cwd: tmpPath
         }
         await tar.extract(opts, fileList);
         return Path.resolve(tmpPath, fileList[0].replace('backup/', ''));
      }
      
      const zipExtract = async archive => {
         return new Promise(async (resolve, reject) => {
             let fileList = [];
             const data = fse.readFileSync(archive)
             const zip = new JSZip();
             const zipObj = await zip.loadAsync(data);
             zipObj.filter((a, b) => false)
             zipObj.folder().forEach(async (fileName, entry) => {
                 const fullPath = Path.resolve(tmpPath, fileName);
                 const pos = fullPath.lastIndexOf(Path.sep) + 1;
                 const realName = fullPath.substring(pos);
                 const realPath = fullPath.substring(0, pos - 1);
                 if (!entry.dir && isName(realName) && realName.indexOf('_dir.json') < 0) {
                     if (dbg) console.debug(realPath + '  = ' + realName);
                     fse.ensureDirSync(Path.resolve(tmpPath, realPath));
                     fse.writeFileSync(fullPath, Buffer.from(entry._data.compressedContent));
                     fileList.push(fileName);
                 }
             })
             resolve(fileList.join(' '));
         })
      }
      
      const gzipExtract = async archive => {
         return new Promise(async (resolve, reject) => {
             const objectsFile = archive.split(Path.sep).pop().replace('.gz', '').substring(17);
             const gunzip = zlib.createGunzip();
             const readStream = fse.createReadStream(archive);
             const writeStream = fse.createWriteStream(Path.resolve(tmpPath, objectsFile));
             readStream.on('error', e => {
                 reject(console.error(e));
             })
             writeStream.on('error', e => {
                 reject(console.error(e));
             })
      
             pipeline(readStream, gunzip, writeStream, e => {
                 if (e) reject(console.error(e));
                 resolve(Path.resolve(tmpPath, objectsFile));
             })
         })
      }
      
      function getFileName(fullName) {
         return fullName.substring(fullName.lastIndexOf('/') + 1, fullName.lastIndexOf('.'));
      }
      
      function isBlockly(sourceData) {
         const pos = sourceData.lastIndexOf('\n');
         const testData = sourceData.substring(pos + 1);
         return /^[\/][\/]JTNDeG1sJTIwe/.test(testData);
      }
      
      function isRules(sourceData) {
         const pos = sourceData.lastIndexOf('\n');
         const testData = sourceData.substring(pos + 1);
         return /[/][/]{"triggers":/.test(testData);
      }
      
      function isTypescript(sourceData) {
         return /(let|const|var)\s*[a-zA-Z0-9]+:*(string|object|number)/.test(sourceData);
      }
      
      function getEngineType(sourceData) {
         return isBlockly(sourceData) ? 'Blockly'
             : isRules(sourceData) ? 'Rules'
                 : isTypescript(sourceData) ? 'Typescript/ts'
                     : 'Javascript/js';
      }
      
      async function getNewestFile(dir, filter) {
         return new Promise((resolve, reject) => {
             return fse.readdir(dir, (e, f) => {
                 if (e) reject(e);
                 const s = f.map(f => {
                     let t;
                     const ff = Path.resolve(dir, f);
                     try {
                         t = fse.lstatSync(ff).mtime.getTime();
                     } catch (e) {
                         reject(e)
                     }
                     return { name: f, time: t }
                 })
                     .sort((a, b) => b.time - a.time)
                     .map(v => v.name)
                     .filter(v => filter.test(v));
                 resolve(s[0]);
             })
         })
      }
      
      // create data points if not existing
      async function createDatapoints(idBase) {
         let dp,
             idKey,
             firstRun = false;
      
         if (!idBase.startsWith('0_userdata.0')) return firstRun;
         firstRun = true;
         const stateAttributes = {};
         stateAttributes[idJson] = { "name": "Skripte Info", "type": "json", "role": "", "read": true, "write": true, "desc": "enthält Skript Tabelle", "def": "" }
      
         //createScriptFolder(idBase);
         for (let key in stateAttributes) {
      
             idKey = idBase + '.' + key;
      
             if (!(await existsStateAsync(idKey))) {
                 dp = stateAttributes[key];
                 firstRun = true;
                 let e = await createStateAsync(idKey, dp);
                 if (e) console.error('[createDatapoints()] - createState: ' + e);
             }
         }
      
         return firstRun;
      
      }
      
      async function createScriptFolder(id) {
         const arr = id.split('.');
         const preId = arr[0] + '.' + arr[1];
         if (preId.length === id.length || (preId != 'script.js' /*&& preId != '0_userdata.0'*/)) return;
         const idNew = id.replace(/[\s"]/g, '_');
      
         if (!(await existsObjectAsync(idNew))) {
             const obj = new Object({
                 "type": "folder",
                 "common": {
                     name: arr[arr.length - 1]
                 },
                 "native": {},
             })
      
             await setObjectAsync(idNew, obj);
         }
         arr.pop();
         id = arr.join('.');
         await createScriptFolder(id);
      }
      
      onStop(() => {
         fse.removeSync(tmpPath);
         if (dbg) console.log('[onStop()] - Skript wurde nach Beendigung automatisch gestoppt!');
      })
      

      posted in JavaScript
      F
      fastfoot
    • RE: vis 1.x Revived als MIT-Community-Projekt ohne Lizenz!

      @apollon77 sagte in vis 1.x Revived als MIT-Community-Projekt ohne Lizenz!:

      Ich denke mit dieser Entscheidung zeigt ioBroker einmal mehr wie "Open-Source" das Projekt ist und es auch meint.

      Das denke ich auch, wobei es doch eigentlich keines Beweises bedarf dass ioBoker ein wahrhaftes Open-Source Projekt ist. Speziell mit einem so unkomplizierten und dann auch noch kostenfreien Upgrade der Offline-Lizenz auf die VIS-2 konnte und durfte man nicht rechnen. Mehr Open-Source geht einfach nicht!

      posted in ioBroker Allgemein
      F
      fastfoot
    • [Skript]Covid 19: 7 Tage Werte aller Landkreise

      Hallo
      inspieriert durch den Thread über die Corona Ampel in Österreich habe ich einmal versucht, die Daten für Deutschland anhand der 7 Tage Werte zusammenzufassen. Grundlage dieser Daten ist der Covid 19 Adapter, weshalb er vor Nutzung installiert und konfiguriert(Städte und Kreise) werden muss

      Ich hoffe jemand kann es gebrauchen, über Feedback würde ich mich natürlich freuen.

      Features:

      • Eigene Kreise/Städte können definiert werden, die Anzeige erfolgt dann am Beginn der Tabelle

      • Ein Minimalwert kann definiert werden, kleinere Werte werden ausgeblendet

      • Die Daten stehen als JSON und HTML Tabelle zur Verfügung, um sie in VIS darstellen zu können

      • Die Aktualisierung erfolgt sobald der Covid19 Adapter neue Daten liefert

      • Bewertung mit Ampelfarben

      • Wahlweise können alle Landkreisdaten des Covid19 Adapters angezeigt werden

      • Zusätzliche Features und Updates bitte im Thread nachlesen, die neueste Version befindet sich immer in diesem Beitrag


      vis.PNG

      /**
       * Zweck:           Anzeige und Bewertung aller Kreise/Städte mit dem 7-Tage Wert an Neuinfektionen
       * Stand:           21.12.2020
       * Autor:           fastfoot
       * Forumthread:     https://forum.iobroker.net/topic/37471/skript-covid-19-7-tage-werte-aller-landkreise
       * Voraussetzung:   Adapter 'COVID-19 live information'
       * Änderungen:      09.10.2020 - Bewertung mit Ampelfarben
       *                             - Unterstriche im Namen durch Leerzeichen ersetzt
       *                             - setting for maximum number of records to show(own records are always shown!)
       *                             - Trennzeile zwischen eigenen und sonstigen Regionen (wählbar)
       *                  11.10.2020 - alle Landkreisdaten (eigener dp)
       *                             - html Tabelle für 7 Tage Werte (nur eigene Regionen)
       *                  05.11.2020 - Fix wegen gleichem DP in den Bundesländern
       *                  06.11.2020 - Daten der Bundesländer hinzugefügt
       *                               Auswahl über DP showFederalStates
       *                             - Option, um nur die Daten der Bundesländer anzuzeigen(+eigene Wahl)
       *                               Auswahl über DP showFederalStatesOnly
       *                             - nicht selbst gewählte Städte/Kreise können ausgeblendet werden
       *                               Auswahl über DP showAllCounties
       *                             - ausgewählte BL mit allen Kreisen/Städten werden markiert
       *                               Wählen über Variable myBL
       *                             - eigene Kreise/Städte/Bundesländer werden markiert
       *                             - Sortierung nach allen Spalten möglich
       *                               Auswahl über DP sort 
       *                             - Bundeslanddaten werden mit ‼️ markiert
       *                             - deutsches Zahlenformat optional (ab Node 14.x !)
       *                  07.11.2020 - Fix: Instanz beendet sich beim Erstellen der DP
       *                  21.12.2020 - Fix: Aufruf von setSchedules() aus main() entfernt
       *                             - Ampel angepasst
       *                    
      */
      //const jsonata = require('jsonata');
      const numberDEComma = Intl.NumberFormat('de', {maximumFractionDigits:2,minimumFractionDigits:2});
      const numberDEFull = Intl.NumberFormat('de', {maximumFractionDigits:0,minimumFractionDigits:0});
      const Node14 = numberDEFull.format(1000).indexOf(".") >= 0;
      const logging = !true;
       
      //Eigene Kreise/Städte/Bundesländer, Markierung mit ❗️
      const myCities = [
          ["Berlin_Charlottenburg-Wilmersdorf","Stadt"],
          ["München","Stadt"],
      ];
      //Eigene Bundesländer  mit allen Kreisen/Städten, Markierung mit ❕
      const myBL = [
          "xBayern"
         ,"xSachsen-Anhalt"
         ,"Saarland"
         ,"xRheinland-Pfalz"
         ,"xNordrhein-Westfalen"
      ];
       
      const MINVALUE = 0;                                                 //kleinster 7-Tage Inzidenzwert
      const baseId = `javascript.${instance}.CoronaDE`;                   //Ort für Datenpunkte
      const idJSON = `${baseId}.json`;                                    //DP for json Data
      const idHTML = `${baseId}.html`;                                    //DP for html Data
      const idSort = `${baseId}.sort`;                                    //DP for sorting
      const idAllCounties = `${baseId}.showAllCounties`;                  //DP for showing all counties
      const idShowFederalStates = `${baseId}.showFederalStates`;          //DP for showing federal states
      const idUpdate = 'coronavirus-statistics.0.Germany.updated';        //DP to trigger updates
      const idData = 'coronavirus-statistics.0.Germany.*.cases7_per_100k';//DPs to look for data
      let allRecords = [];                                                //holds all final data
       
      async function createDatapoints() {
          const stateAttributes = {
              "sort":{
                  "name":"Sortierung",
                  "type":"string",
                  "role":"state",
                  "read":true,
                  "write":true,
                  "def":"My"
              },
              "json":{
                  "name":"Alle Corona Daten (json)",
                  "type":"string",
                  "role":"state",
                  "read":true,
                  "write":true,
                  "def":""
              },
              "html":{
                  "name":"7 Tage Corona Fälle (html)",
                  "type":"string",
                  "role":"state",
                  "read":true,
                  "write":true,
                  "def":""
              },
              "showAllCounties":{
                  "name":"Zeige Daten aller Kreise/Städte",
                  "type":"boolean",
                  "role":"state",
                  "read":true,
                  "write":true,
                  "def":false
              },
              "showFederalStates":{
                  "name":"Zeige Daten aller Bundesländer",
                  "type":"boolean",
                  "role":"state",
                  "read":true,
                  "write":true,
                  "def":false
              }
          }
          for(let key in stateAttributes) {
              if (!(await existsStateAsync(baseId + '.' + key))) {
                  let dp = stateAttributes[key];
                  await createStateAsync(baseId + '.' + key, {
                      "name":dp.name,
                      "type":dp.type,
                      "role":dp.role,
                      "read":dp.read,
                      "write":dp.write,
                      "def":dp.def
                  })
              }
          }
      }
       
      async function main() {
          await createDatapoints();
          let showAllCounties = (await getStateAsync(idAllCounties)).val;
          let showBundesländer = (await getStateAsync(idShowFederalStates)).val;
          //let BundesländerOnly = (await getStateAsync(idShowFederalStatesOnly)).val;
          let idCases7 = $(idData);
          allRecords = [];
          idCases7.each(function(id,i) {
              let My = '';
              let Bundesland = '';
              let FällePP;
              let Todesrate;
              let Art = id.split(".")[3];
              let Name = id.split(".")[4].replace(/_/g, " ");
              let Fälle = getState(id.split(".").slice(0,-1).join(".") + ".cases").val;
       
              let Fälle100k = getState(id.split(".").slice(0,-1).join(".") + ".cases_per_100k").val;
       
              let Tote = getState(id.split(".").slice(0,-1).join(".") + ".deaths").val;
       
              let Fälle7 = getState(id).val;
              let Bewertung = getAmpel(Fälle7);
       
              if(id.split(".")[3] == 'Bundesland') {
                  Bundesland = id.split(".")[4];
                  FällePP = (Fälle100k / 1e3);
                  Todesrate = Tote / Fälle * 100;
              } else {
                  Bundesland = getState(id.split(".").slice(0,-1).join(".") + ".BL").val;
                  FällePP = getState(id.split(".").slice(0,-1).join(".") + ".cases_per_population").val;
                  Todesrate = getState(id.split(".").slice(0,-1).join(".") + ".death_rate").val;
              }
              let c;
              if(Node14) {
                  let FPPSort = 0;
                  let FSort = 0;
                  let F7Sort = 0;
                  let F100Sort = 0;
                  let TSort = 0;
                  let TrSort = 0;
                  FSort = +Fälle;
                  Fälle = numberDEFull.format(Fälle);
                  F100Sort = +Fälle100k.toFixed(1);
                  Fälle100k = numberDEComma.format(Fälle100k);
                  FPPSort = +FällePP.toFixed(1);
                  FällePP = numberDEComma.format(FällePP);
                  TSort = +Tote;
                  Tote = numberDEFull.format(Tote);
                  F7Sort = +Fälle7.toFixed(1);
                  Fälle7 = numberDEComma.format(Fälle7);
                  TrSort = +Todesrate.toFixed(1);
                  Todesrate = numberDEComma.format(Todesrate);
                  c = {My,Bundesland,Art,Name,Fälle,FällePP,Fälle100k,Todesrate,Tote,Fälle7,Bewertung,
                          FSort,FPPSort,F100Sort,TrSort,TSort,F7Sort};
              } else {
                  Fälle100k = +Fälle100k.toFixed(1);
                  FällePP = +FällePP.toFixed(1);
                  Fälle7 = +Fälle7.toFixed(1);
                  Todesrate = +(Todesrate.toFixed(1));
                  c = {My,Bundesland,Art,Name,Fälle,FällePP,Fälle100k,Todesrate,Tote,Fälle7,Bewertung};
              }
       
              let found = false;
              for(let i=0; i < myCities.length; i++){
                  if(c.Art == myCities[i][1] && c.Name == myCities[i][0].replace(/_/g, " ")) {
                      c.My = "❗️";
                      found = true;
                      break;
                  }
              }
       
              for(let i=0; i < myBL.length; i++){
                  if(c.Bundesland == myBL[i]) {
                      if(!(c.My > '')) c.My = "❕";
                      found = true;
                      break;
                  }
              }
       
              if(showAllCounties){
                  found = true;
              }
       
              if(showBundesländer){
                  if(c.Art == "Bundesland") {
                      if(!(c.My > '')) c.My = "‼️";
                      found = true;
                  }
              }
       
              if(found){
                  if(c.Bundesland == 'Berlin') c.Name = c.Name.replace(/Berlin\s/,'');
                  if(c.Bundesland == 'Saarland') c.Name = c.Name.replace(/Reg.*\s/,'RV ');
                  if(Node14){
                      if(c.F7Sort >= MINVALUE) allRecords.push(c);
                  }else{
                      if(c.Fälle7 >= MINVALUE) allRecords.push(c);
                  }
              }
          })
       
          /*if(BundesländerOnly){
              let expr = `$[My >"" or Art = "Bundesland"]`;
              allRecords = jsonata(expr).evaluate(allRecords);
          }*/
       
          let sortColumn = getState(idSort).val;
          Sort(allRecords, sortColumn);
          setState(idJSON,JSON.stringify(allRecords));
          generateHTML(allRecords);
      }
       
      //sort cases descending
      function Sort(allRecords, col) {
          switch(col) {
              case "My":
                  if(logging) log('My');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.My.localeCompare(a.My)||b.F7Sort - a.F7Sort;
                      }else{
                          return b.My.localeCompare(a.My)||b.Fälle7- a.Fälle7;
                      }
                  })
                  break;
              case "Bundesland":
                  if(logging) log('Bundesland');
                  allRecords.sort((a,b)=>{
                      return a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name);
                  })
                  break;
              case "Art":
                  if(logging) log('Art');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return a.Art.localeCompare(b.Art)||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name)||b.F7Sort - a.F7Sort;
                      }else{
                          return a.Art.localeCompare(b.Art)||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name)||b.Fälle7 - a.Fälle7;
                      }
                  })
                  break;
              case "Name":
                  if(logging) log('Name');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return a.Name.localeCompare(b.Name)||b.F7Sort - a.F7Sort;
                      }else{
                          return a.Name.localeCompare(b.Name)||b.Fälle7 - a.Fälle7;
                      }
                  })
                  break;
              case "Fälle":
                  if(logging) log('Fälle');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.FSort - a.FSort||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name);
                      }else{
                          return b.Fälle - a.Fälle||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name);
                      }
                  })
                  break;
              case "FällePP":
                  if(logging) log('FällePP');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.FPPSort - a.FPPSort;
                      }else{
                          return b.FällePP - a.FällePP;
                      }
                  })
                  break;
              case "Fälle100K":
                  if(logging) log('Fälle100k');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.F100Sort - a.F100Sort;
                      }else{
                          return b.Fälle100k - a.Fälle100k;
                      }
                  })
                  break;
              case "Todesrate":
                  if(logging) log('Todesrate');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.TrSort - a.TrSort||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name);
                      }else{
                          return b.Todesrate - a.Todesrate||a.Bundesland.localeCompare(b.Bundesland)||a.Name.localeCompare(b.Name);
                      }
                  })
                  break;
              case "Tote":
                  if(logging) log('Tote');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.TSort - a.TSort;
                      }else{
                          return b.Tote - a.Tote;
                      }
                  })
                  break;
              case "Fälle7":
                  if(logging) log('Fälle7');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return b.F7Sort - a.F7Sort;
                      }else{
                          return b.Fälle7 - a.Fälle7;
                      }
                  })
                  break;
              default:
                  if(logging) log('default');
                  allRecords.sort((a,b)=>{
                      if(a.FSort){
                          return a.My.localeCompare(b.My)||b.F7Sort - a.F7Sort;
                      }else{
                          return b.My.localeCompare(a.My)||b.Fälle7 - a.Fälle7;
                      }
                  })
          }
      }
      
      // rating for 7day cases per 100k
      function getAmpel(wert){
          const arrBewert = ["⚪","🟡","🟠","🔴","🟣","⚫","🟢"];
          if (wert < 10) return arrBewert[0];
          if (wert < 30) return arrBewert[1];
          if (wert < 50) return arrBewert[2];
          if (wert < 200) return arrBewert[3];
          if (wert < 500) return arrBewert[4];
          if (wert > 499) return arrBewert[5];
      }
       
      //generate HTML table
      function generateHTML(allRecords){
          let html = 
                  `<table style="width:100%;">
                  <thead>
                      <tr>
                      <th width="" style="text-align:left;">Bundesland</th>
                      <th width="" style="text-align:left;">Art</th>
                      <th width="" style="text-align:left;">Name</th>
                      <th width="" style="text-align:right;">Fälle7</th>
                      <th width="" style="text-align:left;">Bewertung</th>
                      </tr>
                  </thead>
                  <tbody>\n`
          for (let i=0;i<allRecords.length;i++){
              html +=
                  `<tr><td>${allRecords[i].Bundesland}</td>
                  <td>${allRecords[i].Art}</td>
                  <td>${allRecords[i].Name}</td>
                  <td style="text-align:right;">${allRecords[i].Fälle7}</td>
                  <td style="text-align:center;">${allRecords[i].Bewertung}</td></tr>`
          }
          html += '</tbody></table>';
          setTimeout(() => {
              setState(idHTML, html);
          }, 1000);
      }
       
      function setSchedules() {
          //run whenever Covid 19 adapter updates data 
          on({id: idUpdate, change: 'any'}, () => main())
       
          //run whenever sort column changes
          on({id: idSort, change: 'any'}, (obj) => {
              let t1;
              let col = obj.state.val;
              //let expr = `$^(>${col})`;
              //allRecords = jsonata(expr).evaluate(allRecords);
              if(logging) t1 = new Date().getTime();
              Sort(allRecords, col);
              setTimeout(()=>{
                  setState(idJSON, JSON.stringify(allRecords));
              },1000)
              if(logging) log((new Date().getTime() - t1).toString());
          })
       
          //run whenever showAllCounties changes
          on({id: idAllCounties, change: 'any'}, (obj) => {
              main();
          })
       
          //run whenever showFederalStates changes
          on({id: idShowFederalStates, change: 'any'}, (obj) => {
              main();
          })
      }
      
      setTimeout(() => {
          setSchedules();
      }, 1000)
      
      //run at script start
      main();
      

      [{"tpl":"i-vis-jsontable","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iTblRowLimit":"502","iColCount":"11","iColShow1":"true","iTblCellImageSize1":"200","iOpacityAll":"1","iTblRowEvenColor":"#333333","iTblRowUnevenColor":"#455618","iTblHeaderColor":"#333333","iTblRowEvenTextColor":"#ffffff","iTblRowUnevenTextColor":"#ffffff","iTblHeaderTextColor":"#ffffff","iRowSpacing":"10","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.json","iTblShowHead":true,"iVertScroll":true,"iColShow2":"true","iTblCellImageSize2":"200","iColShow3":"true","iTblCellImageSize3":"200","iColShow4":"true","iTblCellImageSize4":"200","iColShow5":"true","iTblCellImageSize5":"200","iColShow6":"true","iTblCellImageSize6":"200","iColShow7":"true","iTblCellImageSize7":"200","iColShow8":"true","iTblCellImageSize8":"200","iColShow9":"true","iTblCellImageSize9":"200","iColShow10":"true","iTblCellImageSize10":"200","iTableRefreshRate":"0","iTblCellFormat1":"normal","iTblTextAlign1":"center","iTblCellFormat2":"normal","iTblTextAlign2":"left","iTblCellFormat3":"normal","iTblTextAlign3":"left","iTblCellFormat4":"normal","iTblTextAlign4":"left","iTblCellFormat5":"normal","iTblTextAlign5":"right","iTblCellFormat6":"normal","iTblTextAlign6":"right","iTblCellFormat7":"normal","iTblTextAlign7":"right","iTblCellFormat8":"normal","iTblTextAlign8":"right","iTblCellFormat9":"normal","iTblTextAlign9":"right","iTblCellFormat10":"normal","iTblTextAlign10":"right","iBorderSize":"1","iBorderStyleLeft":"solid","iBorderStyleRight":"solid","iBorderStyleUp":"solid","iBorderStyleDown":"solid","iBorderColor":"#ffffff","iColShow11":"true","iTblCellFormat11":"normal","iTblCellImageSize11":"200","iTblTextAlign11":"center","iColName1":" ","iColShow12":"true","iTblCellFormat12":"normal","iTblCellImageSize12":"200","iTblTextAlign12":"left","iColShow13":"true","iTblCellFormat13":"normal","iTblCellImageSize13":"200","iTblTextAlign13":"left","iColShow14":"true","iTblCellFormat14":"normal","iTblCellImageSize14":"200","iTblTextAlign14":"left","iColShow15":"true","iTblCellFormat15":"normal","iTblCellImageSize15":"200","iTblTextAlign15":"left","iColShow16":"true","iTblCellFormat16":"normal","iTblCellImageSize16":"200","iTblTextAlign16":"left","iColShow17":"true","iTblCellFormat17":"normal","iTblCellImageSize17":"200","iTblTextAlign17":"left","iColShow18":"true","iTblCellFormat18":"normal","iTblCellImageSize18":"200","iTblTextAlign18":"left","iColShow19":"true","iTblCellFormat19":"normal","iTblCellImageSize19":"200","iTblTextAlign19":"left","iColShow20":"true","iTblCellFormat20":"normal","iTblCellImageSize20":"200","iTblTextAlign20":"left","iColShow21":"true","iTblCellFormat21":"normal","iTblCellImageSize21":"200","iTblTextAlign21":"left","iColShow22":"true","iTblCellFormat22":"normal","iTblCellImageSize22":"200","iTblTextAlign22":"left","iColWidth1":"25px","iColWidth2":"190px","iColWidth3":"85px","iColWidth4":"220px","iColWidth5":"80px","iColName5":"Fälle","iColWidth6":"80px","iColWidth7":"80px","iColName2":"Bundesland","iColName3":"Art","iColName4":"Name","iColName6":"FällePP","iColName8":"Todesrate","iColWidth8":"80px","iColName9":"Tote","iColWidth9":"80px","iColName10":"Fälle7","iColWidth10":"80px","iColName11":"Wertung","iColWidth11":"80px"},"style":{"left":"10px","top":"110px","width":"1243px","height":"612px","z-index":"0"},"widgetSet":"vis-inventwo"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"test_html":"alles","html_prepend":"<div>alles","html_append":"</div>"},"style":{"left":"500px","top":"40px","width":"60px","height":"20px"},"widgetSet":"basic"},{"tpl":"tplValueString","data":{"oid":"nothing_selected","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"test_html":"BL","html_prepend":"<div>BL","html_append":"</div>"},"style":{"left":"580px","top":"40px"},"widgetSet":"basic"},{"tpl":"i-vis-switch-1","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iSwitchOrientation":"horizontal","iOpacityBack":"1","iSwitchSize":"31","iSwitchColOn":"#333333","iSwitchColOnActive":"#00ff00","iSwitchColOff":"#333333","iSwitchColOffActive":"#ff0000","iSwitchColor":"black","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"iFlipImage":false,"iValueFalse":"false","iValueTrue":"true","oid":"javascript.0.CoronaDE.showFederalStates"},"style":{"left":"570px","top":"10px","width":"62px","height":"33px"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-switch-1","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iSwitchOrientation":"horizontal","iOpacityBack":"1","iSwitchSize":"31","iSwitchColOn":"#333333","iSwitchColOnActive":"#00ff00","iSwitchColOff":"#333333","iSwitchColOffActive":"#ff0000","iSwitchColor":"black","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"iFlipImage":false,"iValueFalse":"false","iValueTrue":"true","oid":"javascript.0.CoronaDE.showAllCounties"},"style":{"left":"500px","top":"10px","width":"62px","height":"33px"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"9","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"0","iShadowYOffset":"0","iShadowBlur":"0","iShadowSpread":"0","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"My"},"style":{"left":"10px","top":"70px","width":"35px","height":"36px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"0","iShadowYOffset":"0","iShadowBlur":"0","iShadowSpread":"0","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Bundesland"},"style":{"left":"47px","top":"70px","width":"199px","height":"36px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Fälle7"},"style":{"left":"1040px","top":"70px","width":"83px","height":"33px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iEnd","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Name","iTextFalse":"","iTextTrue":""},"style":{"left":"347px","top":"70px","width":"227px","height":"33px","z-index":"1","position":"","display":"inline-block"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"0","iShadowYOffset":"0","iShadowBlur":"0","iShadowSpread":"0","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Art"},"style":{"left":"250px","top":"70px","width":"92px","height":"36px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Fälle"},"style":{"left":"580px","top":"70px","width":"84px","height":"34px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"FällePP"},"style":{"left":"671px","top":"70px","width":"84px","height":"33px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Fälle100K"},"style":{"left":"762px","top":"70px","width":"88px","height":"33px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Todesrate"},"style":{"left":"855px","top":"70px","width":"82px","height":"33px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"0","iStateResetValueTime":"0","iNavWait":"99","iButtonCol":"#fb9898","iButtonActive":"#455618","iOpacityBack":"0","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"horizontal","iContentVertAlign":"iSpace-between","iContentOrder":"orderTextImg","iOpacityCtn":"1","iTextColor":"#ff120f","iTextSize":"23","iTextAlign":"iCenter","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#ffd1d1","iShadowInnerColorActive":"#ffd1d1","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"nav_view":"Ampel","iTextFalse":"","value":"Inzidenz","iTextTrue":"","oid":"javascript.0.CoronaDE.sort","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"630px","top":"80px","width":"67px","height":"50px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"0","iStateResetValueTime":"0","iNavWait":"99","iButtonCol":"#fb9898","iButtonActive":"#455618","iOpacityBack":"0","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"horizontal","iContentVertAlign":"iSpace-between","iContentOrder":"orderTextImg","iOpacityCtn":"1","iTextColor":"#ff120f","iTextSize":"23","iTextAlign":"iCenter","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#ffd1d1","iShadowInnerColorActive":"#ffd1d1","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"nav_view":"Ampel","iTextFalse":"","value":"Tote","iTextTrue":"","oid":"javascript.0.CoronaDE.sort","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"590px","top":"80px","width":"38px","height":"50px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":true,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"0","iStateResetValueTime":"0","iNavWait":"99","iButtonCol":"#fb9898","iButtonActive":"#455618","iOpacityBack":"0","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"horizontal","iContentVertAlign":"iSpace-between","iContentOrder":"orderTextImg","iOpacityCtn":"1","iTextColor":"#ff120f","iTextSize":"23","iTextAlign":"iCenter","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#ffd1d1","iShadowInnerColorActive":"#ffd1d1","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"nav_view":"Ampel","iTextFalse":"","value":"Fälle","iTextTrue":"","oid":"javascript.0.CoronaDE.sort","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"530px","top":"80px","width":"50px","height":"50px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"0","iStateResetValueTime":"0","iNavWait":"99","iButtonCol":"#fb9898","iButtonActive":"#455618","iOpacityBack":"0","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"horizontal","iContentVertAlign":"iSpace-between","iContentOrder":"orderTextImg","iOpacityCtn":"1","iTextColor":"#ff120f","iTextSize":"23","iTextAlign":"iCenter","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#ffd1d1","iShadowInnerColorActive":"#ffd1d1","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"nav_view":"Ampel","iTextFalse":"","value":"My","iTextTrue":"","oid":"javascript.0.CoronaDE.sort","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide"},"style":{"left":"10px","top":"80px","width":"33px","height":"50px","z-index":"1"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Tote"},"style":{"left":"945px","top":"70px","width":"88px","height":"33px","z-index":"11"},"widgetSet":"vis-inventwo"},{"tpl":"i-vis-universal","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","iUniversalWidgetType":"State","iValueType":"boolean","iStateResponseTime":"500","iStateResetValueTime":"0","iNavWait":"100","iButtonCol":"#333333","iButtonActive":"#455618","iOpacityBack":"1","iCornerRadiusUL":"0","iCornerRadiusUR":"0","iCornerRadiusLR":"0","iCornerRadiusLL":"0","iContentFlexDirection":"vertical","iContentVertAlign":"iSpace-between","iContentOrder":"orderImgText","iOpacityCtn":"1","iTextColor":"#ffffff","iTextSize":"12","iTextAlign":"iStart","iTextSpaceTop":"0","iTextSpaceBottom":"0","iTextSpaceLeft":"0","iTextSpaceRight":"0","iIconSize":"35","iImgAlign":"iCenter","iImgSpaceTop":"5","iImgSpaceBottom":"0","iImgSpaceLeft":"0","iImgSpaceRight":"0","iImgRotation":"0","iImgBlinkFalse":"0","iImgBlinkTrue":"0","iImgColorFalse":"","iImgColorTrue":"","iImgColorFalseFilter":"","iImgColorTrueFilter":"","iShadowXOffset":"2","iShadowYOffset":"2","iShadowBlur":"2","iShadowSpread":"1","iShadowColor":"#111111","iShadowColorActive":"#111111","iShadowInnerXOffset":"0","iShadowInnerYOffset":"0","iShadowInnerBlur":"0","iShadowInnerSpread":"0","iShadowInnerColor":"#111111","iShadowInnerColorActive":"#111111","iBorderSize":"0","iBorderStyle":"none","iBorderColor":"#ffffff","iBorderColorActive":"#ffffff","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,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"oid":"javascript.0.CoronaDE.sort","value":"Bewertung"},"style":{"left":"1130px","top":"70px","width":"89px","height":"33px","z-index":"11"},"widgetSet":"vis-inventwo"}]
      

      posted in JavaScript
      F
      fastfoot
    • RE: Skripte aus Backup herausholen

      @smartboart Mit diesem Skript hier aus dem Forum klappt das einwandfrei:

      /*
      https://forum.iobroker.net/topic/34161/source-code-von-script-aus-backup-json-extrahieren
      Script zum Extrahieren von Scripts aus dem backup.json file des Backitup-Adapters
      1. Verzeichnis /opt/iobroker/restore/ erstellen
      2. backup.json file aus Backup extrahieren und in obiges Verzeichnis kopieren
      3. Im Script unten den gewünschten Namen des Scripts eintragen
      3. Script starten
      4. das extrahierte Script wird mit dem Namen "the_script.js" erzeugt
      */
       
      // Hier das Verzeichnis und den Namen des Scripts eintragen. 
      // Im Beispiel das Script 'Jalousien', das unter 'common' abgelegt wurde
       
      const name_of_script = "common.Jalousien";
       
      var fs = require('fs');
      var filename = '/opt/iobroker/restore/backup.json';
      fs.readFile(filename, 'utf8', function(err, data) {
        if (!err) {
          var objects = JSON.parse(data).objects;
          var index = objects.findIndex(x => x.id ==="script.js." + name_of_script);
          var source = objects[index];
          var script_text = unescape(source.value.common.source);
          fs.writeFile("/opt/iobroker/restore/the_script.js", script_text, function(err) {
          if(err) {
              return console.log(err);
          }
          log("Script was extracted");
          });
        } else log("backup.json konnte nicht gelesen werden");
      });
      
      
      posted in ioBroker Allgemein
      F
      fastfoot
    • RE: Iobroker update per Docker

      @homoran sagte in Iobroker update per Docker:

      mein "bashing" basiert aus meinem Support hier im Forum und der Tatsache dass es immer wieder Container sind, wenn es zu Problemen kommt, die es bei Linux nativ oder einer VM nicht gibt und die "normalen" Lösungsansätze dann nicht greifen.

      ich lese diese Posts jetzt auch schon eine Zeitlang intensiv mit, da gibt es kein Problem welches die Nutzer nicht auch unter native Linux hätten, zumindest meine Einschätzung. Natürlich gibt es Besonderheiten, jedoch nicht für ein Standardsetup. Eine VM braucht Wissen über Proxmox oder andere VM Systeme, Docker nutzt man einfach mit minimalem Wissen. Die Beiträge mit Docker als Ursache sind doch auch weitaus geringer als die mit vermurksten Linux Installationen.

      Um es nochmal klar zu sagen, ich möchte nicht zu Docker überreden, jedoch gibt es sehr gute Gründe, sich eben nicht ein Zusatzsystem anzuschaffen, sondern bereits vorhandene Hardware (NAS) zu nutzen, und es stört auf Dauer wenn diese Leute behandelt werden als hätten sie nicht alle Latten am Zaun und als würden sie etwas Falsches tun

      posted in ioBroker Allgemein
      F
      fastfoot
    • RE: js-controller 3.3 jetzt im STABLE!

      @pedder007 sagte in js-controller 3.3 jetzt im STABLE!:

      Alles völlig umsonst

      Backups sind nie!!! umsonst 🙂

      posted in ioBroker Allgemein
      F
      fastfoot

    Latest posts made by fastfoot

    • RE: Textvariablen mit & - wie trennen?

      @wildbill na eigentlich sind es ja vier Lösungen, wir wollen die Blockly Lösung ja nicht unterschlagen. Aber hast Recht, nur drei sind richtig. Da @ticaki sich beharrlich weigert seine Lösung auch mal zu testen ist ihm trotz meiner Hinweise nicht aufgefallen dass sein Regex schlicht falsch ist. Da werden alle Zeichen unmittelbar vor einem Hochkomma gelöscht, die kein \ sind. aus x"xx wird somit "xx

      Mein persönlicher Favorit ist die Lösung von @haus-automatisierung , auch wenn das natürlich nur ein inoffizielles Statement ist. Die Funktion kannte ich leider gar nicht. Die jsonata Lösung ist deshalb klasse weil sie zeigt was damit alles möglich ist

      posted in JavaScript
      F
      fastfoot
    • RE: Textvariablen mit & - wie trennen?

      @ticaki das kompiliert doch so gar nicht! Der Grund ist in Zeile 2

      posted in JavaScript
      F
      fastfoot
    • RE: Textvariablen mit & - wie trennen?

      @ticaki sagte in Textvariablen mit & - wie trennen?:

      Da sollte...

      vor Allem solltest Du deine Ratschläge testen, bevor du die veröffentlichst 🙂

      posted in JavaScript
      F
      fastfoot
    • RE: Textvariablen mit & - wie trennen?

      @homoran Och, ich seh das nicht so eng, Deine Lösung ist sicher für die Blockly-Fan Gemeinde interessant. Meine ersten Gehversuche mit Javascript waren hier im Forum, mit Blockly 🙂

      posted in JavaScript
      F
      fastfoot
    • RE: Textvariablen mit & - wie trennen?

      Blockly macht mich mittlerweile ganz kirre 🙂 Alternative:

      const txtorg = "PASSKEY=xxx&stationtype=GW2000A_V3.2.2&runtime=86732&heap=82460&dateutc=2025-04-19%2018%3A57%3A39&tempinf=69.08&humidityin=43&baromrelin=29.740&baromabsin=29.740&tempf=46.40&humidity=76&vpd=0.076&winddir=304&windspeedmph=3.80&windgustmph=7.38&maxdailygust=13.65&solarradiation=0.16&uv=0&rrain_piezo=0.000&erain_piezo=0.000&hrain_piezo=0.000&drain_piezo=0.000&wrain_piezo=0.409&mrain_piezo=0.409&yrain_piezo=0.409&srain_piezo=0&ws90cap_volt=5.2&ws90_ver=133&wh90batt=3.26&freq=868M&model=GW2000A&interval=60";
      const txt = decodeURIComponent(txtorg);
      const json = '{"' + txt.replaceAll('&', '","').replaceAll('=', '":"') + '"}';
      const obj = JSON.parse(json);
      log(obj.tempf);
      log(obj.dateutc);
      log(obj.humidity);
      
      posted in JavaScript
      F
      fastfoot
    • RE: ChatGPT als Installationshilfe!

      @jey-cee Ein weiterer Punkt der mich verwirrt! Wenn ich diese LLMs selbst hoste, es gibt ja mehr als genug auf zB Github, dann brauche ich doch aber immer noch Daten um die Modelle zu füttern? Geht das dann kpl. ohne Account bei irgendeinem der Anbieter oder wie ist da dann das Szenario?

      posted in Plauderecke
      F
      fastfoot
    • RE: ChatGPT als Installationshilfe!

      @myzerat Vielen Dank für die Erläuterungen und die Benennung der Kosten! 20$ ist zwar nicht wenig, aber wenn man das so intensiv nutzt wie du das beschreibst dann scheint es wieder günstig. Jedenfalls vermittelt es mir das Gefühl fest kalkulierbare Kosten haben zu können, meine Sorge war vorher dass die Kosten ausufern könnten.

      Nun ja, ich werde vorerst kein ChatGPT nutzen, mein Hobby ist es Dinge selbst zu ergründen, aber die Kostenfrage war mir sehr wichtig. Nochmals Danke!

      posted in Plauderecke
      F
      fastfoot
    • RE: ChatGPT als Installationshilfe!

      @myzerat sagte in ChatGPT als Installationshilfe!:

      Ich lasse mir dort regelmäßig meine Befunde und Rezepte erklären

      Hast Du denn gar keine Sorge vor Datenabfluss? Das ist einer meiner Hauptgründe solche Services nicht zu nutzen. Plus, je mehr man die Systeme mit Daten(auch Fragen!) füttert, umso schlauer werden die, völlig 'kostenlos'.

      Aber das nur nebenbei, es ist natürlich toll wenn man so einen Helfer zur Hand hat wenn man ihn braucht, eine schöne Story!

      Was mich aber schon immer interessiert hat: Magst Du uns mitteilen was so eine Reparatur-Session denn monitär kostet? Oder auch so eine Erklärung deiner Befunde und Rezepte durch ChatGpt? Ich stelle mir den Gebrauch auf Monat und Jahr gerechnet irgendwie teuer vor.

      Danke schonmal für nähere Erläuterungen

      posted in Plauderecke
      F
      fastfoot
    • RE: FritzBox Onlinezeit von Teilnehmern verlängern

      @bananajoe Nee, leider nicht. Ich bin gerade in ein ZUGFeRD Projekt involviert, da bleibt kaum Zeit für etwas Anderes

      posted in Skripten / Logik
      F
      fastfoot
    • RE: io Broker Oberfläche - Passwort vergessen

      @codierknecht 100% Zustimmung. die erste Variante ist mein Default und eig. kenne ich diese Befehle nur deshalb, weil sich iobroker schon paarmal verstellt hatte bzw. installiert hatte. War aber nie nachvollziehbar und ist auch schon länger her. Das Setzen eines neuen Passwortes hab' ich nur der Vollständigkeit halber erwähnt, würde ich auch nie nutzen

      posted in ioBroker Allgemein
      F
      fastfoot
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo