Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/generate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,5 @@ jobs:
run: npm run validate-paths
- name: Validate cross-site links
run: npm run validate-links
- name: Validate all pages are in SUMMARY.md
run: npm run validate-orphan-pages
93 changes: 93 additions & 0 deletions codegen/validate-orphan-pages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { readdirSync, readFileSync } from 'node:fs'
import { join, relative } from 'node:path'

import { siteSections } from './lib/config.js'

// Matches markdown links in SUMMARY.md: [Title](path/to/file.md)
const summaryLinkPattern = /\[([^\]]*)\]\(([^)]+)\)/g

function walkDir(dir: string): string[] {
const files: string[] = []
for (const entry of readdirSync(dir, { withFileTypes: true })) {
const fullPath = join(dir, entry.name)
if (entry.isDirectory()) {
// Skip .gitbook directories (assets, includes, etc.)
if (entry.name === '.gitbook') continue
files.push(...walkDir(fullPath))
} else if (entry.name.endsWith('.md')) {
// Skip underscore-prefixed files (e.g., _report.md)
if (entry.name.startsWith('_')) continue
// Skip SUMMARY.md itself
if (entry.name === 'SUMMARY.md') continue
files.push(fullPath)
}
}
return files
}

interface OrphanPage {
section: string
path: string
}

const orphans: OrphanPage[] = []

for (const section of siteSections) {
const summaryPath = join(section.root, 'SUMMARY.md')
const contents = readFileSync(summaryPath, 'utf-8')

// Collect all file paths referenced in SUMMARY.md
const referencedPaths = new Set<string>()
for (const match of contents.matchAll(summaryLinkPattern)) {
const linkPath = match[2] ?? ''
if (linkPath.startsWith('http') || linkPath.startsWith('#')) continue
// Strip anchor fragments
const cleanPath = linkPath.split('#')[0] ?? ''
if (cleanPath !== '') {
referencedPaths.add(cleanPath)
}
}

// Walk all markdown files in this section
const allPages = walkDir(section.root)

for (const fullPath of allPages) {
const relPath = relative(section.root, fullPath)
if (!referencedPaths.has(relPath)) {
orphans.push({ section: section.name, path: relPath })
}
}
}

if (orphans.length > 0) {
// Group by section
const bySection = new Map<string, string[]>()
for (const { section, path } of orphans) {
const existing = bySection.get(section) ?? []
existing.push(path)
bySection.set(section, existing)
}

// eslint-disable-next-line no-console
console.error(
`Found ${orphans.length} page(s) not referenced in SUMMARY.md:\n`,
)
for (const [section, paths] of bySection) {
// eslint-disable-next-line no-console
console.error(` [${section}]`)
for (const p of paths) {
// eslint-disable-next-line no-console
console.error(` ${p}`)
}
// eslint-disable-next-line no-console
console.error('')
}
// eslint-disable-next-line no-console
console.error(
'Either add these pages to SUMMARY.md or move them to the trash/ folder.',
)
process.exit(1)
} else {
// eslint-disable-next-line no-console
console.log('All pages are referenced in SUMMARY.md.')
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ Seam Mobile Components are pre-built views that let you deliver end-user access

### Platform Guides

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>iOS Guide</strong><br>Integrate Seam Mobile Components into your iOS app</td><td><a href="../../.gitbook/assets/image (35).png">image (35).png</a></td><td><a href="seam-mobile-components-for-ios/">seam-mobile-components-for-ios</a></td></tr><tr><td><strong>Android Guide</strong><br>Integrate Seam Mobile Components into your Android app</td><td><a href="../../.gitbook/assets/android_logo.png">android_logo.png</a></td><td><a href="seam-mobile-components-for-android/">seam-mobile-components-for-android</a></td></tr></tbody></table>
<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>iOS Guide</strong><br>Integrate Seam Mobile Components into your iOS app</td><td><a href="../../.gitbook/assets/image (35).png">image (35).png</a></td><td><a href="seam-mobile-components-for-ios/">seam-mobile-components-for-ios</a></td></tr></tbody></table>
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"postgenerate": "npm run format",
"validate-paths": "tsx codegen/validate-paths.ts",
"validate-links": "tsx codegen/validate-links.ts",
"validate-orphan-pages": "tsx codegen/validate-orphan-pages.ts",
"typecheck": "tsc",
"lint": "eslint .",
"postlint": "prettier --check --ignore-path .prettierignore .",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,30 @@ description: Guide for using SmartThings hubs + smart locks with Seam

[SmartThings Hubs](https://www.samsung.com/fr/smartthings/) are connected to your local network using either Wi-Fi or Ethernet. You pair smart locks to SmartThings hubs using Zigbee or Z-Wave. Them, you can unlock and lock these smart locks remotely, and you can program access codes on them for keyless entry.

***
---

## Supported Devices

This integration supports the SmartThings hub and door locks paired with it.

For detailed information about the SmartThings hubs that Seam supports, see our [SmartThings Supported Devices page](https://www.seam.co/manufacturers/smartthings).

***
---

## Supported Features

We support the following features:

* [Triggering web lock and unlock actions](https://docs.seam.co/latest/capability-guides/smart-locks/lock-and-unlock) on paired smart locks that support this feature
* [Programming access codes](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) on paired smart locks that support this feature
- [Triggering web lock and unlock actions](https://docs.seam.co/latest/capability-guides/smart-locks/lock-and-unlock) on paired smart locks that support this feature
- [Programming access codes](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) on paired smart locks that support this feature

***
---

### Device Provider Key

To create a [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) that enables your users to connect their August devices to Seam, include the `smartthings` device provider key in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webviews](https://docs.seam.co/latest/core-concepts/connect-webviews/customizing-connect-webviews#customize-the-brands-to-display-in-your-connect-webviews).

***
---

## Setup Instructions

Expand All @@ -41,7 +41,7 @@ To control SmartThings-connected devices using Seam, you must prompt owners of t
2. Follow [these instructions](https://www.samsung.com/ca/support/mobile-devices/smartthings-how-to-set-up-your-hub/) to pair your devices to the SmartThings hub.
3. Note your login credentials for the SmartThings app, and use these credentials to log in to the [Seam Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) to add your devices to Seam.

***
---

## Brand-Specific Features

Expand All @@ -51,12 +51,12 @@ Note the following SmartThings-specific features:

For SmartThings-connected devices, you can report the set of supported access code lengths or the minimum and maximum supported code lengths. For details, see [Report Device Access Code Constraints](https://docs.seam.co/latest/api/access_codes/report_device_constraints).

***
---

## Where to Order

To order SmartThings hubs, see the Aeotec **Where to buy** page.

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td></td><td><strong>Aeotec Where to buy page</strong></td><td></td><td><a href="https://aeotec.com/where-to-buy/">https://aeotec.com/where-to-buy/</a></td><td><a href=".gitbook/assets/smartthings-logo.png">smartthings-logo.png</a></td></tr></tbody></table>

***
---
1 change: 0 additions & 1 deletion docs/guides/contact-us.md → trash/guides/contact-us.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,3 @@ We're here for you every step of the way!
:computer: [Contact Support](mailto:support@seam.co)

:wave: [Contact Sales](https://www.seam.co/contact-us)

Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,21 @@ For example, a battery-powered door lock with a pin-pad such as Yale Assure woul

Seam exposes each capability as a set of APIs. Furthermore, those APIs are standardized across brands for ease of integration.



![](<../.gitbook/assets/image (10).png>)

### Capabilities -> Actions, Properties, and Events

Each device capability decomposes into 3 sets of affordances:&#x20;

* **Actions** — things you can do to it.&#x20;
* **Properties** — the current state of the device.
* **Events** — reports from the device describing state transitions.&#x20;
- **Actions** — things you can do to it.&#x20;
- **Properties** — the current state of the device.
- **Events** — reports from the device describing state transitions.&#x20;

For example, the `lock` capability decomposes in the following manner:

* **Actions:** `UNLOCK` and `LOCK`
* **Properties:** a `locked` status to determine the lock's current status
* **Events:** a list of lock/unlock events logging all of the lock's transitions.
- **Actions:** `UNLOCK` and `LOCK`
- **Properties:** a `locked` status to determine the lock's current status
- **Events:** a list of lock/unlock events logging all of the lock's transitions.

### Standardizing Capabilities Across Device Brands

Expand All @@ -36,9 +34,4 @@ For example, some door locks with the `access_codes` capability require differen

In those instances, we attempt to handle these differences for you. For example, we will generate and set a pin code of the appropriate length. However, you may wish to set your own code. We let you do so, but it must meet the constraints set by the device.





\[1] This device interaction model leans heavily on the wonderful work done by the [W3C WoT](https://www.w3.org/TR/wot-architecture/#sec-interaction-model).

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: Guide for using Hubitat Elevation Hubs with Seam

This integration uses [Hubitat’s Maker API](https://docs2.hubitat.com/en/apps/maker-api) to make devices connected to a Hubitat Hub available for use with Seam.

***
---

## Supported Devices

Expand All @@ -16,73 +16,73 @@ For detailed information about the Hubitat-connected devices that Seam supports,

We support the following features:

* [Triggering web lock and unlock actions](../capability-guides/smart-locks/lock-and-unlock.md) for devices with this capability
* [Programming access codes](../capability-guides/smart-locks/access-codes/) on devices with this capability
- [Triggering web lock and unlock actions](../capability-guides/smart-locks/lock-and-unlock.md) for devices with this capability
- [Programming access codes](../capability-guides/smart-locks/access-codes/) on devices with this capability

***
---

### Device Provider Key

To create a [Connect Webview](../core-concepts/connect-webviews/) that enables you to connect your Hubitat Hub and devices to Seam, include the `hubitat` device provider key as the `selected_provider` or in the `accepted_providers` list. For more information, see [Customize the Brands to Display in Your Connect Webview](../core-concepts/connect-webviews/customizing-connect-webviews.md#customize-the-brands-to-display-in-your-connect-webviews).

***
---

## Setup Instructions

To control Hubitat Hub-connected devices using Seam, you must prompt owners of these devices to perform the following steps:

### 1. Access the Hubitat Hub Dashboard

* [Follow these instructions to get access to the Hubitat Hub's Dashboard.](https://docs2.hubitat.com/getting-started/registration-and-setup)
- [Follow these instructions to get access to the Hubitat Hub's Dashboard.](https://docs2.hubitat.com/getting-started/registration-and-setup)

### 2. Configure the "Type" of the Device

* From the Hubitat Hub dashboard, click on "Devices" in the left navigation.
* In the "Device Information" section, click on "Type", and select the correct device type of the device.
- From the Hubitat Hub dashboard, click on "Devices" in the left navigation.
- In the "Device Information" section, click on "Type", and select the correct device type of the device.

### 3. Turn on Hub Login Security (IMPORTANT)

This prevents other people on the same network as that of the hub from being able to log in to the dashboard and modify your settings.

* From the Hubitat Hub dashboard, click on "Settings" in the left navigation
* In the "Admin Settings" section, click on "Hub Login Security".
* Click on "Add User"
* Fill in the form with a username, email, and password, and make sure to save this information somewhere. You'll be using these credentials to log in to your dashboard in the future.
- From the Hubitat Hub dashboard, click on "Settings" in the left navigation
- In the "Admin Settings" section, click on "Hub Login Security".
- Click on "Add User"
- Fill in the form with a username, email, and password, and make sure to save this information somewhere. You'll be using these credentials to log in to your dashboard in the future.

### 4. Adding the Maker API App for Seam access
### 4. Adding the Maker API App for Seam access

* From the Hubitat Hub dashboard, click on "Apps" in the left navigation
* Click on "Add Built-In App" on the top right corner
* Click on the "Maker API" app to install it
* Under the "Security" section:
* Enable "Allow Access via Remote / Cloud"
* Disable "Allow Access via Local IP / Address"
* Under "Select Devices", check the checkboxes of all the devices you want to connect with Seam
* Under the "Cloud URLS:" section, copy the "Get Device Info" Cloud URL, and save it. You'll be using this URL to connect the hub to Seam.
- From the Hubitat Hub dashboard, click on "Apps" in the left navigation
- Click on "Add Built-In App" on the top right corner
- Click on the "Maker API" app to install it
- Under the "Security" section:
- Enable "Allow Access via Remote / Cloud"
- Disable "Allow Access via Local IP / Address"
- Under "Select Devices", check the checkboxes of all the devices you want to connect with Seam
- Under the "Cloud URLS:" section, copy the "Get Device Info" Cloud URL, and save it. You'll be using this URL to connect the hub to Seam.

### 5. Adding your account via Seam Connect Webview

Use the Cloud URL you collected in the previous step to connect your account.

<figure><img src="../.gitbook/assets/Screen Shot 2023-07-06 at 5.19.49 PM (2).png" alt="" width="338"><figcaption></figcaption></figure>

***
---

## Where to Order

You can purchase Hubitat Hubs from [their website](https://hubitat.com/products). They offer Zigbee and Z-Wave hubs that work in the following regions (with the associated Z-Wave frequencies):

* North America and United States (908.4 MHz)
* Europe (868.4 MHz)
* United Kingdom / Ireland (868.4 MHz)
* Australia, New Zealand (921.4/919.8 MHz)
* Korea/Thailand (920.9, 921.7, 923.1)
* Malaysia (919.8, 921.4)
* India (865.2)
* Israel (916)
* Japan (922.5, 923.9, 926.3)
* Russia (869.0)
* Hong Kong (919.8)
* China (868.4)
- North America and United States (908.4 MHz)
- Europe (868.4 MHz)
- United Kingdom / Ireland (868.4 MHz)
- Australia, New Zealand (921.4/919.8 MHz)
- Korea/Thailand (920.9, 921.7, 923.1)
- Malaysia (919.8, 921.4)
- India (865.2)
- Israel (916)
- Japan (922.5, 923.9, 926.3)
- Russia (869.0)
- Hong Kong (919.8)
- China (868.4)

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td></td><td><strong>Hubitat Hub Store</strong></td><td></td><td><a href="https://hubitat.com/products">https://hubitat.com/products</a></td><td><a href="../.gitbook/assets/61-5mM-Np1L._AC_SL1500_.jpg">61-5mM-Np1L._AC_SL1500_.jpg</a></td></tr></tbody></table>
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ Seam's official backup access code pool can be enabled by adding `use_backup_acc
```javascript
// Time of Creation
await seam.accessCodes.create({
name: "My Access Code",
code: "1234",
name: 'My Access Code',
code: '1234',
use_backup_access_code_pool: true,
})

// Time of Reservation
async function getGuestMessage() {
const access_code = await seam.accessCodes.get({ name: "My Access Code" })
const access_code = await seam.accessCodes.get({ name: 'My Access Code' })
if (access_code.errors.length === 0) {
return `Hello Guest! Your access code is: ${access_code.code}`
} else {
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,18 @@ Next, run the code below to check you are correctly authenticated:
// Replace with
// const Seam = require("seam")
// if not using ES6 modules and/or TypeScript.
import { Seam } from "seam";
import { Seam } from 'seam'

// Seam will automatically use the SEAM_API_KEY environment variable if you
// don't provide an apiKey to `new Seam()`
const seam = new Seam();
const seam = new Seam()

const checkAuth = async () => {
const { workspace } = await seam.workspaces.get();
console.log(workspace);
const { workspace } = await seam.workspaces.get()
console.log(workspace)
}

checkAuth();
checkAuth()

/*
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@ layout:

Use the search bar at the top of the page to search for any help article!

---


***

* [How often am I billed with Seam?](how-often-am-i-billed-with-seam.md)
* [Handling Recurring Access Codes](handling-recurring-access-codes.md)
* [what-is-an-action-attempt-when-is-it-used.md](what-is-an-action-attempt-when-is-it-used.md "mention")
- [How often am I billed with Seam?](how-often-am-i-billed-with-seam.md)
- [Handling Recurring Access Codes](handling-recurring-access-codes.md)
- [what-is-an-action-attempt-when-is-it-used.md](what-is-an-action-attempt-when-is-it-used.md 'mention')
Loading
Loading