Smart Home im Neubau

Hallo liebe community,

Ich plane einen Neubau, Fertigstellung nächstes Jahr.
Ich habe mich seit kurzem mit dem Thema Smart Home beschäftigt und aufgrund der Komplexität einen Berater aufgesucht.
Der empfiehlt mir Fibaro, mit Einbau und Einrichtung soll der Spaß ca. 15.000 Euro kosten und das ist mir ehrlich gesagt zu teuer.
Auf die Frage warum homey nicht in Frage kommt sagte er, dass homey ab 60 z wave Aktoren nicht zuverlässig arbeiten würde.

Daher folgende Fragen:

  1. hat jemand Erfahrung mit so vielen oder noch mehr Geräten? Kann homey das oder muss man da was beachten?
  2. ist die Summe wirklich zu hoch oder muss man die so einkalkulieren?
  3. ich habe überlegt mir jetzt schon die zentrale (pro 2023) zu kaufen zum testen. Die davor ist ja von 2019, daher frage ich mich ob das Sinn macht oder ich warte sollte, weil bald eine neue Zentrale auf den Markt kommt?
  4. kann mir jemand die vor/Nachteile im vgl zu homey auflisten?

Danke :slight_smile:

tumblr_nnalwj5EWs1s2f16eo3_r1_400
Da stellt sich mir die Frage: Welche Drogen nimmt er und wo bekomm ich die her ?

Ich hab ein bisschen mehr als 60 Zwave Aktoren.
Homey kann im übrigen ein etwas mehr wie Zwave. Es gibt auch noch Zigbee, Wlan, Bluetooth usw.
Ich persönlich habe im Moment…ach, du kannst selbst lesen:


Das zu deiner 1. Frage

Es kommt natürlich darauf an, wieviel und welche Geräte du kaufen willst. Du kannst das nicht pauschal sagen, aber mit 5000 € für die Grundkonfuguration, hast du schon ein großes Smart Home. Du wirst dein System eh nach und nach ausbauen und nicht alles auf einmal kaufen.

Es ist im Moment kein neuer Homey geplant. Selbst wenn, du kennst die Anzahl meiner Geräte. Was sollte ein neuer Homey mehr können ?

Frage 4 verstehe ich nicht ganz. Vor und Nachteile Fibaro zu Homey ?
Homey = Porsche 911, Fibaro= VW Jetta
Manche von uns benutzen die Fibaro Zentrale nur, um die Fibaro Aktoren/Sensoren zu updaten.

An deiner Stelle würde ich mir einen anderen Berater suchen. Der will sich an dir nicht nur dumm, sondern dumm und dämlich verdienen. Von Smart Home hat er vermutlich so viel Ahnung wie ich von Kernkraftwerken.

2 Likes

Hallo Daniel,

ich habe aktuell 75 Z-Wave Geräte im Einsatz, wovon 37 Aktoren sind, also Geräte, die vom Stromnetz versorgt werden, und 38 batteriebetriebene Geräte. Und es werden noch welche hinzukommen.
Ich habe aber auch schon Posts von anderen Usern gesehen, die mehr als 100 Z-Wave Geräte im Einsatz hatten.
Die maximale Grenze liegt soweit ich weiß bei ungefähr 256 Z-Wave Geräten, was vom verwendeten Z-Wave Chip begrenzt wird.

Was die 15.000 € betrifft, sehe ich es auch so wie @undertaker. Es kommt halt auch darauf an, was alles an Hardware verbaut werden soll. Deshalb wäre es mal interessant zu wissen was Du geplant hast.
Btw, kann es sein, dass der Name der Firma mit Intui anfängt, und mit tech aufhört?

Da würde mir schon einiges einfallen. An erster Stelle stünde definitiv mehr Arbeitsspeicher um einfach mehr Homey Apps nutzen zu können.

Frage 4 kann im Grunde ja wirklich nur jemand beantworten, der beide Systeme schon mal ausgiebig getestet hat. Ansonsten kann man erst mal nur die technischen Daten miteinander vergleichen.
Was die Anzahl der Protokolle betrifft und mit Matter und Thread auch zukunftssicherer ist, liegt der Homey Pro (early 2023) klar vorne.
Dennoch denke ich, dass beide Systeme ihre Vor- und Nachteile haben

1 Like

Lass die Finger von solchen komischen, Beratern, die wollen nur Geld verdienen. Mir hat man eine Infrarotdecken-Heizung eingebaut. Smart Home gesteuert. Nur dass die Zentrale dazu noch 800 €zusätzlich kosten soll.

Für den Prsi von 15 bis 20t€ würde ich eine KNX Installation erwarten. Alles verkabelt mit entsprechend großem Schaltschrank im Keller. Dazu überall smarte Schalternmit Display.
Konnte ich schon mal live sehen. Macht echt eindruck, wenn man so hut wie jede Steckdose im Schaltschrank smart ansteuern kann. Und die Display-Schalter mit kombinierter Licht/Heizung/Rollo-Steuerung sahen auch gut aus.

So etwas erwarte ich von einem Berater.
Wenn dir Fibaro angeboten wird, dann klingt das nach provisionsgetriebenem Verkauf.

Danke für die Rückmeldungen soweit, bestätigt das was ich befürchtet habe :sweat_smile:
Ich hab mir auch diverse Tests über homey durchgelesen und mich eigentlich schon dafür entschieden. das einzige was mich noch stutzig gemacht hatte waren diese angeblichen Fehler bei über 60 z wave Geräten, aber das scheint ja nicht zu stimmen :person_shrugging:
Mein Haus wird massiv gebaut werden aus Stahlbeton, muss man dahingehend bei homey was beachten? Zusätzliche bridge wahrscheinlich? Oder noch was anderes?

Als ersten überall LAN-Kabel. Dann kannst du bei Bedarf WLAN-AccessPoints per Kabel anschließen, um vernünftiges WLAN zu haben.

Für ZigBee/ZWave brauchst du vermutlich mehrere Router. Das sind Geräte mit Stromversorgung, die immer aktiv sind (Steckdosen, Lampen). Diese strombetriebenen Geräte bilden ein Mesh, in dem die Signale an die batteriebetriebenen Geräte weitergeleitet werden, falls diese außer Reichweite sind.

Falls du ein zweites Mesh verwendest (z.B. parallel eine PhilipeHue Bridge), dann erstellt diese ein eigenes Mesh. Beide Netze sind dann unabhängig. D.h. die Hue-Lampen würden dann nicht die ZigBee-Geräte von Homey routen.

Die LAN Anschlüsse sind geplant, min 2 jeweils im EG und OG, Router wird im Keller stehen.

Ich wollte smarte steckdosen/lichtschalter/Rollläden einrichten, vermutlich mit shelly aufgrund des Preises :slightly_smiling_face:
Außerdem Heizung (Viessmann, hat wohl smart integriert und gibt dazu ne App von homey).
Ggf noch die ein oder andere Lampe, Kamera und Bewegungssensoren.

Ein weiteres Netz außer homey ist nicht geplant, ich möchte dann nur Sachen einbauen die sich über homey steuern lassen

Bei den Schalterdosen dann unbedingt die tiefe Variante verwenden. Bei der Stadardtiefe bekommst du keine Shellys mehr rein, wenn noch Schnellverbinder verbaut sind.

@Undertaker wo kann ich mir die auswertung ziehen, wie viel geräte ich verbunden habe?

Das wird in der App Flow Checker angezeigt.

1 Like

Alternativ kann man das folgende Homey Script verwenden. Dieses stellt deutlich mehr Informationen zur Verfügung als nur die Geräteanzahl:

// Set any of these from `false;` to `true;` to see the corresponding Name(s) or Node ID('s) added to the list
const showStorage = false; // Show storage status (Very slow!, is enabled for Homey Pro (early 2023))
const showUpdateableApps = true; // Names of Apps that can be updated
const showDisabledApps = true; // Names of Apps that are disabled or crashed
const showStableApps = false; // Names of Stable channel Apps
const showTestApps = false; // Names of Test channel Apps
const showDevApps = false; // Names of Apps that are installed via CLI or Community Appstore
const showSDKv2Apps = false; // Names of Apps that are on SDKv2
const showSDKv3Apps = false; // Names of Apps that are on SDKv3
const showZones = false; // Names of Zones
const showLogicBoolean = false; // Names and ID of boolean (yes/no) variables
const showLogicNumber = false; // Names and ID of number variables
const showLogicString = false; // Names and ID of string (text) variables
const showDisabledFlows = false; // Names of Flows that are disabled
const showBrokenFlows = false; // Names of Flows that are broken
const showDisabledAdvancedFlows = false; // Names of Advanced Flows that are disabled
const showBrokenAdvancedFlows = false; // Names of Advanced Flows that are broken
const showImages = false; // URLs of all your images (HP 2023+ only)
const showMoods = false; // Names of all Moods (HP 2023+ only)
const showUnavailableDevices = false; // Names of devices that are marked unavailable
const showZwaveDevices = false; // Names and Node ID of all Z-Wave devices
const showZwaveRouterDevices = false; // Names and Node ID of Z-Wave router devices
const showZwaveUnsecureDevices = false; // Names and Node ID of unsecure Z-Wave devices
const showZwaveSecureS0Devices = false; // Names and Node ID of secure (S0) Z-Wave devices
const showZwaveSecureS2AuthenticatedDevices = false; // Names and Node ID of secure (S2 Authenticated) Z-Wave devices
const showZwaveSecureS2UnauthenticatedDevices = false; // Names and Node ID of secure (S2 Unauthenticated) Z-Wave devices
const showZwaveBatteryDevices = false; // Names and Node ID of Z-Wave battery devices
const showZwaveUnreachableNodes = false; // Node ID's of unreachable (flagged) devices
const showZwaveUnknownNodes = false; // Node ID's of unknown nodes
const showZigbeeNodes = false; // Names of all ZigBee devices
const showZigbeeRouter = false; // Names of ZigBee: router devices
const showZigbeeEndDevice = false; // Names of ZigBee: end device devices
const showZigbeeLastSeen = false; // Show additional: the last seen time and date (HP 2023+ only)
const showVirtualDevices = false; // Names of all Virtual devices
const showIRDevices = false; // Names of all InfraRed devices

// ================= Don't edit anything below here =================

log('--------------- Homey Pro Overview v1.17 --------------');

await Homey.system.getSystemName()
  .then(result => log('Homey name:', result))
  .catch(() => log('Failed: Getting Homey name'));

let homeyPlatformVersion, homeyVersion, timezone;
await Homey.system.getInfo()
  .then(result => {
    log('Homey version:', homeyVersion = result.homeyVersion);
    log('Homey model:', result.homeyModelName, '(' + result.cpus.length + ' core(s))');
    homeyPlatformVersion = result.homeyPlatformVersion || 1;
    timezone = result.timezone;

    const d = Math.floor(result.uptime / 86400);
    const h = Math.floor((result.uptime % 86400) / 3600);
    const m = Math.floor((result.uptime % 3600) / 60);
    const s = Math.floor(result.uptime % 60);
    let uptimeHuman = '';
    if (d > 0) uptimeHuman += d + ' day' + (d > 1 ? 's, ' : ', ');
    uptimeHuman += h + ' hour' + (h > 1 ? 's, ' : ', ');
    uptimeHuman += m + ' minute' + (m > 1 ? 's, ' : ', ');
    uptimeHuman += s + ' second' + (s > 1 ? 's' : '');
    log('Uptime:', result.uptime, '(' + uptimeHuman + ')');

    if (homeyPlatformVersion === 2) {
      log('WiFi:', (result.wifiConnected) ? 'Connected' : 'Not connected');
      log('Ethernet:', (result.ethernetConnected) ? 'Connected' : 'Not connected');
      log('Throttled:', (result.videoCoreThrottleOccured) ? 'Yes' : 'No', '(Currently:', (result.videoCoreThrottleCurrently) ? 'Yes)' : 'No)');
      log('Under voltage:', (result.videoCoreUndervoltageOccured) ? 'Yes' : 'No', '(Currently:', (result.videoCoreUnderVoltageCurrently) ? 'Yes)' : 'No)');
    }
  })
  .catch(() => log('Failed: Getting Homey\'s statistics'));

await Homey.updates.getUpdates()
  .then(result => {
    if(result.length > 0) {
      log('Update available:', result[0].version);
    } else {
      log('Update available: No');
    }
  })
  .catch(() => log('Failed: Getting updates'));

if (showStorage || homeyPlatformVersion === 2) {
  await Homey.system.getStorageInfo()
    .then(result => {
      let sizeFree = result.free + 'B'
      if (result.free >= 1000000000) {
        sizeFree = (result.free / 1000000000).toFixed(2) + ' GB';
      } else if (result.free >= 1000000) {
        sizeFree = (result.free / 1000000).toFixed(2) + ' MB';
      }
      log('Storage:', (result.total / 1000000000).toFixed(2), 'GB (' + sizeFree + ' free)');
    })
    .catch(() => log('Failed: Getting storage information'));
}

log('\r\n------------------ Main ---------------------');

await Homey.users.getUsers()
  .then(result => {
    let owner = 0, manager = 0, user = 0, guest = 0;

    Object.keys(result).forEach(function(key) {
      const role = result[key].role;
      if (role === 'owner') owner++;
      if (role === 'manager') manager++;
      if (role === 'user') user++;
      if (role === 'guest') guest++;
    });

    log(Object.keys(result).length, 'Users', '('  + owner + ' Owner, ' + manager + ' Manager, ' + user + ' User, ' + guest + ' Guest)');
  })
  .catch(() => log('Failed: Getting users'));

await Homey.apps.getApps()
  .then(result => {
    let sdkv2Apps = [], sdkv3Apps = [], updateableApps = [], disabledApps = [], stableApps = [], testApps = [], devApps = [];

    Object.keys(result).forEach(function(key) {
      if (result[key].updateAvailable) updateableApps.push(result[key].name);
      if (result[key].sdk === 2) sdkv2Apps.push(result[key].name);
      if (
        result[key].sdk === 3
        || homeyPlatformVersion === 2
      ) {
        sdkv3Apps.push(result[key].name);
      }
      if (!result[key].ready) disabledApps.push(result[key].name);
      if (result[key].origin === 'devkit_install') devApps.push(result[key].name);
      else if (result[key].channel === 'stable' || result[key].channel === 'live') stableApps.push(result[key].name);
      if (result[key].channel === 'beta' || result[key].channel === 'test') testApps.push(result[key].name);
    });

    log(Object.keys(result).length, 'Apps', '(' + stableApps.length + ' Stable, ' + testApps.length + ' Test, ' + devApps.length + ' Development/Community Appstore, ' + sdkv2Apps.length + ' SDKv2, '  + sdkv3Apps.length + ' SDKv3, '  + updateableApps.length + ' Updateable, ' + disabledApps.length + ' Disabled/Crashed)');
    if (showStableApps) {
      log('---------------------------------------------')
      log('App(s) in the Stable channel:');
      log(stableApps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showTestApps) {
      log('---------------------------------------------')
      log('App(s) in the Test channel:');
      log(testApps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showDevApps) {
      log('---------------------------------------------')
      log('App(s) that are installed via CLI or Community Appstore:');
      log(devApps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showSDKv2Apps) {
      log('---------------------------------------------')
      log('SDKv2 app(s):');
      log(sdkv2Apps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showSDKv3Apps) {
      log('---------------------------------------------')
      log('SDKv3 app(s):');
      log(sdkv3Apps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showUpdateableApps) {
      log('---------------------------------------------')
      log('Updateable app(s):');
      log(updateableApps.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showDisabledApps) {
      log('---------------------------------------------')
      log('Disabled app(s):');
      log(disabledApps.join('\r\n'));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting apps'));

let zones = {};
await Homey.zones.getZones()
  .then(result => {
    Object.keys(result).forEach(function(key) {
      zones[result[key].id] = result[key].name;
    });
    log(Object.keys(result).length, 'Zones');

    if (showZones) {
      log('---------------------------------------------')
      log('Zones:');
      log(Object.entries(zones).sort((a, b) => a[1].localeCompare(b[1])).map(zone => zone[1]).join('\r\n'));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting zones'));

await Homey.notifications.getNotifications()
  .then(result => log(Object.keys(result).length || 0, 'Notifications (Timeline)'))
  .catch(() => log('Failed: Getting notifications'));

await Homey.insights.getLogs()
  .then(result => {
    let boolean = 0, number = 0;

    Object.keys(result).forEach(function(key) {
      if (result[key].type === 'number') number++;
      if (result[key].type === 'boolean') boolean++;
    });

    log(Object.keys(result).length, 'Insight entries', '(' + boolean + ' Boolean (Yes/No), ' + number + ' Number)');
  })
  .catch(() => log('Failed: Getting Insights'));

await Homey.logic.getVariables()
  .then(result => {
    let boolean = [], number = [], string = [];

    Object.keys(result).forEach(function(key) {
      if (result[key].type === 'boolean') boolean.push(result[key].name + ' (ID: ' + result[key].id + ')');
      if (result[key].type === 'number') number.push(result[key].name + ' (ID: ' + result[key].id + ')');
      if (result[key].type === 'string') string.push(result[key].name + ' (ID: ' + result[key].id + ')');
    });

    log(Object.keys(result).length, 'Logic Variables', '(' + boolean.length + ' Boolean (Yes/No), ' + number.length + ' Number, ' + string.length + ' String (Text))');

    if (showLogicBoolean) {
      log('---------------------------------------------')
      log('Boolean (yes/no) variable(s):');
      log(boolean.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showLogicNumber) {
      log('---------------------------------------------')
      log('Number variable(s):');
      log(number.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showLogicString) {
      log('---------------------------------------------')
      log('String (text) variable(s):');
      log(string.join('\r\n'));
      log('---------------------------------------------')
    }

  })
  .catch(() => log('Failed: Getting variables'));

await Homey.flow.getFlows()
  .then(result => {
    let disabledFlows = [], brokenFlows = [];
    Object.keys(result).forEach(function(key) {
      if (!result[key].enabled) disabledFlows.push(result[key].name);
      if (result[key].broken) brokenFlows.push(result[key].name);
    });

    log(Object.keys(result).length, 'Flows', '('  + brokenFlows.length + ' Broken, ' + disabledFlows.length + ' Disabled)');

    if (showBrokenFlows) {
      log('---------------------------------------------')
      log('Broken flow name(s):');
      log(brokenFlows.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showDisabledFlows) {
      log('---------------------------------------------')
      log('Disabled flow name(s):');
      log(disabledFlows.join('\r\n'));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting flows'));

await Homey.flow.getAdvancedFlows()
  .then(result => {
    let disabledFlows = [], brokenFlows = [];
    Object.keys(result).forEach(function(key) {
      if (!result[key].enabled) disabledFlows.push(result[key].name);
      if (result[key].broken) brokenFlows.push(result[key].name);
    });

    log(Object.keys(result).length, 'Advanced flows', '('  + brokenFlows.length + ' Broken, ' + disabledFlows.length + ' Disabled)');

    if (showBrokenAdvancedFlows) {
      log('---------------------------------------------')
      log('Broken advanced flow name(s):');
      log(brokenFlows.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showDisabledAdvancedFlows) {
      log('---------------------------------------------')
      log('Disabled advanced flow name(s):');
      log(disabledFlows.join('\r\n'));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting advanced flows'));

if (homeyPlatformVersion === 2) {
  await Homey.images.getImages()
    .then(result => {
      let images = [];

      Object.keys(result).forEach(function(key) {
        if (result[key].id !== 'dummy') {
          images.push(result[key].url);
        }
      });

      log(images.length, 'Images');

      if (showImages) {
        log('---------------------------------------------')
        log('Image URL(s):');
        log(images.join('\r\n'));
        log('\r\n');
        log('Images can also be found in the developer tools:');
        log('https://tools.developer.homey.app/tools/images');
        log('---------------------------------------------')
      }
    })
    .catch(() => log('Failed: Getting images'));
}

if (homeyPlatformVersion === 2 && Homey.moods !== undefined) {
  await Homey.moods.getMoods()
    .then(result => {
      let moods = [];

      Object.keys(result).forEach(async function(key) {
        moods.push(zones[result[key].zone] + ' : ' + result[key].name);
      });

      log(moods.length, 'Moods');

      if (showMoods) {
        log('---------------------------------------------')
        log('Mood(s):');
        log(moods.join('\r\n'));
        log('---------------------------------------------')
      }
    })
    .catch(() => log('Failed: Getting Moods'));
}

await Homey.alarms.getAlarms()
  .then(result => {
    let enabled = 0;
    Object.keys(result).forEach(function(key) {
      if (result[key].enabled) enabled++;
    });

    log(Object.keys(result).length, 'Alarms', '(' + enabled + ' Enabled)')
  })
  .catch(() => log('Failed: Getting alarms'));

await Homey.apps.getAppSettings({id: 'com.athom.homeyscript'})
  .then(result => {
    log(Object.keys(result.scripts).length, 'HomeyScript scripts', '(' + ((result.tokens) ? Object.keys(result.tokens).length : 0) + ' Token/Tag)');
  })
  .catch(() => {
    if (homeyPlatformVersion === 2 && homeyVersion.localeCompare("10.0.0-rc.80", undefined, {numeric: true, preversion: ["rc"]}) < 0) {
      log('Failed: Getting HomeyScript, Homey Pro (early 2023): getting information from apps is currently unavailable.');
    }
    else {
      log('Failed: Getting HomeyScript');
    }
  });

await Homey.apps.getAppSettings({id: 'net.i-dev.betterlogic'})
  .then(result => {
    let boolean = 0, number = 0, string = 0;
    Object.keys(result.variables).forEach(function(key) {
      if (result.variables[key].type === 'boolean') boolean++;
      if (result.variables[key].type === 'number') number++;
      if (result.variables[key].type === 'string') string++;
    });

    log(Object.keys(result.variables).length, 'Better Logic Variables', '(' + boolean + ' Boolean (Yes/No), ' + number + ' Number, ' + string + ' String)');
  })
  .catch(() => {
    if (homeyPlatformVersion === 2 && homeyVersion.localeCompare("10.0.0-rc.80", undefined, {numeric: true, preversion: ["rc"]}) < 0) {
      log('Failed: Getting Better logic, Homey Pro (early 2023): getting information from apps is currently unavailable.');
    }
  });

log('\r\n----------------- Devices -------------------');
let allDevices = 0, other = 0, homeyBridge = 0, zwaveDevices = [], zwaveNodes = [], zwaveRouterDevices = [], zwaveBatteryDevices = [], zwaveSxDevices = [], zwaveS0Devices = [], zwaveS2AuthDevices = [], zwaveS2UnauthDevices = [], unavailableDevices = [];

await Homey.devices.getDevices()
  .then(result => {
    let virtualNames = [], irNames = [];

    Object.keys(result).forEach(function(key) {
      const device = result[key];
      const virtualDeviceApps = [
        'homey:app:com.arjankranenburg.virtual',
        'homey:app:nl.qluster-it.DeviceCapabilities',
        'homey:app:nl.fellownet.chronograph',
        'homey:app:net.i-dev.betterlogic',
        'homey:app:com.swttt.devicegroups',
        'homey:app:com.sysInternals',
        'homey:virtualdriver',
      ]

      if (
        device.hasOwnProperty('available')
        && device.available === false
      ) {
        unavailableDevices.push(device.name + ' (' + device.unavailableMessage + ')');
      }

      if (device.driverId.includes('infraredbasic') || device.driverId.includes('homey:virtualdriverinfrared')) {
        irNames.push(device.name);
      }
      else if (device.driverId.includes('homey:virtualdriverbridge')) {
        homeyBridge++;
      }
      else if (virtualDeviceApps.some(app => app === device.driverUri || device.driverId.includes(app))) {
        virtualNames.push(device.name);
      }
      else if (device.flags.includes('zwaveRoot')) {
        zwaveDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
        zwaveNodes.push(Number(device.settings.zw_node_id));

        if (
          device.settings.zw_battery === '✓'
          || device.energyObj.batteries
        ) {
          zwaveBatteryDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
        }
        else {
          zwaveRouterDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
        }

        switch(device.settings.zw_secure) {
          case '⨯':
            zwaveSxDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
            break;
          case '✓':
          case 'S0':
            zwaveS0Devices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
            break;
          case 'S2 (Unauthenticated)':
          case 'Unauthenticated':
            zwaveS2UnauthDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
            break;
          case 'S2 (Authenticated)':
          case 'Authenticated':
            zwaveS2AuthDevices.push(device.name + ' (Node ID: ' + device.settings.zw_node_id + ')');
            break;
        }
      }
      else if (
        !device.flags.includes('zwave')
        && !device.flags.includes('zigbee')
      ) {
        other++;
      }
    });

    allDevices = virtualNames.length + irNames.length + zwaveDevices.length + other + homeyBridge;

    log(unavailableDevices.length, 'Unavailable devices')
    if (showUnavailableDevices) {
      log('---------------------------------------------')
      log('Unavailable device(s):');
      log(unavailableDevices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    log(virtualNames.length, 'Virtual devices');
    if (showVirtualDevices) {
      log('---------------------------------------------')
      log('Virtual device(s):');
      log(virtualNames.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    log(irNames.length, 'Infrared (database) devices');
    if (showIRDevices) {
      log('---------------------------------------------')
      log('Infrared (database) device(s):');
      log(irNames.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting devices'));

await Homey.zwave.getState()
  .then(result => {
    const unknownNodes = result.zw_state.nodes
      .filter((el) => !zwaveNodes.includes(el))
      .sort((a, b) => a - b)
      .slice(1);

    log(zwaveDevices.length, 'Z-Wave devices', '(' + zwaveSxDevices.length + ' Unsecure, ' + zwaveS0Devices.length + ' Secure (S0), ' + zwaveS2AuthDevices.length + ' Secure (S2 Authenticated), ' + zwaveS2UnauthDevices.length + ' Secure (S2 Unauthenticated), ' + zwaveRouterDevices.length + ' Router, ' + zwaveBatteryDevices.length + ' Battery, ' + result.zw_state.noAckNodes.length + ' Unreachable, ' + unknownNodes.length + ' Unknown)')

    if (showZwaveDevices) {
      log('---------------------------------------------')
      log('Z-Wave device(s):');
      log(zwaveDevices.join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveRouterDevices) {
      log('---------------------------------------------')
      log('Z-Wave router device(s):');
      log(zwaveRouterDevices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveUnsecureDevices) {
      log('---------------------------------------------')
      log('Z-Wave unsecure device(s):');
      log(zwaveSxDevices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveSecureS0Devices) {
      log('---------------------------------------------')
      log('Z-Wave secure (S0) device(s):');
      log(zwaveS0Devices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveSecureS2AuthenticatedDevices) {
      log('---------------------------------------------')
      log('Z-Wave secure (S2) authenticated device(s):');
      log(zwaveS2AuthDevices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveSecureS2UnauthenticatedDevices) {
      log('---------------------------------------------')
      log('Z-Wave secure (S2) Unauthenticated device(s):');
      log(zwaveS2Unauth.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveBatteryDevices) {
      log('---------------------------------------------')
      log('Z-Wave battery device(s):');
      log(zwaveBatteryDevices.sort((a, b) => a - b).join('\r\n'));
      log('---------------------------------------------')
    }

    if (showZwaveUnreachableNodes) {
      log('---------------------------------------------')
      log('Unreachable node(s):');
      log('Node ID:', result.zw_state.noAckNodes.sort((a, b) => a - b).join('\r\nNode ID: '));
      log('---------------------------------------------')
    }

    if (showZwaveUnknownNodes) {
      log('---------------------------------------------')
      log('Unknown node(s):');
      log('Node ID:', unknownNodes.join('\r\nNode ID: '));
      log('---------------------------------------------')
    }
  })
  .catch(() => log('Failed: Getting Z-Wave state'));

let zigbee;
if (Homey.zigBee !== undefined) {
  await Homey.zigBee.getState()
    .then(result => {
      zigbee = result;
    })
    .catch(async () => log('Failed: Getting ZigBee state'));
}
if (Homey.zigbee !== undefined) {
  await Homey.zigbee.getState()
    .then(result => {
      zigbee = result;
    })
    .catch(async () => log('Failed: Getting Zigbee state'));
}

if (zigbee) {
  let zigbeeDevices = [], routerDevices = [], endDevices = [];

  Object.keys(zigbee.nodes).forEach(function(key) {
    device = zigbee.nodes[key];
    let deviceName = device.name;
    if (showZigbeeLastSeen && device.hasOwnProperty('lastSeen')) {
      const lastSeen = new Date(device.lastSeen).toLocaleString('en-GB', {timeZone: timezone, month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit'});
      deviceName += ' (last seen: ' + lastSeen + ')';
    }
    zigbeeDevices.push(deviceName);

    if (device.type.toLowerCase() === 'router') routerDevices.push(deviceName);
    if (device.type.toLowerCase() === 'enddevice') endDevices.push(deviceName);
  });

  log(zigbeeDevices.length, 'Zigbee devices', '(' + routerDevices.length + ' Router, ' + endDevices.length + ' End device)');

  if (showZigbeeNodes) {
    log('---------------------------------------------')
    log('ZigBee device(s):');
    log(zigbeeDevices.join('\r\n'));
    log('---------------------------------------------')
  }

  if (showZigbeeRouter) {
    log('---------------------------------------------')
    log('ZigBee router(s):');
    log(routerDevices.sort((a, b) => a - b).join('\r\n'));
    log('---------------------------------------------')
  }

  if (showZigbeeEndDevice) {
    log('---------------------------------------------')
    log('ZigBee end device(s):');
    log(endDevices.sort((a, b) => a - b).join('\r\n'));
    log('---------------------------------------------')
  }

  allDevices += zigbeeDevices.length;
};

log(homeyBridge, 'Homey bridges');
log(other, 'Other devices');
log(allDevices, 'Total devices')

return 'Overview finished';
1 Like

Und da wo recht viel zusammenkommt, gerne auch die Multimediadosen :wink:

Sorry für den langen Post. Ich fasse ihn mal in drei Sätzen zusammen: Nimm im Neubau das bisschen Geld in die Hand und setze überall auf gute Verkabelung – beim Netzwerk im Haus als auch im SmartHome. Funk ist doch echt nur zum Nachrüsten und die Möglichkeit wird dir auch in 30 Jahren noch zur Verfügung stehen. Jetzt, beim Bau, hast du noch die Chance es „richtig“ zu machen und hast über Jahrzehnte eine zuverlässige Lösung, über die du dich freuen kannst.

=====================================

Oh Gott, Neubau und alles über Funk? Ich würde echt viel dafür geben, überall einen Bus legen zu können. Hab nur keinen Bock, mein ganzes Haus aufzupicken.

Investiere in eine gute Verkabelung. Einmal, wie schon gesagt wurde, LAN überall hin. Und dann nicht geizen. Pack Cat7 rein und gut. Jaja, Cat6a/5e könnte auch für 10G reichen bla bla bla. Und in 20 Jahren ärgerst du oder dein nachbesitzer / deine Kinder sich. Also: ein Datenkabel in fast jedem Raum. Auch wenn da aktuell keins benötigt wird. Stell dir die Frage: könnte (!) Man den Raum in Zukunft zu irgendwas umfunktionieren, wo man ein Datenkabel bräuchte? Wenn ja, pack eins rein. Auch darauf achten, dass man ggfs. einen wlan Accesspoint an der Decke / Wand haben kann / will. Da reicht auch theoretisch nur das Datenkabel und man versorgt den per POE.

Ich plane derzeit meine Etagenverteilung zB sogar per Glasfaser. Hat zum Vorteil, dass die Kabel kleiner und billiger sind. Kann ich super die bestehenden Antennenkabel mit ersetzen und muss keine Wand aufmachen oder aufputz verlegen. So bekomme ich jetzt schon eine 10G Verteilung für jede Etage hin. Das Glasfaserkabel, das ich verwende, kann aber auch 40G oder gar 100G. Kann ich also noch uograden ohne Probleme, wenn die Hardware dafür erschwinglich wird und sowas mal Sinn machen sollte. Auf den Etagen sind’s dann „nur“ 2.5G per LAN Kabel, aber da sind 10G auch locker drin, ist mir nur die Technik zu teuer im Moment (und wird per Kupfer zu heiß). Da ich die LAN Kabel aber eh Aufputz verlegen muss, kann ich da auch jederzeit auf Glasfaser umstellen, wenn’s sein muss und die Technik mal soweit sein sollte (SFP+ oder höher Eingänge an Endgeräten).

Was ich damit sagen will: Die blöden Kabel baust du EINMAL ein. Lass dir nicht einreden, dass man „das jetzt eh nicht braucht“ und was anderes doch „ausreicht“ weils nen Euro weniger pro Meter kostet. Diese Infrastruktur soll auch in 30 Jahren noch upgradefähig sein und neue Entwicklungen mitmachen können. Steigert dann auch mal (leicht) denn wiederverkaufwert des Hauses.

Schau mal wie jung du noch bist und wie viele Jahre du da drin wohnen willst. Dann schau mal, wie sich in dieser Zeitspanne rückblickend die Technik weiter entwickelt hat. Keiner kann dir ernsthaft glauben machen, dass sie wissen, was man in 10-20 Jahren alles schönes mit 10G und mehr Geschwindigkeiten im heimischen Netz alles anstellen kann.

Selbst wenn du jetzt Homey haben möchstest, lass dir Bus/KNX Kabel doch einfach mit reinlegen. Das ist ne saubere Installation. Spart auch langfristig Geld (strom), da nicht überall nen Mini Server mitlaufen muss (Shelly). Ich setze zwar konsequent auf Zigbee / Thread, aber nach Ausbau meines SmartHomes letztes Jahr zahlen wir deutlich mehr Strom. Ich werde etwas rückbauen und nicht jede einzelne Lampe mehr smart lassen, sondern nur die Schalter smart und dimmbar machen. Jedes smarte Gerät = ein paar Watt mehr.

Alles über Funk kannst du auch später nachrüsten. Ich würde beim Neubau zB NIE an Shellys denken. Schon gleich gar nicht die Varianten mit WLAN. Rollos und Ähnliches sollten nicht von einer WLAN Verbindung abhängen meiner Meinung nach. Wenn möglich nichtmal von Funk. Und wenn du sowas einbaust, nimm etwas, was noch zusätzlich direkt per Taster zu bedienen ist. Wenn irgend eine zentrale mal abraucht (und sind wir mal ehrlich, bei allen Smart Home Zentralen die hier genannt wurden geht das über ein fehlgeschlagenes/fehlerhaftes Update), bleiben die Rollos zu und ihr in einem Notfall drin oder so (das gilt allerdings auch für KNX, aber da baut man idR immer normale Taster ein, die dann nur per KNX geschaltet werden können).

Such dir doch mal jemanden, der Smarthome richtig kann. KNX (mimeine Empfehlung) oder Loxxone. Jedenfalls viel Spaß bei deinem Projekt.

Ich habe von Fibaro zu Homey gewechselt. Wegen der 100x besseren Flows und Integration von Cloud Diensten immer noch ein guter Schritt.
ABER: Die Z-Wave Integration von Homey ist fragwürdig. Ich habe keine Ahnung, wieso man bei Homey Geräte nur “in der Nähe” der Zentrale verbinden kann und dann erst am Installationsort verbauen muss!?!? Das war mit dem Firbaro HC3 nie ein Thema. Ausserdem reparieren sich Verbindungen im Z-Wave Netzwerk nicht wie erwartet. Daher ist meine Wetterstation immer noch unerreichbar für das Homey.

Der Preis von 15k ist massiv übertrieben, ausser der Typ kümmert sich über 3 Monate Vollzeit um alle deine Wünsche und programmiert komplizierte Dinge, die du nachher selbst nicht mehr warten kannst. Dann zahlst du beim nächsten Mal wieder zweitausend für jede Kleinigkeit. Meine Empfehlung deckt sich mit den vorherigen Kommentaren: Nicht tun.
Fibaro selbst ist trotzdem so einfach, dass ich alles selbst machen konnte. Mein Elektriker hat mir die Aktoren umsonst verbaut. Also hatte ich quasi nur die Gerätekosten von ca. 500 Euro.