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. Tester
  4. Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)

NEWS

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

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

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

Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)

Geplant Angeheftet Gesperrt Verschoben Tester
appdark-modeiqontrolresponsivevisvisualisierungvisualizationwidget
7.6k Beiträge 296 Kommentatoren 7.0m Aufrufe 201 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.bormannS s.bormann

    @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

    Hi zusammen,

    ich bastle mir gerade eine automatisierte Bewässerung.

    Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
    Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
    Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

    Der Datenpunkt ist als state / Time festgelegt.

    Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

    a365b4f0-2a65-444f-914d-fed9ab346831-image.png

    Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

    B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

    https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

    VG!

    M Offline
    M Offline
    muuulle
    schrieb am zuletzt editiert von
    #5537

    @s-bormann said in Test Adapter iQontrol 1.8.x Vis:

    @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

    Hi zusammen,

    ich bastle mir gerade eine automatisierte Bewässerung.

    Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
    Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
    Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

    Der Datenpunkt ist als state / Time festgelegt.

    Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

    a365b4f0-2a65-444f-914d-fed9ab346831-image.png

    Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

    B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

    https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

    VG!

    Moin,
    bitte beachten, dass der max. Wert des Datenpunkts der Zeit nicht beschränkt ist. Ansonsten funktioniert das nicht und der Wert des Datenpunkts wird auf 1 gesetzt.

    Gruß

    P 1 Antwort Letzte Antwort
    0
    • B blackeagle998

      @meerkat
      Kannst du mal dein komplettes Skript Aussenanlage.vacuum_eg hier posten, dann kann ich vielleicht helfen.

      M Offline
      M Offline
      meerkat
      schrieb am zuletzt editiert von meerkat
      #5538

      @blackeagle998
      klar, kein Problem. Ist 1zu1 das Script aus deiner ZIP-Datei. Hat halt nur einen anderen Namen.

      // jshint maxerr:1000
      const dp_vacuum_state               = 'mihome-vacuum.0.info.state';
      const dp_vacuum_map                 = 'mihome-vacuum.0.map.map64';
      
      const dp_vacuum_emptying_spot       = '0_userdata.0.vacuum.emptying_spot';
      const dp_vacuum_html                = '0_userdata.0.vacuum.html';
      const dp_vacuum_iqontrol_ip         = '0_userdata.0.vacuum.iqontrol_ip';
      const dp_vacuum_map_hide            = '0_userdata.0.vacuum.map_hide';
      const dp_vacuum_map_rotate          = '0_userdata.0.vacuum.map_rotate';
      const dp_vacuum_room_clean          = '0_userdata.0.vacuum.room_clean';
      const dp_vacuum_room_clean_active   = '0_userdata.0.vacuum.room_clean_active';
      const dp_vacuum_popup_message       = '0_userdata.0.vacuum.popup_message';
      
      const dp_vacuum_control_start       = 'mihome-vacuum.0.control.start';
      const dp_vacuum_control_pause       = 'mihome-vacuum.0.control.pause';
      const dp_vacuum_control_home        = 'mihome-vacuum.0.control.home';
      const dp_vacuum_control_goTo        = 'mihome-vacuum.0.control.goTo';
      const dp_vacuum_control_clearQueue  = 'mihome-vacuum.0.control.clearQueue';
      
      var arr_vacuum_rooms            = [];
      var arr_vacuum_onID             = [];
      var arr_vacuum_onID_button      = [];
      var arr_vacuum_onID_consumer    = [];
      var arr_vacuum_onID_room_states = [];
      
      fctInit();
      
      on({id:arr_vacuum_onID, change:'ne'} , function (dp) {
          getRoomState();
      });
      
      on({id:arr_vacuum_onID_consumer, change:'ne'} , function (dp) {
          getRoomState();
      });
      
      on({id:arr_vacuum_onID_room_states, change: 'any'}, function () {
          getRoomState();
      });
      
      on({id:arr_vacuum_onID_button} , function (dp) {
          getRoomState();
      });
      
      on({id:dp_vacuum_room_clean, change:'ne'} , function (dp) {
          startRoomClean(dp.state.val);
          setState(dp.id, '');
      });
      
      on({id:dp_vacuum_popup_message, change:'ne'} , function (dp) {
          showPopup(dp.state.val);
          setState(dp.id, '');
      });
      
      function fctInit(){
          if (existsAdapter()){
              createVacuumStates();
              if (existsIP()){
                  arr_vacuum_rooms = initRooms();
                  if (arr_vacuum_rooms.length !== 0){
                      fctInitOnID();
                      setTimeout(function(){
                          getRoomState();
                      },2000);
                  }else{
                      log('In der Objektstruktur \'mihome-vacuum.0.rooms\' wurden keine Räume gefunden.', 'warn');    
                  }
              }else{
                  log('Bitte geben Sie im Datenpunkt ' + dp_vacuum_iqontrol_ip + ' eine gültige IP-Adresse ein.', 'warn');    
              }
          }else{
              log('Der Adapter \'mihome-vacuum\' scheint nicht installiert zu sein (Datenpunkt \'' + dp_vacuum_state + '\' nicht gefunden.', 'error');
          }
      }
      
      function fctInitOnID(){
          arr_vacuum_onID.push(dp_vacuum_state);
          arr_vacuum_onID.push(dp_vacuum_map_hide);
          arr_vacuum_onID.push(dp_vacuum_map_rotate);
          arr_vacuum_onID.push(dp_vacuum_emptying_spot);
          arr_vacuum_onID.push('mihome-vacuum.0.info.connection');
          arr_vacuum_onID.push('mihome-vacuum.0.info.error');
          arr_vacuum_onID.push('mihome-vacuum.0.info.battery');
          arr_vacuum_onID.push('mihome-vacuum.0.info.queue');
          
          arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.filter');
          arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.main_brush');
          arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.sensors');
          arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.side_brush');
          arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.water_filter');
      
          arr_vacuum_onID_button.push(dp_vacuum_control_start);
          arr_vacuum_onID_button.push(dp_vacuum_control_pause);
          arr_vacuum_onID_button.push(dp_vacuum_control_home);
          arr_vacuum_onID_button.push(dp_vacuum_control_clearQueue);
          
          for (let i = 0; i < arr_vacuum_rooms.length; i++){
              arr_vacuum_onID_room_states.push(arr_vacuum_rooms[i].id + '.state');
          }
      }
      
      function createVacuumStates(){
          if(!existsState(dp_vacuum_emptying_spot)) {
              createState(dp_vacuum_emptying_spot,
                  {type: 'string', name: 'Koordinaten Entleerung', role: 'value', read: true , write: true , def: ''}
              );
          }
          if(!existsState(dp_vacuum_html)) {
              createState(dp_vacuum_html,
                  {type: 'string', name: 'html', role: 'value', read: true , write: true , def: ''}
              );
          }
          if(!existsState(dp_vacuum_iqontrol_ip)) {
              createState(dp_vacuum_iqontrol_ip,
                  {type: 'string', name: 'IP iQontrol', role: 'value', read: true , write: true , def: '192.x.x.x'}
              );
          }
          if(!existsState(dp_vacuum_map_hide)) {
              createState(dp_vacuum_map_hide,
                  {type: 'boolean', name: 'Karte verstecken', role: 'switch', read: true , write: true , def: true}
              );
          }
          if(!existsState(dp_vacuum_map_rotate)) {
              createState(dp_vacuum_map_rotate,
                  {type: 'number', name: 'Karte x° drehen', role: '', read: true , write: true , def: 0,
                      states: {
                          "0": "keine Drehung",
                          "90": "90° Drehung",
                          "180": "180° Drehung",
                          "270": "270° Drehung"
                      }
                  }
              );
          }
          if(!existsState(dp_vacuum_room_clean)) {
              createState(dp_vacuum_room_clean,
                  {type: 'string', name: 'Raum Reinigung', role: 'value', read: true , write: true , def: ''}
              );
          }
          if(!existsState(dp_vacuum_room_clean_active)) {
              createState(dp_vacuum_room_clean_active,
                  {type: 'string', name: 'Raum Reinigung aktiv', role: 'value', read: true , write: true , def: ''}
              );
          }
          if(!existsState(dp_vacuum_popup_message)) {
              createState(dp_vacuum_popup_message,
                  {type: 'string', name: 'Popup Nachricht', role: 'value', read: true , write: true , def: ''}
              );
          }
      }
      
      function getRoomState(){
          if (existsAdapter()){
              if (existsIP()){
                  let room_active = false;;
      
                  for (let i = 0; i < arr_vacuum_rooms.length; i++){
                      let str_state = getState(arr_vacuum_rooms[i].id + '.state').val;
      
                      if (str_state == 'sauge Zimmer'){
                          setState(dp_vacuum_room_clean_active, arr_vacuum_rooms[i].name);
                          arr_vacuum_rooms[i].state = 'active';
                          room_active = true;
                      }else{
                          if (str_state.indexOf('Warteposition') + 1 > 0) {
                              let queue_position = str_state.slice(-1).charAt(0);
                              arr_vacuum_rooms[i].state = queue_position;
                          }else{
                              arr_vacuum_rooms[i].state = 'inactive';
                          }
                      }
                  }
                  if (!room_active){
                      setState(dp_vacuum_room_clean_active, '');
                  }
                  setState(dp_vacuum_html, createVacuumHTML());
              }else{
                  log('Bitte geben Sie im Datenpunkt ' + dp_vacuum_iqontrol_ip + ' eine gültige IP-Adresse ein.', 'warn');    
              }
          }else{
              log('Der Adapter \'mihome-vacuum\' scheint nicht installiert zu sein (Datenpunkt \'' + dp_vacuum_state + '\' nicht gefunden.', 'error');
          }
      }
      
      function createVacuumHTML() {
          let css_file            = './../iqontrol.meta/userimages/userwidgets/vacuum.css';
          let js_file             = './../iqontrol.meta/userimages/userwidgets/vacuum.js';
          let ip                  = getState(dp_vacuum_iqontrol_ip).val;
          let emptying_spot       = getState(dp_vacuum_emptying_spot).val;
          let map_link            = 'http://' + ip + ':8082/mihome-vacuum.admin/actualMap_0.png?' + Math.random();
          
          let str_html            = '';
          let str_html_head       = '';
          let str_html_error      = '';
          
          let img_blank           = './images/icons/blank.png';
          let img_vacuum          = './../iqontrol.meta/userimages/usericons/vacuum/vacuum.png';
          let img_wifi            = './../iqontrol.meta/userimages/usericons/vacuum/wifi.png';
          let img_wifi_disconnected = './../iqontrol.meta/userimages/usericons/vacuum/wifi_disconnected.png';
          let img_clear_queue     = './../iqontrol.meta/userimages/usericons/vacuum/clear_queue.png';
          let img_back_home       = './../iqontrol.meta/userimages/usericons/vacuum/back_home.png';
          let img_pause_cleaning  = './../iqontrol.meta/userimages/usericons/vacuum/pause_cleaning.png';
          let img_resume_cleaning = './../iqontrol.meta/userimages/usericons/vacuum/resume_cleaning.png';
          let img_trashcan        = './../iqontrol.meta/userimages/usericons/vacuum/trashcan.png';
          let gif_sirene          = './../iqontrol.meta/userimages/usericons/vacuum/sirene.gif';
          
          str_html_head = str_html_head + '<head><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">';
          str_html_head = str_html_head + '<link rel="stylesheet" href="' + css_file + '" />';
          str_html_head = str_html_head + '<script type="text/javascript" src="' + js_file + '"></script>';
          str_html_head = str_html_head + '</head>';
      
          str_html = str_html_head + '<body>';
      
          //Box Error
          let vacuum_error = getState('mihome-vacuum.0.info.error').val;
          if (vacuum_error !== 0){
              str_html_error = str_html_error + '<div class="box_row">';
              str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
              str_html_error = str_html_error + '<label class="box_row" id="box_sirene_value">';
              str_html_error = str_html_error + getStatetxt('mihome-vacuum.0.info.error', vacuum_error);
              str_html_error = str_html_error + '</label>';
              str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
              str_html_error = str_html_error + '</div>';
              str_html_error = str_html_error + '</div>';
          }else{
              let str_consumer    = '';
              let consumer_limit  = 10;
              
              for (let i = 0; i < arr_vacuum_onID_consumer.length; i++){
                  if (getState(arr_vacuum_onID_consumer[i]).val < consumer_limit){
                      if (str_consumer !== ''){
                          str_consumer = str_consumer + ', ' + arr_vacuum_onID_consumer[i];
                      }else{
                          str_consumer = arr_vacuum_onID_consumer[i];
                      }
                      
                  }
              }
              
              if (str_consumer !== ''){
                  str_consumer = str_consumer.replace(/mihome-vacuum.0.consumable./g, '');
                  str_html_error = str_html_error + '<div class="box_row" id="box_consumer">';
                  str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                  str_html_error = str_html_error + '<div class="box_column">';
                  str_html_error = str_html_error + '<label class="box_row" id="box_consumer_value_headline">Bitte reinigen:</label>';
                  str_html_error = str_html_error + '<label class="box_row" id="box_consumer_value">' + str_consumer + '</label>';
                  str_html_error = str_html_error + '</div>';
                  str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                  str_html_error = str_html_error + '</div>';
                  str_html_error = str_html_error + '</div>';
              }else{
                  str_html_error = str_html_error + '<div class="box_column"></div>';
              }
          }
      
          //Box 1 = Alarm
          str_html = str_html + str_html_error;
      
          //Box 2 = Statusangaben
          let vacuum_state        = getState(dp_vacuum_state).val;
          let vacuum_state_txt    = getStatetxt(dp_vacuum_state, vacuum_state);
          
          str_html = str_html + '<div class="box_column" id="box_states">';
          str_html = str_html + '<div class="box_row">';
          str_html = str_html + '<div class="box_row" id="box_state">Status:</div>';
          str_html = str_html + '<div class="box_row" id="box_battery">Batterie:</div>';
          str_html = str_html + '<div class="box_row" id="box_connection">Verbindung:</div>';
          str_html = str_html + '</div>';
      
          str_html = str_html + '<div class="box_row">';
          str_html = str_html + '<div class="box_row" id="box_state_value"><center>' + vacuum_state_txt;
          let str_active_room = getState(dp_vacuum_room_clean_active).val;
          if (str_active_room !== ''){
              str_html = str_html + '</br>(' + str_active_room + ')';
          }
          
          str_html = str_html + '</center></div>';
          str_html = str_html + '<div class="box_row" id="box_battery_value">' + getState('mihome-vacuum.0.info.battery').val + '%</div>';
          str_html = str_html + '<div class="box_row" id="box_connection_value">';
          if (getState('mihome-vacuum.0.info.connection').val == true){
              str_html = str_html + '<img class="img_wifi" src="' + img_wifi + '" />';
          }else{
              str_html = str_html + '<img class="img_wifi" src="' + img_wifi_disconnected + '" />';
          }
          str_html = str_html + '</div>';
          str_html = str_html + '</div>';
          str_html = str_html + '</div>';
      
          //Box 3 = Raumauswahl und Warteschlange
          str_html = str_html + '<div class="box_row" id="box_rooms_and_controls">';
          str_html = str_html + '<div class="box_column" id="box_room_selection">';
          str_html = str_html + '<div class="box_row"><label class="lbl_room_selection">Raumauswahl:</label></div>';
          str_html = str_html + '<div class="box_row"><form name="rooms">';
          str_html = str_html + '<select name="room" id="room">';
          str_html = str_html + '<option selected>bitte wählen...</option>';
      
          let arr_vacuum_rooms_sort = [];
          for (let i = 0;i < arr_vacuum_rooms.length; i++){
              arr_vacuum_rooms_sort.push(arr_vacuum_rooms[i].name);
          }
          arr_vacuum_rooms_sort.sort();
          arr_vacuum_rooms_sort.push('Komplettreinigung');
      
          for (let j = 0; j < arr_vacuum_rooms_sort.length; j++){
              str_html = str_html + '<option>' + arr_vacuum_rooms_sort[j] + '</option>';
          }
          str_html = str_html + '</select>';
          str_html = str_html + '</form></div>'; 
      
          let str_html_queue = getQueue();
          if (str_html_queue !== ''){
              str_html = str_html + '<div class="box_column" id="box_queue">';
              str_html = str_html + '<div class="box_column">';
              str_html = str_html + '<div class="box_row" id="box_queue_headline">';
              str_html = str_html + '<div><label class="lbl_queue_headline"><center>Warteschlange</center></label></div>';
              str_html = str_html + '<div><input type="image" class="img_queue_clear" onclick="setState(\'' + dp_vacuum_control_clearQueue + '\', true)" src="' + img_clear_queue + '" /></div>';
              str_html = str_html + '</div>';
              str_html = str_html + '<div class="box_column" id="box_queue_rooms">';
              str_html = str_html + str_html_queue;
              str_html = str_html + '</div>';
              str_html = str_html + '</div>';
              str_html = str_html + '</div>';
          }
          str_html = str_html + '</div>';
      
          //Box 4 = Steuerung, aktiver Raum und Karte
          str_html = str_html + '<div class="box_column" id="box_controls_and_active_room">';
          str_html = str_html + '<div class="box_row" id="box_controls">';
          str_html = str_html + '<input type="image" class="img_control"';
          str_html = str_html + 'onclick="setState(\'' + dp_vacuum_room_clean + '\', document.rooms.room.options[document.rooms.room.selectedIndex].text)" ';
          str_html = str_html + 'src="' + img_vacuum + '" />';
          if ((vacuum_state_txt !== 'Unknown') && (vacuum_state_txt !== 'Initiating') && (vacuum_state_txt !== '?') && (vacuum_state_txt !== 'Charging') && (vacuum_state_txt !== 'Charging Error') && (vacuum_state_txt !== 'Pause') && (vacuum_state_txt !== 'In Error') && (vacuum_state_txt !== 'Sleeping')){
              str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_pause + '\', true)" src="' + img_pause_cleaning + '" />';
          }else{
              str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
          }
          if ((vacuum_state_txt == 'Sleeping') || (vacuum_state_txt == 'Waiting') || (vacuum_state_txt == 'Pause')){
              str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_start + '\', true)" src="' + img_resume_cleaning + '" />';
          }else{
              str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
          }
          if ((vacuum_state_txt !== 'Unknown') && (vacuum_state_txt !== 'Initiating') && (vacuum_state_txt !== '?') && (vacuum_state_txt !== 'Charging') && (vacuum_state_txt !== 'Charging Error') && (vacuum_state_txt !== 'In Error')){
              str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_home + '\', true)" src="' + img_back_home + '" />';
          }else{
              str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
          }
          if (emptying_spot !== ''){
              str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_goTo + '\', \'' + emptying_spot + '\')" src="' + img_trashcan + '" />';
          }else{
              str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
          }
          str_html = str_html + '</div>';
          
          let map_rotate = getState(dp_vacuum_map_rotate).val;
          if (vacuum_state_txt !== 'Charging'){
              str_html = str_html + '<div class="box_row" id="box_map">';
              if (map_rotate !== 0){
                  str_html = str_html + '<img id="img_map" style="transform: rotate(' + map_rotate + 'deg)" src="' + map_link + '" />';
              }else{
                  str_html = str_html + '<img id="img_map" src="' + map_link + '" />';
              }
              str_html = str_html + '</div>';
              str_html = str_html + '<script type="text/javascript">';
              str_html = str_html + 'startMapReload("' + map_link + '")';
              str_html = str_html + '</script>';
          }else{
              if (getState(dp_vacuum_map_hide).val){
                  str_html = str_html + '<div class="box_row" id="box_map">';
                  str_html = str_html + '</div>';
              }else{
                  str_html = str_html + '<div class="box_row" id="box_map">';
                  if (map_rotate !== 0){
                      str_html = str_html + '<img id="img_map" style="transform: rotate(' + map_rotate + 'deg)" src="' + map_link + '" />';
                  }else{
                      str_html = str_html + '<img id="img_map" src="' + map_link + '" />';
                  }
                  str_html = str_html + '</div>';
              }
              str_html = str_html + '<script type="text/javascript">';
              str_html = str_html + 'endMapReload()';
              str_html = str_html + '</script>';
          }
          str_html = str_html + '</div>';
          str_html = str_html + '</div>';
          str_html = str_html + '</body>';
      	return str_html;
      }
      
      function getQueue(){
          let str_html = '';
          let arr_temp = [];
      
          for (let i = 0; i < arr_vacuum_rooms.length; i++){
              let str_state = arr_vacuum_rooms[i].state;
              if ((str_state !== '') && (str_state !== 'active') && (str_state !== 'inactive')){
                  arr_temp[parseInt(str_state)] = arr_vacuum_rooms[i].name;
              }
          }
          
          if (arr_temp.length !== 0){
              for (let j = 0; j < arr_temp.length; j++){
                  str_html = str_html + '<label class="lbl_queue_room">' + (j + 1) + '. ' + arr_temp[j] + '</label>';
              }
          }
      
          return str_html;
      }
      
      function startRoomClean(room){
          if ((room !== null) && (room !== undefined)){
              if ((room !== '') && (room !== 'bitte wählen...')){
                  if (room !== 'Komplettreinigung'){
                      for (let i = 0; i < arr_vacuum_rooms.length; i++){
                          if (arr_vacuum_rooms[i].name == room){
                              let str_state = arr_vacuum_rooms[i].state;
                              if (str_state == 'inactive'){
                                  setState(dp_vacuum_popup_message, room  + ' wird zur Reinigung hinzugefügt.');
                                  setState(arr_vacuum_rooms[i].id + '.roomClean', true);
                              }else{
                                  if (str_state == 'active'){
                                      setState(dp_vacuum_popup_message, room  + ' wird bereits gesaugt.');
                                  }else{
                                      setState(dp_vacuum_popup_message, room  + ' befindet sich bereits in der Warteschlange.');
                                  }
                              }
                          }
                      }
                  }else{
                      let vacuum_state        = getState(dp_vacuum_state).val;
                      let vacuum_state_txt    = getStatetxt(dp_vacuum_state, vacuum_state);
                      let popup_message       = '';
                      
                      if (vacuum_state_txt !== 'Charging'){
                          popup_message = 'Die Komplettreinigung kann nur gestartet werden, wenn sich der Staubsaugerroboter auf der Ladestation befindet.';
                      }else{
                          popup_message = 'Komplettreiniguung gestartet';
                          setState(dp_vacuum_control_start, true);
                      }
                      setState(dp_vacuum_popup_message, popup_message);
                  }
              }
          }else{
              log('An die Funktion startRoomClean wurde ein NULL/UNDEFINED Wert übergeben.', 'warn');
          }
      }
      
      function initRooms(){
          let arr_rooms           = [];
          let arr_rooms_states    = [];
      
          // Ermittle alle States unterhalb der Struktur mihome-vacuum.0.rooms.room*
          arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.room*"));
          if (arr_rooms_states.length !== 0){
              for (let i = 0; i < arr_rooms_states.length; i++){
                  let room_id     = arr_rooms_states[i].slice(0, arr_rooms_states[i].lastIndexOf("."));
                  let room_name   = getObject(room_id).common.name;
                  let found = false
                  if (arr_rooms.length !== 0){
                      for (let j = 0; j < arr_rooms.length; j++){
                          if (arr_rooms[j].name == room_name){
                              found = true;
                          }
                      }
                  }
                  if (!found){
                      let obj_room = {};
                      obj_room.id     = room_id;
                      obj_room.name   = room_name;
                      obj_room.state  = 'inactive';
                      arr_rooms.push(obj_room);
                  }
              }
          }
          return arr_rooms;
      }
      
      function existsAdapter() {
          if (existsState(dp_vacuum_state)){
              return true;
          }else{
              return false;   
          }
      }
      
      function existsIP() {
          if (existsState(dp_vacuum_iqontrol_ip)){
              let str_ip = getState(dp_vacuum_iqontrol_ip).val;
              if ((str_ip !== '') && (str_ip !== '192.x.x.x')){
                  return true;
              }else{
                  return false;
              }
          }else{
              return false;   
          }
      }
      
      function showPopup(message){
          if (message !== ''){
              sendTo("iqontrol.0", "send", {
                  PopupMessage: message,
                  PopupDuration: 5000
              });
          }
      }
      
      function getStatetxt(id, val) {
          let states = getStatesObj(id);
          if(states) return states[val];
          else return null;
      }
      
      function getStatesObj(id) {
          if(!getObject(id)) {
              log(id + ': kein Objekt', 'warn');
              return null;
          }
          let obj = getObject(id);
          if (!obj.common.states) {
              log(id + ': keine Zustandtexte', 'warn');
              return null;
          }
          var states = obj.common.states;
          if (typeof states == 'string') {
              var arr = states.split(';');
              states = {};
              for(var i = 0; i < arr.length; i++) {
                  var ele = arr[i].split(':');
                  states[ele[0]] = ele[1];
              }
          }
          return states;
      }
      
      B 1 Antwort Letzte Antwort
      0
      • M meerkat

        @blackeagle998
        klar, kein Problem. Ist 1zu1 das Script aus deiner ZIP-Datei. Hat halt nur einen anderen Namen.

        // jshint maxerr:1000
        const dp_vacuum_state               = 'mihome-vacuum.0.info.state';
        const dp_vacuum_map                 = 'mihome-vacuum.0.map.map64';
        
        const dp_vacuum_emptying_spot       = '0_userdata.0.vacuum.emptying_spot';
        const dp_vacuum_html                = '0_userdata.0.vacuum.html';
        const dp_vacuum_iqontrol_ip         = '0_userdata.0.vacuum.iqontrol_ip';
        const dp_vacuum_map_hide            = '0_userdata.0.vacuum.map_hide';
        const dp_vacuum_map_rotate          = '0_userdata.0.vacuum.map_rotate';
        const dp_vacuum_room_clean          = '0_userdata.0.vacuum.room_clean';
        const dp_vacuum_room_clean_active   = '0_userdata.0.vacuum.room_clean_active';
        const dp_vacuum_popup_message       = '0_userdata.0.vacuum.popup_message';
        
        const dp_vacuum_control_start       = 'mihome-vacuum.0.control.start';
        const dp_vacuum_control_pause       = 'mihome-vacuum.0.control.pause';
        const dp_vacuum_control_home        = 'mihome-vacuum.0.control.home';
        const dp_vacuum_control_goTo        = 'mihome-vacuum.0.control.goTo';
        const dp_vacuum_control_clearQueue  = 'mihome-vacuum.0.control.clearQueue';
        
        var arr_vacuum_rooms            = [];
        var arr_vacuum_onID             = [];
        var arr_vacuum_onID_button      = [];
        var arr_vacuum_onID_consumer    = [];
        var arr_vacuum_onID_room_states = [];
        
        fctInit();
        
        on({id:arr_vacuum_onID, change:'ne'} , function (dp) {
            getRoomState();
        });
        
        on({id:arr_vacuum_onID_consumer, change:'ne'} , function (dp) {
            getRoomState();
        });
        
        on({id:arr_vacuum_onID_room_states, change: 'any'}, function () {
            getRoomState();
        });
        
        on({id:arr_vacuum_onID_button} , function (dp) {
            getRoomState();
        });
        
        on({id:dp_vacuum_room_clean, change:'ne'} , function (dp) {
            startRoomClean(dp.state.val);
            setState(dp.id, '');
        });
        
        on({id:dp_vacuum_popup_message, change:'ne'} , function (dp) {
            showPopup(dp.state.val);
            setState(dp.id, '');
        });
        
        function fctInit(){
            if (existsAdapter()){
                createVacuumStates();
                if (existsIP()){
                    arr_vacuum_rooms = initRooms();
                    if (arr_vacuum_rooms.length !== 0){
                        fctInitOnID();
                        setTimeout(function(){
                            getRoomState();
                        },2000);
                    }else{
                        log('In der Objektstruktur \'mihome-vacuum.0.rooms\' wurden keine Räume gefunden.', 'warn');    
                    }
                }else{
                    log('Bitte geben Sie im Datenpunkt ' + dp_vacuum_iqontrol_ip + ' eine gültige IP-Adresse ein.', 'warn');    
                }
            }else{
                log('Der Adapter \'mihome-vacuum\' scheint nicht installiert zu sein (Datenpunkt \'' + dp_vacuum_state + '\' nicht gefunden.', 'error');
            }
        }
        
        function fctInitOnID(){
            arr_vacuum_onID.push(dp_vacuum_state);
            arr_vacuum_onID.push(dp_vacuum_map_hide);
            arr_vacuum_onID.push(dp_vacuum_map_rotate);
            arr_vacuum_onID.push(dp_vacuum_emptying_spot);
            arr_vacuum_onID.push('mihome-vacuum.0.info.connection');
            arr_vacuum_onID.push('mihome-vacuum.0.info.error');
            arr_vacuum_onID.push('mihome-vacuum.0.info.battery');
            arr_vacuum_onID.push('mihome-vacuum.0.info.queue');
            
            arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.filter');
            arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.main_brush');
            arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.sensors');
            arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.side_brush');
            arr_vacuum_onID_consumer.push('mihome-vacuum.0.consumable.water_filter');
        
            arr_vacuum_onID_button.push(dp_vacuum_control_start);
            arr_vacuum_onID_button.push(dp_vacuum_control_pause);
            arr_vacuum_onID_button.push(dp_vacuum_control_home);
            arr_vacuum_onID_button.push(dp_vacuum_control_clearQueue);
            
            for (let i = 0; i < arr_vacuum_rooms.length; i++){
                arr_vacuum_onID_room_states.push(arr_vacuum_rooms[i].id + '.state');
            }
        }
        
        function createVacuumStates(){
            if(!existsState(dp_vacuum_emptying_spot)) {
                createState(dp_vacuum_emptying_spot,
                    {type: 'string', name: 'Koordinaten Entleerung', role: 'value', read: true , write: true , def: ''}
                );
            }
            if(!existsState(dp_vacuum_html)) {
                createState(dp_vacuum_html,
                    {type: 'string', name: 'html', role: 'value', read: true , write: true , def: ''}
                );
            }
            if(!existsState(dp_vacuum_iqontrol_ip)) {
                createState(dp_vacuum_iqontrol_ip,
                    {type: 'string', name: 'IP iQontrol', role: 'value', read: true , write: true , def: '192.x.x.x'}
                );
            }
            if(!existsState(dp_vacuum_map_hide)) {
                createState(dp_vacuum_map_hide,
                    {type: 'boolean', name: 'Karte verstecken', role: 'switch', read: true , write: true , def: true}
                );
            }
            if(!existsState(dp_vacuum_map_rotate)) {
                createState(dp_vacuum_map_rotate,
                    {type: 'number', name: 'Karte x° drehen', role: '', read: true , write: true , def: 0,
                        states: {
                            "0": "keine Drehung",
                            "90": "90° Drehung",
                            "180": "180° Drehung",
                            "270": "270° Drehung"
                        }
                    }
                );
            }
            if(!existsState(dp_vacuum_room_clean)) {
                createState(dp_vacuum_room_clean,
                    {type: 'string', name: 'Raum Reinigung', role: 'value', read: true , write: true , def: ''}
                );
            }
            if(!existsState(dp_vacuum_room_clean_active)) {
                createState(dp_vacuum_room_clean_active,
                    {type: 'string', name: 'Raum Reinigung aktiv', role: 'value', read: true , write: true , def: ''}
                );
            }
            if(!existsState(dp_vacuum_popup_message)) {
                createState(dp_vacuum_popup_message,
                    {type: 'string', name: 'Popup Nachricht', role: 'value', read: true , write: true , def: ''}
                );
            }
        }
        
        function getRoomState(){
            if (existsAdapter()){
                if (existsIP()){
                    let room_active = false;;
        
                    for (let i = 0; i < arr_vacuum_rooms.length; i++){
                        let str_state = getState(arr_vacuum_rooms[i].id + '.state').val;
        
                        if (str_state == 'sauge Zimmer'){
                            setState(dp_vacuum_room_clean_active, arr_vacuum_rooms[i].name);
                            arr_vacuum_rooms[i].state = 'active';
                            room_active = true;
                        }else{
                            if (str_state.indexOf('Warteposition') + 1 > 0) {
                                let queue_position = str_state.slice(-1).charAt(0);
                                arr_vacuum_rooms[i].state = queue_position;
                            }else{
                                arr_vacuum_rooms[i].state = 'inactive';
                            }
                        }
                    }
                    if (!room_active){
                        setState(dp_vacuum_room_clean_active, '');
                    }
                    setState(dp_vacuum_html, createVacuumHTML());
                }else{
                    log('Bitte geben Sie im Datenpunkt ' + dp_vacuum_iqontrol_ip + ' eine gültige IP-Adresse ein.', 'warn');    
                }
            }else{
                log('Der Adapter \'mihome-vacuum\' scheint nicht installiert zu sein (Datenpunkt \'' + dp_vacuum_state + '\' nicht gefunden.', 'error');
            }
        }
        
        function createVacuumHTML() {
            let css_file            = './../iqontrol.meta/userimages/userwidgets/vacuum.css';
            let js_file             = './../iqontrol.meta/userimages/userwidgets/vacuum.js';
            let ip                  = getState(dp_vacuum_iqontrol_ip).val;
            let emptying_spot       = getState(dp_vacuum_emptying_spot).val;
            let map_link            = 'http://' + ip + ':8082/mihome-vacuum.admin/actualMap_0.png?' + Math.random();
            
            let str_html            = '';
            let str_html_head       = '';
            let str_html_error      = '';
            
            let img_blank           = './images/icons/blank.png';
            let img_vacuum          = './../iqontrol.meta/userimages/usericons/vacuum/vacuum.png';
            let img_wifi            = './../iqontrol.meta/userimages/usericons/vacuum/wifi.png';
            let img_wifi_disconnected = './../iqontrol.meta/userimages/usericons/vacuum/wifi_disconnected.png';
            let img_clear_queue     = './../iqontrol.meta/userimages/usericons/vacuum/clear_queue.png';
            let img_back_home       = './../iqontrol.meta/userimages/usericons/vacuum/back_home.png';
            let img_pause_cleaning  = './../iqontrol.meta/userimages/usericons/vacuum/pause_cleaning.png';
            let img_resume_cleaning = './../iqontrol.meta/userimages/usericons/vacuum/resume_cleaning.png';
            let img_trashcan        = './../iqontrol.meta/userimages/usericons/vacuum/trashcan.png';
            let gif_sirene          = './../iqontrol.meta/userimages/usericons/vacuum/sirene.gif';
            
            str_html_head = str_html_head + '<head><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">';
            str_html_head = str_html_head + '<link rel="stylesheet" href="' + css_file + '" />';
            str_html_head = str_html_head + '<script type="text/javascript" src="' + js_file + '"></script>';
            str_html_head = str_html_head + '</head>';
        
            str_html = str_html_head + '<body>';
        
            //Box Error
            let vacuum_error = getState('mihome-vacuum.0.info.error').val;
            if (vacuum_error !== 0){
                str_html_error = str_html_error + '<div class="box_row">';
                str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                str_html_error = str_html_error + '<label class="box_row" id="box_sirene_value">';
                str_html_error = str_html_error + getStatetxt('mihome-vacuum.0.info.error', vacuum_error);
                str_html_error = str_html_error + '</label>';
                str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                str_html_error = str_html_error + '</div>';
                str_html_error = str_html_error + '</div>';
            }else{
                let str_consumer    = '';
                let consumer_limit  = 10;
                
                for (let i = 0; i < arr_vacuum_onID_consumer.length; i++){
                    if (getState(arr_vacuum_onID_consumer[i]).val < consumer_limit){
                        if (str_consumer !== ''){
                            str_consumer = str_consumer + ', ' + arr_vacuum_onID_consumer[i];
                        }else{
                            str_consumer = arr_vacuum_onID_consumer[i];
                        }
                        
                    }
                }
                
                if (str_consumer !== ''){
                    str_consumer = str_consumer.replace(/mihome-vacuum.0.consumable./g, '');
                    str_html_error = str_html_error + '<div class="box_row" id="box_consumer">';
                    str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                    str_html_error = str_html_error + '<div class="box_column">';
                    str_html_error = str_html_error + '<label class="box_row" id="box_consumer_value_headline">Bitte reinigen:</label>';
                    str_html_error = str_html_error + '<label class="box_row" id="box_consumer_value">' + str_consumer + '</label>';
                    str_html_error = str_html_error + '</div>';
                    str_html_error = str_html_error + '<img class="img_sirene" src="' + gif_sirene + '"/>';
                    str_html_error = str_html_error + '</div>';
                    str_html_error = str_html_error + '</div>';
                }else{
                    str_html_error = str_html_error + '<div class="box_column"></div>';
                }
            }
        
            //Box 1 = Alarm
            str_html = str_html + str_html_error;
        
            //Box 2 = Statusangaben
            let vacuum_state        = getState(dp_vacuum_state).val;
            let vacuum_state_txt    = getStatetxt(dp_vacuum_state, vacuum_state);
            
            str_html = str_html + '<div class="box_column" id="box_states">';
            str_html = str_html + '<div class="box_row">';
            str_html = str_html + '<div class="box_row" id="box_state">Status:</div>';
            str_html = str_html + '<div class="box_row" id="box_battery">Batterie:</div>';
            str_html = str_html + '<div class="box_row" id="box_connection">Verbindung:</div>';
            str_html = str_html + '</div>';
        
            str_html = str_html + '<div class="box_row">';
            str_html = str_html + '<div class="box_row" id="box_state_value"><center>' + vacuum_state_txt;
            let str_active_room = getState(dp_vacuum_room_clean_active).val;
            if (str_active_room !== ''){
                str_html = str_html + '</br>(' + str_active_room + ')';
            }
            
            str_html = str_html + '</center></div>';
            str_html = str_html + '<div class="box_row" id="box_battery_value">' + getState('mihome-vacuum.0.info.battery').val + '%</div>';
            str_html = str_html + '<div class="box_row" id="box_connection_value">';
            if (getState('mihome-vacuum.0.info.connection').val == true){
                str_html = str_html + '<img class="img_wifi" src="' + img_wifi + '" />';
            }else{
                str_html = str_html + '<img class="img_wifi" src="' + img_wifi_disconnected + '" />';
            }
            str_html = str_html + '</div>';
            str_html = str_html + '</div>';
            str_html = str_html + '</div>';
        
            //Box 3 = Raumauswahl und Warteschlange
            str_html = str_html + '<div class="box_row" id="box_rooms_and_controls">';
            str_html = str_html + '<div class="box_column" id="box_room_selection">';
            str_html = str_html + '<div class="box_row"><label class="lbl_room_selection">Raumauswahl:</label></div>';
            str_html = str_html + '<div class="box_row"><form name="rooms">';
            str_html = str_html + '<select name="room" id="room">';
            str_html = str_html + '<option selected>bitte wählen...</option>';
        
            let arr_vacuum_rooms_sort = [];
            for (let i = 0;i < arr_vacuum_rooms.length; i++){
                arr_vacuum_rooms_sort.push(arr_vacuum_rooms[i].name);
            }
            arr_vacuum_rooms_sort.sort();
            arr_vacuum_rooms_sort.push('Komplettreinigung');
        
            for (let j = 0; j < arr_vacuum_rooms_sort.length; j++){
                str_html = str_html + '<option>' + arr_vacuum_rooms_sort[j] + '</option>';
            }
            str_html = str_html + '</select>';
            str_html = str_html + '</form></div>'; 
        
            let str_html_queue = getQueue();
            if (str_html_queue !== ''){
                str_html = str_html + '<div class="box_column" id="box_queue">';
                str_html = str_html + '<div class="box_column">';
                str_html = str_html + '<div class="box_row" id="box_queue_headline">';
                str_html = str_html + '<div><label class="lbl_queue_headline"><center>Warteschlange</center></label></div>';
                str_html = str_html + '<div><input type="image" class="img_queue_clear" onclick="setState(\'' + dp_vacuum_control_clearQueue + '\', true)" src="' + img_clear_queue + '" /></div>';
                str_html = str_html + '</div>';
                str_html = str_html + '<div class="box_column" id="box_queue_rooms">';
                str_html = str_html + str_html_queue;
                str_html = str_html + '</div>';
                str_html = str_html + '</div>';
                str_html = str_html + '</div>';
            }
            str_html = str_html + '</div>';
        
            //Box 4 = Steuerung, aktiver Raum und Karte
            str_html = str_html + '<div class="box_column" id="box_controls_and_active_room">';
            str_html = str_html + '<div class="box_row" id="box_controls">';
            str_html = str_html + '<input type="image" class="img_control"';
            str_html = str_html + 'onclick="setState(\'' + dp_vacuum_room_clean + '\', document.rooms.room.options[document.rooms.room.selectedIndex].text)" ';
            str_html = str_html + 'src="' + img_vacuum + '" />';
            if ((vacuum_state_txt !== 'Unknown') && (vacuum_state_txt !== 'Initiating') && (vacuum_state_txt !== '?') && (vacuum_state_txt !== 'Charging') && (vacuum_state_txt !== 'Charging Error') && (vacuum_state_txt !== 'Pause') && (vacuum_state_txt !== 'In Error') && (vacuum_state_txt !== 'Sleeping')){
                str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_pause + '\', true)" src="' + img_pause_cleaning + '" />';
            }else{
                str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
            }
            if ((vacuum_state_txt == 'Sleeping') || (vacuum_state_txt == 'Waiting') || (vacuum_state_txt == 'Pause')){
                str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_start + '\', true)" src="' + img_resume_cleaning + '" />';
            }else{
                str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
            }
            if ((vacuum_state_txt !== 'Unknown') && (vacuum_state_txt !== 'Initiating') && (vacuum_state_txt !== '?') && (vacuum_state_txt !== 'Charging') && (vacuum_state_txt !== 'Charging Error') && (vacuum_state_txt !== 'In Error')){
                str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_home + '\', true)" src="' + img_back_home + '" />';
            }else{
                str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
            }
            if (emptying_spot !== ''){
                str_html = str_html + '<input type="image" class="img_control" onclick="setState(\'' + dp_vacuum_control_goTo + '\', \'' + emptying_spot + '\')" src="' + img_trashcan + '" />';
            }else{
                str_html = str_html + '<input type="image" class="img_control" src="' + img_blank + '" />';
            }
            str_html = str_html + '</div>';
            
            let map_rotate = getState(dp_vacuum_map_rotate).val;
            if (vacuum_state_txt !== 'Charging'){
                str_html = str_html + '<div class="box_row" id="box_map">';
                if (map_rotate !== 0){
                    str_html = str_html + '<img id="img_map" style="transform: rotate(' + map_rotate + 'deg)" src="' + map_link + '" />';
                }else{
                    str_html = str_html + '<img id="img_map" src="' + map_link + '" />';
                }
                str_html = str_html + '</div>';
                str_html = str_html + '<script type="text/javascript">';
                str_html = str_html + 'startMapReload("' + map_link + '")';
                str_html = str_html + '</script>';
            }else{
                if (getState(dp_vacuum_map_hide).val){
                    str_html = str_html + '<div class="box_row" id="box_map">';
                    str_html = str_html + '</div>';
                }else{
                    str_html = str_html + '<div class="box_row" id="box_map">';
                    if (map_rotate !== 0){
                        str_html = str_html + '<img id="img_map" style="transform: rotate(' + map_rotate + 'deg)" src="' + map_link + '" />';
                    }else{
                        str_html = str_html + '<img id="img_map" src="' + map_link + '" />';
                    }
                    str_html = str_html + '</div>';
                }
                str_html = str_html + '<script type="text/javascript">';
                str_html = str_html + 'endMapReload()';
                str_html = str_html + '</script>';
            }
            str_html = str_html + '</div>';
            str_html = str_html + '</div>';
            str_html = str_html + '</body>';
        	return str_html;
        }
        
        function getQueue(){
            let str_html = '';
            let arr_temp = [];
        
            for (let i = 0; i < arr_vacuum_rooms.length; i++){
                let str_state = arr_vacuum_rooms[i].state;
                if ((str_state !== '') && (str_state !== 'active') && (str_state !== 'inactive')){
                    arr_temp[parseInt(str_state)] = arr_vacuum_rooms[i].name;
                }
            }
            
            if (arr_temp.length !== 0){
                for (let j = 0; j < arr_temp.length; j++){
                    str_html = str_html + '<label class="lbl_queue_room">' + (j + 1) + '. ' + arr_temp[j] + '</label>';
                }
            }
        
            return str_html;
        }
        
        function startRoomClean(room){
            if ((room !== null) && (room !== undefined)){
                if ((room !== '') && (room !== 'bitte wählen...')){
                    if (room !== 'Komplettreinigung'){
                        for (let i = 0; i < arr_vacuum_rooms.length; i++){
                            if (arr_vacuum_rooms[i].name == room){
                                let str_state = arr_vacuum_rooms[i].state;
                                if (str_state == 'inactive'){
                                    setState(dp_vacuum_popup_message, room  + ' wird zur Reinigung hinzugefügt.');
                                    setState(arr_vacuum_rooms[i].id + '.roomClean', true);
                                }else{
                                    if (str_state == 'active'){
                                        setState(dp_vacuum_popup_message, room  + ' wird bereits gesaugt.');
                                    }else{
                                        setState(dp_vacuum_popup_message, room  + ' befindet sich bereits in der Warteschlange.');
                                    }
                                }
                            }
                        }
                    }else{
                        let vacuum_state        = getState(dp_vacuum_state).val;
                        let vacuum_state_txt    = getStatetxt(dp_vacuum_state, vacuum_state);
                        let popup_message       = '';
                        
                        if (vacuum_state_txt !== 'Charging'){
                            popup_message = 'Die Komplettreinigung kann nur gestartet werden, wenn sich der Staubsaugerroboter auf der Ladestation befindet.';
                        }else{
                            popup_message = 'Komplettreiniguung gestartet';
                            setState(dp_vacuum_control_start, true);
                        }
                        setState(dp_vacuum_popup_message, popup_message);
                    }
                }
            }else{
                log('An die Funktion startRoomClean wurde ein NULL/UNDEFINED Wert übergeben.', 'warn');
            }
        }
        
        function initRooms(){
            let arr_rooms           = [];
            let arr_rooms_states    = [];
        
            // Ermittle alle States unterhalb der Struktur mihome-vacuum.0.rooms.room*
            arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.room*"));
            if (arr_rooms_states.length !== 0){
                for (let i = 0; i < arr_rooms_states.length; i++){
                    let room_id     = arr_rooms_states[i].slice(0, arr_rooms_states[i].lastIndexOf("."));
                    let room_name   = getObject(room_id).common.name;
                    let found = false
                    if (arr_rooms.length !== 0){
                        for (let j = 0; j < arr_rooms.length; j++){
                            if (arr_rooms[j].name == room_name){
                                found = true;
                            }
                        }
                    }
                    if (!found){
                        let obj_room = {};
                        obj_room.id     = room_id;
                        obj_room.name   = room_name;
                        obj_room.state  = 'inactive';
                        arr_rooms.push(obj_room);
                    }
                }
            }
            return arr_rooms;
        }
        
        function existsAdapter() {
            if (existsState(dp_vacuum_state)){
                return true;
            }else{
                return false;   
            }
        }
        
        function existsIP() {
            if (existsState(dp_vacuum_iqontrol_ip)){
                let str_ip = getState(dp_vacuum_iqontrol_ip).val;
                if ((str_ip !== '') && (str_ip !== '192.x.x.x')){
                    return true;
                }else{
                    return false;
                }
            }else{
                return false;   
            }
        }
        
        function showPopup(message){
            if (message !== ''){
                sendTo("iqontrol.0", "send", {
                    PopupMessage: message,
                    PopupDuration: 5000
                });
            }
        }
        
        function getStatetxt(id, val) {
            let states = getStatesObj(id);
            if(states) return states[val];
            else return null;
        }
        
        function getStatesObj(id) {
            if(!getObject(id)) {
                log(id + ': kein Objekt', 'warn');
                return null;
            }
            let obj = getObject(id);
            if (!obj.common.states) {
                log(id + ': keine Zustandtexte', 'warn');
                return null;
            }
            var states = obj.common.states;
            if (typeof states == 'string') {
                var arr = states.split(';');
                states = {};
                for(var i = 0; i < arr.length; i++) {
                    var ele = arr[i].split(':');
                    states[ele[0]] = ele[1];
                }
            }
            return states;
        }
        
        B Offline
        B Offline
        blackeagle998
        schrieb am zuletzt editiert von blackeagle998
        #5539

        @meerkat
        Zeig mir mal bitte deine Objektstruktur unter
        mihome-vacuum.0.rooms., scheint, als würde er da nichts finden.
        Er sucht ja nach Raumnamen beginnend mit room
        , wenn deine anders heißen, dann musst du das anpassen, Skriptzeile 451:

        arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.room*"));
        
        M 1 Antwort Letzte Antwort
        0
        • B blackeagle998

          @meerkat
          Zeig mir mal bitte deine Objektstruktur unter
          mihome-vacuum.0.rooms., scheint, als würde er da nichts finden.
          Er sucht ja nach Raumnamen beginnend mit room
          , wenn deine anders heißen, dann musst du das anpassen, Skriptzeile 451:

          arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.room*"));
          
          M Offline
          M Offline
          meerkat
          schrieb am zuletzt editiert von
          #5540

          @blackeagle998
          Mist, da habe ich dir jetzt genau das falsche gechickt. Ich habe die Zeile schon auf

          arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.*"));
          

          abgeändert.
          vacu.jpg

          B 1 Antwort Letzte Antwort
          0
          • M meerkat

            @blackeagle998
            Mist, da habe ich dir jetzt genau das falsche gechickt. Ich habe die Zeile schon auf

            arr_rooms_states = Array.prototype.slice.apply($("mihome-vacuum.0.rooms.*"));
            

            abgeändert.
            vacu.jpg

            B Offline
            B Offline
            blackeagle998
            schrieb am zuletzt editiert von
            #5541

            @meerkat
            Dann kann ich dir nicht wirklich helfen.
            Die Fehlermeldung "TypeError: Cannot read property 'common' of null" sagt ja, dass die getObject Funktion einen NULL Wert zurück gibt. Warum, musst du selber herausfinden.

            Vielleicht lässt du mal alle Inhalte des Arrays in der log console ausgeben, dann siehst du ja, ob da ein Datenpunkt dabei ist, der kein Raum ist.

            1 Antwort Letzte Antwort
            0
            • M muuulle

              @s-bormann said in Test Adapter iQontrol 1.8.x Vis:

              @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

              Hi zusammen,

              ich bastle mir gerade eine automatisierte Bewässerung.

              Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
              Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
              Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

              Der Datenpunkt ist als state / Time festgelegt.

              Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

              a365b4f0-2a65-444f-914d-fed9ab346831-image.png

              Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

              B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

              https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

              VG!

              Moin,
              bitte beachten, dass der max. Wert des Datenpunkts der Zeit nicht beschränkt ist. Ansonsten funktioniert das nicht und der Wert des Datenpunkts wird auf 1 gesetzt.

              Gruß

              P Offline
              P Offline
              Peks200
              schrieb am zuletzt editiert von
              #5542

              @muuulle said in Test Adapter iQontrol 1.8.x Vis:

              @s-bormann said in Test Adapter iQontrol 1.8.x Vis:

              @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

              Hi zusammen,

              ich bastle mir gerade eine automatisierte Bewässerung.

              Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
              Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
              Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

              Der Datenpunkt ist als state / Time festgelegt.

              Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

              a365b4f0-2a65-444f-914d-fed9ab346831-image.png

              Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

              B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

              https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

              VG!

              Moin,
              bitte beachten, dass der max. Wert des Datenpunkts der Zeit nicht beschränkt ist. Ansonsten funktioniert das nicht und der Wert des Datenpunkts wird auf 1 gesetzt.

              Gruß

              Sehr geil und so einfach umzustellen DANKE :grinning:

              61ebe85e-4ad1-4300-baab-046fe075cedc-image.png

              @SiKo

              Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
              Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.
              fb55320f-9a3c-4f42-96f9-14f62162fd66-image.png

              Wenn ich auf das Bewässerungsicon gehe kommt das Fenster:
              5bba2c25-b80b-4bc9-a845-435cf8212af6-image.png

              Und wenn ich auf Automatik gehe kommt dieses:

              Hier ist dann alles einstellbar :)
              554edabf-bf2d-4631-8b6e-8e0b235e8309-image.png

              dslraserD C S 3 Antworten Letzte Antwort
              2
              • P Peks200

                @muuulle said in Test Adapter iQontrol 1.8.x Vis:

                @s-bormann said in Test Adapter iQontrol 1.8.x Vis:

                @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                Hi zusammen,

                ich bastle mir gerade eine automatisierte Bewässerung.

                Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
                Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
                Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

                Der Datenpunkt ist als state / Time festgelegt.

                Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

                a365b4f0-2a65-444f-914d-fed9ab346831-image.png

                Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

                B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

                https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

                VG!

                Moin,
                bitte beachten, dass der max. Wert des Datenpunkts der Zeit nicht beschränkt ist. Ansonsten funktioniert das nicht und der Wert des Datenpunkts wird auf 1 gesetzt.

                Gruß

                Sehr geil und so einfach umzustellen DANKE :grinning:

                61ebe85e-4ad1-4300-baab-046fe075cedc-image.png

                @SiKo

                Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.
                fb55320f-9a3c-4f42-96f9-14f62162fd66-image.png

                Wenn ich auf das Bewässerungsicon gehe kommt das Fenster:
                5bba2c25-b80b-4bc9-a845-435cf8212af6-image.png

                Und wenn ich auf Automatik gehe kommt dieses:

                Hier ist dann alles einstellbar :)
                554edabf-bf2d-4631-8b6e-8e0b235e8309-image.png

                dslraserD Offline
                dslraserD Offline
                dslraser
                Forum Testing Most Active
                schrieb am zuletzt editiert von
                #5543

                @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.

                Welches Gardena Systen nutzt Du ?

                P 1 Antwort Letzte Antwort
                0
                • dslraserD dslraser

                  @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                  Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                  Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.

                  Welches Gardena Systen nutzt Du ?

                  P Offline
                  P Offline
                  Peks200
                  schrieb am zuletzt editiert von
                  #5544

                  @dslraser said in Test Adapter iQontrol 1.8.x Vis:

                  @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                  Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                  Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.

                  Welches Gardena Systen nutzt Du ?

                  Ich nutze das Gardena Gateway mit Irrigation Control und V3 Ventilbox.
                  Lässt sich über den Adapter "smartgarden"
                  im iobroker steuern.

                  dslraserD 1 Antwort Letzte Antwort
                  0
                  • P Peks200

                    @muuulle said in Test Adapter iQontrol 1.8.x Vis:

                    @s-bormann said in Test Adapter iQontrol 1.8.x Vis:

                    @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                    Hi zusammen,

                    ich bastle mir gerade eine automatisierte Bewässerung.

                    Nun möchte ich natürlich die Startzeit in iQontrol festlegen um welche Uhrzeit bewässert werden soll.
                    Funktioniert soweit auch schon. Nur wollte ich frage ob es in iQontrol möglich ist die Uhrzeit mit einem Slider oder Rad oder ähnlichen einzustellen.
                    Aktuell muss ich die Zeit von Hand eingeben und auf Absenden klicken.

                    Der Datenpunkt ist als state / Time festgelegt.

                    Vllt. hatte das Thema ja schon jemand. Finden konnte ich im Forum allerdings nichts :blush:

                    a365b4f0-2a65-444f-914d-fed9ab346831-image.png

                    Hi, mit der aktuellen Version sollte Date, Time und Durations eigentlich gehen. Es gibt ein eigenes Gerät dafür.

                    B32CEBD6-CA74-4F28-BF3C-14E6118A4AB7.jpeg

                    https://github.com/sbormann/ioBroker.iqontrol#-date-and-time

                    VG!

                    Moin,
                    bitte beachten, dass der max. Wert des Datenpunkts der Zeit nicht beschränkt ist. Ansonsten funktioniert das nicht und der Wert des Datenpunkts wird auf 1 gesetzt.

                    Gruß

                    Sehr geil und so einfach umzustellen DANKE :grinning:

                    61ebe85e-4ad1-4300-baab-046fe075cedc-image.png

                    @SiKo

                    Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                    Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.
                    fb55320f-9a3c-4f42-96f9-14f62162fd66-image.png

                    Wenn ich auf das Bewässerungsicon gehe kommt das Fenster:
                    5bba2c25-b80b-4bc9-a845-435cf8212af6-image.png

                    Und wenn ich auf Automatik gehe kommt dieses:

                    Hier ist dann alles einstellbar :)
                    554edabf-bf2d-4631-8b6e-8e0b235e8309-image.png

                    C Offline
                    C Offline
                    Cino
                    schrieb am zuletzt editiert von
                    #5545

                    @peks-67 sieht top aus. Sowas könnte ich für meine Poolpumpe gebrauchen. Gerade läuft das alles mit den Timern noch über die Shelly App

                    IOB@RPI4
                    Shelly, Zigbee, ebus

                    S 1 Antwort Letzte Antwort
                    0
                    • C Cino

                      @peks-67 sieht top aus. Sowas könnte ich für meine Poolpumpe gebrauchen. Gerade läuft das alles mit den Timern noch über die Shelly App

                      S Offline
                      S Offline
                      SiKo
                      schrieb am zuletzt editiert von
                      #5546

                      @cino
                      geht auch mit Shelly: https://forum.iobroker.net/post/654895

                      C 1 Antwort Letzte Antwort
                      0
                      • S SiKo

                        @cino
                        geht auch mit Shelly: https://forum.iobroker.net/post/654895

                        C Offline
                        C Offline
                        Cino
                        schrieb am zuletzt editiert von
                        #5547

                        @siko und die Zeit ist einfach eine Variable die im Blockly als Ausschaltverzögerung dient?

                        Und für die Wochentage einfach eine Variable setzen und mit einer Und Verknüpfung auf die Switch Variable vom Shelly? Ist das so richtig?

                        Ich habe es gestern mit ach und krach gerade mal geschafft in blockly eine Lampe durch einen Bewegungsmelder zuschalten.

                        IOB@RPI4
                        Shelly, Zigbee, ebus

                        1 Antwort Letzte Antwort
                        0
                        • P Peks200

                          @dslraser said in Test Adapter iQontrol 1.8.x Vis:

                          @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                          Ich nutze das Gardena System. Habe die Steuerung jetzt aber komplett über Blockly Scripte und Datenpunkte gelöst da mir die Gardena eigene App nicht wirklich zusagt.
                          Für meine drei Bewässerungskreise sieht das im iQontrol nun so aus.

                          Welches Gardena Systen nutzt Du ?

                          Ich nutze das Gardena Gateway mit Irrigation Control und V3 Ventilbox.
                          Lässt sich über den Adapter "smartgarden"
                          im iobroker steuern.

                          dslraserD Offline
                          dslraserD Offline
                          dslraser
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von dslraser
                          #5548

                          @peks-67 sagte in Test Adapter iQontrol 1.8.x Vis:

                          Ich nutze das Gardena Gateway mit Irrigation Control und V3 Ventilbox.
                          Lässt sich über den Adapter "smartgarden"
                          im iobroker steuern.

                          Ah okay, das nutze ich auch.
                          Ich habe das auch über Blockly laufen, allerdings nicht über Uhrzeiten gesteuert.
                          Ich habe mir Deine Screenshots nochmal genauer angesehen und verstehe jetzt auch was Du mit automatik meinst. Da Du für die einzelnen Kreise unterschiedliche Zeiten hast funktioniert das ja auch. (Gehen ja immer max 2 Kreise gleichzeitig)
                          Ich hatte für mich einen etwas anderen Ansatz. Ich habe vier Ventile drann und kann die entweder einzeln steuern, oder alle nacheinander.
                          Z.B. Gesamtlaufzeit soll 80 Minuten sein, dann läuft alles brav nacheinander jeweils 20 Minuten.
                          Vielleicht kannst Du mal hier

                          https://forum.iobroker.net/post/408094

                          Deine Blocklys posten, das wäre interessant für mich.
                          (mein Blockly habe ich auch etwas angepasst, da Gardena die max Laufzeiten der Ventile erhöht hat, das waren mal max 59 Minuten)
                          Bei meiner Variante funktioniert die Steuerung sowohl über die Gardena App, oder über iQontrol. Es wird immer ä, wenn gewünscht in beiden angezeigt. Meine Frau nimmt die App, ich nehme lieber iQontrol.

                          Screenshot_20210723-145427_Chrome.jpg

                          1 Antwort Letzte Antwort
                          0
                          • S Offline
                            S Offline
                            SiKo
                            schrieb am zuletzt editiert von
                            #5549

                            @cino Ich fülle per VIS/Blockly den Shelly Datenpunkt "Auto Off" somit ist sicher auch wenn sich mal das Script aufhängen würde, das der Shelly stopt.
                            Ich nutze dazu einen eigenen Datenpunkt für Minuten und nehme das mit 60 mal und trage das dann bei Shelly ein.

                            85d4fcba-9751-431d-80b9-bf8a54df4d89-image.png

                            1 Antwort Letzte Antwort
                            0
                            • M Offline
                              M Offline
                              meerkat
                              schrieb am zuletzt editiert von
                              #5550

                              Hi an alle,
                              man kann für das Media Element ja so schön die Sender hinterlegen
                              3659c344-137b-429a-b15c-1dc0a1af5271-image.png
                              und das alles über die Eigenschaft RemoteChannels pflegen. 85aee5af-92c1-4cbd-b866-eb1650827cef-image.png

                              Kann man das Array auch irgendwie kopieren oder da auch einen Datenpunkt hinterlegen? Habe mehrere Alexa´s und nicht wirklich Lust, bei jedem neuen Sender alle Geräte durchzugehen.

                              Gruß

                              da_WoodyD ldittmarL 2 Antworten Letzte Antwort
                              0
                              • M meerkat

                                Hi an alle,
                                man kann für das Media Element ja so schön die Sender hinterlegen
                                3659c344-137b-429a-b15c-1dc0a1af5271-image.png
                                und das alles über die Eigenschaft RemoteChannels pflegen. 85aee5af-92c1-4cbd-b866-eb1650827cef-image.png

                                Kann man das Array auch irgendwie kopieren oder da auch einen Datenpunkt hinterlegen? Habe mehrere Alexa´s und nicht wirklich Lust, bei jedem neuen Sender alle Geräte durchzugehen.

                                Gruß

                                da_WoodyD Offline
                                da_WoodyD Offline
                                da_Woody
                                schrieb am zuletzt editiert von
                                #5551

                                @meerkat wenn ich dich richtig verstehe, dann kopier doch das gerät in den raum wo soll und ändere dort die daten der schnepfe...

                                gruß vom Woody
                                HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                1 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  SiKo
                                  schrieb am zuletzt editiert von
                                  #5552

                                  Hallo,
                                  hat jemand von euch sein Auto mit eingebunden.
                                  hab noch keine genaue Vorstellung wie ich diese Infos am Besten visualisieren könnte.

                                  a2eb29cb-d818-4eaa-968b-02cef8681c56-image.png

                                  1 Antwort Letzte Antwort
                                  0
                                  • s.bormannS Offline
                                    s.bormannS Offline
                                    s.bormann
                                    Most Active
                                    schrieb am zuletzt editiert von
                                    #5553

                                    Habe mal das schlechte Wetter im Urlaub genutzt :)
                                    Beim FLOT-Widget kann man nun die Achsen konfigurieren:
                                    9cd1851e-6db4-4012-9f6e-33b939fedddd-image.png

                                    1.8.1 (2021-07-28)

                                    • (sbormann) Some design-adjustments for react-ui.
                                    • (sbormann) Keep track of ioBroker object changes in admin.
                                    • (sbormann) Fixed crash if active view has no devices.
                                    • (sbormann) Removed old conn.js from admin.
                                    • (Einstein2002, sbormann) Added HomematicIP-Thermostat.
                                    • (sbormann) Enhanced max-height of dialog.
                                    • (sbormann) Fixed up, down and stop button for blinds.
                                    • (sbormann) Changed some log messages.
                                    • (sbormann) Enhanced FLOT-Chart-Widget to set axis options.
                                    ldittmarL 1 Antwort Letzte Antwort
                                    8
                                    • s.bormannS s.bormann

                                      Habe mal das schlechte Wetter im Urlaub genutzt :)
                                      Beim FLOT-Widget kann man nun die Achsen konfigurieren:
                                      9cd1851e-6db4-4012-9f6e-33b939fedddd-image.png

                                      1.8.1 (2021-07-28)

                                      • (sbormann) Some design-adjustments for react-ui.
                                      • (sbormann) Keep track of ioBroker object changes in admin.
                                      • (sbormann) Fixed crash if active view has no devices.
                                      • (sbormann) Removed old conn.js from admin.
                                      • (Einstein2002, sbormann) Added HomematicIP-Thermostat.
                                      • (sbormann) Enhanced max-height of dialog.
                                      • (sbormann) Fixed up, down and stop button for blinds.
                                      • (sbormann) Changed some log messages.
                                      • (sbormann) Enhanced FLOT-Chart-Widget to set axis options.
                                      ldittmarL Offline
                                      ldittmarL Offline
                                      ldittmar
                                      Developer
                                      schrieb am zuletzt editiert von
                                      #5554

                                      Hi,

                                      ich bin gerade dabei meine Instanzen ins iQontrol zu packen:

                                      29-07-_2021_15-30-12.png

                                      Dabei werden Adapter die aktualisiert werden können grün dargestellt, CPU und RAM werden angezeigt und oben ein Badge mit Anzahl der Logmeldungen (warn/error)

                                      Wenn man es öffnet...

                                      29-07-_2021_15-33-05.png

                                      ...kann man Adapter ein-/ausschalten, Logeinträge löschen, die aktuellen Versionen (installiert, stable, latest und auf Github) sehen und die letzten 100 Logeinträge (warn/error) lesen.

                                      Was ich noch gerne hätte, ist dass die aktuell installierte Adapter-Version auf dem Kachel angezeigt wird, aber nicht in INFO-A oder B, sondern irgendwo anders. Von mir aus unten rechts oder hinter der Bezeichnung. Egal... Hat jemand eine Idee?

                                      Und wenn ich schon dabei bin: Hat jemand noch eine Idee man noch als Info oder Funktion zu den Instanzen hinzufügen kann? Ich will mein Template fertig machen, bevor ich alle Instanzen hinzufüge :smirk:

                                      S da_WoodyD 2 Antworten Letzte Antwort
                                      2
                                      • da_WoodyD Offline
                                        da_WoodyD Offline
                                        da_Woody
                                        schrieb am zuletzt editiert von
                                        #5555

                                        @ldittmar mir fällt im mom nichts besseres ein, als eventuell Badge für die Version zu nehmen, oder CPU und RAM in InfoA als Arrey zu packen, dann wäre InfoB frei für Version.

                                        gruß vom Woody
                                        HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                        ldittmarL 1 Antwort Letzte Antwort
                                        0
                                        • M meerkat

                                          Hi an alle,
                                          man kann für das Media Element ja so schön die Sender hinterlegen
                                          3659c344-137b-429a-b15c-1dc0a1af5271-image.png
                                          und das alles über die Eigenschaft RemoteChannels pflegen. 85aee5af-92c1-4cbd-b866-eb1650827cef-image.png

                                          Kann man das Array auch irgendwie kopieren oder da auch einen Datenpunkt hinterlegen? Habe mehrere Alexa´s und nicht wirklich Lust, bei jedem neuen Sender alle Geräte durchzugehen.

                                          Gruß

                                          ldittmarL Offline
                                          ldittmarL Offline
                                          ldittmar
                                          Developer
                                          schrieb am zuletzt editiert von ldittmar
                                          #5556

                                          @meerkat Das wäre wirklich gut, denn ich habe 9 Alexas schon fetig eingestellt und es wäre echt cool, wenn ich diese Arrays einfach rein pasten könnte. Und nochmal kurz die Frage: Wie hast du das gemacht, dass man auf dem Button klickt und Alexa darauf reagiert bzw den richtigen Sender auswählt?

                                          dslraserD M 2 Antworten Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          650

                                          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