Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. [Vorstellung] Meine dritte VIS

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

[Vorstellung] Meine dritte VIS

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
visvis projekte
640 Beiträge 83 Kommentatoren 185.0k Aufrufe 117 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S SARCux

    @Kuddel
    ich stelle mir eine Vis für die Küche vor (dort hängt der Sonos) und beim antippen eines Sender (wenn drei zur auswahl als Icon) das es dann über den Sonos in der Küche wiedergegeben wird

    :thinking_face:

    K Offline
    K Offline
    Kuddel
    schrieb am zuletzt editiert von
    #362

    @SARCux wenn man den Sonos in ioBroker integrieren kann, geht das bestimmt.

    Mit Sonos kenne ich mich allerdings nicht aus.

    S 1 Antwort Letzte Antwort
    0
    • K Kuddel

      @SARCux wenn man den Sonos in ioBroker integrieren kann, geht das bestimmt.

      Mit Sonos kenne ich mich allerdings nicht aus.

      S Offline
      S Offline
      SARCux
      schrieb am zuletzt editiert von
      #363

      @Kuddel

      Vorab schonmal danke für die schnellen Antworten.

      Ich warte jetzt mal auf die Lieferung des pi und gehen dann Schritt für Schritt an den io broker ran.

      Es werden dann sicherlich Fragen auftauchen, die ich ier bestimmt beantwortet bekomme.

      BG
      SARCux

      1 Antwort Letzte Antwort
      0
      • K Kuddel

        Hallo zusammen,

        nach meiner zweiten VIS folgt jetzt meine dritte VIS.

        Die größte Neuerung ist ein komplett neues Menü mit Hilfe des Top App Bar Widget. Vielen Dank an dieser Stelle an @Scrounger.

        Bestimmt sind immer noch ein paar Fehler drin, aber fertig wird man ja eh nie.

        Vieles habe ich aus meiner zweiten VIS übernommen, so dass die Screenshots aus dem Thread oben auch fast noch alle aktuell sind.

        Screenshots:


        Startseite
        90372124-cd0b-40d0-ae6e-b8286ee25672-grafik.png

        Menü
        52f11cf6-b7f3-49c8-9344-b1a0f89d0eaa-grafik.png
        e766325b-8727-48c0-b6e7-9f773f4f246b-grafik.png

        BVB Details
        423488b3-1367-4ebf-b28e-8b730970dfae-grafik.png

        Tablet Details
        ac924af2-ac1c-4069-a59e-6a68c8775a3f-grafik.png

        System -> ioBroker
        eb9f518b-c318-4a00-a66e-6879959792a4-grafik.png

        System -> Homematic
        1aaaed6f-8e59-4cdc-8bfd-c26185f1c28b-grafik.png

        System -> Netzwerk
        622fd166-ec5b-4ff3-9cbe-d5a81fd5332b-grafik.png

        System -> Geräte
        f20ab8dd-18f2-446e-94ac-55a74765e1ca-grafik.png

        Details VU
        9cdd9c50-f62a-4e3c-b01a-f911d2e8388d-grafik.png

        System -> Logs
        e190e53e-2a68-4e6d-ae7e-a48d069f809f-grafik.png

        System -> VMware
        34ffe501-5b74-4b2c-9092-2e1a8ed9f99e-grafik.png

        Erdgeschoss -> Wohnzimmer
        18c3b9dc-75e4-41c9-9338-ef3c827f4c86-grafik.png

        Garten -> Bewässerung
        160a9338-d885-42be-8ae8-2d0daa67a8f1-grafik.png

        Wetter
        840f00c2-b9bb-4f94-be9d-9bb5b0330947-grafik.png

        Staubsauger
        1343f5bc-1514-44d2-8754-9a6eff483708-grafik.png

        Echo Geräte
        aebe9414-69fe-46ef-86b9-9125b66e2f1d-grafik.png

        Mutlimedia -> TV
        d3549b5b-2178-48de-aa40-86c03343a04d-grafik.png

        Damit die Navigation und alle Widgets funktionieren, wird vor dem Import der DP

        javascript.0.VIS-Steuerung.Aktuelle_VIS_Seite
        

        benöigt.

        Ebenso sind natürlich alle von mir verwendeten Widgets wichitg:

        ad5673c8-1694-4fe5-9839-ca55c4dd920d-grafik.png
        aba96ff9-f4c4-4291-a479-95ce40906c5b-grafik.png

        Anleitung zum Import der kompletten VIS inkl. meiner Icons:


        2020-08-17-VIS_v3.zip
        Meine_Icons.zip

        1. meine_icons.zip entpacken
        2. 2020-08-17-vis_v3.zip entpacken
        3. Die beiden VIS-Datein und die den Icons Ordner zu einem neuen Zip Archiv zusammefügen
        4. Wie gewohnt das neue Archiv im VIS Editor importieren

        Anleitung zum Import meiner Skripte:


        Voraussetzung für den Skript Import

        • Adapter: Mail, Pushover
        • Objekte für meine Skripts

        Objekte anlegen

        Alle Objekte, mit denen ich in meinen Skripten arbeite, können mit einem Javascript erstellt werden:
        objekte.txt

        • Den Inhalt der TXT-Datei in ein neues Javascript kopieren
        • Das Skript starten
        • Alle Objekte werden angelegt
        • Das Skript wieder stoppen

        Import

        1. Download der Datei 2020-03-17-scripts.zip
        2. Eigene Skripte in Zip Datei exportieren
        3. Beide Archive entpacken und dann die Skripte / Gruppen in einem gemeinsamen Archiv zusammenführen
        4. Import des neu erstellten Archivs

        Bei Fragen einfach im Thread stellen ;-)

        Das nächste Projekt wird dann eine VIS fürs Smartphone

        M Offline
        M Offline
        marhal
        schrieb am zuletzt editiert von Negalein
        #364

        @Kuddel

        Hallo Kuddel,

        ich bin ja von deiner Vis begeistert und baue sie fleissig nach :) ich bin gerade bei den iobroker Adaptern und dem Javascript (adapter_infos.). Leider bekomme ich folgende Meldungen bei dem Script kannst du mir da helfen was der Fehler dort ist ?

        12:58:07.905	error	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:14:39
        12:58:07.905	error	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
        12:58:22.813	warn	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:35:18
        12:58:22.814	warn	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
        12:58:22.815	warn	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:47:19
        12:58:22.816	warn	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
        

        wäre super wenn mir da jemand helfen kann

        gruß
        Marhal

        K 1 Antwort Letzte Antwort
        0
        • M marhal

          @Kuddel

          Hallo Kuddel,

          ich bin ja von deiner Vis begeistert und baue sie fleissig nach :) ich bin gerade bei den iobroker Adaptern und dem Javascript (adapter_infos.). Leider bekomme ich folgende Meldungen bei dem Script kannst du mir da helfen was der Fehler dort ist ?

          12:58:07.905	error	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:14:39
          12:58:07.905	error	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
          12:58:22.813	warn	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:35:18
          12:58:22.814	warn	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
          12:58:22.815	warn	javascript.0 (1355) at script.js.java.abfragen.adapter_infos:47:19
          12:58:22.816	warn	javascript.0 (1355) at Object.<anonymous> (script.js.java.abfragen.adapter_infos:13:19)
          

          wäre super wenn mir da jemand helfen kann

          gruß
          Marhal

          K Offline
          K Offline
          Kuddel
          schrieb am zuletzt editiert von
          #365

          @marhal das ist meine aktuelle Version:

          // Liest die ioBroker Adapter aus und legt verschiedenen State's an.
          
          //on({id:"system.adapter.admin.0.uptime",change:'any'}, function (obj) {
          on({id:"system.adapter.admin.0.uptime",change:'any'}, function (obj) {
             createState('Adapter.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Adapter', type: 'number', unit: '', min: '0', max: '255', role: '',read: true, write: true });
             createState('Adapter.AdapterNummer', 0, { name: 'Adapter zum schalten', desc: 'Adapter zum schalten', type: 'number', unit: '', min: '0', max: '255', role: '',read: true, write: true });    
             //var counterAlt = getState("javascript.0.Adapter.Anzahl").val;
             var counter =0;
             var on = 0
             var manuell=0	
          
             var cacheSelector = $('[id=system.adapter.*.alive]');    
             cacheSelector.each(function(id, i) {        
                 var devicename = getObject(id).common.name; 
             	
             	//Instanzen ausklammern
             	instanz0 = devicename.indexOf('daswetter');
             	instanz1 = devicename.indexOf('dwd');
                 instanz2 = devicename.indexOf('ical');
             	instanz3 = devicename.indexOf('feiertage');
             	instanz4 = devicename.indexOf('snmp.1');
                 instanz5 = devicename.indexOf('vis.0');
                 instanz6 = devicename.indexOf('yamaha.0');
             	if(instanz0 !=0 && instanz1 != 0 && instanz2 !=0 && instanz3 != 0 && instanz4 != 0 && instanz5 !=0 && instanz6 !=0){
             	
             		var devicenameName=devicename;
             		var instanzname=getObject(id).common.name;
             		var test = devicenameName;
             		var devicename_array = devicenameName.split(' ');        
             		devicenameName = devicename_array[0];
             		counter = counter+1; 
             			
             		var strStatePath = "system.adapter." + devicenameName + ".alive";
             		if (isState(strStatePath, true)) {
             			var uptime = getState("system.adapter." + devicenameName + ".uptime").val;
             			var tage = Math.floor(uptime / (24*3600));
             			var stunden = Math.floor((uptime % (24*3600))/3600);
             			var minuten = Math.floor((uptime % (3600))/60);
             			//var sekunden = Math.floor(uptime % 60);      
             			if (stunden < 10) {stunden = "0"+stunden};
                         if (minuten < 10) {minuten = "0"+minuten};				
             			if (tage == 1) {uptime = tage.toString()+" Tag, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";};
             			if (tage != 1) {uptime = tage.toString()+" Tage, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";}
             			//var total = getState("system.adapter." + devicenameName + ".memHeapTotal").val;
             			//var used = getState("system.adapter." + devicenameName + ".memHeapUsed").val;
             			//var rss = getState("system.adapter." + devicenameName + ".memRss").val;
             			var connect = getState("system.adapter." + devicenameName + ".alive").val;            
          
             			if(connect == false){var con = 0;}
             			else {                
             				var con = 1;
             				var strStatePath = devicenameName + ".info.connection";
             				if (isState(strStatePath, true)) {
             					var connectS = getState(devicenameName + ".info.connection").val;
             					if (connectS == false) {
             						con = 2;
             					}                                                                        
             				} 
             			}
             			if(con==1) {on = on + 1}
             								  
             		}       
             		
             		devicename="Adapter.Adapter"+counter.toString()+".KompletterNameAdapter";
             		createState(devicename, 'empty', { name: 'Kompletter Name des Adapters', desc: '', type: 'string', role: '',read: true, write: true }); 
             		setStateDelayed(devicename, devicenameName, 800);
             		
             		var contentstring = devicenameName;
             		var suchstring = /(ical)/g; 
             		var suchergebnis = suchstring.test( contentstring );
             		
             		if (suchergebnis != true) {
             			var devicename_array = devicenameName.split('.');        
             			devicenameName = devicename_array[0];
             		}    
          
             		if (devicenameName == "daswetter") {
             			var bild = "/" + devicenameName + ".admin/" + devicenameName + "com.png";
             		} else if (suchergebnis != false) {
             			var devicename_array = devicenameName.split('.');        
             			var icalName = devicename_array[0];        
             			var bild = "/" + icalName + ".admin/" + icalName + ".png";
             		} else {
             			var bild = "/" + devicenameName + ".admin/" + devicenameName + ".png";
             		}
             		
             		//Alexa2
             		if (devicenameName == 'alexa2') {var bild = "/" + devicenameName + ".admin/" + "alexa.png";}
             		//FritzDECT
             		if (devicenameName == 'fritzdect') {var bild = "/" + devicenameName + ".admin/" + "fritzdect_logo.png";}
             		//FullyBrowser
             		if (devicenameName == 'fullybrowser') {var bild = "/" + devicenameName + ".admin/" + "fully.png";}
             		//HM-Rega
             		//if (devicenameName == 'hm-rega') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
             		if (devicenameName == 'hm-rega') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic.gif";}
             		//HomeMatic
             		//if (instanzname == 'hm-rpc.0 alive') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
             		if (instanzname == 'hm-rpc.0 alive') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic.gif";}
             		//HomeMatic-IP
             		//if (instanzname == 'hm-rpc.1 alive') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
             		if (instanzname == 'hm-rpc.1 alive') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic_ip.jpg";}
             		//UPNP
             		if (devicenameName == 'upnp') {var bild = "/" + devicenameName + ".admin/" + "upnp-discovery.png";}
                     //Pushover.1
             		if (instanzname == 'pushover.1 alive') {var bild = "/mihome-vacuum.admin/mihome-vacuum.png";}
                     //Pushover.2
             		if (instanzname == 'pushover.2 alive') {var bild = "/daswetter.admin/daswettercom.png";}
             		
          
          
                     ///////////////////////
             		//AdapterName anpassen
                     ////////////////////////
             		            
                     //DasWetter
             		if (instanzname == 'daswetter.0 alive') {devicenameName='DasWetter'; manuell=1}
             		//DWD
             		if (instanzname == 'dwd.0 alive') {devicenameName='DWD'; manuell=1}
             		//HM-REGA
             		if (instanzname == 'hm-rega.0 alive') {devicenameName='HM-Rega'; manuell=1}			
             		//HM-RPC.0
             		if (instanzname == 'hm-rpc.0 alive') {devicenameName='HomeMatic'; manuell=1}
             		//HM-RPC.1
             		if (instanzname == 'hm-rpc.1 alive') {devicenameName='HM-IP'; manuell=1}
             		//MiHome-Vacuum
             		if (instanzname == 'mihome-vacuum.0 alive') {devicenameName='Nono'; manuell=1}
             		//Pushover
             		if (instanzname == 'pushover.0 alive') {devicenameName='Pushover.0'; manuell=1}
             		if (instanzname == 'pushover.1 alive') {devicenameName='Pushover.1'; manuell=1}
             		if (instanzname == 'pushover.2 alive') {devicenameName='Pushover.2'; manuell=1}
             		//Simple-API
             		if (instanzname == 'simple-api.0 alive') {devicenameName='Simple-API'; manuell=1}
             		//SNMP.0
             		if (instanzname == 'snmp.0 alive') {devicenameName='SNMP.0'; manuell=1}
             		//SNMP.1
             		if (instanzname == 'snmp.1 alive') {devicenameName='SNMP.1'; manuell=1}
                     //Spotify
                     if (instanzname == 'spotify-premium.0 alive') {devicenameName='Spotify'; manuell=1}
                     //TR-064.0
             		if (instanzname == 'tr-064.0 alive') {devicenameName='TR-064.0'; manuell=1}
             		//TR-064.1
             		if (instanzname == 'tr-064.1 alive') {devicenameName='TR-064.1'; manuell=1}
                     //XPEnology
                     if (instanzname == 'synology.1 alive') {devicenameName='XPEnology'; manuell=1}
             		
             		
             		
             		//Instanz-Namen setzen
             		if(manuell!=1) {devicenameName = devicenameName.substring(0, 1).toUpperCase() + devicenameName.substring(1).toLowerCase();}	
                     //devicenameName = devicenameName.substring(0, 1).toUpperCase() + devicenameName.substring(1).toLowerCase();
             		devicename="Adapter.Adapter"+counter.toString()+".NameInstanz";
             		createState(devicename, 'empty', { name: 'Name des Geräts', desc: '', type: 'string', role: '',read: true, write: true }); 
             		setStateDelayed(devicename, devicenameName, 800);
             		//Bild Pfad setzen
             		devicename="Adapter.Adapter"+counter.toString()+".Bild";
             		createState(devicename, 'empty', { name: 'Speicherort Bild', desc: '', type: 'string', role: '',read: true, write: true });
             		setStateDelayed(devicename, bild, 800);
             		//Uptime setzen
             		devicename="Adapter.Adapter"+counter.toString()+".Uptime";          
             		createState(devicename, 'empty', { name: 'Uptime', desc: '', type: 'string', role: '',read: true, write: true });
             		setStateDelayed(devicename, uptime, 800);
             		//MemUsed setzen
             		//devicename="Adapter.Adapter"+counter.toString()+".MemUsed";          
             		//createState(devicename, 0, { name: 'Link MemUsed', desc: '', type: 'number', role: '',read: true, write: true });
             		//setStateDelayed(devicename, used, 800);
             		//MemToal setzen
             		//devicename="Adapter.Adapter"+counter.toString()+".MemTotal";          
             		//createState(devicename, 0, { name: 'Link MemTotal', desc: '', type: 'number', role: '',read: true, write: true });
             		//setStateDelayed(devicename, total, 800);
             		//MemRSS setzen
             		//devicename="Adapter.Adapter"+counter.toString()+".MemRSS";          
             		//createState(devicename, 0, { name: 'Link MemRSS', desc: '', type: 'number', role: '',read: true, write: true });
             		//setStateDelayed(devicename, rss, 800);
             		//Connected setzen
             		devicename="Adapter.Adapter"+counter.toString()+".Connected";          
             		createState(devicename, 0, { name: 'Status Adapter', desc: '', type: 'number', role: '',read: true, write: true });
             		setStateDelayed(devicename, con, 800);
             		
                     //Wert zurücksetzen
                     var manuell=0
             	}
             });
             
             //Adaptet Icon Übersicht
             visstatus="javascript.0.VIS-Status.alle_adapter_gestartet";
             if(on == counter){setState(visstatus, true);}
             if(on == counter -1){setState(visstatus, true);}
             if(on < counter -1){setState(visstatus, false);}
             
             
             setStateDelayed('Adapter.Anzahl', counter, 800);
          
             function isState(strStatePath, strict) {
                 let mSelector;
                 if (strict) {
                     mSelector = $('state[id=' + strStatePath + '$]');
                 } else {
                     mSelector = $('state[id=' + strStatePath + ']');
                 }
                 if (mSelector.length > 0) {
                     return true;
                 } else {
                     return false;
                 }
             }  
          }); 
          
          on({id:"javascript.0.Adapter.AdapterNummer", change: 'any'}, function (dpobj) {
             if (getState("javascript.0.Adapter.AdapterNummer").val != 0) {        
                 const instanz = "javascript." + instance;
                 var adapterNummer = getState(instanz + ".Adapter.AdapterNummer").val;
                 var adapter = getState(instanz + ".Adapter.Adapter" + adapterNummer + ".KompletterNameAdapter").val; // Name und Instanz des Adapters 
                 var idAdapter = "system.adapter." + adapter;
                 
                 var obj = getObject(idAdapter);
                 if (dpobj.state.val == false) {
                     obj.common.enabled = true;  // Adapter einschalten
                 } else if (dpobj.state.val == true) {
                     obj.common.enabled = false;  // Adapter ausschalten
                 }
                 setObject(idAdapter, obj);
                 setStateDelayed('javascript.0.Adapter.AdapterNummer', 0, 800);        
             }
          });   
          

          C M I 4 Antworten Letzte Antwort
          -2
          • K Kuddel

            @marhal das ist meine aktuelle Version:

            // Liest die ioBroker Adapter aus und legt verschiedenen State's an.
            
            //on({id:"system.adapter.admin.0.uptime",change:'any'}, function (obj) {
            on({id:"system.adapter.admin.0.uptime",change:'any'}, function (obj) {
               createState('Adapter.Anzahl', 0, { name: 'Anzahl', desc: 'Anzahl der Adapter', type: 'number', unit: '', min: '0', max: '255', role: '',read: true, write: true });
               createState('Adapter.AdapterNummer', 0, { name: 'Adapter zum schalten', desc: 'Adapter zum schalten', type: 'number', unit: '', min: '0', max: '255', role: '',read: true, write: true });    
               //var counterAlt = getState("javascript.0.Adapter.Anzahl").val;
               var counter =0;
               var on = 0
               var manuell=0	
            
               var cacheSelector = $('[id=system.adapter.*.alive]');    
               cacheSelector.each(function(id, i) {        
                   var devicename = getObject(id).common.name; 
               	
               	//Instanzen ausklammern
               	instanz0 = devicename.indexOf('daswetter');
               	instanz1 = devicename.indexOf('dwd');
                   instanz2 = devicename.indexOf('ical');
               	instanz3 = devicename.indexOf('feiertage');
               	instanz4 = devicename.indexOf('snmp.1');
                   instanz5 = devicename.indexOf('vis.0');
                   instanz6 = devicename.indexOf('yamaha.0');
               	if(instanz0 !=0 && instanz1 != 0 && instanz2 !=0 && instanz3 != 0 && instanz4 != 0 && instanz5 !=0 && instanz6 !=0){
               	
               		var devicenameName=devicename;
               		var instanzname=getObject(id).common.name;
               		var test = devicenameName;
               		var devicename_array = devicenameName.split(' ');        
               		devicenameName = devicename_array[0];
               		counter = counter+1; 
               			
               		var strStatePath = "system.adapter." + devicenameName + ".alive";
               		if (isState(strStatePath, true)) {
               			var uptime = getState("system.adapter." + devicenameName + ".uptime").val;
               			var tage = Math.floor(uptime / (24*3600));
               			var stunden = Math.floor((uptime % (24*3600))/3600);
               			var minuten = Math.floor((uptime % (3600))/60);
               			//var sekunden = Math.floor(uptime % 60);      
               			if (stunden < 10) {stunden = "0"+stunden};
                           if (minuten < 10) {minuten = "0"+minuten};				
               			if (tage == 1) {uptime = tage.toString()+" Tag, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";};
               			if (tage != 1) {uptime = tage.toString()+" Tage, "+stunden.toString()+" Std, "+minuten.toString()+" Min ";}
               			//var total = getState("system.adapter." + devicenameName + ".memHeapTotal").val;
               			//var used = getState("system.adapter." + devicenameName + ".memHeapUsed").val;
               			//var rss = getState("system.adapter." + devicenameName + ".memRss").val;
               			var connect = getState("system.adapter." + devicenameName + ".alive").val;            
            
               			if(connect == false){var con = 0;}
               			else {                
               				var con = 1;
               				var strStatePath = devicenameName + ".info.connection";
               				if (isState(strStatePath, true)) {
               					var connectS = getState(devicenameName + ".info.connection").val;
               					if (connectS == false) {
               						con = 2;
               					}                                                                        
               				} 
               			}
               			if(con==1) {on = on + 1}
               								  
               		}       
               		
               		devicename="Adapter.Adapter"+counter.toString()+".KompletterNameAdapter";
               		createState(devicename, 'empty', { name: 'Kompletter Name des Adapters', desc: '', type: 'string', role: '',read: true, write: true }); 
               		setStateDelayed(devicename, devicenameName, 800);
               		
               		var contentstring = devicenameName;
               		var suchstring = /(ical)/g; 
               		var suchergebnis = suchstring.test( contentstring );
               		
               		if (suchergebnis != true) {
               			var devicename_array = devicenameName.split('.');        
               			devicenameName = devicename_array[0];
               		}    
            
               		if (devicenameName == "daswetter") {
               			var bild = "/" + devicenameName + ".admin/" + devicenameName + "com.png";
               		} else if (suchergebnis != false) {
               			var devicename_array = devicenameName.split('.');        
               			var icalName = devicename_array[0];        
               			var bild = "/" + icalName + ".admin/" + icalName + ".png";
               		} else {
               			var bild = "/" + devicenameName + ".admin/" + devicenameName + ".png";
               		}
               		
               		//Alexa2
               		if (devicenameName == 'alexa2') {var bild = "/" + devicenameName + ".admin/" + "alexa.png";}
               		//FritzDECT
               		if (devicenameName == 'fritzdect') {var bild = "/" + devicenameName + ".admin/" + "fritzdect_logo.png";}
               		//FullyBrowser
               		if (devicenameName == 'fullybrowser') {var bild = "/" + devicenameName + ".admin/" + "fully.png";}
               		//HM-Rega
               		//if (devicenameName == 'hm-rega') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
               		if (devicenameName == 'hm-rega') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic.gif";}
               		//HomeMatic
               		//if (instanzname == 'hm-rpc.0 alive') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
               		if (instanzname == 'hm-rpc.0 alive') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic.gif";}
               		//HomeMatic-IP
               		//if (instanzname == 'hm-rpc.1 alive') {var bild = "/" + devicenameName + ".admin/" + "homematic.png";}
               		if (instanzname == 'hm-rpc.1 alive') {var bild = "/vis.0/VIS/Meine_Icons/Adapter_Icons/homematic_ip.jpg";}
               		//UPNP
               		if (devicenameName == 'upnp') {var bild = "/" + devicenameName + ".admin/" + "upnp-discovery.png";}
                       //Pushover.1
               		if (instanzname == 'pushover.1 alive') {var bild = "/mihome-vacuum.admin/mihome-vacuum.png";}
                       //Pushover.2
               		if (instanzname == 'pushover.2 alive') {var bild = "/daswetter.admin/daswettercom.png";}
               		
            
            
                       ///////////////////////
               		//AdapterName anpassen
                       ////////////////////////
               		            
                       //DasWetter
               		if (instanzname == 'daswetter.0 alive') {devicenameName='DasWetter'; manuell=1}
               		//DWD
               		if (instanzname == 'dwd.0 alive') {devicenameName='DWD'; manuell=1}
               		//HM-REGA
               		if (instanzname == 'hm-rega.0 alive') {devicenameName='HM-Rega'; manuell=1}			
               		//HM-RPC.0
               		if (instanzname == 'hm-rpc.0 alive') {devicenameName='HomeMatic'; manuell=1}
               		//HM-RPC.1
               		if (instanzname == 'hm-rpc.1 alive') {devicenameName='HM-IP'; manuell=1}
               		//MiHome-Vacuum
               		if (instanzname == 'mihome-vacuum.0 alive') {devicenameName='Nono'; manuell=1}
               		//Pushover
               		if (instanzname == 'pushover.0 alive') {devicenameName='Pushover.0'; manuell=1}
               		if (instanzname == 'pushover.1 alive') {devicenameName='Pushover.1'; manuell=1}
               		if (instanzname == 'pushover.2 alive') {devicenameName='Pushover.2'; manuell=1}
               		//Simple-API
               		if (instanzname == 'simple-api.0 alive') {devicenameName='Simple-API'; manuell=1}
               		//SNMP.0
               		if (instanzname == 'snmp.0 alive') {devicenameName='SNMP.0'; manuell=1}
               		//SNMP.1
               		if (instanzname == 'snmp.1 alive') {devicenameName='SNMP.1'; manuell=1}
                       //Spotify
                       if (instanzname == 'spotify-premium.0 alive') {devicenameName='Spotify'; manuell=1}
                       //TR-064.0
               		if (instanzname == 'tr-064.0 alive') {devicenameName='TR-064.0'; manuell=1}
               		//TR-064.1
               		if (instanzname == 'tr-064.1 alive') {devicenameName='TR-064.1'; manuell=1}
                       //XPEnology
                       if (instanzname == 'synology.1 alive') {devicenameName='XPEnology'; manuell=1}
               		
               		
               		
               		//Instanz-Namen setzen
               		if(manuell!=1) {devicenameName = devicenameName.substring(0, 1).toUpperCase() + devicenameName.substring(1).toLowerCase();}	
                       //devicenameName = devicenameName.substring(0, 1).toUpperCase() + devicenameName.substring(1).toLowerCase();
               		devicename="Adapter.Adapter"+counter.toString()+".NameInstanz";
               		createState(devicename, 'empty', { name: 'Name des Geräts', desc: '', type: 'string', role: '',read: true, write: true }); 
               		setStateDelayed(devicename, devicenameName, 800);
               		//Bild Pfad setzen
               		devicename="Adapter.Adapter"+counter.toString()+".Bild";
               		createState(devicename, 'empty', { name: 'Speicherort Bild', desc: '', type: 'string', role: '',read: true, write: true });
               		setStateDelayed(devicename, bild, 800);
               		//Uptime setzen
               		devicename="Adapter.Adapter"+counter.toString()+".Uptime";          
               		createState(devicename, 'empty', { name: 'Uptime', desc: '', type: 'string', role: '',read: true, write: true });
               		setStateDelayed(devicename, uptime, 800);
               		//MemUsed setzen
               		//devicename="Adapter.Adapter"+counter.toString()+".MemUsed";          
               		//createState(devicename, 0, { name: 'Link MemUsed', desc: '', type: 'number', role: '',read: true, write: true });
               		//setStateDelayed(devicename, used, 800);
               		//MemToal setzen
               		//devicename="Adapter.Adapter"+counter.toString()+".MemTotal";          
               		//createState(devicename, 0, { name: 'Link MemTotal', desc: '', type: 'number', role: '',read: true, write: true });
               		//setStateDelayed(devicename, total, 800);
               		//MemRSS setzen
               		//devicename="Adapter.Adapter"+counter.toString()+".MemRSS";          
               		//createState(devicename, 0, { name: 'Link MemRSS', desc: '', type: 'number', role: '',read: true, write: true });
               		//setStateDelayed(devicename, rss, 800);
               		//Connected setzen
               		devicename="Adapter.Adapter"+counter.toString()+".Connected";          
               		createState(devicename, 0, { name: 'Status Adapter', desc: '', type: 'number', role: '',read: true, write: true });
               		setStateDelayed(devicename, con, 800);
               		
                       //Wert zurücksetzen
                       var manuell=0
               	}
               });
               
               //Adaptet Icon Übersicht
               visstatus="javascript.0.VIS-Status.alle_adapter_gestartet";
               if(on == counter){setState(visstatus, true);}
               if(on == counter -1){setState(visstatus, true);}
               if(on < counter -1){setState(visstatus, false);}
               
               
               setStateDelayed('Adapter.Anzahl', counter, 800);
            
               function isState(strStatePath, strict) {
                   let mSelector;
                   if (strict) {
                       mSelector = $('state[id=' + strStatePath + '$]');
                   } else {
                       mSelector = $('state[id=' + strStatePath + ']');
                   }
                   if (mSelector.length > 0) {
                       return true;
                   } else {
                       return false;
                   }
               }  
            }); 
            
            on({id:"javascript.0.Adapter.AdapterNummer", change: 'any'}, function (dpobj) {
               if (getState("javascript.0.Adapter.AdapterNummer").val != 0) {        
                   const instanz = "javascript." + instance;
                   var adapterNummer = getState(instanz + ".Adapter.AdapterNummer").val;
                   var adapter = getState(instanz + ".Adapter.Adapter" + adapterNummer + ".KompletterNameAdapter").val; // Name und Instanz des Adapters 
                   var idAdapter = "system.adapter." + adapter;
                   
                   var obj = getObject(idAdapter);
                   if (dpobj.state.val == false) {
                       obj.common.enabled = true;  // Adapter einschalten
                   } else if (dpobj.state.val == true) {
                       obj.common.enabled = false;  // Adapter ausschalten
                   }
                   setObject(idAdapter, obj);
                   setStateDelayed('javascript.0.Adapter.AdapterNummer', 0, 800);        
               }
            });   
            

            C Offline
            C Offline
            ChrisXY
            schrieb am zuletzt editiert von
            #366

            @Kuddel hast du zufällig vom Nono ein Update mit der Room funktion ?

            K 1 Antwort Letzte Antwort
            0
            • C ChrisXY

              @Kuddel hast du zufällig vom Nono ein Update mit der Room funktion ?

              K Offline
              K Offline
              Kuddel
              schrieb am zuletzt editiert von
              #367

              @ChrisXY ne habe ich mich bis jetzt noch nicht wieder mit beschäftigt

              1 Antwort Letzte Antwort
              0
              • SlowmanS Offline
                SlowmanS Offline
                Slowman
                schrieb am zuletzt editiert von Slowman
                #368

                erledigt

                1 Antwort Letzte Antwort
                0
                • BluelinuxB Offline
                  BluelinuxB Offline
                  Bluelinux
                  schrieb am zuletzt editiert von
                  #369

                  Halli Hallo Ihr leiben,

                  erst einmal allen einen schönen Nikolaus und 2. Advent. Ich hoffe mir kann hier jemand helfen, denn ich habe ein Problem mit dem Menü in meiner VIS. Im VIS-Editor Materialdesign - Top App Bar fehlt der reiter Untermenü wie kommt das?? Habe das System gewechselt und seid dem ist das. Hat jemand eine Ahnung wo das Problem ist? Anbei ist noch ein Bild vom VIS-Editor.

                  Material kein untermenü.PNG

                  Das ganze hat zufolge, dass ich die Seiten nicht wechseln kann.

                  Grüße und vielen Dank

                  1 Antwort Letzte Antwort
                  0
                  • Holger EtzelH Offline
                    Holger EtzelH Offline
                    Holger Etzel
                    schrieb am zuletzt editiert von
                    #370

                    Hallo Kuddel,
                    schone Arbeit, gefällt mir sehr gut.
                    Habe mir die VIS für den Saugroboter geklaut und die Skripte installiert,
                    hier mal eine blöde Frage zum Blockly.
                    Bei den Zonen sind 5-Stellige Zahlen in den Variablen definiert, wo kommen diese her?
                    "app_zoned-clean [.............."
                    Irgendwie stehe ich auf dem Schlauch, oder kapiere das nicht.

                    Kannst du das etwas erklären, danke schon mal im vorraus.

                    LG
                    Holger

                    BluelinuxB 1 Antwort Letzte Antwort
                    0
                    • Holger EtzelH Holger Etzel

                      Hallo Kuddel,
                      schone Arbeit, gefällt mir sehr gut.
                      Habe mir die VIS für den Saugroboter geklaut und die Skripte installiert,
                      hier mal eine blöde Frage zum Blockly.
                      Bei den Zonen sind 5-Stellige Zahlen in den Variablen definiert, wo kommen diese her?
                      "app_zoned-clean [.............."
                      Irgendwie stehe ich auf dem Schlauch, oder kapiere das nicht.

                      Kannst du das etwas erklären, danke schon mal im vorraus.

                      LG
                      Holger

                      BluelinuxB Offline
                      BluelinuxB Offline
                      Bluelinux
                      schrieb am zuletzt editiert von
                      #371

                      @Holger-Etzel hi hi ich bin zwar nich Kuddel aber ich habe das auch versucht zu lösen. Die Koordinaten habe ich mir mit einer APP namens : FloleVac ausgelesen. Dort kann man die Stellen (Räume) in der Karte makieren und somit die daten auslesen, ABER..... offensichtlich dreht sich die Grundkarte immer mal wieder was bedeutet, das deine Koordinaten um 90° oder 180° oder 270° verdreht sind. Deswegen funktioniert die Zonenreinigung bei MIR leider nicht. Um es mal noch Plumper auszudrücken.... angenommen deine Karte wäre immer richtung Norden ausgerichtet würde es klappen aber die ist halt mal nach osten süden oder westen ausgerichtet. Ich hoffe ich konnte es ein wenig erklären

                      Grüße

                      Holger EtzelH 1 Antwort Letzte Antwort
                      0
                      • BluelinuxB Bluelinux

                        @Holger-Etzel hi hi ich bin zwar nich Kuddel aber ich habe das auch versucht zu lösen. Die Koordinaten habe ich mir mit einer APP namens : FloleVac ausgelesen. Dort kann man die Stellen (Räume) in der Karte makieren und somit die daten auslesen, ABER..... offensichtlich dreht sich die Grundkarte immer mal wieder was bedeutet, das deine Koordinaten um 90° oder 180° oder 270° verdreht sind. Deswegen funktioniert die Zonenreinigung bei MIR leider nicht. Um es mal noch Plumper auszudrücken.... angenommen deine Karte wäre immer richtung Norden ausgerichtet würde es klappen aber die ist halt mal nach osten süden oder westen ausgerichtet. Ich hoffe ich konnte es ein wenig erklären

                        Grüße

                        Holger EtzelH Offline
                        Holger EtzelH Offline
                        Holger Etzel
                        schrieb am zuletzt editiert von
                        #372

                        @Bluelinux wie kommt man dann an die Koordinaten? kann die Zonen markieren und wie geht es dann weiter?

                        1 Antwort Letzte Antwort
                        0
                        • GlasfaserG Glasfaser

                          @Urs

                          was mit "moment" und "moment-duration-format"

                          Hier eintragen :

                          .
                          1.JPG

                          K Offline
                          K Offline
                          KHK
                          schrieb am zuletzt editiert von
                          #373

                          @Glasfaser wie kann ich die Module entsprechend dem Screenshot eintragen? Irgendwie finde ich keinen Hinweis, wie ich das machen kann.
                          Habe die Version 4.10.8. Auch unter den Einstellungen sehe ich nichts!
                          Bin für jeden Hinweis dankbar....

                          NegaleinN 1 Antwort Letzte Antwort
                          0
                          • K KHK

                            @Glasfaser wie kann ich die Module entsprechend dem Screenshot eintragen? Irgendwie finde ich keinen Hinweis, wie ich das machen kann.
                            Habe die Version 4.10.8. Auch unter den Einstellungen sehe ich nichts!
                            Bin für jeden Hinweis dankbar....

                            NegaleinN Offline
                            NegaleinN Offline
                            Negalein
                            Global Moderator
                            schrieb am zuletzt editiert von
                            #374

                            @KHK sagte in [Vorstellung] Meine dritte VIS:

                            Bin für jeden Hinweis dankbar....

                            du öffnest die Instanz javascript.0
                            Dann schreibst du in die Zeile mit den Modulen einfach moment-duration-format rein und drückst Enter.

                            Screenshot_2020-12-12 instances - ioBroker.png

                            ° Node.js: 20.17.0 NPM: 10.8.2
                            ° Proxmox, Ubuntu 22.04.3 LTS
                            ° Fixer ---> iob fix

                            1 Antwort Letzte Antwort
                            0
                            • K Kuddel

                              @derIOalex und @Mautz der von euch genannte DP muss auf der Startseite_0000 im Widget !View_Anzeige eingetragen werden

                              ab292a65-6420-4c66-ba60-1a202a620917-grafik.png

                              K Offline
                              K Offline
                              KHK
                              schrieb am zuletzt editiert von KHK
                              #375

                              @Kuddel
                              Ich versuche gerade das Prinzip des Menü-Widget zu verstehen, aber habe ein paar Probleme.

                              Dazu habe ich mir mal ein paar Screenshots gemacht. Wenn ich im importierten VIS über das Menü einen Menüpkt aufrufe, dann steht in der DP bei mir "true" und die aufgerufene Seite ist laut Titel da, aber der Inhalt fehlt.
                              d2bf3e82-c416-4656-80d7-53bef1340a61-grafik.png

                              Wenn ich dann die gleich Seite über den Button auf der Startseite aufrufe, dann wird die Seit ekorrekt angezeigt und in dem DP ist die Seitenzahl auch abgelegt.

                              6ede8877-bf24-480c-8499-aff312225856-grafik.png

                              Wo ist im Menü hinterlegt, dass bei Aufruf einer Seite diese auch aufgerufen wird. In dem widegt8 finde ich unter "VIEW" die hinterlegten views...Dort sehe ich dass unter "ALLGEMEIN" als Objekt ID auch dieser neu erstellte DP "javascript.0.VIS-Steuerung.Aktuelle_VIS_Seite" hinterlegt ist - genauso wie unter dem "Top App Bar Nav Drawer" dieser DP hinterlegt ist.

                              Wieso erscheinen aber bei den unterschiedlichen Aufrufen zwei verschiedene Werte ?

                              Karl

                              K 1 Antwort Letzte Antwort
                              0
                              • K Kuddel

                                @SARCux was genau meinst du mit "Klappt das auch mit Sonos und Alexa"?

                                Ich habe keine Sonos Geräte, nutze aber verschiedene Echode Devices zur Steuerung.

                                K Offline
                                K Offline
                                KHK
                                schrieb am zuletzt editiert von KHK
                                #376

                                @Kuddel
                                Hallo, ich versuch emich ein wenig in deine VIS einzuarbeiten, aber da ich noch nicht lange mit ioBroker und auch Javascript was gemacht habe, treten immer wieder viele ? auf.
                                Heute eins bei deinem Script (aus dem Paket bzw. dem hier eingefügten Update) "adapter_infos".
                                3c78dce6-6ec1-4c4f-87f3-aea86be19235-grafik.png

                                Wo finde ich diese ID? im admin-adapter bei mir ist keine solche ID vorhanden?

                                Eine andere Frage - wo finde ich die Berechnung der Zeiten deines ASTRO-views (Sonnenaufgang, Sonnenuntergang, Tageslänge, Nachtlänge)?

                                Karl

                                K 1 Antwort Letzte Antwort
                                0
                                • K KHK

                                  @Kuddel
                                  Ich versuche gerade das Prinzip des Menü-Widget zu verstehen, aber habe ein paar Probleme.

                                  Dazu habe ich mir mal ein paar Screenshots gemacht. Wenn ich im importierten VIS über das Menü einen Menüpkt aufrufe, dann steht in der DP bei mir "true" und die aufgerufene Seite ist laut Titel da, aber der Inhalt fehlt.
                                  d2bf3e82-c416-4656-80d7-53bef1340a61-grafik.png

                                  Wenn ich dann die gleich Seite über den Button auf der Startseite aufrufe, dann wird die Seit ekorrekt angezeigt und in dem DP ist die Seitenzahl auch abgelegt.

                                  6ede8877-bf24-480c-8499-aff312225856-grafik.png

                                  Wo ist im Menü hinterlegt, dass bei Aufruf einer Seite diese auch aufgerufen wird. In dem widegt8 finde ich unter "VIEW" die hinterlegten views...Dort sehe ich dass unter "ALLGEMEIN" als Objekt ID auch dieser neu erstellte DP "javascript.0.VIS-Steuerung.Aktuelle_VIS_Seite" hinterlegt ist - genauso wie unter dem "Top App Bar Nav Drawer" dieser DP hinterlegt ist.

                                  Wieso erscheinen aber bei den unterschiedlichen Aufrufen zwei verschiedene Werte ?

                                  Karl

                                  K Offline
                                  K Offline
                                  Kuddel
                                  schrieb am zuletzt editiert von
                                  #377

                                  @KHK es sieht für mich so aus, als wenn im Menü der DP nicht korrekt hinterlegt ist.

                                  Schaue mal ob du da auch "Aktuell_VIS_Seite" eingestellt hast

                                  K 1 Antwort Letzte Antwort
                                  0
                                  • K KHK

                                    @Kuddel
                                    Hallo, ich versuch emich ein wenig in deine VIS einzuarbeiten, aber da ich noch nicht lange mit ioBroker und auch Javascript was gemacht habe, treten immer wieder viele ? auf.
                                    Heute eins bei deinem Script (aus dem Paket bzw. dem hier eingefügten Update) "adapter_infos".
                                    3c78dce6-6ec1-4c4f-87f3-aea86be19235-grafik.png

                                    Wo finde ich diese ID? im admin-adapter bei mir ist keine solche ID vorhanden?

                                    Eine andere Frage - wo finde ich die Berechnung der Zeiten deines ASTRO-views (Sonnenaufgang, Sonnenuntergang, Tageslänge, Nachtlänge)?

                                    Karl

                                    K Offline
                                    K Offline
                                    Kuddel
                                    schrieb am zuletzt editiert von
                                    #378

                                    @KHK

                                    Du musst die Expertenansicht aktivieren (siehe der Roten Butto)
                                    b5267c0c-536d-4e11-b9b6-2d4e394a2ac3-grafik.png

                                    Die Zeiten sind entweder im Rolladen-Skript oder im Skript "Zeiten"

                                    C 1 Antwort Letzte Antwort
                                    0
                                    • K Kuddel

                                      @KHK

                                      Du musst die Expertenansicht aktivieren (siehe der Roten Butto)
                                      b5267c0c-536d-4e11-b9b6-2d4e394a2ac3-grafik.png

                                      Die Zeiten sind entweder im Rolladen-Skript oder im Skript "Zeiten"

                                      C Offline
                                      C Offline
                                      cTech
                                      schrieb am zuletzt editiert von
                                      #379

                                      @Kuddel
                                      Kannst du einmal bitte mitteilen, wie du das im Adapter Parser ausgefüllt hast? Da komme ich irgendwie nicht weiter. Besten Dank

                                      K 1 Antwort Letzte Antwort
                                      0
                                      • C cTech

                                        @Kuddel
                                        Kannst du einmal bitte mitteilen, wie du das im Adapter Parser ausgefüllt hast? Da komme ich irgendwie nicht weiter. Besten Dank

                                        K Offline
                                        K Offline
                                        Kuddel
                                        schrieb am zuletzt editiert von
                                        #380

                                        @cTech was genau wills du wissen? welcher Anwendungsfall ?

                                        C 1 Antwort Letzte Antwort
                                        0
                                        • K Kuddel

                                          @cTech was genau wills du wissen? welcher Anwendungsfall ?

                                          C Offline
                                          C Offline
                                          cTech
                                          schrieb am zuletzt editiert von
                                          #381

                                          @Kuddel genau wie du, die Bahnverspätungen anzeigen lassen ;) Aber mit dem Adapter komme ich nicht klar, was dort eingetragen werden muss

                                          K 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          656

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe