From fb5bd012e013a5fd6dce5b546ac5bd39617cc42b Mon Sep 17 00:00:00 2001 From: symi-daguo <303316404@qq.com> Date: Sat, 3 Jan 2026 16:54:13 +0800 Subject: [PATCH] feat: add Home Assistant Matter Hub by symi-daguo --- Apps/home-assistant-matter-hub/.npmignore | 13 +++ .../addon.Dockerfile | 34 ++++++ .../addon.docker-entrypoint.sh | 11 ++ Apps/home-assistant-matter-hub/build.js | 42 +++++++ .../docker-compose.yml | 67 ++++++++++++ Apps/home-assistant-matter-hub/icon.png | Bin 0 -> 5148 bytes Apps/home-assistant-matter-hub/package.json | 103 ++++++++++++++++++ .../screenshot-1.png | Bin 0 -> 5148 bytes .../standalone.Dockerfile | 18 +++ .../test/package.test.ts | 26 +++++ Apps/home-assistant-matter-hub/tsconfig.json | 17 +++ 11 files changed, 331 insertions(+) create mode 100644 Apps/home-assistant-matter-hub/.npmignore create mode 100644 Apps/home-assistant-matter-hub/addon.Dockerfile create mode 100644 Apps/home-assistant-matter-hub/addon.docker-entrypoint.sh create mode 100644 Apps/home-assistant-matter-hub/build.js create mode 100644 Apps/home-assistant-matter-hub/docker-compose.yml create mode 100644 Apps/home-assistant-matter-hub/icon.png create mode 100644 Apps/home-assistant-matter-hub/package.json create mode 100644 Apps/home-assistant-matter-hub/screenshot-1.png create mode 100644 Apps/home-assistant-matter-hub/standalone.Dockerfile create mode 100644 Apps/home-assistant-matter-hub/test/package.test.ts create mode 100644 Apps/home-assistant-matter-hub/tsconfig.json diff --git a/Apps/home-assistant-matter-hub/.npmignore b/Apps/home-assistant-matter-hub/.npmignore new file mode 100644 index 000000000..e48b42bc5 --- /dev/null +++ b/Apps/home-assistant-matter-hub/.npmignore @@ -0,0 +1,13 @@ +# Exclude everything +test/ +*.docker-entrypoint.sh +*.Dockerfile +build.js +tsconfig.json +package.tgz + +# EXPLICITLY INCLUDE +!dist/ +!package.json +!README.md +!LICENSE diff --git a/Apps/home-assistant-matter-hub/addon.Dockerfile b/Apps/home-assistant-matter-hub/addon.Dockerfile new file mode 100644 index 000000000..eb9d5cbe7 --- /dev/null +++ b/Apps/home-assistant-matter-hub/addon.Dockerfile @@ -0,0 +1,34 @@ +ARG NODE_VERSION="22" + +FROM node:${NODE_VERSION}-alpine AS nodebuild + +FROM ghcr.io/hassio-addons/base:18.2.1 + +# Install Node.js +RUN apk add --no-cache libstdc++ bash +COPY --from=nodebuild /usr/local/bin/node /usr/local/bin/ +COPY --from=nodebuild /usr/local/lib/node_modules /usr/local/lib/node_modules +RUN \ + ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \ + ln -s ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx && \ + ln -s ../lib/node_modules/corepack/dist/corepack.js /usr/local/bin/corepack +RUN corepack enable + +ENV SUPERVISOR_TOKEN="" +VOLUME /config + +COPY addon.docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +ARG PACKAGE_VERSION="unknown" +LABEL \ + io.hass.version="$PACKAGE_VERSION" \ + io.hass.type="addon" \ + io.hass.arch="armhf|aarch64|i386|amd64" + +RUN mkdir /install +COPY package.tgz /install/package.tgz +RUN npm install -g /install/package.tgz +RUN rm -rf /install + +CMD /docker-entrypoint.sh diff --git a/Apps/home-assistant-matter-hub/addon.docker-entrypoint.sh b/Apps/home-assistant-matter-hub/addon.docker-entrypoint.sh new file mode 100644 index 000000000..1dff5c391 --- /dev/null +++ b/Apps/home-assistant-matter-hub/addon.docker-entrypoint.sh @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bashio + +exec home-assistant-matter-hub start \ + --log-level=$(bashio::config 'app_log_level') \ + --disable-log-colors=$(bashio::config 'disable_log_colors') \ + --mdns-network-interface="$(bashio::config 'mdns_network_interface')" \ + --storage-location=/config/data \ + --web-port=$(bashio::addon.ingress_port) \ + --home-assistant-url='http://supervisor/core' \ + --home-assistant-access-token="$SUPERVISOR_TOKEN" \ + --http-ip-whitelist="172.30.32.2" diff --git a/Apps/home-assistant-matter-hub/build.js b/Apps/home-assistant-matter-hub/build.js new file mode 100644 index 000000000..351a8f556 --- /dev/null +++ b/Apps/home-assistant-matter-hub/build.js @@ -0,0 +1,42 @@ +import * as fs from "node:fs"; +import * as path from "node:path"; +import { fileURLToPath } from "node:url"; +import { rimraf } from "rimraf"; + +const projectRoot = path.join(import.meta.dirname, "../.."); + +const frontend = packageDir("@home-assistant-matter-hub/frontend", "dist"); +const backend = packageDir("@home-assistant-matter-hub/backend", "dist"); + +const dist = path.resolve(import.meta.dirname, "dist"); +await rimraf(dist); + +fs.cpSync(frontend, path.join(dist, "frontend"), { + recursive: true, +}); +fs.cpSync(backend, path.join(dist, "backend"), { + recursive: true, +}); + +fs.cpSync( + path.join(projectRoot, "README.md"), + path.join(import.meta.dirname, "README.md"), +); +fs.cpSync( + path.join(projectRoot, "LICENSE"), + path.join(import.meta.dirname, "LICENSE"), +); + +/** + * Resolve a directory in a package + * @param {string} packageName The path of the package json + * @param {string} directory The dist dir in the package + * @returns {string} + */ +function packageDir(packageName, directory) { + const packageJsonPath = fileURLToPath( + import.meta.resolve(path.join(packageName, "package.json")), + ); + const packagePath = path.dirname(packageJsonPath); + return path.join(packagePath, directory); +} diff --git a/Apps/home-assistant-matter-hub/docker-compose.yml b/Apps/home-assistant-matter-hub/docker-compose.yml new file mode 100644 index 000000000..ee4d195ba --- /dev/null +++ b/Apps/home-assistant-matter-hub/docker-compose.yml @@ -0,0 +1,67 @@ +name: home-assistant-matter-hub +services: + home-assistant-matter-hub: + image: panwang/home-assistant-matter-hub:latest + container_name: home-assistant-matter-hub + restart: unless-stopped + network_mode: host + volumes: + - /DATA/AppData/$AppID/data:/data + environment: + - HAMH_HOME_ASSISTANT_URL=${HAMH_HOME_ASSISTANT_URL} + - HAMH_HOME_ASSISTANT_ACCESS_TOKEN=${HAMH_HOME_ASSISTANT_ACCESS_TOKEN} + - HAMH_STORAGE_LOCATION=/data + - TZ=${TZ} + - PUID=${PUID} + - PGID=${PGID} + x-casaos: + envs: + - container: HAMH_HOME_ASSISTANT_URL + default: "http://localhost:8123" + description: + en_US: "Home Assistant URL (Must start with http:// or https://)" + zh_CN: "Home Assistant 访问地址 (必须以 http:// 或 https:// 开头)" + - container: HAMH_HOME_ASSISTANT_ACCESS_TOKEN + description: + en_US: "Long-lived Access Token (Required! Generate in HA Profile)" + zh_CN: "HA 长期访问令牌 (必填!在 HA 个人资料页底部生成)" + ports: + - container: "8482" + host: "8482" + description: + en_US: Web UI Port + zh_CN: 网页管理界面端口 + - container: "5540" + description: + en_US: Matter Communication Port + zh_CN: Matter 通信端口 + volumes: + - container: /data + description: + en_US: Data directory + zh_CN: 数据持久化目录 + +x-casaos: + architectures: + - amd64 + - arm + - arm64 + main: home-assistant-matter-hub + scheme: http + port_map: "8482" + index: / + author: symi-daguo + category: Home Automation + developer: t0bst4r + description: + en_US: "Simulate Matter bridges to publish your entities from Home Assistant to any Matter-compatible controller like Alexa, Apple Home, or Google Home. Completely local communication, no port forwarding required." + zh_CN: "模拟 Matter 桥接器,将 Home Assistant 中的实体发布到任何兼容 Matter 的控制器(如 Alexa、Apple Home 或 Google Home)。完全本地化通信,无需配置端口转发。" + tagline: + en_US: "Bridge Home Assistant entities to Matter (HomeKit/Alexa/Google)" + zh_CN: "将 Home Assistant 实体桥接到 Matter (HomeKit/Alexa/Google)" + title: + en_US: "HA Matter Hub" + zh_CN: "HA Matter 枢纽" + icon: https://raw.githubusercontent.com/symi-daguo/home-assistant-matter-hub/main/Apps/home-assistant-matter-hub/icon.png + screenshot_link: + - https://raw.githubusercontent.com/symi-daguo/home-assistant-matter-hub/main/Apps/home-assistant-matter-hub/screenshot-1.png diff --git a/Apps/home-assistant-matter-hub/icon.png b/Apps/home-assistant-matter-hub/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4745447cf1dada286b6f1056e4e30ec83e270e GIT binary patch literal 5148 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 KMNUMnLSTZQ!{ { + it("should include all necessary dependencies", () => { + const expected = pickBy( + { ...backend.dependencies, ...common.dependencies }, + (_, key) => !key.startsWith("@home-assistant-matter-hub/"), + ); + expect(own.dependencies).toEqual(expected); + }); + + it("should pin all dependencies", () => { + const expected = mapValues(own.dependencies, (value) => + value.replace(/^\D+/, ""), + ); + expect(own.dependencies).toEqual(expected); + }); +}); diff --git a/Apps/home-assistant-matter-hub/tsconfig.json b/Apps/home-assistant-matter-hub/tsconfig.json new file mode 100644 index 000000000..7066fc543 --- /dev/null +++ b/Apps/home-assistant-matter-hub/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + // Compiler + "target": "ES2020", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": true, + + // Lint + "resolveJsonModule": true, + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + }, + "include": ["./test/"] +}