Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Profile
    • Following 0
    • Followers 16
    • Topics 97
    • Posts 1520
    • Best 290
    • Groups 4

    Mic

    @Mic

    Developer

    628
    Reputation
    990
    Profile views
    1520
    Posts
    16
    Followers
    0
    Following
    Joined Last Online
    Website github.com/Mic-M?tab=repositories

    Mic Follow
    Developer Pro Starter Most Active

    Best posts made by Mic

    • [Vorlage] Hilfreiche JavaScript-Funktionen

      Dies ist eine Sammlung von JavaScript-Funktionen, die hilfreich zur Erstellung von Skripten im JavaScript-Adapter sind. Ich pflege diese Scripts kontinuierlich und ergänze entsprechend.

      Bitte beachtet: ioBroker bringt schon einige tolle Funktionen mit, siehe: ioBroker JavaScript-Funktionen

      Weitere hilfreiche Ressourcen:

      • Aufruf: Welche guten JavaScripts setzt ihr ein? Sammlung einiger Scripts
      • javascript.info: Gutes JavaScript-Tutorial
      • regex101: Zum einfachen Erstellen und Testen von Regular Expressions

      1. Strings

      /**
       * Will just keep lower case letters, numbers, and replaces the rest with a single "-"
       * Use Case: to prepare a sting for a file name.
       * @param {string}  strInput   Input String
       * @return {string}   the sanitized string 
       */
      function sanitizeStr(strInput) {
       
          let strT = strInput.toLowerCase();
          let strResult = strT.replace(/([^a-z0-9]+)/gi, '-');
          return strResult;
      
      }
      

      /**
       * Clean a given string for using in ioBroker as part of a atate
       * Will just keep letters, incl. Umlauts, numbers, "-" and "_" and "."
       * @param  {string}  strInput   Input String
       * @return {string}   the processed string 
       */
      function cleanStringForState(strInput) {
          let strResult = strInput.replace(/([^a-zA-ZäöüÄÖÜß0-9\-\._]+)/gi, '');
          return strResult;
      }
      

      /**
       * Checks if the string provided contains either every or some terms.
       * Requires function isLikeEmpty().
       * Source: https://stackoverflow.com/questions/36283767/javascript-select-the-string-if-it-matches-multiple-words-in-array
       * @param {string} strInput - The string on which we run this search
       * @param {array} arrayTerms - The terms we are searching, e.g. ["hue", "error", "raspberry"]
       * @param {string} type - 'every': all terms must match to be true,
       *                        'some': at least one term (or more) must match
       *                        'blacklist': different here: function will always
       *                         return FALSE, but if one of the arrayTerms contains
       *                         minimum 3 chars and is found in provided string,
       *                         we return TRUE (= blacklisted item found).
       * @return {boolean}       true, if it contains ALL words, false if not all words (or none)
       *                         Also, will return true if arrayTerms is not array or an empty array
       */
      function strMatchesTerms(strInput, arrayTerms, type) {
          if(type === 'blacklist') {
              if (Array.isArray(arrayTerms)) {
                  let arrayTermsNew = [];
                  for (let lpTerm of arrayTerms) {
                      if (lpTerm.length >= 3) {
                          arrayTermsNew.push(lpTerm);
                      }
                  }
                  if(isLikeEmpty(arrayTermsNew) === false) {
                      let bResultBL = arrayTermsNew.some(function(word) {
                          return strInput.indexOf(word) > -1;
                      });
                      return bResultBL;
                  } else {
                      return false; // return false if no items to be blacklisted
                  }
              } else {
                  return false; // we return false if the arrayTerms given is not an array. Want to make sure if we really should blacklist...
              }
      
          } else {
              if (Array.isArray(arrayTerms)) {
                  if(type === 'every') {
                      let bResultEvery = arrayTerms.every(function(word) {
                          return strInput.indexOf(word) > -1;
                      });
                      return bResultEvery;
                  } else if(type === 'some') {
                      let bResultSome = arrayTerms.some(function(word) {
                          return strInput.indexOf(word) > -1;
                      });
                      return bResultSome;
                  }
      
              } else {
                  return true; // we return true if the arrayTerms given is not an array
              }
          }
      }
      

      /**
        * Encrypts or decrypts a string.
        * @source https://codereview.stackexchange.com/questions/127454/a-small-custom-encryption-decryption-script
        * @param {string}  strInput   The input string to be encrypted or decrypted
        * @param {boolean}  bEncrypt  if true, it will be encrypted, otherwise decrypted
        * @return {string}  Encrypted or decrypted string.
      */
      function cryptStr(strInput, bEncrypt) {
          var text = strInput;
          var crypted = '';
          for(var i = 0; i < text.length; i++) {
              var ASCII = text[i].charCodeAt(0);
              var n = null;
              if(i % 2 === 0) {
                  n = bEncrypt === true ? ASCII + 4 : ASCII - 4;
              }
              else if(i % 2 == 1) {
                  n = bEncrypt === true ? ASCII + 7 : ASCII - 7;
              }
              var s = String.fromCharCode(n);
              crypted += s;
          }
          return crypted;
      }
      

      2. Strings/Arrays gemischt


      ACHTUNG: Bitte /[ und /] durch /\[ und /\[ ersetzen, wird durch das Forum nicht korrekt dargestellt.

      /**
       * Checks if Array or String is not undefined, null or empty.
       * 08-Sep-2019: added check for [ and ] to also catch arrays with empty strings.
       * @param inputVar - Input Array or String, Number, etc.
       * @return true if it is undefined/null/empty, false if it contains value(s)
       * Array or String containing just whitespaces or >'< or >"< or >[< or >]< is considered empty
       */
      function isLikeEmpty(inputVar) {
          if (typeof inputVar !== 'undefined' && inputVar !== null) {
              let strTemp = JSON.stringify(inputVar);
              strTemp = strTemp.replace(/\s+/g, ''); // remove all whitespaces
              strTemp = strTemp.replace(/\"+/g, "");  // remove all >"<
              strTemp = strTemp.replace(/\'+/g, "");  // remove all >'<
              strTemp = strTemp.replace(/[+/g, "");  // remove all >[<
              strTemp = strTemp.replace(/]+/g, "");  // remove all >]<
              if (strTemp !== '') {
                  return false;
              } else {
                  return true;
              }
          } else {
              return true;
          }
      }
      

      3. Arrays

      /**
       * Removing Array element(s) by input value. 
       * @param {array}   arr             the input array
       * @param {string}  valRemove       the value to be removed
       * @param {boolean} [exact=true]    OPTIONAL: default is true. if true, it must fully match. if false, it matches also if valRemove is part of element string
       * @return {array}  the array without the element(s)
       */
      function arrayRemoveElementsByValue(arr, valRemove, exact) {
      
          if (exact === undefined) exact = true;
      
          for ( let i = 0; i < arr.length; i++){ 
              if (exact) {
                  if ( arr[i] === valRemove) {
                      arr.splice(i, 1);
                      i--; // required, see https://love2dev.com/blog/javascript-remove-from-array/
                  }
              } else {
                  if (arr[i].indexOf(valRemove) != -1) {
                      arr.splice(i, 1);
                      i--; // see above
                  }
              }
          }
          return arr;
      }
      

      /**
       * Clean Array: Removes all falsy values: undefined, null, 0, false, NaN and "" (empty string)
       * Source: https://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript
       * @param {array} inputArray       Array to process
       * @return {array}  Cleaned array
       */
      function cleanArray(inputArray) {
        var newArray = [];
        for (let i = 0; i < inputArray.length; i++) {
          if (inputArray[i]) {
            newArray.push(inputArray[i]);
          }
        }
        return newArray;
      }
      

      /**
       * Remove Duplicates from Array
       * Source - https://stackoverflow.com/questions/23237704/nodejs-how-to-remove-duplicates-from-array
       * @param {array} inputArray       Array to process
       * @return {array}  Array without duplicates.
       */
      function arrayRemoveDublicates(inputArray) {
          let uniqueArray;
          uniqueArray = inputArray.filter(function(elem, pos) {
              return inputArray.indexOf(elem) == pos;
          });
          return uniqueArray;
      }
      

      /**
       * Returns the next or previous element of an array for a given element.
       * Use case is to easily switch through an array of elements...
       * If it is the last element of the array, it will return the first one, if bNext is true.
       * If it is the first element of the array, it will return the last one, if bNext is false.
       * If not found, it will ALWAYS return the first element.
       *
       * @param {array}   inputArray  Array
       * @param {string}  strElement  for this String we want to get the next/previous array element
       * @param {boolean} bNext       next element if true, previous element if false
       * @return {string} The next or previous element from the array
       */
      function arrayGetNextOrPreviousValue(inputArray, strElement, bNext) {
          let iLength = inputArray.length; // Number of elements in the Array
          let iPosition = inputArray.indexOf(strElement) + 1; // Current position. We add 1 since first element is in position 0
          let iPositionNext = iPosition + 1;
          let iPositionPrevious = iPosition - 1;
          
          if (bNext) {
              // if not found, it will return the first element...
              if (iPositionNext > iLength) iPositionNext = 1;
              return inputArray[iPositionNext - 1];
          } else {
              if (iPosition === 0) { // will be zero if not found
                  return inputArray[0]; // return the first element, if not found
              } else {
                  if (iPositionPrevious < 1) iPositionPrevious = iLength;
                  return inputArray[iPositionPrevious - 1];
              }
          }
      }
      

      /**
       * Sort array case-insensitive
       * @param {object} arrayInput  Array to be sorted
       * @return {object}   case-insensitive sorted array
       */
      function arraySortCaseInsensitive(arrayInput) {
          let arrayResult = [...arrayInput]; // We use array spreads '...' to copy array. If not, array is changed by reference and not value.
          arrayResult.sort(function (a, b) {
              return a.toLowerCase().localeCompare(b.toLowerCase());
          });
          return arrayResult;
      }
      


      indexOf() ist eine bereits vorhandene Funktion in JavaScript. Sie gibt den Index des Elements
      zurück (0, 1, 2, 3, usw.), oder -1, falls das Element nicht im Array ist.
      Beispiel:

      let arrayFruits = ['Apfel', 'Birne', 'Pfirsich'];
      let fruit = 'Banane';
      // indexOf() return the index of an element in the array, or -1 if it's not in the array.
      if (arrayFruits.indexOf(fruit) > -1) {
          log(fruit + ' ist im Array enthalten.');
      } else {
          log(fruit + ' ist im Array NICHT enthalten.');
      }
      

      4. Zahlen

      /**
       * Prüft ob Variableninhalt eine Zahl ist.
       * isNumber ('123'); // true  
       * isNumber ('123abc'); // false  
       * isNumber (5); // true  
       * isNumber ('q345'); // false
       * isNumber(null); // false
       * isNumber(undefined); // false
       * isNumber(false); // false
       * isNumber('   '); // false
       * @source https://stackoverflow.com/questions/1303646/check-whether-variable-is-number-or-string-in-javascript
       * @param {any} n     Variable, die zu prüfen ist auf Zahl
       * @return {boolean}  true falls Zahl, false falls nicht.
        */
      function isNumber(n) { 
          return /^-?[\d.]+(?:e-?\d+)?$/.test(n); 
      }
      

      /**
       * Fügt Vornullen zu einer Zahl hinzu, macht also z.B. aus 7 eine "007". 
       * Akzeptiert sowohl Datentyp number und string als Eingabe.
       * zeroPad(5, 4);    // wird "0005"
       * zeroPad('5', 6);  // wird "000005"
       * zeroPad(1234, 2); // wird "1234" :)
       * @param  {string|number}  num     Zahl, die Vornull(en) bekommen soll
       * @param  {number}         places  Anzahl Stellen.
       * @return {string}         Zahl mit Vornullen wie gewünscht.
       */
      function zeroPad(num, places) {
          let zero = places - num.toString().length + 1;
          return Array(+(zero > 0 && zero)).join("0") + num;        
      } 
      

      5. Datum/Zeit


      Dies ist eine eher wenig bekannte ioBroker-interne Funktion, siehe Dokumentation. Daher führe ich sie hier auf.
      Man kann damit einfach Zeiten vergleichen. Im folgenden Beispiel wird geprüft, ob die aktuelle Uhrzeit innerhalb des Bereichs ist.

      let result = compareTime('20:00', '22:30', 'between');
      log('Liegt die aktuelle Uhrzeit zwischen 20:00 und 22:30?: ' + result);
      

      /**
       * ---------------------------------------------------------------------------------------------
       * Converts a given date into a string by replacing "YYYY, MM, DD, hh, mm, ss" in given format.
       * Optional: will replace like DD-MM-YYYY with "Today"/"Yesterday" if within # (hash).
       *           So, '#DD.MM.YY#, hh:mm:ss' will become 'Today, 08:25:13'.
       *           Use optional parameters [todayString] and [yesterdayString] accordingly to replace
       *           with your terms you want to use for "Today" and "Yesterday".
       * ---------------------------------------------------------------------------------------------
       * Version: 1.1
       * Author: Mic
       * Source: https://forum.iobroker.net/topic/24179/
       * ---------------------------------------------------------------------------------------------
       * @param {object|number}  inputDate            The date to convert. Accepts both a date object (like: "new Date()") 
       *                                              or a timestamp number like 1582826332588 (so like what "Date.now()" returns)
       * @param {string}         format               String of which "YYYY, MM, DD, hh, mm, ss" will be replaced accordingls.
       *                                              Examples: 'YYYY-MM-DD hh:mm:ss', 'DD.MM.YY, hh:mm:ss', 'DD.MM.YY um hh:mm:ss Uhr'
       * @param {string}         [todayString]        Optional. String for "Today". Default is "Heute".
       * @param {string}         [yesterdayString]    Optional. String for "Yesterday". Default is "Gestern".
       * @return {string}                             The format containing the date values for YYYY, MM, DD, hh, mm, ss
       */
      function dateToString(inputDate, format, todayString='Heute', yesterdayString='Yesterday') {
      
          let strResult = format;
      
          // Convert inputDate to date. This is to accept timestamps, which will be converted to a date object as well
          let dateGiven = new Date(inputDate);
      
      
          // Replace today's date and yesterday's date
          let hashkMatch = strResult.match(/#(.*)#/);
          if (hashkMatch != null) {
              let todayYesterdayTxt = todayYesterday(dateGiven);
              if(todayYesterdayTxt != '') {
                  // We have either today or yesterday, so set according txt
                  strResult = strResult.replace('#'+hashkMatch[1]+'#', todayYesterdayTxt);
              } else {
                  // Neither today nor yesterday, so remove all ##
                  strResult = strResult.replace(/#/g, '');
              }        
          }
      
          // Replace YYYY, YY, MM, DD, hh, mm, ss accordingly with actual date/times
          strResult = strResult.replace(/Y{4}/g, zeroPad(dateGiven.getFullYear(), 4));
          strResult = strResult.replace(/Y{2}/g, zeroPad(dateGiven.getFullYear(), 2));
          strResult = strResult.replace(/M{2}/g, zeroPad((dateGiven.getMonth() + 1), 2));
          strResult = strResult.replace(/D{2}/g, zeroPad(dateGiven.getDate(), 2));
          strResult = strResult.replace(/h{2}/g, zeroPad(dateGiven.getHours(), 2));
          strResult = strResult.replace(/m{2}/g, zeroPad(dateGiven.getMinutes(), 2));
          strResult = strResult.replace(/s{2}/g, zeroPad(dateGiven.getSeconds(), 2));
       
          return strResult;
      
      
      
          /**
           * Add leading numbers -  see https://forum.iobroker.net/topic/24179/
           */
          function zeroPad(num, places) {
              let zero = places - num.toString().length + 1;
              return Array(+(zero > 0 && zero)).join('0') + num;        
          } 
      
          /**
           * @param {object} dateGiven   Date object
           * @return                     'Heute', if today, 'Gestern' if yesterday, empty string if neither today nor yesterday
           */
          function todayYesterday(dateGiven) {
              const today = new Date();
              const yesterday = new Date(); 
              yesterday.setDate(today.getDate() - 1)
              if (dateGiven.toLocaleDateString() == today.toLocaleDateString()) {
                  return todayString;
              } else if (dateGiven.toLocaleDateString() == yesterday.toLocaleDateString()) {
                  return yesterdayString;
              } else {
                  return '';
              }
          }
      
      }
      
      
      

      /**
       * Returns the current date in ISO format "YYYY-MM-DD".
       * Requires function zeroPad().
       * @return  {string}    Date in ISO format
       */
      function getCurrentIsoDate() {
          let currDate = new Date();
          return currDate.getFullYear() + '-' + zeroPad((currDate.getMonth() + 1), 2) + '-' + zeroPad(currDate.getDate(), 2);
      }
      
      

      /**
       * Converts a "date" datatype into ISO date. E.g. March 23, 2016 will become "2016-03-23" 
       * Requires function zeroPad().
       * @param   {object}  inputDate   Date created with "new Date()". If you want the current date, use "new Date()"
       * @return  {string}  Date in ISO format
       */
      function dateToIsoDate(inputDate) {
          return inputDate.getFullYear() + '-' + zeroPad((inputDate.getMonth() + 1), 2) + '-' + zeroPad(inputDate.getDate(), 2);
      }
      

      /**
       * Converts a given date datatype into European date/time. E.g. '9:03pm and 17 seconds' -> '21:03:17'
       * Requires function zeroPad().
       * @param   {object}   inputDate   Date created with "new Date()". If you want the current date, use "new Date()"
       * @return  {string}    Date in European date/time as String
       */
      function dateToEuroString(inputDate) {
          return zeroPad(inputDate.getHours(), 2) + ':' + zeroPad(inputDate.getMinutes(), 2) + ':' + zeroPad(inputDate.getSeconds(), 2);
      }
      

      /**
       * Abfrage, ob ein Datum innerhalb eines Bereichs ist.
       * Angeregt von: https://forum.iobroker.net/topic/2289/
       * Zum Aufruf ist das ISO-Datumsformat JJJJ-MM-TT erforderlich, z.B. 2019-12-24.
       * Gepostet unter: https://forum.iobroker.net/post/256400
       * @param {string}   strDateToCheck       Das zu prüfende Datum. Falls aktuelles Datum geprüft werden soll: 'now' eingeben.
       * @param {string}   strDateFirst         Datum: Zeitraum erster Tag.
       * @param {string}   strDateLast          Datum: Zeitraum letzter Tag.
       */
      function isDateInRange(strDateToCheck, strDateFirst, strDateLast) {
          // Prepare the date we want to check. Either current date, or provided date in variable strDateToCheck
          let dtToCheck;
          if (strDateToCheck == 'now') {
              dtToCheck = new Date();
          } else {
               dtToCheck = new Date(strDateToCheck);
          }
          dtToCheck.setHours(0, 0, 0, 0); // Same basis for hours, minutes etc. as for all dates
          let dtFirst = new Date(strDateFirst);
          dtFirst.setHours(0, 0, 0, 0);
          let dtLast = new Date(strDateLast);
          dtLast.setHours(0, 0, 0, 0);
          let isInRange = false;
          if ( (dtLast >= dtFirst) && (dtToCheck >= dtFirst) && (dtToCheck <= dtLast) )  {
              isInRange = true;
          }
          return isInRange;
      }
      

      /**
       * Add certain number of minutes to a given date/time.
       * @param {object}    dateInp      Date created with "new Date()". If you want the current date, use "new Date()"
       * @param {number}    minutesInp   Number of minutes to be added to the given date.
       * @return {object}   New date with the minutes added
       */
      function dateAddMinutes(dateInp, minutesInp) {
          return new Date(dateInp.getTime() + (minutesInp * 60000));
      }
      

      /**
       * Add certain number of days to a given date/time.
       * @param {object}    dateInp      Date created with "new Date()". If you want the current date, use "new Date()"
       * @param {number}    numberOfDays   Number of days to be added to the given date.
       * @return {object}   New date with the days added
       */
      function addDays(dateInp, numberOfDays) {
          return new Date(dateInp.getTime() + (numberOfDays * 24 * 60 * 60 * 1000));
      }
      

      6. Filesystem

      /**
       * Check if a file in the file system exists. It works synchronously.
       * See: https://stackoverflow.com/questions/4482686/
       * Version: Mic - 0.1 (27 Jan 2020)
       * @param {string}  filePath   Full file path incl. file name, like '/etc/passwd' or '/tmp/textfile.txt'
       */
      function fileExistsSync(filePath) {
          const fs = require('fs');
          if (fs.existsSync(filePath)) {
              return true;
          } else {
              return false;
          }
      }
      

      7. Regular Expressions - RegExp

      /**
       * Escapes a string for use in RegEx as (part of) pattern
       * Source: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
       * @param {string} inputStr  The input string to be escaped
       * @return {string}  The escaped string
       */
      function escapeRegExp(inputStr) {
      	return inputStr.replace(/[.*+?^${}()|[]\]/g, '\\$&'); // $& means the whole matched string
      }
      

      8. XML

      /**
       * Simple XML parser. Quelle: https://gist.github.com/petersirka/9e79b1d43cf6e579fc62
       * Wandelt ein XML in ein Array um, damit viel einfacher handhabbar.
       * @param  {string}  xml
       * @return {object}
       */
      function xmlParse(xml) {
      
          let beg = -1;
          let end = 0;
          let tmp = 0;
          let current = [];
          let obj = {};
          let from = -1;
      
          while (true) {
      
              beg = xml.indexOf('<', beg + 1);
              if (beg === -1)
                  break;
      
              end = xml.indexOf('>', beg + 1);
              if (end === -1)
                  break;
      
              let el = xml.substring(beg, end + 1);
              let c = el[1];
      
              if (c === '?' || c === '/') {
      
                  let o = current.pop();
      
                  if (from === -1 || o !== el.substring(2, el.length - 1))
                      continue;
      
                  let path = current.join('.') + '.' + o;
                  let value = xml.substring(from, beg);
      
                  if (typeof(obj[path]) === 'undefined')
                      obj[path] = value;
                  else if (obj[path] instanceof Array)
                      obj[path].push(value);
                  else
                      obj[path] = [obj[path], value];
      
                  from = -1;
                  continue;
              }
      
              tmp = el.indexOf(' ');
              let hasAttributes = true;
      
              if (tmp === -1) {
                  tmp = el.length - 1;
                  hasAttributes = false;
              }
      
              from = beg + el.length;
      
              let isSingle = el[el.length - 2] === '/';
              let name = el.substring(1, tmp);
      
              if (!isSingle)
                  current.push(name);
      
              if (!hasAttributes)
                  continue;
      
              let match = el.match(/\w+\=\".*?\"/g);
              if (match === null)
                  continue;
      
              let attr = {};
              let length = match.length;
      
              for (let i = 0; i < length; i++) {
                  let index = match[i].indexOf('"');
                  attr[match[i].substring(0, index - 1)] = match[i].substring(index + 1, match[i].length - 1);
              }
      
              obj[current.join('.') + (isSingle ? '.' + name : '') + '[]'] = attr;
          }
      
          return obj;
      }
      

      9. Astro

      /**
       * Check if a certain time is matching Astro name(s). 
       * Example use case: when turning on a light, you can use different colors depending on the 
       *                   current Astro time like 'sunrise', 'goldenHour'.
       * Version 1.0
       * @param {string|array} astroNames  A single name like 'sunset' as string, or an array of names,
       *                                   like ['goldenHour', 'sunsetStart', 'sunset', 'dusk']
       * @param {object} [dateTime]        Optional: A date object (new Date()). If omitted, we use current time.
       * @return {boolean}                 true if matching, false if not.
       */
      function isTimeInAstro(astroNames, dateTime=undefined) {
      
          if (!Array.isArray(astroNames)) astroNames = [astroNames]; // Put into array if it is a single string.
      
          const LOG_DEBUG = false;
      
          if ((dateTime != undefined) && !_isValidDate(dateTime)) { log('Provided parameter for dateTime is not a valid date.', 'error'); return; };
      
          let G_timeString = (dateTime == undefined) ? _dateToEuroStringTime(new Date()) : _dateToEuroStringTime(dateTime);
          if(LOG_DEBUG) log('[DEBUG] Time: ' + G_timeString);
      
          let strCurrAstroName = _getAstroName(G_timeString);
          if(LOG_DEBUG) log('[DEBUG] Current Astro: ' + strCurrAstroName);
          for (let lpVal of astroNames) {
              if (strCurrAstroName === lpVal) {
                  return true;
              }
          }
          return false; // Kein Treffer, also geben wir false zurück.
      
          //////////////////////////////// End. Functions are following below. ////////////////////////////////
      
          /*******************************************************************************
           * Get Astro name for given time. Returns like 'sunrise', 'goldenHour' etc.
           *   Example (September):
           *   01:10 -> nadir; 05:05 -> nightEnd; 05:44 -> nauticalDawn; 06:21 -> dawn; 06:53 -> sunrise; 06:56 -> sunriseEnd; 07:34 -> goldenHourEnd; 
           *   13:10 -> solarNoon; 18:46 -> goldenHour; 19:23 -> sunsetStart; 19:27 -> sunset; 19:58 -> dusk; 20:35 -> nauticalDusk; 21:14 -> night
           * @param {string}   strTime    Zeit in 'HH:MM' oder 'HH:MM:SS', z.B. '19:23', '08:45:12'.
           * @return {string}             Astro name like 'sunrise', 'goldenHour' etc.
          ******************************************************************************/
          function _getAstroName(strTime) {
              
              strTime = strTime.substring(0, 5); // remove seconds
      
              let arrAstroArrays = _getAstroArrays();
              for (let i = 0; i <= arrAstroArrays[0].length; i++) {
                  if (strTime < arrAstroArrays[0][i]) {
                      if (i === 0) {
                          // Hit on first element of array, so we return last element of array
                          return arrAstroArrays[1][arrAstroArrays[1].length - 1];
                      } else {
                          // We return the element -1
                          return arrAstroArrays[1][i-1];
                      }
                  }
              }
              // We did not find anything, so it is the last element of the array
              return arrAstroArrays[1][arrAstroArrays[0].length - 1];
      
      
              /***********************************
               * Gibt ein Array aus 2 Arrays zurück
               * 1. Sortierte Liste der Uhrzeiten der Astrozeiten, z.B. ["01:20","05:13","05:53","06:31",....]
               * 2. Sortierte Liste der Astronamen, typischerweise: ["nadir","nightEnd","nauticalDawn","dawn", ...]
               **********************************/
              function _getAstroArrays() {
                  let currDate = new Date();
                  let suncalc = require('suncalc');
                  if(_getSystemConfig('latitude') == '' || _getSystemConfig('longitude') == '') log('Latitude and/or Longitude is blank in ioBroker admin settings.', 'warn');
                  let times = suncalc.getTimes(currDate, _getSystemConfig('latitude'), _getSystemConfig('longitude'));
                  
                  // Get all current Astro Times in arrays
                  let astroTimes = [];
                  let astroBoth = [];
                  for (let t in times) {
                      let Hour = times[t].getHours();
                      let Minute = times[t].getMinutes();
                  
                      if ( Hour < 10 ) { Hour = "0" + Hour; }
                      if ( Minute < 10 ) { Minute = "0" + Minute; }
                      let TimeString = Hour + ':' + Minute;
                  
                      astroTimes.push(TimeString);
                      astroBoth.push(TimeString + "#" + t);
                      
                  }
                  astroTimes.sort();
                  
                  // We  bring the names in same sort order as the times
                  // Supposed to result in: ["nadir","nightEnd","nauticalDawn","dawn","sunrise","sunriseEnd","goldenHourEnd","solarNoon","goldenHour","sunsetStart","sunset","dusk","nauticalDusk","night"]
                  astroBoth.sort();
                  let astroNames = [];
                  for (let lpVal of astroBoth) {
                      astroNames.push(lpVal.substring(6));
                  }    
                  
                  return [ astroTimes, astroNames ];
      
                  /**
                   * Returns a value as configured in Administration Settings of ioBroker
                   * @param {string}  what     Options like: city, country, longitude, latitude, language, tempUnit, 
                   *                                         currency, dateFormat, isFloatComma, licenseConfirmed, 
                   *                                         defaultHistory, activeRepo, diag
                   *                           To see all options, use: log('All options: ' +  JSON.stringify(getObject('system.config').common));
                   * @return {string}          The option. Will be an empty string if value is not set.
                   */
                  function _getSystemConfig(what) {
                      let config = getObject('system.config').common;
                      if (config[what] == undefined) {
                          log('Setting [' + what + '] not found in ioBroker admin settings.', 'warn');
                          return '';
                      }
                      return config[what];
                  }
      
              }
      
          }
      
          // https://stackoverflow.com/questions/643782/
          function _isValidDate(date) {
              return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
          }
      
          /**
           * Converts a given date datatype into European date/time. E.g. '9:03pm and 17 seconds' -> '21:03:17'
           * @param   {object}   inputDate   Date created with "new Date()". If you want the current date, use "new Date()"
           * @return  {string}    Time in European format like '21:03:17'
           */
          function _dateToEuroStringTime(inputDate) {
              return _zeroPad(inputDate.getHours(), 2) + ':' + _zeroPad(inputDate.getMinutes(), 2) + ':' + _zeroPad(inputDate.getSeconds(), 2);
      
              // Fügt Vornullen zu einer Zahl hinzu, macht also z.B. aus 7 eine "007". 
              function _zeroPad(num, places) {
                  let zero = places - num.toString().length + 1;
                  return Array(+(zero > 0 && zero)).join("0") + num;        
              } 
          }
      
      }
      

      10. ioBroker


      Mit diesem Script bzw. dieser Funktion können States (Datenpunkte) unter 0_userdata.0 oder unter javascript.x angelegt werden.
      Dabei können mehrere States gleichzeitig angelegt werden. Sobald alle erfolgreich angelegt wurden, kann danach (per callback) ein beliebiger Code ausgeführt werden, also beispielsweise die Haupt-Funktion des Scripts.

      Function, mit Beschreibung in Deutsch): https://github.com/Mic-M/iobroker.createUserStates
      Support: https://forum.iobroker.net/topic/26839/

      /**
       * Returns a value as configured in Administration Settings of ioBroker
       * @param {string}  what     Options like: city, country, longitude, latitude, language, tempUnit, 
       *                                         currency, dateFormat, isFloatComma, licenseConfirmed, 
       *                                         defaultHistory, activeRepo, diag
       *                           To see all options, use: log('All options: ' +  JSON.stringify(getObject('system.config').common));
       * @return {string}          The option. Will be an empty string if value is not set.
       */
      function getSystemConfig(what) {
          let config = getObject('system.config').common;
          if (config[what] == undefined) {
              log('Setting [' + what + '] not found in ioBroker admin settings.', 'warn');
              return '';
          }
          return config[what];
      


      Hinweis (07.01.2019): Bislang gab es hier eine Function isState(), diese ist nun hinfällig, weil es mit existsState() nun (mind. ab JS-Adapter-Version 4.3.4, gg. früher schon) eine neue ioBroker-Funktion gibt, um zu prüfen, ob ein State (Datenpunkt) existiert. Beispiel:

      const STATE_ID = '0_userdata.0.LivingRoom.Lights.Sideboard.Brightness'
      if( existsState(STATE_ID) ) {
          log('Datenpunkt existiert');
      } else {
          log('Datenpunkt ist nicht vorhanden');
      }
      

      /**
       * Vor wie vielen Sekunden wurde ein State aktualisiert?
       * Per Default wird der Timestamp genommen. Durch Setzen von what auf 'lc' wird die letzte Änderung genommen.
       * @param {string}  stateId   Id zum State, z.B. 'fullybrowser.0.192_168_0_10.isFullyAlive'
       * @param {string} [what='ts'] Optional. 'ts' für timestamp (= Default), lc für lastchanged.
       * @return {number} Vergangene Anzahl an Sekunden, als der State zuletzt aktualisiert wurde
       */
      function stateLastUpdated(stateId, what) {
      
          if (what === undefined) what = 'ts';
          if(what !== 'ts' && what !== 'lc') what = 'ts';
      
          let dtNow = new Date();
          let tsNow = dtNow.getTime();
          let dtCheck = new Date(getState(stateId)[what]);
          let tsCheck = dtCheck.getTime();
      
          return Math.round((tsNow - tsCheck) / 1000); // Zeitdifferenz in Sekunden
      
      }
      

      /**
       * Adapter einschalten/neu starten oder ausschalten
       * Quelle: https://forum.iobroker.net/topic/24179/vorlage-hilfreiche-javascript-funktionen/
       * WICHTIG: In JavaScript-Adapter-Instanz Haken bei "setObject erlauben" aktivieren.
       * Version: 0.3 Mic
       * @param {string}    adapterInstancePath  Pfad zur Adapter-Instanz, z.B. "spotify-premium.0"
       * @param {boolean}   flag                 true für Einschalten oder Neustart (falls bereits eingeschaltet), false für Ausschalten
        * @param {object}  [callback]            Optional: a callback function.
        */
      function adapterOnOff(adapterInstancePath, flag, callback){
          const PATH = 'system.adapter.' + adapterInstancePath;
          let obj = getObject(PATH);
          obj.common['enabled'] = flag;  // Adapter einschalten/neu starten oder ausschalten
          setObject(PATH, obj, function(){
              if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                  return callback();
              }
          });
      }
      

      /**
       * Is a certain adapter up and running?
       * @param {string}   adapterState  Main state of adapter, e.g. 'hm-rpc.0'
       * @param {number}   [minUptime=0] Optional: minimum number of minutes the adapter is running.
       *                                 Default = 0 minutes, so the uptime will not be checked by default.
       *                                 If you provide a certain number of minutes, the function will return false if 
      *                                  if adapter is running less time than this number of minutes.
       * @return {boolean}               true if adapter is actively running yes, false if not.
       */
      function isAdapterAlive(adapterState, minUptime) {
          if(minUptime === undefined) minUptime = 0;
      
          let isAlive = false;
          if ( (getState('system.adapter.' + adapterState + '.alive').val) && (getState('system.adapter.' + adapterState + '.connected').val) ) {
              if( (getState('system.adapter.' + adapterState + '.uptime').val / 60) > minUptime ) {
                  isAlive = true;
              }
          }
          return isAlive;
      }
      

      /**
       * Change VIS View
       * @param {string}   toView                 Projekt + '/' + Viewname (aus Datenpunkt vis.0.control.data übernehmen)
       * @param {string}   [instance='FFFFFFFF']  Optional: Instanz. Default ist 'FFFFFFFF', sollte das nicht gehen, dann Wert vom Vis, Menü Tools, Feld "Instanz ID" nehmen
       */
      function changeVisView(toView, instance){
          if (instance === undefined) instance = 'FFFFFFFF';
          let visCmd = '{"instance": "' + instance + '", "command": "changeView", "data": "' + toView + '"}';
          setState('vis.0.control.command', visCmd);
      }
      

      11. Weiteres für das Schreiben von Scripten

      /**
       * Retrieve values from a CONFIG variable, example:
       * const CONF = [{car: 'bmw', color: 'black', hp: '250'}, {car: 'audi', color: 'blue', hp: '190'}]
       * To get the color of the Audi, use: getConfigValuePerKey(CONF, 'car', 'audi', 'color')
       * To find out which car has 190 hp, use: getConfigValuePerKey(CONF, 'hp', '190', 'car')
       * @param {object}  config     The configuration variable/constant
       * @param {string}  key1       Key to look for.
       * @param {string}  key1Value  The value the key should have
       * @param {string}  key2       The key which value we return
       * @returns {any}    Returns the element's value, or number -1 of nothing found.
       */
      function getConfigValuePerKey(config, key1, key1Value, key2) {
          for (let lpConfDevice of config) {
              if ( lpConfDevice[key1] === key1Value ) {
                  if (lpConfDevice[key2] === undefined) {
                      return -1;
                  } else {
                      return lpConfDevice[key2];
                  }
              }
          }
          return -1;
      }
      

      posted in JavaScript
      Mic
      Mic
    • [Aufruf] Welche guten JavaScripts setzt ihr ein?

      Hi,

      wie wäre es, wenn wir die hier in der ioBroker-Community enstandenen JavaScripts entsprechend sammeln und die Liste entsprechend pflegen?

      Voraussetzung für die Aufnahme in dieser Liste: Einfach verwendbar, auch ohne wirklicher JavaScript-Kenntnisse. Und entsprechender Use-Case vorhanden, der nicht allzu individuell ist.

      Nun seid ihr dran:
      Bitte postet Links zu Scripts, die hier aufgenommen werden sollten. Eine Begründung dazu, also warum aufnehmen, wäre auch noch gut. Danke!
      Bitte am besten immer Link zum Original-Script hier im Forum, falls ihr Scripts hier direkt postet.


      P.S. Weitere interessante Links

      • ioBroker JavaScript-Functions: Dokumentation
      • Hilfreiche ioBroker JavaScript-Funktionen
      • javascript.info: Gutes JavaScript-Tutorial

      Zu den Kategorien

      Scripts der Kategorie A erfüllen Folgendes:

      1. Der Ersteller pflegt regelmäßig das Script
      2. Es gibt einen Forum-Thread für User-Feedback, der verlinkt ist.
      3. Optional, jedoch gewünscht 🙂 : das Script ist auf Github veröffentlicht und versioniert.

      Gerade Scripts der Kategorie A sind auch potentielle Kandidaten für die Umwandlung in einen neuen Adapter.

      Scripts der Kategorie B sind alle restlichen Scripts, die diese Kriterien nicht erfüllen. Diese sind dennoch einfach verwendbar ohne tiefer JavaScript-Kenntnisse und es ist ebenso ein entsprechender Use-Case vorhanden, der nicht allzu individuell ist.
      Achtung: Scripts der Kategorie B sind nicht unbedingt durch mehrere Anwender getestet worden, sondern wurden teils einfach ohne näherer Prüfung hier übernommen!

      ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖

      Scripts Kategorie A

      ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖

      Anwesenheit

      Aktuelles Script: Github
      ioBroker-Forum-Thread: Anwesenheitssteuerung mit TR-064-Community-Adapter

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Geofency-Skript: über PHP-Webspace an ioBroker

      Bewegungsmelder

      Javascript, mit dem die mittels Mihome-Adapter eingebundenen Xiaomi Aqara Sensoren entsprechend Geräte steuern, z.B.:

      • Gerät/Licht an bei Bewegung
      • Dabei: optional Gerät/Licht wieder ausschalten, falls nach X Minuten keine Bewegung mehr
      • Dabei: optional nur zwischen bestimmten Zeiten schalten (z.B. nur zwischen 7:00-9:00 und 18:-23:00)
      • Dabei: optional nur schalten, falls gemessene Lichtstärke in Lux nicht über Schwellwert (damit z.B. bei ausreichender Helligkeit kein Licht eingeschaltet wird).

      Die Konfiguration sollte selbsterklärend sein. Es können beliebig viele Bewegungsmelder damit gesteuert werden, die jeweils unterschiedlich konfiguriert werden können.

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Bewegungsmelder Xiaomi Aqara: Geräte/Lichter steuern

      Heizung

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Homematic IP Thermostate mit CCU: Externe Temperatursensoren (z.B. Xiaomi, etc.) einbinden mittels Offset-Setzen

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Homematic IP Thermostate: Urlaubssteuerung über VIS

      ioBroker-Forum-Thread: Vorlage: Ventilsteuerung mit PWM-Ansatz für Fussbodenheizungen/IR-Panele o.ä.

      Multimedia

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Philips-TV-Adapter

      Benötigt den Sonos-Adapter.

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Script für Sonos-Adapter

      System

      ioBroker-Forum-Thread: Script - Info über Datenpunkte sammeln


      Der ioBroker loggt alle Aktionen der Adapter und Scripte entsprechend mit, einzusehen in der ioBroker-Administration, linke Seite Menüpunkt "Log".
      Dieses Script bietet folgendes:

      • Log im VIS darstellen: Entsprechend gefiltert, also etwa nur Warnungen und Fehler, nur Ausgaben eines bestimmten Adapters, usw.
      • Auf Log-Ereignisse agieren
        Dabei nimmt das Script jeden neuen Logeintrag des ioBrokers und wendet entsprechend gesetzte Filter an,
        um den Eintrag dann in den entsprechenden Datenpunkten dieses Scripts abzulegen.
        Es stehen auch JSON-Datenpunkte zur Verfügung, mit diesen kann im vis eine Tabelle ausgegeben werden (z.B. über das Widget 'basic - Table').

      Aktuelles Script: ioBroker Log-Script
      ioBroker-Forum-Thread: Vorlage: Log-Datei aufbereiten für VIS

      Visualisierung

      ioBroker-Forum-Thread: Material Design Widgets: Adapter Status
      Material Design Widgets Adapter: https://github.com/Scrounger/ioBroker.vis-materialdesign

      Neu:
      Das Log-Script bietet eine Alexa-History-Integration. Hier veröffentlicht: https://forum.iobroker.net/post/386960

      Log-Script: Installation und Einrichtung (Github)
      Zusätzliches Script für Alexa: Erklärung im Forum und auf Github

      Alt:
      Aktuelles Script: Github
      ioBroker-Forum-Thread: Vorlage: Alexa-History-Befehle in VIS anzeigen

      ioBroker-Forum-Thread: Script: Alexa Listen pflegen und Anzeigen

      ioBroker-Forum-Thread: HTML Tabelle für BackItUp Adapter

      ioBroker-Forum-Thread: Script für Tabelle der Batterie-Zustände

      ioBroker-Forum-Thread: Vorlage: Zeit herunterzählen bis Google-Termin eintritt

      ioBroker-Forum-Thread: Script: Eieruhr

      Script: Google Charts

      ioBroker-Forum-Thread: Vorlage: Google Charts Beispiel

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Google Tabelle in ioBroker-Datenpunkte

      Script: ioB-Lebensmittelwarnung

      ioBroker-Forum-Thread: Javascript für Warnungen von Lebensmittelwarnung


      Der ioBroker loggt alle Aktionen der Adapter und Scripte entsprechend mit, einzusehen in der ioBroker-Administration, linke Seite Menüpunkt "Log".
      Dieses Script bietet folgendes:

      • Log im VIS darstellen: Entsprechend gefiltert, also etwa nur Warnungen und Fehler, nur Ausgaben eines bestimmten Adapters, usw.
      • Auf Log-Ereignisse agieren
        Dabei nimmt das Script jeden neuen Logeintrag des ioBrokers und wendet entsprechend gesetzte Filter an,
        um den Eintrag dann in den entsprechenden Datenpunkten dieses Scripts abzulegen.
        Es stehen auch JSON-Datenpunkte zur Verfügung, mit diesen kann im vis eine Tabelle ausgegeben werden (z.B. über das Widget 'basic - Table').

      Aktuelles Script: ioBroker Log-Script
      ioBroker-Forum-Thread: Vorlage: Log-Datei aufbereiten für VIS

      ioBroker-Forum-Thread: https://forum.iobroker.net/topic/30885/vorlage-mdcss-v2-iobroker-log-in-vis-anzeigen

      Es wird das Material Design CSS benötigt.

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: Pflanzen gießen - Erinnerung (für VIS, keine Hardware erforderlich)

      ioBroker-Forum-Thread: Material Design Widgets: Skript Status

      Von @Negalein hier in diesem Thread gepostet: https://forum.iobroker.net/post/381494

      Aktuelles Script (hier im Thread): https://forum.iobroker.net/post/373292

      Link zum Thema: Skripten des E-Control Spritpreisrechners

      Aktuelles Script: Github

      ioBroker-Forum-Thread: Vorlage: VIS: View durch Pin schützen

      ioBroker-Forum-Thread: Variable Zeitsteuerung mit VIS Editor

      ioBroker-Forum-Thread: Vorlage: Zeitschaltuhr mit 4 Zyklen ein aus einstellbar in vis inkl. Astro und manuell auto umschaltung

      Windows


      Script: Github
      ioBroker-Forum-Thread: Windows-Steuerung
      Software GetAdmin: Software GetAdmin (credits to Vladimir Vilisov)


      ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖

      Scripts Kategorie B

      ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖ ➖
      Im Gegensatz zu Scripts der Kategorie A sind diese Scripts hier teils nur einmalig veröffentlicht worden, nicht unbedingt regelmäßig vom Ersteller gepflegt/aktualisiert und es gibt nicht unbedingt einen Forum-Thread für User-Feedback für das Script.
      Achtung: Diese Scripts sind teils auch ungetestet bzw. nur vom Ersteller getestet worden.


      Alexa

      (Weitere Alexa-Scripts siehe auch unter "Kategorie A - Visualisierung")

      ioBroker-Forum-Thread: Script "LichtAn": Erkennt von welchem Echo-Gerät Befehl kommt

      Von Tictactoo hier in diesem Thread gepostet: https://forum.iobroker.net/post/376463

      Bewegungsmelder

      Von @Tictactoo hier in diesem Thread gepostet.

      1. Aqara/Xiaomi-Bewegungssensor schaltet Zigbee-Device mit .state
      2. Aqara/Xiaomi-Bewegungssensor schaltet Zigbee-Lampe mit .brightness

      Hardware generell

      ioBroker-Forum-Thread: Vorlage: Script und VIS: Druckerpatronen Zustand

      Basierend auf Vorlage: Script und VIS: Druckerpatronen Zustand

      Aktuelles Script (hier im Thread): https://forum.iobroker.net/post/373292

      Ursprünglich hier gepostet: https://forum.iobroker.net/topic/669/vorlage-script-und-vis-druckerpatronen-zustand/5

      Von @BoBeRzE hier in diesem Thread gepostet: https://forum.iobroker.net/post/383430

      Von @charakterkopf in diesem Thread gepostet.

      Link: https://forum.iobroker.net/post/373269

      Von @Chaot hier in diesem Thread gepostet: https://forum.iobroker.net/post/392751

      Von @Tictactoo hier in diesem Thread gepostet.
      MiFlora Pflanzensensor mit Telegram Benachrichtigung

      Von @charakterkopf in diesem Thread gepostet.

      Link: https://forum.iobroker.net/post/373275

      System

      Hier im Thread veröffentlicht: Dieses Skript Räumt in den Räumen und Funktionen auf
      Script auf Github: https://github.com/xCruziX/ioBroker-Clean-Enums

      Telegram, Alarm

      Von @Nahasapee - Link: https://github.com/Nahasapeemapetilon/MyTelegramMenu

      Von Tictactoo hier in diesem Thread gepostet: https://forum.iobroker.net/post/376463

      Von Tictactoo hier in diesem Thread gepostet: https://forum.iobroker.net/post/376463

      Visualisierung

      ioBroker-Forum-Posting: Sidebar in VIS

      Zeitschaltuhr

      ioBroker-Forum-Thread: Time Of Day - Design Pattern

      posted in JavaScript
      Mic
      Mic
    • Digital Detox

      Hi zusammen,
      hier nun eine Rückmeldung von mir, warum ich so ganz plötzlich hier von der Bildfläche verschwunden bin im Dezember.

      Ich hatte einen Burnout, letztendlich war es ein zu viel im eigentlichen Job, privat, und dann noch ioBroker mit den Entwicklungsprojekten.

      Eigentlich dachte ich, als mental sehr fitter und positiv eingestellter Mensch, gesund, fit, sportlich, etc. dass mich das nicht trifft. Aber es war dann doch zu viel.

      Daher hatte ich im Dezember u.a. den Stecker gezogen und ein (digitales) Detox eingeleitet, also: Email-Filterregeln (z.B. alles mit ioBroker in einen Unterordner ablegen), keine technischen Foren mehr, keine Programmierung etc. mehr, usw.

      Mittlerweile geht es mir aber wieder wirklich gut. ☺

      Allerdings habe ich natürlich dazu gelernt und bin vorsichtig: ich werde jetzt erst mal auch weiterhin mein Engagement für ioBroker pausieren zumindest für die nächsten Wochen.

      Das bedeutet für laufende ioBroker-Projekte von mir:
      Bitte Freiwillige vor, zur Übernahme, für Support, etc.

      Aufgrund meines laufenden „Detox-Programms“ lese ich weiterhin keine ioBroker-Emails, private Nachrichten, PMs, etc., sondern werde nur in diesen Thread öfters mal rein schauen.

      Meldet Euch also gerne hier als Antwort, falls wer ein (Adapter-)projekt übernehmen möchte, gerne steige ich später wieder mit ein, wie möglich.

      Bitte hier keinerlei Supportanfragen, etc. Danke 😉

      Viele Grüße

      posted in Off Topic
      Mic
      Mic
    • Planung neuer Adapter: Smart Control

      Hi,

      mein ursprünglicher Plan war/ist, das Bewegungsmelder-Script abzulösen.
      In meiner Umfrage war das auch Wunsch Nummer 1 als nächster Adapter.

      Nun steht ein Konzept, hab aber außer der Adapter-Konfiguration noch keine Zeile Adapter-Code geschrieben 😉

      Selbst der Adapter-Name steht noch nicht fest, hab ihn jetzt erst mal "Room Control" benannt. Namens-Vorschläge sind willkommen ☺

      Was wird der Adapter können:

      Hier mal Beispiel Use Cases:

      • Bad wird am Montag um 7:00 betreten (falls nicht Feiertag), dann geht das Licht an und das Radio schaltet sich an. Falls nach 15 Minuten keine Bewegung mehr, wird ausgeschaltet.
      • Flurlicht-Steuerung mit Bewegungsmeldern, Lichtschaltern, etc.
      • Küchenlicht schaltet sich ein, wenn Helligkeit kleiner xxx Lux und andere Kriterien (z.B. jemand anwesend, Uhrzeit/Astro, Bewegung, etc.) zutreffen.
      • Relax-Bereich: Licht geht an und Alexa spielt Musik, sobald sich jemand auf den Sessel in der "Leseecke" sitzt. Sobald keiner mehr sitzt (z.B. über Xiaomi-Tür/Fenster-Sensor), wird nach paar Minuten wieder ausgeschaltet.

      Ich erkläre es mal anhand der Konfiguration:

      1. Man definiert Auslöser ("Triggers") also z.B. Bewegungsmelder, Wandschalter, einen Fensterkontakt, o.ä.
        518419b5-d566-4f27-befd-5a16cccabfd1-image.png

      2. Man definiert zu schaltende Geräte/Datenpunkte, die geschaltet werden (Mehrfachauswahl) sobald ein Auslöser was meldet.
        fd775c51-619c-4128-80d2-9f0d7ec6dff9-image.png

      3. Man definiert Räume/Bereiche, wie z.B. "Lese-Ecke", "Gäste-WC EG", "Flur 1. OG", "Esstisch", usw. Hier verknüpft man dann die Auslöser und die zu schaltenden Ziele.
        02ecc340-4615-4e08-8e8b-ef02572efdde-image.png
        e98241a6-a01a-476c-be3f-4e6492d64fa1-image.png
        1469979a-a178-4446-b4c8-2726dbf995fb-image.png

      4. Dann definiert man noch gewisse Bedingungen, z.B. Feiertag, alle abwesend, Kaffeemaschine muss gereinigt werden, etc.
        d4d9d283-77f3-4fc1-a66e-f0c2e56d07a6-image.png

      5. Zum Schluss eine Zeitplanung, wann bei Auslösen der Trigger geschaltet wird. Also z.B. immer, wenn ein Trigger auslöst, oder nur zu bestimmten Zeiten und nur falls wer anwesend, nicht auslösen, falls die Kaffeemaschine gereinigt werden muss, usw.
        9bd5f25e-91fe-46f0-b657-c0cdbd8ac22b-image.png

      Soweit so gut. Beim Entwerfen des Konzepts kommt mir immer mehr, dass das eine größere Sache werden könnte und nicht nur limitiert auf Schalter/Bewegungsmelder/Lichter etc. Aber jetzt erst mal hiermit starten 😎

      Hier noch eine gif-Animation zu den geplanten Einstellungen:
      xxtest.gif

      Ausblick

      Fokus ist erst mal "Licht-/Geräte-/Raumsteuerung" in Verbindung mit optionalen Bewegungsmeldern und Zeitplanungen.

      Aber man könnte damit auch viele andere Blockly/JavaScripts ablösen, wie z.B. "Xiaomi Aqara Cube wird geschüttelt --> Fernseher geht aus", also einige ITTT "If This Then That" Sachen, ohne dass man Blockly/JS braucht.
      Mal sehen ☺

      Ideen und Vorschläge anderer User

      • @Tirador hat hier und nachfolgend hier einige sehr gute Ideen zur zentralen Lichtsteuerung gepostet.
      • @Omnedon hat dazu ergänzt.
      • Generell:
        • Thread: Vorlage: Bewegungsmelder-Script
        • Thread: Umfrage: Welchen Adapter soll ich als nächstes entwickeln?

      Nun brauche ich bitte euer Feedback

      Die Umsetzung der Adapter-Entwicklung hängt maßgeblich vom Konzept ab, daher habe ich erst mal die Konfiguration gestaltet. Bevor ich jetzt loslege mit der eigentlichen Entwicklung und unnötig Zeit verbrate:

      • Erscheint das Konzept für euch so sinnvoll?
      • Fehlt was Wesentliches?
      • Was würdet ihr euch noch wünschen?
      • Andere Meinungen?

      VIS-Widgets und VIS-Steuerung schließe ich im Scope des Adapters explizit aus, das überlasse ich anderen 🙂 Aber Datenpunkte kann ich natürlich gerne zur Verfügung stellen zur Konfiguration.

      Brauche auch noch bitte bessere Namensvorschläge für den Adapter (derzeit "Room Control") 😉

      posted in Entwicklung
      Mic
      Mic
    • Test: Adapter Log Parser v0.x.x GitHub
      Aktuelle Test Version 0.4.6
      Veröffentlichungsdatum 13. April 2020
      Github Link https://github.com/Mic-M/ioBroker.logparser

      Über diesen Adapter

      Mit diesem Adapter können die ioBroker-Logs aller Adapter entsprechend geparsed, also gefiltert werden. Dieser Adapter ersetzt auch vollständig mein Log-Script (siehe Github | ioBroker-Forum-Thread).

      Siehe hier die Vorankündigung: Adapter Log-Parser – brauche bitte Eure Meinung

      Ein paar Kommentare:

      • Es sind soweit alle Features des Log-Scripts vorhanden.
      • Die Performance wurde massiv verbessert. Ich habe die meisten Script-Teile entsprechend umgeschrieben.
      • Bestehende Log-Scripts von mir im JavaScript-Adapter bitte deaktivieren zum testen.
      • Installation für die Tester über "5.) Adapter aus eigener URL installieren". Dann werden die entsprechenden Datenpunkte unter logparser.0 angelegt.
      • Für die Umsteiger vom Log-Script: Hier eine Vergleichstabelle der Datenpunkte

      Euer Feedback ist sehr willkommen 🙂 Ich werde auch noch Lasttests durchführen, also viele Logs gleichzeitig reinballern, um zu sehen wie sich der Adapter verhält.

      Anleitungen:

      Deutsch | Englisch

      Fragen zu Filterregeln:

      Bitte hier stellen: Log Parser: Fragen und Antworten zu Regex und Filterregeln

      Changelog:

      Siehe hier

      Beispiel für VIS:

      (Hier die Beschreibung)
      visintro.gif

      posted in Tester
      Mic
      Mic
    • [Doku] Adapter-Entwicklung für Dummies

      Header

      Mit "...für Dummies" habe ich einen bewusst provozierenden Titel gewählt 😀

      Es gibt zur Adapterentwicklung sehr viele einzelne Beiträge hier im Forum, in der Dokumentation, usw., aber es fehlt meines Erachtens eine einfache Schritt-für-Schritt-Anleitung, mit der man schnell zum Erfolg kommt.

      Das versuche ich hiermit jetzt zu ändern 🙂

      Erwähnenswert ist sicherlich die Luftdaten-Adapter-Entwicklungs-Doku, aber diese ist mit YouTube umgesetzt und macht es aus meiner Erfahrung nicht unbedingt einfach, das dann 1:1 nachzubilden, da ist oft eine niedergeschriebene Schritt-für-Schritt-Anleitung einfacher.

      Hier nun ein erster Start. Innerhalb wohl weniger als 20 Minuten wird eine ioBroker-Testumgebung aufgesetzt, eine Entwicklungsumgebung geschaffen (noch ohne Debuggen), und ein erster Adapter auf dem Testsystem generiert, der das erste "Hallo Welt" ausgibt.
      Weiteres folgt nach und nach.

      Link: Adapter-Entwicklung für Anfänger

      Was haltet ihr davon? Ist so was hilfreich für die ioBroker-Community?

      posted in Entwicklung
      Mic
      Mic
    • Aufruf: Neuen SmartControl-Adapter 0.1.0-alpha.x testen

      4cccce5b-3fd1-42e2-a376-007feda65890-image.png

      Aktuelle Test Version 0.1.0-alpha.8 3 4 5 6 7
      Veröffentlichungsdatum 12. Juli 2020
      Github Link https://github.com/Mic-M/ioBroker.smartcontrol

      Über diesen Adapter

      Mein ursprünglicher Plan war/ist, das Bewegungsmelder-Script durch einen Adapter abzulösen. In meiner Umfrage war das auch Wunsch Nummer 1 als nächster Adapter.

      Daraus ist nun der "Smart Control"-Adapter entstanden, der aber deutlich mehr kann als nur Bewegungsmelder, und es wird noch deutlich mehr folgen 😉

      Alles dreht sich bei dem Adapter um Auslöser (z.B. Wandschalter wird geschaltet, Bewegungsmelder aktiviert, Fenster wird geöffnet, 8:30 Uhr Freitags tritt ein, Sonnenaufgang + 30 Minuten am Wochenende tritt ein, etc.), worauf dann Datenpunkte geschaltet werden, wenn weitere Bedingungen zutreffen (z.B. "mindestens eine Person anwesend"). Ausgeschaltet wird dann optional auch wieder automatisch z.B. mittels Timer (also wenn Bewegungsmelder verwendet: keine Bewegung mehr und nach angegebenen Sekunden).

      Die ganze Logik legt ihr in den Adapter-Einstellungen an und verknüpft diese dort entsprechend.
      Hier kurz erklärt (Screenshot von den Adapter-Einstellungen);
      5063d5cf-52f2-48eb-b5e0-8be101660e74-image.png

      Ein paar Beispiel-Anwendungen (Use Cases):

      • Bad wird am Montag um 7:00 betreten (falls nicht Feiertag), dann geht das Licht an und das Radio schaltet sich an. Falls nach 15 Minuten keine Bewegung mehr, wird ausgeschaltet.
      • Flurlicht-Steuerung mit Bewegungsmeldern, Lichtschaltern, etc.
      • Küchenlicht schaltet sich bei Bewegung ein, wenn Helligkeit kleiner x Lux und andere Kriterien (z.B. jemand anwesend, Uhrzeit/Astro, etc.) zutreffen.
      • Relax-Bereich: Licht geht an und Alexa spielt Musik, sobald sich jemand auf den Sessel in der "Leseecke" sitzt und es nach Sonnenuntergang minus 30 Minuten ist. Sobald keiner mehr sitzt (z.B. erkannt über Xiaomi-Tür/Fenster-Sensor), wird wieder ausgeschaltet.

      Der Adapter legt mehrere Datenpunkte an:

      • smartcontrol.0.Test – rein zum testen, haben keinerlei sonstige Auswirkungen. Details siehe "Für Tester" in der Adapter-Startseite (Admin):
        6708fdca-7185-4d1e-8337-d230ce98d990-image.png
      • smartcontrol.0.info.astroTimes: Hier werden eure aktuellen Astrozeiten angezeigt. Der Adapter aktualisiert diese Datenpunkte für euch jede Nacht um 0.00 Uhr.
        90eb8f7e-3ca4-44e1-a5a0-0016aa1dc4a8-image.png
        Zeitstempel (timeStamps) gibt es auch, falls ihr die Astrozeiten zur JavaScript/Blockly-Entwicklung nutzen wollt.
        Der Adapter selbst nutzt diese Datenpunkte nicht aktiv, sondern kalkuliert selbst, dient also nur für euch zur Info und soll ein ggf. bislang genutztes Script hierfür ersetzen. Weil ich ja eh schon die Infos im Adapter habe (über suncalc), stelle ich sie euch hier gleich zur Verfügung 🙂 Ihr könnt damit außerdem die aktuellen Astrozeiten sehen für eure Einstellungen, ist ja dann doch "verwirrend", wann z.B. "nauticalDusk" jetzt genau ist aktuell...
      • smartcontrol.0.targetDevices: Hier erscheinen alle "ZIELGERÄTE" als Datenpunkte. Für jede Tabellenzeile unter "1. ZIELGERÄTE" fügt dieser Adapter verknüpfte Datenpunkte zu smartcontrol.x.targetDevices.xxx hinzu. Wenn du diese Datenpunkte änderst, wird der ursprüngliche Ziel-Datenpunkt entsprechend geändert, und umgekehrt, d.h. die Datenpunkte sind verlinkt.
        80de33ee-4aa5-4595-a73c-6942d1cfa432-image.png
        Das ist sozusagen eine kleine "Alias / Linked Devices"-Implementierung. Du kannst also Geräte im SmartControl-Adapter unter "ZIELGERÄTE" anlegen und dann nur noch die Datenpunkte unterhalb von smartcontrol.0.targetDevices zum ein- und ausschalten in deinen anderen Scripts verwenden. Wie du halt magst...
      • smartcontrol.0.options: Hier kannst du Tabellenzeilen der Adapter-Konfig aktivieren und deaktivieren. Bitte beachte, dass eine Änderung einen Neustart der Adapter-Instanz auslöst, weil nur damit die geänderten Zeitpläne, Verifzierungen usw. greifen.

      Ursprünglicher Thread auch mit allen Erklärungen usw.

      Hier: Planung neuer Adapter: Smart Control

      Testen

      Der Adapter kann nun endlich getestet werden, Feuer frei 🙂

      Bitte beachten

      • Mehrere Abschnitte in den Adapter-Einstellungen sind noch nicht in Deutsch übersetzt.
      • ioBroker-Admin-Issue #590 - Auswahlfelder müssen "an der Seite" angeklickt werden. Ist bereits behoben im ioBroker Admin Adapter, aber ist derzeit noch präsent.

      Bisherige Erweiterungs-Anfragen

      Siehe hier

      Zum Testen

      Weitere Infos zum Testen findet ihr im Adapter selbst:
      873218dc-ea34-46cd-8cfc-a06302bf08d5-image.png

      Du brauchst Hilfe? Es gibt ein Problem? Du hast einen Verbesserungsvorschlag?

      Am besten postest du erst mal hier (auch wenn in den Adapter-Optionen schon mal anders beschrieben für zukünftige Versionen), weil der Adapter noch so früh in der Entwicklung ist.
      Ich sammle hier alle Erweiterungswünsche: Github - Erweiterungswünsche, die ich später noch besser strukturiere und priorisiere, usw.


      Meine Entwicklungs-Approaches

      • Durchgängig Promises mittels async/await, also so wie modern vorgesehen 😉
      • Durchgängig try/catch als Errorhandling, aber vor dem "catch" schon vieles abfangen
      • Kapseln in eigene Funktionen wenn immer möglich/sinnvoll
      • Alles gut dokumentiert im Quellcode
      • User-Eingaben immer verifizieren und mit aussagekräftigem Log ausgeben falls was nicht passt. Habe keine Lust auf Fehlersuche, wenn ich nicht genau weiß, wie ich anfangen soll. Grad bei fremden Datenpunkten usw. ein großes Thema...

      To Do's beim Adapter-Code:

      • Restrukturierung, der Adapter-Code ist ziemlich gewachsen, muss da mal prinzipiell noch mal ran. Ggf. auch isolierte Sachen in eigene Klassen und sogar eigene Files packen, usw.
      • Noch nicht umgesetzte 'this.log.error' in throw() umwandeln und dort dann this.dumpError() sowie entsprechenden return.
      • Wiederholende Logiken noch besser in Funktionen kapseln.
      • Noch bessere Trennung: Adapter-spezifisch, vs. Adapter-unabhängig, vs. node.js.-generisch
      • Konsistentere Logausgaben debug vs. info vs. extendedInfo
      • ggf. eigene Klasse für User-Input der Admin-Optionen zur Validierung, möglichst generisch und verwendbar dann auch für andere Adapter
      • ...
      posted in Tester
      Mic
      Mic
    • RE: Planung neuer Adapter: Smart Control

      Kurzes Update / Zwischenstand:
      Bin aktiv an der Entwicklung, aber wie ich halt so dazu komme, habe relativ wenig Zeit, Dauert also noch etwas 😉
      Je mehr ich entwickle, desto mehr stelle ich das große Potenzial des Adapters und dieses Konzeptes fest, also später nicht mehr nur begrenzt auf Licht/Raumsteuerung etc., sondern auch ein einfach zusammen-klickbares "If This, Then That"mit optionaler Zeitsteuerung, etc..... Mal sehen, lassen wir uns überraschen 😉

      Accomplishments:

      • User friendly Admin-Oberfläche steht. Hat mich viel Zeit gekostet, aber war es wert!
      • Saubere input validation für die User-Angaben im Admin (z.B. ob Datenpunkte existieren, die angegebenen State-Values mit Type des Datenpunktes etc. übereinstimmen, usw.) für alle Konfig-Tabellen implementiert. Gekapselt in eine Function, daher gut skalierbar usw.
      • Alles async/await und mit ES6 class, damit sauberer Code zustande kommt. Musste mich erst einarbeiten in die Thematik 😉
      • Verkettung/Abgleich der Config-Tabellen mit vielen Abhängigkeiten (in Kürze schwierig zu erklären, aber war sehr zeitintensiv)
      • Vieles weitere.

      Derzeitiger Entwicklungsstand: ca. 25% fertig. Jetzt fängt es an, Spaß zu machen mit den Logiken, etc.

      posted in Entwicklung
      Mic
      Mic
    • Test Adapter Windows-Control v0.1.x GitHub
      Aktuelle Test-Version 0.1.0
      Veröffentlichungsdatum Version 0.0.1: 24.03.2020, aktuelle 0.1.0: 27.03.2020
      Github Link https://github.com/Mic-M/ioBroker.windows-control

      Hi,

      ich habe nun endlich einen ersten Adapter geschrieben, weitere werden sicherlich folgen 😎

      Der Adapter Windows Control löst das Script https://github.com/Mic-M/iobroker.control-ms-windows ab, das hier gepostet ist: https://forum.iobroker.net/topic/1570/windows-steuerung

      Siehe Dokumentation auf Github für weitere Erklärungen.

      Mit diesem Adapter ist es möglich, Windows-Geräte entsprechend zu steuern, siehe https://forum.iobroker.net/topic/1570/windows-steuerung

      Danke auch an dieser Stelle an Vladimir Vilisov für sein GetAdmin-Tool.
      Für diesen Adapter benötigt ihr GetAdmin auf jedem Windows-Rechner, den ihr mit ioBroker steuern möchtet. GetAdmin ist eine einzelne 776 kB große (bzw. kleine) exe-Datei, die Vladimir Vilisov auf seinem Blog instalator.ru veröffentlicht hat.

      In den Adapter-Einstellungen kann man das alles entsprechend einstellen:
      getadmin_1.png

      Es werden dann pro Windows-Rechner folgende States angelegt. Dank "user commands" können diese beliebig erweitert werden.
      gast.png

      Im Beispiel von GetAdmin sind zwei "user commands" in der "Commands List" gesetzt:
      ga2.png

      Ich freue mich auf eure Testergebnisse.
      @Jey-Cee habe ich bereits angeschrieben für das Tester-Forum, aber ich poste schon mal hier.

      Hoffe, ich hab alles soweit richtig gemacht für den ersten Adapter ☺


      Mod-Edit: Thema von "Allgemein" nach "Tester" verschoben!

      posted in Tester
      Mic
      Mic
    • [Vorlage] JS: Log-Datei aufbereiten für VIS

      Sinn und Zweck dieses Scripts

      Der ioBroker loggt alle Aktionen der Adapter und Scripte entsprechend mit, einzusehen in der ioBroker-Administration, linke Seite Menüpunkt "Log".
      Dieses Script bietet nun folgendes:

      • Log im VIS darstellen: Entsprechend gefiltert, also etwa nur Warnungen und Fehler, nur Ausgaben eines bestimmten Adapters, usw.
      • Auf bestimmte Log-Ereignisse reagieren

      Dabei nimmt das Script jeden neuen Logeintrag des ioBrokers und wendet entsprechend gesetzte Filter an, um den Eintrag dann in den entsprechenden Datenpunkten dieses Scripts abzulegen.
      Es stehen auch JSON-Datenpunkte zur Verfügung, mit diesen kann im vis eine Tabelle ausgegeben werden. Z.B. über das Widget 'basic - Table' oder hier im Beispiel über Widget 'materialdesign - Table' (Material Design Widgets werden dafür benötigt).
      logproj.png

      Über die Filter kann man auch einzelne Geräte-Logs oder JS/Blockly-Logs ausgeben. Beispiel für ein "Garagentor":
      garage.png

      Installation / Einrichtung

      Hier weiterlesen (Github)...



      Ursprünglicher Beitrag von mir vom 18.07.2018:

      Hallo,

      ich überlege, dass ich per JavaScript die Log-Datei unter "/opt/iobroker/log/iobroker.YYYY-MM-DD.log" z.B. alle paar Sekunden auslese und Warnungen und Fehler in zwei separate Datenpunkte schreibe (Datenpunkt hält dann z.B. die letzten 30 Werte vor). Diese würde ich dann übers vis entsprechend in einer View ausgeben.

      Bevor ich das Rad neu erfinde, gibt es schon ein solches Script? Habe nur das hier gefunden: https://forum.iobroker.net/topic/1246/geloest-log-daten-im-vis-anzeigen

      Falls das noch keiner erstellt hat (was mich etwas wundern würde, wäre ja praktisch 🙂 - auch weil manche Adapter das Log voll müllen, da könnte man dann noch ausfiltern etc.) dann werde ich da selbst was schreiben und hier zur Verfügung stellen.

      Viele Grüße

      posted in JavaScript
      Mic
      Mic

    Latest posts made by Mic

    • Digital Detox

      Hi zusammen,
      hier nun eine Rückmeldung von mir, warum ich so ganz plötzlich hier von der Bildfläche verschwunden bin im Dezember.

      Ich hatte einen Burnout, letztendlich war es ein zu viel im eigentlichen Job, privat, und dann noch ioBroker mit den Entwicklungsprojekten.

      Eigentlich dachte ich, als mental sehr fitter und positiv eingestellter Mensch, gesund, fit, sportlich, etc. dass mich das nicht trifft. Aber es war dann doch zu viel.

      Daher hatte ich im Dezember u.a. den Stecker gezogen und ein (digitales) Detox eingeleitet, also: Email-Filterregeln (z.B. alles mit ioBroker in einen Unterordner ablegen), keine technischen Foren mehr, keine Programmierung etc. mehr, usw.

      Mittlerweile geht es mir aber wieder wirklich gut. ☺

      Allerdings habe ich natürlich dazu gelernt und bin vorsichtig: ich werde jetzt erst mal auch weiterhin mein Engagement für ioBroker pausieren zumindest für die nächsten Wochen.

      Das bedeutet für laufende ioBroker-Projekte von mir:
      Bitte Freiwillige vor, zur Übernahme, für Support, etc.

      Aufgrund meines laufenden „Detox-Programms“ lese ich weiterhin keine ioBroker-Emails, private Nachrichten, PMs, etc., sondern werde nur in diesen Thread öfters mal rein schauen.

      Meldet Euch also gerne hier als Antwort, falls wer ein (Adapter-)projekt übernehmen möchte, gerne steige ich später wieder mit ein, wie möglich.

      Bitte hier keinerlei Supportanfragen, etc. Danke 😉

      Viele Grüße

      posted in Off Topic
      Mic
      Mic
    • RE: [Vorlage] Homematic IP Thermostate mit CCU: Externe Temperatursensoren (Xiaomi etc.) einbinden mittels Offset-Setzen

      @florian84z sagte in [Vorlage] Homematic IP Thermostate mit CCU: Externe Temperatursensoren (Xiaomi etc.) einbinden mittels Offset-Setzen:

      @Mic Entschuldige bitte meine doofe Frage, aber funktioniert dein Script nicht mit dem HomeMatic IP Cloud-Zugriffspunkt- Adapter? Ich habe keine CCU, sondern nur dein einfachen Gateway.

      Hey Florian,
      mein Script hab ich rein für die CCU-Zentrale geschrieben, und nicht für das Gateway, und kann auch nicht sagen, ob das mit dem Gateway überhaupt geht.

      Bezüglich Homematic kennen sich aber andere hier im Forum deutlich besser aus als ich, auch weil viele zu ioBroker über Homematic kamen. Ich verwende das nur wie jede andere Hardware (wie Hue, Xiaomi, usw.) und versuche da nur zu optimieren 😉

      Das Gateway hatte ich mal da zum testen, aber hatte festgestellt, damit deutlich weniger steuern zu können programmatisch, daher blieb ich bei meiner Heizungssteuerung bei der CCU2, die bei mir locker dafür reicht, und gebraucht gekauft war sie echt günstig.
      Aber jeder hat da natürlich eine andere Umgebung und Use Case etc

      posted in Praktische Anwendungen (Showcase)
      Mic
      Mic
    • RE: Test Adapter SmartControl 0.3.x-0.6.x Latest

      @FuXXz2 sagte in Test Adapter SmartControl 0.3.x-0.6.x Latest:

      Ich habe es irgendwo hier schon einmal gefragt, ist nur leider untergegangen 😞
      Wie kann ich am besten eine "Alle Lichter aus" Schaltung machen?
      Über die Aufzählungen geht es nicht, da die Geräte unterschiedliche States haben wie z.B. True / False und 0 / 100 %

      Wie kann ich das also umsetzen? Mehrere Aufzählungen erstellen, mit allen Dimmern und eine mit allen Lichtern?

      Bitte mache ein neues Enhancement Request unter https://github.com/Mic-M/ioBroker.smartcontrol/issues auf.
      Ich bin mir jetzt nicht sicher, aber ich denke, das bedarf einer Erweiterung. Es sei denn, andere User haben das schon umgesetzt mit den bestehenden Optionen 😉

      posted in Tester
      Mic
      Mic
    • RE: Test Adapter SmartControl 0.3.x-0.6.x Latest

      @Lenny-CB sagte in Test Adapter SmartControl 0.3.x-0.6.x Latest:

      @Mic mir ist noch eine weitere Möglichkeit aufgefallen, in der der Adapter speichert, aber gelb bleibt. Auf GIT ist habe ich es ergänzt.
      https://github.com/Mic-M/ioBroker.smartcontrol/issues/61#issuecomment-734697416
      Muss jetzt hier mal sagen, dass dein Adapter einer derer ist, der bei mir am meisten Scripte obsolet macht. Mein "Script-Ordner" ist seit dem recht übersichtlich geworden!
      Vielen Dank!

      Gerne, und danke für dein Feedback 🙂

      Das war tatsächlich noch ein "To Do" von mir. Jetzt werden alle Fehler bereits beim Speichern der Adapter-Optionen ausgegeben, dieselben Meldungen wie auch im Log. Diese sind dabei übrigens jetzt noch in Englisch, aber werde das noch gelegentlich lokalisieren.

      1.2.1

      • (Mic-M) Enhancement: Now, all adapter config validations take place while saving the adapter configuration, and all identified errors are shown in a dialog. Addresses issue #61

      Sieht dann z.B. so aus:

      eb6bc3d7-8a78-4c13-9027-c402970b627c-image.png

      posted in Tester
      Mic
      Mic
    • RE: Meeting für ioBroker Core/Dev/Admin 16.12.20 20:30

      @UncleSam sagte in Online Meeting für ioBroker Core/Dev/Admin was nun?:

      Aber es gibt den Wunsch Images zu haben; irgendwie müssen wir da eine Lösung finden.

      Ich bin "damals" in ioBroker auch erst mal mit einem Raspberry eingestiegen, und hatte da dann auch ein Image verwendet, weil es halt auf der ioBroker-Homepage so angeboten wurde.
      Hätte ich stattdessen eine Schritt-für-Schritt-Anleitung bekommen, die zeigt, wie ich das selbst installiere, wäre das auch kein Problem gewesen. Ist halt einiges copy/paste, aber das macht man nur 1x.
      Vorteil: man muss sich damit schon mal etwas mit Linux auseinandersetzen, denn so ganz ohne gehts halt einfach nicht, wenn man ne Raspy betreibt.

      Daher die Frage: Muss es wirklich ein Image sein und ist das wirklich ein Show-Stopper? Ich finde das mega aufwändig zu pflegen, die Zeit-Ressourcen hierfür kann man sicherlich doch besser nutzen im ioBroker-Projekt.

      posted in Entwickler-Meetings
      Mic
      Mic
    • RE: Test Adapter Philips-TV v0.2.x

      @Laire sagte in Test Adapter Philips-TV v0.2.x:

      Muss ich das Script einfach nur kopieren und als JS Script hinzufügen? Oder muss ich auch den Adapter aus dem ersten Beitrag installieren?

      Ersteres, den Adapter brauchst du nicht.

      Und warum die Installation eines neuen System bzw. Container für die Passwort Generierung? Greift da irgendetwas ins System ein? Kann ich das nicht einfach auf einem meiner bestehenden Linux Systeme machen?

      Ich hab da nur geschrieben
      @Mic sagte in Test Adapter Philips-TV v0.2.x:

      Hier mal eine Anleitung für Linux für die Generierung von User-Name und Passwort für den Philips-TV. Ich habe hierzu eine frische Debian-Installation (Proxmox-Container) genommen.

      Es obliegt dir, das auch auf einem bestehenden System zu machen. Ich wollte das halt nicht in einer Produktivumgebung o.ä. machen, sondern lieber in einer Testumgebung.

      posted in Tester
      Mic
      Mic
    • RE: Test Adapter SmartControl 0.3.x-0.6.x Latest

      @Lenny-CB

      Danke für dein Feedback. Ich habe einen Enhancement-Request aufgemacht für mich:
      https://github.com/Mic-M/ioBroker.smartcontrol/issues/61

      Kann ich gut nachvollziehen, ich selbst schau ja auch nicht nach jeder Änderung der Adapter-Konfig gleich ins Log oder prüfe, ob der Adapter grün ist.

      Mic-M created this issue in Mic-M/ioBroker.smartcontrol

      closed Validierungs-Ergebnis aller Adapter-Optionen nach Speichern in Admin anzeigen und nicht nur im Log #61

      posted in Tester
      Mic
      Mic
    • RE: [Smart Control Adapter] FAQ / Use Cases

      @handy80 - danke für dein Feedback 🙂

      Ich zitiere mich mal selbst von Issue #39

      Betrifft generell das Thema "Lichtsteuerung", was sehr komplex ist.
      Siehe: https://forum.iobroker.net/topic/24936/diskussion-objektdefinition-licht/37
      Pittini hat hierzu übrigens auch ein Script geschrieben: https://forum.iobroker.net/topic/36578/vorlage-lightcontrol
      Je mehr ich das betrachte, desto mehr stelle ich fest, dass es da fast einen separaten Adapter "Light Control" braucht, der das alles abfängt (sämtliche "Licht"-Adapter unterstützt wie Hue, Yeelight, uvm., entsprechende Einstellungen, etc.).

      Mach bitte gerne ein Github-Issue hierzu auf.

      posted in ioBroker Allgemein
      Mic
      Mic
    • RE: Test Adapter SmartControl 0.3.x-0.6.x Latest

      @Slowman sagte in Test Adapter SmartControl 0.3.x-0.6.x Latest:

      @Mic

      Muss ich das mit den 2 BWM irgendwo einstellen oder ist dies automatisch?

      Gute Frage, ist automatisch. Ergänze ich noch in der Adapter Doku.
      Falls es Use Cases gibt, wo das nicht erwünscht ist, kann ich gerne eine Option zum Ausschalten einbauen. Bitte einfach Github-Issue aufmachen.

      posted in Tester
      Mic
      Mic
    • RE: Meeting für ioBroker Core/Dev/Admin 18.11.20 20:30

      @apollon77 sagte in Online Meeting für ioBroker Core/Dev/Admin 18.11 20:30:

      Hi Leute,

      ich hätte noch ein Thema was ich gern rein bringen würde, aber auch gern den "Ownership" direkt abgeben würde ;-))
      Richtet sich vor allem an die "Visu" Devs ...
      Es gab in https://github.com/ioBroker/ioBroker.socketio/issues/34 eine Anfrage warum extendObject und delObject per socket.io nicht geht. Es gibt auch effektiv einen PR schon um das generell zu "ändern" von @foxriver76 (https://github.com/ioBroker/ioBroker.socketio/pull/35).

      (Zitat gekürzt)

      Hi @apollon77

      Danke für's aufgreifen 🙂

      Leider kann ich heute nicht dabei sein (Family ruft 😉 ).
      Ich verstehe deine Bedenken sehr gut (VIS, offene Ports, ...), echt ein wichtiger Punkt.
      Mein Use Case ist hier übrigens nicht VIS, sondern ein npm-Modul (https://github.com/Jey-Cee/iobroker-drones) zum Ablösen des Windows-Control-Adapters. Aber ich hatte da dann einen schnellen Workaround eingebaut: https://github.com/Jey-Cee/iobroker-drones/blob/a5472f070963e3add7d15cf1813de197e3726269/main.js#L301
      Bei einem Einsatz von socket.io in einem npm-Modul (also nicht VIS etc.) wäre das wohl unproblematischer?

      Wünsche euch viel Spaß und einen konstruktiven Austausch heute Abend!

      posted in Entwickler-Meetings
      Mic
      Mic
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo