Navigation

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

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    T
    • Profile
    • Following 1
    • Followers 0
    • Topics 2
    • Posts 19
    • Best 1
    • Groups 1

    thoemmes86

    @thoemmes86

    2
    Reputation
    40
    Profile views
    19
    Posts
    0
    Followers
    1
    Following
    Joined Last Online

    thoemmes86 Follow
    Starter

    Best posts made by thoemmes86

    • RE: Anfrage Tahoma/Somfy IO Adapter

      Hallo zusammen,

      und hier das Nikolausgeschenk von mir. Funktionalität ist wieder vollumfänglich enthalten.
      PLUS: Jetzt werden auch Szenarien unterstützt. Die sind im Objektbaum unter 'actionGroups' zu finden.

      Viele Grüße

      var request = require('request');
      
      // enable debugging mode
      //request.debug = true;
      
      var lastEventTime = new Date().getTime();
      
      var rawDeviceData = false;
      var tahomaJar = request.jar();
      var baseRequest = request.defaults({
        headers: {
              'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'},
        jar: tahomaJar
      });
      
      var tahomaDevices = {};
      var tahomaActionGroups = {};
      var Map_DeviceURL2StateName = {};
      
      var userName = "xxxUSERNAMExxx";
      var passWord = "xxxPASSWORTxxx";
      
      var baseURL = 'https://www.tahomalink.com/enduser-mobile-web/enduserAPI/';
      
      var isConnectedInternal = false;
      let loginInProgress = false;
      
      var eventRegisterID = '-1';
      
      createState('tahoma.connected', false, {
        read: true, 
        write: true, 
        name: "connection status of tahoma", 
        type: "boolean", 
        def: false
      });
      
      createOrUpdateState('tahoma.update', false, {
          read: true, 
          write: true,
          role: "button"
      });
      on('javascript.0.tahoma.update', function(obj)
      {
          //log("tahoma refresh states requested: " + obj);
          
          if (obj.newState.val)
          {
              getAllStates();   
          }
      });
      
      function isConnected()
      {
          return isConnectedInternal;
      }
      function setConnected(connected)
      {
          isConnectedInternal = connected;
          
          setState('javascript.0.tahoma.connected', connected, true);
      }
      
      function getCreateStateOptions4Widget(widget)
      {
          if (widget === 'PositionableRollerShutter')
          {
              return {
                      "role":  "blind",
              };
          }
          
          if (widget === 'LuminanceSensor')
          {
              return {
                  "role":  "sensor"
              };
          }
          
          return {
                      read: true, 
                      write: false,
                      role: "state"
                  };
      }
      
      function getCreateStateOptions4State(widget, stateName)
      {
          if (stateName === "core:ClosureState" || stateName === "core:TargetClosureState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": true,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100,                    // optional,  default 100
                      "unit":  "%",                    // optional,  default %
                      "role":  "level.blind"           // mandatory
                 };
          }
          if (stateName === "core:SlateOrientationState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": true,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100,                    // optional,  default 100
                      "unit":  "%",                    // optional,  default %
                      "role":  "level.blind.orientation"           // mandatory
                 };
          }
          if (stateName === "core:LuminanceState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": false,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100000,                    // optional,  default 100
                      "unit":  "Lux",                    // optional,  default %
                      "role":  "level.color.luminance"           // mandatory
                 };
          }
          
          return {
                      read: true, 
                      write: false,
                      role: "state"
                  };
      }
      
      function sendPOST(requestPath, payload, callback)
      {
          login(function(err,data)
          {
              if (err)
              {
                  return callback(err, data);
              }
              
              sendInternalPOST(requestPath, payload, callback);
          });
      }
      
      function sendGET(requestPath, payload, callback)
      {
          login(function(err,data)
          {
              if (err)
              {
                  return callback(err, data);
              }
              
              sendInternalGET(requestPath, payload, callback);
          });
      }
      
      function sendInternalGET(requestPath, payload, callback){
          var url = baseURL + requestPath;
            
          var formPayload = null;
          var jsonPayload = null;
          
          jsonPayload = payload;
          
          log("perform " + requestPath + " with payload:" + JSON.stringify(payload), 'debug');
      
          baseRequest.get(
              {
                  url:    url,
                  json:   jsonPayload,
                  form:   formPayload
              }, 
              function(error, response, body) 
              {
                  if (!error && response.statusCode === 200) 
                  {
                      callback(false, body);
                  }
                  else if (response && (response.statusCode === 401 || response.statusCode === 403))
                  {
                      log("error during tahomalink request: " + response.statusText + " ->" + response.statusCode + " retry "  + requestPath, 'error');
                      
                      // session expired?
                      setConnected(false);
                      loginInProgress = false;
      
                      // perform login and send again
                      sendGET(requestPath, payload, callback);
                  }
                  else
                  {
                      log("error during tahomalink request: " + response.statusCode + ": " + error + 
                          ", request path: " + requestPath + " with payload:" + JSON.stringify(payload), 'error');
                      
                      var result = {};        
                      result.error = error;
                      
                      if(typeof response !== "undefined")
                      {
                          log("response status: " + response.statusCode + " " + response.statusText,'debug');
                          
                          result.responseStatusCode = response.statusCode;
                          result.responseStatusText = response.statusText;
                      }
                      
                      callback(true, result);
                  }
          });
      }
      
      function sendInternalPOST(requestPath, payload, callback)
      {
          var url = baseURL + requestPath;
          
          if (requestPath.endsWith("apply"))
          {
              url = baseURL + requestPath + "/highPriority";
          }
          
          var formPayload = null;
          var jsonPayload = null;
          
          if (requestPath === 'login')
          {
              formPayload = payload;
          }
          else
          {
              jsonPayload = payload;
          }
          
          log("perform " + requestPath + " with payload:" + JSON.stringify(payload), 'debug');
      
          baseRequest.post(
              {
                  url:    url,
                  json:   jsonPayload,
                  form:   formPayload
              }, 
              function(error, response, body) 
              {
                  if (!error && response.statusCode === 200) 
                  {
                      if (requestPath === 'login')
                      {
                          callback(false, JSON.parse(body));
                      }
                      else
                      {
                          callback(false, body);
                      }
                  }
                  else if (response && requestPath !== 'logout'
                      && (response.statusCode === 401 || response.statusCode === 403))
                  {
                      log("error during tahomalink request: " + response.statusText + " ->" + response.statusCode + " retry "  + requestPath, 'error');
                      
                      // session expired?
                      setConnected(false);
                      loginInProgress = false;
      
                      // perform login and send again
                      sendPOST(requestPath, payload, callback);
                  }
                  else
                  {
                      log("error during tahomalink request: " + response.statusCode + ": " + error + 
                          ", request path: " + requestPath + " with payload:" + JSON.stringify(payload), 'error');
                      
                      var result = {};        
                      result.error = error;
                      
                      if(typeof response !== "undefined")
                      {
                          log("response status: " + response.statusCode + " " + response.statusText,'debug');
                          
                          result.responseStatusCode = response.statusCode;
                          result.responseStatusText = response.statusText;
                      }
                      
                      callback(true, result);
                  }
          });
      }
      
      function logout(callback)
      {
          var performLogout = isConnected();
          setConnected(false);
          
          if (performLogout)
          {
              sendInternalPOST("logout", {}, function (err, data)
              {
                  callback(err, data);
              });
          }
          else
          {
              callback(false, {});
          }
      }
      
      function login(callback)
      {
          if (isConnected())
          {
               callback(false, {});
               return;
          }
      
          // check for login already started but not yet finished
          if (loginInProgress)
          {
              //log("login in progress, wait 100 msec");
      
              setTimeout(function()
              {
                  login(callback);
              }, 1500);
              return;
          }
      
          loginInProgress = true;
      
          var payload = {'userId': userName, 'userPassword': passWord};
              
          var result = sendInternalPOST("login", payload, function (err, data)
          {
              if (err || !data.success)
              {
                  loginInProgress = false;
                  return callback(true, data);
              }
              
              lastEventTime = new Date().getTime();
              setConnected(true);
              loginInProgress = false;
              
              getUserInfo(function (err,data)
              {
                  if (!err)
                  {
                      return getSetup(callback);
                  }
                  
                  callback(err, data);
              });
          });
      }
      
      function getUserInfo(callback)
      {
          sendGET('enduser/mainAccount', {},function (err, data)
          {
              if (!err)
              {
                  updateData('userdata', data.endUser);
                  
                  callback(false, data);
              }
              else
              {
                  log("enduser/mainAccount failed!", 'error');
              }
              
          });
      }
      
      function updateGateWayData(gateways)
      {   
          for (var i in gateways) 
          {
              var gateway = gateways[i];
              
              updateData(gateway.gatewayId, gateway);
          }
      }
      
      function updateDevices(devices)
      {   
          tahomaDevices = devices;
          
          for (var i in devices) 
          {
              var device = devices[i];
              
              // just set the raw data from tahoma
              updateDevice('devices.' + device.label, device);
          }
      }
      
      function updateDevice(name, deviceData)
      {   
          createOrUpdateState('tahoma.' + name, '',
              getCreateStateOptions4Widget(deviceData.widget));
          
          // device URL
          createOrUpdateState('tahoma.' + name + '.deviceURL', deviceData.deviceURL);
          
          // states
          for (var stateKey in deviceData.states)
          {
              var state = deviceData.states[stateKey];
              
              createOrUpdateState('tahoma.' + name + '.states.' + state.name, 
                  mapValueTahoma2ioBroker(state.name, state.value),
                  getCreateStateOptions4State(deviceData.widget, state.name));
          }
          
           // commands
          for (var commandKey in deviceData.definition.commands)
          {
              var command = deviceData.definition.commands[commandKey];
              
              if (command.nparams === 0)
              {
                  createOrUpdateState('tahoma.' + name + '.commands.' + command.commandName, false, {
                      read: true, 
                      write: true,
                      role: "button"
                  });
              }
          }
                  
          // raw data
          if (rawDeviceData)
          {
              for (var p in deviceData) 
              {
                  var value = deviceData[p];
                  
                  if (typeof(value) === 'object')
                  {
                      updateData('raw.' + name + '.' + p, value);
                  }
                  else
                  {
                      createOrUpdateState('tahoma.raw.' + name + '.' + p, value);
                  }
              }
          }
      }
      
      function updateActionGroups(actionGroups)
      {   
          tahomaActionGroups = actionGroups;
          
          for (var i in actionGroups) 
          {
              var actionGroup = actionGroups[i];
              
              // just set the raw data from tahoma
              updateActionGroup('actionGroups.' + actionGroup.label, actionGroup);
          }
      }
      
      function updateActionGroup(actionGroup, actionGroupData)
      {    
          // Action Group OID
          createOrUpdateState('tahoma.' + actionGroup + '.oid', actionGroupData.oid);
              
          createOrUpdateState('tahoma.' + actionGroup + '.commands.' + 'execute', false, {
              read: true, 
              write: true,
              role: "button"
          });
      }
      
      function mapValueTahoma2ioBroker(stateName, stateValue)
      {
          if (stateName === 'core:ClosureState' || 
              stateName === 'core:TargetClosureState' ||
              stateName === "core:SlateOrientationState" ||
              stateName === "core:LuminanceState"
              )
          {
              stateValue = parseInt(stateValue,10);
          }
      
          return stateValue;
      }       
      
      function mapValueioBroker2Tahoma(stateName, stateValue)
      {
          if (stateName === 'core:ClosureState' || stateName === 'core:TargetClosureState')
          {
              //stateValue = parseInt(stateValue,10);
          }
      
          return stateValue;
      }       
      
      function updateData(type, data)
      {   
          for (var p in data) 
          {
              var value = data[p];
              
              if (typeof(value) === 'object')
              {
                  updateData(type + '.' + p, value);
              }
              else
              {
                  createOrUpdateState('tahoma.' + type + '.' + p, value);
              }
          }
      }
      
      function createOrUpdateState(key, value, options)
      {
          key = key.replace(' ' , '_');
          var state = getState("javascript.0." + key);
          var typeName = "string";
          
          if (value === "true" || value === "false")
          {
              value = value == "true";
              typeName = "boolean";
          } 
          else if (Number.isInteger(value))
          {
              value = parseInt(value,10);
              typeName = "number";
          }
          else if (!isNaN(value))
          {
              value = Number(value);
              typeName="number";
          }
          
          if (state.notExist)
          {
              
              if (typeof(options) === 'undefined')
              {
                  options = {
                      read: true, 
                      write: false,
                      type: typeName
                  };
              }
      
              // create state
              createState(key, value, 0, options);
          }
          else
          {
              setState("javascript.0." + key, value, true);
          }
      }
      
      function getSetup(callback)
      {
          sendGET('setup', {},function (err, data)
          {
              if (!err)
              {
                  updateGateWayData(data.gateways);
                  updateData('location', data.location);
                  updateDevices(data.devices);
                  
                  // delete old devices
                  deleteOldDevices();
                  
                  // update mapping table device URL to state key with label
                  $('javascript.0.tahoma.devices.*.deviceURL').each(function (id, i) 
                  {
                      var state = getState(id);
                      Map_DeviceURL2StateName[state.val] = id.substr(0, id.indexOf(".deviceURL"));
                      
                      //log("set mapping deviceURL to name: " + state.val + " -> " + id.substr(0, id.indexOf(".deviceURL")),'debug');
                  });
                  
                  // refresh
                  refresh(callback);            
              }
              else
              {
                  log("setup failed!",'error');
                  callback(err, {});
              }
          });
      
          sendGET('actionGroups', {},function (err, data)
          {
              if (!err)
              {
                  updateActionGroups(data);          
              }
              else
              {
                  log("actionGroups failed!",'error');
                  callback(err, {});
              }
          });
      }
      
      function refresh(callback){
          sendPOST('/setup/devices/states/refresh', {}, function (err,data)
                  {
                      if (err)
                      {
                          log("refresh device state failed", 'error');
                      }
                      callback(err, {});   
                  });
      }
      
      function refresh(){
          sendPOST('/setup/devices/states/refresh', {}, function (err,data)
                  {
                      if (err)
                      {
                          log("refresh device state failed", 'error');
                      }
                  });
      }
      
      function getAllStates()
      {
          login(function (err, data)
          {
              if (err)
              {
                  return;
              }
          });
      
          if(eventRegisterID === '-1'){
              sendPOST("events/register", {}, function (err,data)
              {
                  if (err)
                  {
                      log("events/register failed", 'error');
                      return;
                  }
      
                  eventRegisterID = data.id;
                  log ("eventRegisterID = " + eventRegisterID);
                  
                  fetchEvents();
              });
          }
          else {
              fetchEvents();
          }
      }
      
      function fetchEvents(){
          refresh();
              
          sendPOST("events/" + eventRegisterID + "/fetch", {}, function (err,data)
          {
              if (err)
              {
                  return;
              }
              var callback;
              
              log ("events/" + eventRegisterID + "/fetch" + "Fetched Data" + data, 'debug');
              updateDeviceStateFromEvent(data);
          });
      }
      
      function updateDeviceStateFromEvent(events)
      {
          for (var i in events) 
          {
              lastEventTime = new Date().getTime();
              var event = events[i];
         
              if (event.name === 'DeviceStateChangedEvent')
              {
                  updateDeviceState(event);
              }
          }
      }
      
      function updateDeviceState(event)
      {
          var deviceURL = event.deviceURL;
          var states = event.deviceStates;
          
          var devicePath = Map_DeviceURL2StateName[deviceURL];
          // tahoma.devices.XXX
          // tahoma.devices.XXX.states.Y
          
          log("got event for device " + devicePath, 'debug');
       
          for (var i in event.deviceStates) 
          {
              var state = event.deviceStates[i];
              var name = state.name;
              var value = mapValueTahoma2ioBroker(name, state.value);
              
              log("found " + devicePath + '.states.' + name + " -> " + value, 'debug');
              setState(devicePath + '.states.' + name, value, true);
          }
      }
      
      function deleteOldDevices()
      {
          var currentTime = new Date().getTime();
          
          $('javascript.0.tahoma.devices.*.lastUpdateTime').each(function (id, i) 
          {
              var state = getState(id);
              var device = id.substr(0, id.indexOf(".lastUpdateTime"));
              
              if (currentTime - state.ts > 5 * 60 * 1000)
              {
                  // update older than 1 minute -> drop
                  log ("found old " + device + " -> " + new Date(state.ts),'debug');
                  
                  $(device + '.*').each(function (id, i) 
                  {
                      log("delete state:" + id, 'debug');
                      deleteState(id);
                  });
              }
          });
      }
      
      on(/^javascript\.0\.tahoma\.devices.*\.commands/,function(obj)
      {
          if (obj.state.val)
          {
            var id = obj.id;
            log("button pressed: " + id + " -> " + JSON.stringify(obj), 'debug');
           
            var commandName = id.substr(id.lastIndexOf(".")+1);
            var deviceURL = getState(id.substr(0, id.indexOf(".commands.")) + ".deviceURL").val;
            
            var payload = {'label':'command ' + commandName + ' from ioBroker',
                'actions':[{
          		'deviceURL': deviceURL,
              	'commands':	[{
          			'name': commandName,
              	    'parameters': []
              	}]}]};
          
              sendPOST("exec/apply", payload, function(err, data)
              {
                  // reset state
                  setState(obj.id, !obj.state.val);
              });
          }
      });
      
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:ClosureState/,function(obj)
      {
          onClosureStateChange(obj);
      });
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:TargetClosureState/,function(obj)
      {
          onClosureStateChange(obj);
      });
      
      function onClosureStateChange(obj)
      {
          if (!obj.newState.ack)
          {
              var id = obj.id;
                //log("closure state changed: " + id + " -> " + JSON.stringify(obj));
               
                var commandName = "setClosure";
                var deviceURL = getState(id.substr(0, id.indexOf(".states.")) + ".deviceURL").val;
                var stateValue = obj.newState.val;
                var roomName = id.substr(id.indexOf('.devices.')+9);
                
                roomName = roomName.substr(0,roomName.indexOf('.states'));
                
                var payload = {'label': roomName + ' - Positioniere auf ' + stateValue + ' % - ioBroker',
                    'actions':[{
              		'deviceURL': deviceURL,
                  	'commands':	[{
              			'name': commandName,
                  	    'parameters': [ mapValueioBroker2Tahoma('core:ClosureState', stateValue) ]
                  	}]}]};
          
                  sendPOST("exec/apply", payload, function(err, data)
                  {
                      // reset state
                      //setState(obj.id, !obj.state.val);
                  });
          }
      };
      
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:SlateOrientationState/,function(obj)
      {
          if (!obj.newState.ack)
          {
              var id = obj.id;
            
            var commandName = "setOrientation";
            var deviceURL = getState(id.substr(0, id.indexOf(".states.")) + ".deviceURL").val;
            var stateValue = obj.newState.val;
            var roomName = id.substr(id.indexOf('.devices.')+9);
                
              roomName = roomName.substr(0,roomName.indexOf('.states'));
            
            //log("slate orientation changed: " + roomName + " -> " + stateValue);
           
            
            var payload = {'label':roomName + ' - Ausrichtung ' + stateValue + ' % - ioBroker',
                'actions':[{
          		'deviceURL': deviceURL,
              	'commands':	[{
          			'name': commandName,
              	    'parameters': [ mapValueioBroker2Tahoma('core:SlateOrientationState', stateValue) ]
              	}]}]};
          
              sendPOST("exec/apply", payload, function(err, data)
              {
                  // reset state
                  //setState(obj.id, !obj.state.val);
              });
              
          }
      });
      
      on({id: /^javascript\.0\.tahoma\.actionGroups.*\.commands.execute/, valNe: false}, function (obj) {
          if (obj.state.val)
          {
              var id = obj.id;
              var oid = getState(id.substr(0, id.indexOf(".commands.")) + ".oid").val;
      
              log(baseURL + "exec/" + oid);
      
              sendPOST("exec/" + oid, "", function(err, data)
              {
                  if (err)
                  {
                      log(baseURL + "exec/" + oid, "error");
                      return;
                  }
              });
          }
      });
      
      // if connected, update state all 5 seconds
      //schedule("*/5 * * * * *", function () 
      // if connected, update state all 10 seconds
      schedule("*/10 * * * * *", function () 
      {
          // if connected, update states
          if (isConnected())
          {
              getAllStates();
              
              if (new Date().getTime() - lastEventTime > 5 * 60 * 1000)
              {
                  // no events within last 60 seconds
                  logout(function () {});
              }
          }
      });
      
      // update state all 10 minutes
      schedule("*/10 * * * *", function () 
      {
          if (new Date().getTime() - lastEventTime > 9 * 60 * 1000)
          {
              log("update tahoma all 10 minutes");
              getAllStates();
          }
      });
      
      onStop(function (callback) {
          logout(function (err, data)
              {
                  callback();
              });
      }, 10000 /*ms*/);
      
      // start script
      getAllStates();
      
      posted in ioBroker Allgemein
      T
      thoemmes86

    Latest posts made by thoemmes86

    • RE: Anfrage Tahoma/Somfy IO Adapter

      Ich habe gerade das Skript in meinem letzten Post aktualisiert.
      War beim Ausführen von Szenarien noch ein Fehler drin. Jedes Szenario konnte nur genau einmal ausgeführt werden. 😵

      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: Anfrage Tahoma/Somfy IO Adapter

      Hallo zusammen,

      und hier das Nikolausgeschenk von mir. Funktionalität ist wieder vollumfänglich enthalten.
      PLUS: Jetzt werden auch Szenarien unterstützt. Die sind im Objektbaum unter 'actionGroups' zu finden.

      Viele Grüße

      var request = require('request');
      
      // enable debugging mode
      //request.debug = true;
      
      var lastEventTime = new Date().getTime();
      
      var rawDeviceData = false;
      var tahomaJar = request.jar();
      var baseRequest = request.defaults({
        headers: {
              'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'},
        jar: tahomaJar
      });
      
      var tahomaDevices = {};
      var tahomaActionGroups = {};
      var Map_DeviceURL2StateName = {};
      
      var userName = "xxxUSERNAMExxx";
      var passWord = "xxxPASSWORTxxx";
      
      var baseURL = 'https://www.tahomalink.com/enduser-mobile-web/enduserAPI/';
      
      var isConnectedInternal = false;
      let loginInProgress = false;
      
      var eventRegisterID = '-1';
      
      createState('tahoma.connected', false, {
        read: true, 
        write: true, 
        name: "connection status of tahoma", 
        type: "boolean", 
        def: false
      });
      
      createOrUpdateState('tahoma.update', false, {
          read: true, 
          write: true,
          role: "button"
      });
      on('javascript.0.tahoma.update', function(obj)
      {
          //log("tahoma refresh states requested: " + obj);
          
          if (obj.newState.val)
          {
              getAllStates();   
          }
      });
      
      function isConnected()
      {
          return isConnectedInternal;
      }
      function setConnected(connected)
      {
          isConnectedInternal = connected;
          
          setState('javascript.0.tahoma.connected', connected, true);
      }
      
      function getCreateStateOptions4Widget(widget)
      {
          if (widget === 'PositionableRollerShutter')
          {
              return {
                      "role":  "blind",
              };
          }
          
          if (widget === 'LuminanceSensor')
          {
              return {
                  "role":  "sensor"
              };
          }
          
          return {
                      read: true, 
                      write: false,
                      role: "state"
                  };
      }
      
      function getCreateStateOptions4State(widget, stateName)
      {
          if (stateName === "core:ClosureState" || stateName === "core:TargetClosureState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": true,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100,                    // optional,  default 100
                      "unit":  "%",                    // optional,  default %
                      "role":  "level.blind"           // mandatory
                 };
          }
          if (stateName === "core:SlateOrientationState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": true,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100,                    // optional,  default 100
                      "unit":  "%",                    // optional,  default %
                      "role":  "level.blind.orientation"           // mandatory
                 };
          }
          if (stateName === "core:LuminanceState")
          {
              return {
                      "type":  "number",               // optional,  default "number"
                      "read":  true,                   // mandatory, default true
                      "write": false,                   // mandatory, default true
                      "min":   0,                      // optional,  default 0
                      "max":   100000,                    // optional,  default 100
                      "unit":  "Lux",                    // optional,  default %
                      "role":  "level.color.luminance"           // mandatory
                 };
          }
          
          return {
                      read: true, 
                      write: false,
                      role: "state"
                  };
      }
      
      function sendPOST(requestPath, payload, callback)
      {
          login(function(err,data)
          {
              if (err)
              {
                  return callback(err, data);
              }
              
              sendInternalPOST(requestPath, payload, callback);
          });
      }
      
      function sendGET(requestPath, payload, callback)
      {
          login(function(err,data)
          {
              if (err)
              {
                  return callback(err, data);
              }
              
              sendInternalGET(requestPath, payload, callback);
          });
      }
      
      function sendInternalGET(requestPath, payload, callback){
          var url = baseURL + requestPath;
            
          var formPayload = null;
          var jsonPayload = null;
          
          jsonPayload = payload;
          
          log("perform " + requestPath + " with payload:" + JSON.stringify(payload), 'debug');
      
          baseRequest.get(
              {
                  url:    url,
                  json:   jsonPayload,
                  form:   formPayload
              }, 
              function(error, response, body) 
              {
                  if (!error && response.statusCode === 200) 
                  {
                      callback(false, body);
                  }
                  else if (response && (response.statusCode === 401 || response.statusCode === 403))
                  {
                      log("error during tahomalink request: " + response.statusText + " ->" + response.statusCode + " retry "  + requestPath, 'error');
                      
                      // session expired?
                      setConnected(false);
                      loginInProgress = false;
      
                      // perform login and send again
                      sendGET(requestPath, payload, callback);
                  }
                  else
                  {
                      log("error during tahomalink request: " + response.statusCode + ": " + error + 
                          ", request path: " + requestPath + " with payload:" + JSON.stringify(payload), 'error');
                      
                      var result = {};        
                      result.error = error;
                      
                      if(typeof response !== "undefined")
                      {
                          log("response status: " + response.statusCode + " " + response.statusText,'debug');
                          
                          result.responseStatusCode = response.statusCode;
                          result.responseStatusText = response.statusText;
                      }
                      
                      callback(true, result);
                  }
          });
      }
      
      function sendInternalPOST(requestPath, payload, callback)
      {
          var url = baseURL + requestPath;
          
          if (requestPath.endsWith("apply"))
          {
              url = baseURL + requestPath + "/highPriority";
          }
          
          var formPayload = null;
          var jsonPayload = null;
          
          if (requestPath === 'login')
          {
              formPayload = payload;
          }
          else
          {
              jsonPayload = payload;
          }
          
          log("perform " + requestPath + " with payload:" + JSON.stringify(payload), 'debug');
      
          baseRequest.post(
              {
                  url:    url,
                  json:   jsonPayload,
                  form:   formPayload
              }, 
              function(error, response, body) 
              {
                  if (!error && response.statusCode === 200) 
                  {
                      if (requestPath === 'login')
                      {
                          callback(false, JSON.parse(body));
                      }
                      else
                      {
                          callback(false, body);
                      }
                  }
                  else if (response && requestPath !== 'logout'
                      && (response.statusCode === 401 || response.statusCode === 403))
                  {
                      log("error during tahomalink request: " + response.statusText + " ->" + response.statusCode + " retry "  + requestPath, 'error');
                      
                      // session expired?
                      setConnected(false);
                      loginInProgress = false;
      
                      // perform login and send again
                      sendPOST(requestPath, payload, callback);
                  }
                  else
                  {
                      log("error during tahomalink request: " + response.statusCode + ": " + error + 
                          ", request path: " + requestPath + " with payload:" + JSON.stringify(payload), 'error');
                      
                      var result = {};        
                      result.error = error;
                      
                      if(typeof response !== "undefined")
                      {
                          log("response status: " + response.statusCode + " " + response.statusText,'debug');
                          
                          result.responseStatusCode = response.statusCode;
                          result.responseStatusText = response.statusText;
                      }
                      
                      callback(true, result);
                  }
          });
      }
      
      function logout(callback)
      {
          var performLogout = isConnected();
          setConnected(false);
          
          if (performLogout)
          {
              sendInternalPOST("logout", {}, function (err, data)
              {
                  callback(err, data);
              });
          }
          else
          {
              callback(false, {});
          }
      }
      
      function login(callback)
      {
          if (isConnected())
          {
               callback(false, {});
               return;
          }
      
          // check for login already started but not yet finished
          if (loginInProgress)
          {
              //log("login in progress, wait 100 msec");
      
              setTimeout(function()
              {
                  login(callback);
              }, 1500);
              return;
          }
      
          loginInProgress = true;
      
          var payload = {'userId': userName, 'userPassword': passWord};
              
          var result = sendInternalPOST("login", payload, function (err, data)
          {
              if (err || !data.success)
              {
                  loginInProgress = false;
                  return callback(true, data);
              }
              
              lastEventTime = new Date().getTime();
              setConnected(true);
              loginInProgress = false;
              
              getUserInfo(function (err,data)
              {
                  if (!err)
                  {
                      return getSetup(callback);
                  }
                  
                  callback(err, data);
              });
          });
      }
      
      function getUserInfo(callback)
      {
          sendGET('enduser/mainAccount', {},function (err, data)
          {
              if (!err)
              {
                  updateData('userdata', data.endUser);
                  
                  callback(false, data);
              }
              else
              {
                  log("enduser/mainAccount failed!", 'error');
              }
              
          });
      }
      
      function updateGateWayData(gateways)
      {   
          for (var i in gateways) 
          {
              var gateway = gateways[i];
              
              updateData(gateway.gatewayId, gateway);
          }
      }
      
      function updateDevices(devices)
      {   
          tahomaDevices = devices;
          
          for (var i in devices) 
          {
              var device = devices[i];
              
              // just set the raw data from tahoma
              updateDevice('devices.' + device.label, device);
          }
      }
      
      function updateDevice(name, deviceData)
      {   
          createOrUpdateState('tahoma.' + name, '',
              getCreateStateOptions4Widget(deviceData.widget));
          
          // device URL
          createOrUpdateState('tahoma.' + name + '.deviceURL', deviceData.deviceURL);
          
          // states
          for (var stateKey in deviceData.states)
          {
              var state = deviceData.states[stateKey];
              
              createOrUpdateState('tahoma.' + name + '.states.' + state.name, 
                  mapValueTahoma2ioBroker(state.name, state.value),
                  getCreateStateOptions4State(deviceData.widget, state.name));
          }
          
           // commands
          for (var commandKey in deviceData.definition.commands)
          {
              var command = deviceData.definition.commands[commandKey];
              
              if (command.nparams === 0)
              {
                  createOrUpdateState('tahoma.' + name + '.commands.' + command.commandName, false, {
                      read: true, 
                      write: true,
                      role: "button"
                  });
              }
          }
                  
          // raw data
          if (rawDeviceData)
          {
              for (var p in deviceData) 
              {
                  var value = deviceData[p];
                  
                  if (typeof(value) === 'object')
                  {
                      updateData('raw.' + name + '.' + p, value);
                  }
                  else
                  {
                      createOrUpdateState('tahoma.raw.' + name + '.' + p, value);
                  }
              }
          }
      }
      
      function updateActionGroups(actionGroups)
      {   
          tahomaActionGroups = actionGroups;
          
          for (var i in actionGroups) 
          {
              var actionGroup = actionGroups[i];
              
              // just set the raw data from tahoma
              updateActionGroup('actionGroups.' + actionGroup.label, actionGroup);
          }
      }
      
      function updateActionGroup(actionGroup, actionGroupData)
      {    
          // Action Group OID
          createOrUpdateState('tahoma.' + actionGroup + '.oid', actionGroupData.oid);
              
          createOrUpdateState('tahoma.' + actionGroup + '.commands.' + 'execute', false, {
              read: true, 
              write: true,
              role: "button"
          });
      }
      
      function mapValueTahoma2ioBroker(stateName, stateValue)
      {
          if (stateName === 'core:ClosureState' || 
              stateName === 'core:TargetClosureState' ||
              stateName === "core:SlateOrientationState" ||
              stateName === "core:LuminanceState"
              )
          {
              stateValue = parseInt(stateValue,10);
          }
      
          return stateValue;
      }       
      
      function mapValueioBroker2Tahoma(stateName, stateValue)
      {
          if (stateName === 'core:ClosureState' || stateName === 'core:TargetClosureState')
          {
              //stateValue = parseInt(stateValue,10);
          }
      
          return stateValue;
      }       
      
      function updateData(type, data)
      {   
          for (var p in data) 
          {
              var value = data[p];
              
              if (typeof(value) === 'object')
              {
                  updateData(type + '.' + p, value);
              }
              else
              {
                  createOrUpdateState('tahoma.' + type + '.' + p, value);
              }
          }
      }
      
      function createOrUpdateState(key, value, options)
      {
          key = key.replace(' ' , '_');
          var state = getState("javascript.0." + key);
          var typeName = "string";
          
          if (value === "true" || value === "false")
          {
              value = value == "true";
              typeName = "boolean";
          } 
          else if (Number.isInteger(value))
          {
              value = parseInt(value,10);
              typeName = "number";
          }
          else if (!isNaN(value))
          {
              value = Number(value);
              typeName="number";
          }
          
          if (state.notExist)
          {
              
              if (typeof(options) === 'undefined')
              {
                  options = {
                      read: true, 
                      write: false,
                      type: typeName
                  };
              }
      
              // create state
              createState(key, value, 0, options);
          }
          else
          {
              setState("javascript.0." + key, value, true);
          }
      }
      
      function getSetup(callback)
      {
          sendGET('setup', {},function (err, data)
          {
              if (!err)
              {
                  updateGateWayData(data.gateways);
                  updateData('location', data.location);
                  updateDevices(data.devices);
                  
                  // delete old devices
                  deleteOldDevices();
                  
                  // update mapping table device URL to state key with label
                  $('javascript.0.tahoma.devices.*.deviceURL').each(function (id, i) 
                  {
                      var state = getState(id);
                      Map_DeviceURL2StateName[state.val] = id.substr(0, id.indexOf(".deviceURL"));
                      
                      //log("set mapping deviceURL to name: " + state.val + " -> " + id.substr(0, id.indexOf(".deviceURL")),'debug');
                  });
                  
                  // refresh
                  refresh(callback);            
              }
              else
              {
                  log("setup failed!",'error');
                  callback(err, {});
              }
          });
      
          sendGET('actionGroups', {},function (err, data)
          {
              if (!err)
              {
                  updateActionGroups(data);          
              }
              else
              {
                  log("actionGroups failed!",'error');
                  callback(err, {});
              }
          });
      }
      
      function refresh(callback){
          sendPOST('/setup/devices/states/refresh', {}, function (err,data)
                  {
                      if (err)
                      {
                          log("refresh device state failed", 'error');
                      }
                      callback(err, {});   
                  });
      }
      
      function refresh(){
          sendPOST('/setup/devices/states/refresh', {}, function (err,data)
                  {
                      if (err)
                      {
                          log("refresh device state failed", 'error');
                      }
                  });
      }
      
      function getAllStates()
      {
          login(function (err, data)
          {
              if (err)
              {
                  return;
              }
          });
      
          if(eventRegisterID === '-1'){
              sendPOST("events/register", {}, function (err,data)
              {
                  if (err)
                  {
                      log("events/register failed", 'error');
                      return;
                  }
      
                  eventRegisterID = data.id;
                  log ("eventRegisterID = " + eventRegisterID);
                  
                  fetchEvents();
              });
          }
          else {
              fetchEvents();
          }
      }
      
      function fetchEvents(){
          refresh();
              
          sendPOST("events/" + eventRegisterID + "/fetch", {}, function (err,data)
          {
              if (err)
              {
                  return;
              }
              var callback;
              
              log ("events/" + eventRegisterID + "/fetch" + "Fetched Data" + data, 'debug');
              updateDeviceStateFromEvent(data);
          });
      }
      
      function updateDeviceStateFromEvent(events)
      {
          for (var i in events) 
          {
              lastEventTime = new Date().getTime();
              var event = events[i];
         
              if (event.name === 'DeviceStateChangedEvent')
              {
                  updateDeviceState(event);
              }
          }
      }
      
      function updateDeviceState(event)
      {
          var deviceURL = event.deviceURL;
          var states = event.deviceStates;
          
          var devicePath = Map_DeviceURL2StateName[deviceURL];
          // tahoma.devices.XXX
          // tahoma.devices.XXX.states.Y
          
          log("got event for device " + devicePath, 'debug');
       
          for (var i in event.deviceStates) 
          {
              var state = event.deviceStates[i];
              var name = state.name;
              var value = mapValueTahoma2ioBroker(name, state.value);
              
              log("found " + devicePath + '.states.' + name + " -> " + value, 'debug');
              setState(devicePath + '.states.' + name, value, true);
          }
      }
      
      function deleteOldDevices()
      {
          var currentTime = new Date().getTime();
          
          $('javascript.0.tahoma.devices.*.lastUpdateTime').each(function (id, i) 
          {
              var state = getState(id);
              var device = id.substr(0, id.indexOf(".lastUpdateTime"));
              
              if (currentTime - state.ts > 5 * 60 * 1000)
              {
                  // update older than 1 minute -> drop
                  log ("found old " + device + " -> " + new Date(state.ts),'debug');
                  
                  $(device + '.*').each(function (id, i) 
                  {
                      log("delete state:" + id, 'debug');
                      deleteState(id);
                  });
              }
          });
      }
      
      on(/^javascript\.0\.tahoma\.devices.*\.commands/,function(obj)
      {
          if (obj.state.val)
          {
            var id = obj.id;
            log("button pressed: " + id + " -> " + JSON.stringify(obj), 'debug');
           
            var commandName = id.substr(id.lastIndexOf(".")+1);
            var deviceURL = getState(id.substr(0, id.indexOf(".commands.")) + ".deviceURL").val;
            
            var payload = {'label':'command ' + commandName + ' from ioBroker',
                'actions':[{
          		'deviceURL': deviceURL,
              	'commands':	[{
          			'name': commandName,
              	    'parameters': []
              	}]}]};
          
              sendPOST("exec/apply", payload, function(err, data)
              {
                  // reset state
                  setState(obj.id, !obj.state.val);
              });
          }
      });
      
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:ClosureState/,function(obj)
      {
          onClosureStateChange(obj);
      });
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:TargetClosureState/,function(obj)
      {
          onClosureStateChange(obj);
      });
      
      function onClosureStateChange(obj)
      {
          if (!obj.newState.ack)
          {
              var id = obj.id;
                //log("closure state changed: " + id + " -> " + JSON.stringify(obj));
               
                var commandName = "setClosure";
                var deviceURL = getState(id.substr(0, id.indexOf(".states.")) + ".deviceURL").val;
                var stateValue = obj.newState.val;
                var roomName = id.substr(id.indexOf('.devices.')+9);
                
                roomName = roomName.substr(0,roomName.indexOf('.states'));
                
                var payload = {'label': roomName + ' - Positioniere auf ' + stateValue + ' % - ioBroker',
                    'actions':[{
              		'deviceURL': deviceURL,
                  	'commands':	[{
              			'name': commandName,
                  	    'parameters': [ mapValueioBroker2Tahoma('core:ClosureState', stateValue) ]
                  	}]}]};
          
                  sendPOST("exec/apply", payload, function(err, data)
                  {
                      // reset state
                      //setState(obj.id, !obj.state.val);
                  });
          }
      };
      
      on(/^javascript\.0\.tahoma\.devices.*\.states.core:SlateOrientationState/,function(obj)
      {
          if (!obj.newState.ack)
          {
              var id = obj.id;
            
            var commandName = "setOrientation";
            var deviceURL = getState(id.substr(0, id.indexOf(".states.")) + ".deviceURL").val;
            var stateValue = obj.newState.val;
            var roomName = id.substr(id.indexOf('.devices.')+9);
                
              roomName = roomName.substr(0,roomName.indexOf('.states'));
            
            //log("slate orientation changed: " + roomName + " -> " + stateValue);
           
            
            var payload = {'label':roomName + ' - Ausrichtung ' + stateValue + ' % - ioBroker',
                'actions':[{
          		'deviceURL': deviceURL,
              	'commands':	[{
          			'name': commandName,
              	    'parameters': [ mapValueioBroker2Tahoma('core:SlateOrientationState', stateValue) ]
              	}]}]};
          
              sendPOST("exec/apply", payload, function(err, data)
              {
                  // reset state
                  //setState(obj.id, !obj.state.val);
              });
              
          }
      });
      
      on({id: /^javascript\.0\.tahoma\.actionGroups.*\.commands.execute/, valNe: false}, function (obj) {
          if (obj.state.val)
          {
              var id = obj.id;
              var oid = getState(id.substr(0, id.indexOf(".commands.")) + ".oid").val;
      
              log(baseURL + "exec/" + oid);
      
              sendPOST("exec/" + oid, "", function(err, data)
              {
                  if (err)
                  {
                      log(baseURL + "exec/" + oid, "error");
                      return;
                  }
              });
          }
      });
      
      // if connected, update state all 5 seconds
      //schedule("*/5 * * * * *", function () 
      // if connected, update state all 10 seconds
      schedule("*/10 * * * * *", function () 
      {
          // if connected, update states
          if (isConnected())
          {
              getAllStates();
              
              if (new Date().getTime() - lastEventTime > 5 * 60 * 1000)
              {
                  // no events within last 60 seconds
                  logout(function () {});
              }
          }
      });
      
      // update state all 10 minutes
      schedule("*/10 * * * *", function () 
      {
          if (new Date().getTime() - lastEventTime > 9 * 60 * 1000)
          {
              log("update tahoma all 10 minutes");
              getAllStates();
          }
      });
      
      onStop(function (callback) {
          logout(function (err, data)
              {
                  callback();
              });
      }, 10000 /*ms*/);
      
      // start script
      getAllStates();
      
      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: Anfrage Tahoma/Somfy IO Adapter

      Hallo zusammen,

      ich bin gerade dabei am Script zu arbeiten, vielleicht hilft der Zwischenstand schon mal dem Ein oder Anderen. So wie es ausschaut hat Somfy die API teilweise geändert. Unter anderem für den Login.
      Über reverse Engineering auf der Tahomalink Seite und der Chrome Entwicklerkonsole bin ich auf die Stellen gekommen.

      Die stellen die geändert wurden, wurden mit //GEÄNDERT markiert.
      Zwei Stellen sind komplexer umzubauen, sind für meinen Verwendung aber nicht höchste Prio.

      Was get schon?

      • Der Login funktioniert wieder.
      • Wenn man mit Alexa die Rollläden steuern möchte, geht das jetzt wieder.

      Was geht nicht?

      • Die regelmäßige Synchronisierung mit dem Somfy Server. Die Positionswerte können also auseinander laufen. Um das zu kompensieren werden alle Aktivitäten in ioBroker an Somfy gesendet.
      • Die Werte des aktuellen Benutzers werden nicht aktualisiert.

      --> Update mit vollem Funktionsumfang siehe Post vom 06.12.2019

      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: [Adapter] - Mihome

      Aktuell gibt es auch Probleme mit den neuen Gateways der Generation 2.

      Habe diese Woche mein 4. Gateway bekommen und es lässt sich leider nicht in ioBroker einbinden.

      Ähnliche Probleme berichten aber auch andere Benutzer die z.B. Openhab benutzen. Anscheinen benutzt die neue Generation einen neues Protokoll.

      Komisch ist das die anderen 3 Gateways auf gleichem Firmwarestand keine Probleme haben.

      Näheres kann man hier nachlesen.

      https://community.openhab.org/t/openhab … /52963/100

      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: Xiaomi: 2\. Gateway einbinden

      Es scheint aktuell mit einigen Gateways ein paar Probleme mit der UDP Kommunikation zu geben.

      Habe gestern mein 4. Gateway bekommen und konnte es leider auch nicht in ioBroker einbinden.

      Das direkte Senden von Nachrichten an den UDP Port ist nicht möglich bzw. man bekommt keine Antwort von dem Gateway. Bei meinen anderen 3 Geräten läuft alles wie es soll.

      Innerhalb der Xiaomi App funktioniert alles wie es soll.

      https://community.openhab.org/t/openhab … d/52963/91

      Vielleicht hat ja jemand eine Idee oder hat das Problem lösen können.

      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: Lets encrypt Problem

      Gleiches Problem hier!

      Hat irgendjemand eine Lösung dafür?

      posted in ioBroker Allgemein
      T
      thoemmes86
    • RE: Fehler beim Start des web Adapters mit aktiviertem let's encrypt

      Vielen Dank für die Antworten.

      Einen Schritt bin ich weiter, aber der web Adapter mag noch nicht starten.

      npm install –save le-acme-core

      hat leider auch nicht geholfen.

      host.raspberrypi	2018-09-03 07:06:08.763	error	instance system.adapter.web.1 terminated with code 0 (OK)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Decoder.add (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-parser/index.js:251:12)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Decoder.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/component-emitter/index.js:133:20)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:345:8)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Manager.Emitter.emit (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/component-emitter/index.js:133:20)
      Caught	2018-09-03 07:06:08.762	error	by controller[9]: at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:244:12)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at Socket.onack (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:319:9)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:705:21)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at adapter.getCertificates (/opt/iobroker/node_modules/iobroker.web/main.js:239:29)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at initWebServer (/opt/iobroker/node_modules/iobroker.web/main.js:847:28)
      Caught	2018-09-03 07:06:08.761	error	by controller[9]: at Object.createServer (/opt/iobroker/node_modules/iobroker.js-controller/lib/letsencrypt.js:55:26)
      Caught	2018-09-03 07:06:08.760	error	by controller[9]: at Object.Greenlock.create (/opt/iobroker/node_modules/greenlock/index.js:258:13)
      Caught	2018-09-03 07:06:08.760	error	by controller[9]: at promisifyAllSelf (/opt/iobroker/node_modules/greenlock/index.js:15:20)
      Caught	2018-09-03 07:06:08.760	error	by controller[9]: at Array.forEach (native)
      Caught	2018-09-03 07:06:08.760	error	by controller[9]: at /opt/iobroker/node_modules/greenlock/index.js:17:33
      Caught	2018-09-03 07:06:08.760	error	by controller[9]: TypeError: util.promisify is not a function
      Caught	2018-09-03 07:06:08.760	error	by controller[7]: Please update to Let's Encrypt v2 (ACME draft 12)
      Caught	2018-09-03 07:06:08.759	error	by controller[7]: Let's Encrypt v1 is deprecated.
      Caught	2018-09-03 07:06:08.759	error	by controller[7]: === WARNING ===
      Caught	2018-09-03 07:06:08.759	error	by controller[5]: Detected Let's Encrypt v01 URL (deprecated). Changing version to v01.
      Caught	2018-09-03 07:06:08.759	error	by controller[4]: This will be required in versions v2.3+
      Caught	2018-09-03 07:06:08.759	error	by controller[3]: (also 'npm install --save le-acme-core' as this legacy dependency will soon be removed)
      Caught	2018-09-03 07:06:08.759	error	by controller[3]: 'v01' for Let's Encrypt v1 (deprecated)
      Caught	2018-09-03 07:06:08.758	error	by controller[2]: or
      Caught	2018-09-03 07:06:08.758	error	by controller[2]: ('v02' is an alias of 'draft-12'
      Caught	2018-09-03 07:06:08.758	error	by controller[1]: 'draft-12' for Let's Encrypt v2 and ACME draft 12
      Caught	2018-09-03 07:06:08.758	error	by controller[1]: Please specify 'version' option:
      Caught	2018-09-03 07:06:08.758	error	by controller[1]: ==========================================================
      Caught	2018-09-03 07:06:08.758	error	by controller[1]: == greenlock.js (v2.2.0+) ==
      Caught	2018-09-03 07:06:08.757	error	by controller[1]: ==========================================================
      
      posted in Error/Bug
      T
      thoemmes86
    • Fehler beim Start des web Adapters mit aktiviertem let's encrypt

      Hallo zusammen,

      da man ja alle 3 Monate bei let's encrypt sein Zertifikat erneuert muss, habe ich den entsprechenden Web Adapter wie zuvor gestartet, allerdings scheint in der aktuellen Version ein Fehler zu sein. Sobald man den let's encrypt Haken in der Adaptperkonfiguration setzt, startet der Adapter nicht mehr.

      Web Adapter ist auf Version 2.4.2, nodejs auf v6.13.1.

      Wäre schön wenn mir jemand helfen könnte.

      2018-09-02 00:00:06.558  - [31merror[39m: web.1 TypeError: util.promisify is not a function
          at Object. <anonymous>(/opt/iobroker/node_modules/safe-replace/index.js:12:27)
          at Module._compile (module.js:577:32)
          at Object.Module._extensions..js (module.js:586:10)
          at Module.load (module.js:494:32)
          at tryModuleLoad (module.js:453:12)
          at Function.Module._load (module.js:445:3)
          at Module.require (module.js:504:17)
          at require (internal/module.js:20:19)
          at Object. <anonymous>(/opt/iobroker/node_modules/iobroker.js-controller/lib/letsencryptStore.js:10:11)
          at Module._compile (module.js:577:32)
          at Object.Module._extensions..js (module.js:586:10)
          at Module.load (module.js:494:32)
          at tryModuleLoad (module.js:453:12)
          at Function.Module._load (module.js:445:3)
          at Module.require (module.js:504:17)
          at require (internal/module.js:20:19)</anonymous></anonymous>
      
      posted in Error/Bug
      T
      thoemmes86
    • RE: Iobroker.alexa2 v0.4+

      Hallo zusammen,

      erst einmal herzlichen Dank an den Programmierer dieses Adapters.

      Habe schon lange darauf gewartet proaktiv an den Alexas spezifischen Text als Sprache auszugeben.

      Jetzt zu einem kleinen Problem bzw. fehlenden Feature.

      Die Alexa Geräte unterstützen eine Markup Sprache mit dem Namen SSML.

      https://developer.amazon.com/de/docs/cu … nce.html#p

      Hiermit lässt sich die die Sprachausgabe steuern so dass Alexa das z.b nicht so runter rattert und Pausen macht oder eben gewisse Absätze betont oder flüstert. Gerade für Aufzählungen ist das sehr hilfreich. Nutze die Features in meinen eigenen Skils sehr häufig.

      Weiß jemand warum das nicht geht, bzw. könnte das eingebaut werden?

      Vielen Dank bereits für die Antworten.

      posted in Cloud Dienste
      T
      thoemmes86
    • RE: Cloud.0 kann keine neue Geräte hinzufügen.

      Hallo zusammen,

      ich habe jetzt seit einigen Tagen auch das Problem das es mir nicht möglich ist Datenpunkte als Gerät im Cloudadapter hinzuzufügen.

      Testweise habe ich bereits hinzugefügte Geräte entfernt um sie anschließend wieder hinzuzufügen. Das funktioniert leider auch nicht.

      Ich vermute hier einen Fehler im Adapter.

      Über die Google Entwicklerkonsole bin ich jetzt auf einen Fehler gestoßen. Ich bin mir allerdings nicht sicher ob es das eigentlich Problem ist.

      Vielleicht kann Bluefox mehr dazu sagen.

      Adapter Version: 2.2.0

      Browser: Chrome 63.0.3239.84

      Uncaught TypeError: Cannot read property 'toLowerCase' of undefined

      at filter_m (?0:772)

      at n. <anonymous>(?0:621)

      at n.onack (universalModuleDefinition:3)

      at n.onpacket (universalModuleDefinition:3)

      at n. <anonymous>(universalModuleDefinition:3)

      at n.emit (universalModuleDefinition:2)

      at n.ondecoded (universalModuleDefinition:1)

      at s. <anonymous>(universalModuleDefinition:3)

      at s.r.emit (universalModuleDefinition:1)

      at s.add (universalModuleDefinition:1)</anonymous></anonymous></anonymous>

      posted in Cloud Dienste
      T
      thoemmes86
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo