2026年7月21日 星期二

在Misskey使用Garage物件儲存服務

Garage是一個相容Amazon S3通訊協定的物件儲存服務。

文件撰寫時的軟體版本:Misskey 2026.6.0,Garage v2.3.0。

下面會說明如何在Misskey連接自行架設的Garage物件儲存服務。假設Misskey與Garage都已經架設好在運作中的狀態。

設置儲存空間(bucket) 

以下是參考官網針對Mastodon的設置說明,大多都通用。

建立存取用的金鑰,記得抄下Key ID與Secret Key。

garage key create misskey-key

建立一個空的bucket 

garage bucket create misskey-data

設置金鑰有讀寫misskey-data的權限

garage bucket allow misskey-data --read --write --key misskey-key

misskey-key是金鑰的名稱,misskey-data是bucket的名稱,都可以更改為自己喜歡的。

 

我們需要讓bucket可以被外部存取,這個作法叫做Exposing buckets as websites

針對bucket設定DNS名稱,此名稱需要在DNS新增一筆紀錄。請把my-social-media.mydomain.tld改成真正要使用的名稱。

garage bucket alias misskey-data my-social-media.mydomain.tld

讓bucket可以被公開存取。 

garage bucket website --allow misskey-data

搬遷已存在的資料

跟Mastodon不同,Misskey在設置物件儲存後不會自動更改已存在檔案的URL,如果要搬遷已存在的資料到Garage,除了移動實體檔案之外,還需要更改資料庫內容,因此在這裡不會解說這個作法。

設置Misskey

使用管理員帳號打開Misskey管理控制台/設定/物件儲存。 

Base URL:https://my-social-media.mydomain.tld

記得之前設定的DNS名稱嘛,Base URL會需要用到。 

儲存空間(bucket):  misskey-data

前綴(prefix)可填可不填,如果要填建議是 files ,跟本地儲存的路徑一致。

端點(endpoint):192.168.x.x:3900

是Garage的endpoint,可填寫內部IP或者外部URL,要連接到Garage的3900 port。

區域(Region):garage

區域設置參考Mastodon的設置範例。

 Access key:Garage Key ID

Secret key :上面Key ID對應的Secret Key

 

下面開關選項按照實際情況設置,唯一必須開啟的是 s3ForcePathStyle 這個選項。

 

設置完成後,可以上傳檔案測試看看,是否可以正確看到檔案,以及網址是否有改變。 

2026年5月5日 星期二

RTX 3060 12GB的LLM性能測試

Rentry的易讀版本: https://rentry.org/uwq752e3

LLM性能測試

硬體

CPU: Intel i5-12500
RAM: 64GB DDR4-3200 (雙通道)
GPU: NVIDIA RTX 3060 12GB
OS: Unraid 7.5

測試軟體:llama-benchy 0.3.7
指令
llama-benchy --base-url <api url> --model zerofata/G4-MeroMero-26B-A4B --depth 0 4096 8192 16384 --tg 128 --latency-mode generation --enable-prefix-caching
測試模型:G4-MeroMero-26B-A4B Q5_K_M量化版本(Gamma 4 26B A4B的微調版本)

測試標的

llamacpp b9014 cuda12 backend(官方提供的docker映像)

啟動參數
llama-server -m /models/model.gguf --port 8000 --host 0.0.0.0 -fit on -c 32768 --chat-template-file /models/g4-chat_template.jinja

測試結果

model test t/s peak t/s ttfr (ms) est_ppt (ms) e2e_ttft (ms)
zerofata/G4-MeroMero-26B-A4B pp2048 512.92 ± 26.80
4105.91 ± 202.11 4005.34 ± 202.11 4105.91 ± 202.11
zerofata/G4-MeroMero-26B-A4B tg128 31.04 ± 0.27 32.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d4096 468.40 ± 29.34
8880.41 ± 526.80 8779.84 ± 526.80 8880.41 ± 526.80
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d4096 29.73 ± 0.10 31.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d4096 466.13 ± 21.00
4503.40 ± 204.89 4402.83 ± 204.89 4503.40 ± 204.89
zerofata/G4-MeroMero-26B-A4B tg128 @ d4096 29.50 ± 0.04 30.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d8192 461.37 ± 16.77
17882.10 ± 663.02 17781.53 ± 663.02 17882.10 ± 663.02
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d8192 29.79 ± 0.04 31.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d8192 451.60 ± 13.77
4639.80 ± 140.88 4539.23 ± 140.88 4639.80 ± 140.88
zerofata/G4-MeroMero-26B-A4B tg128 @ d8192 28.83 ± 0.66 30.67 ± 0.47


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d16384 473.32 ± 15.88
34756.61 ± 1166.07 34656.04 ± 1166.07 34756.61 ± 1166.07
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d16384 28.18 ± 0.48 30.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d16384 453.97 ± 5.18
4612.45 ± 51.82 4511.88 ± 51.82 4612.45 ± 51.82
zerofata/G4-MeroMero-26B-A4B tg128 @ d16384 29.21 ± 0.11 30.00 ± 0.00


測試結果分析(Gemini

這份針對 32k 上下文長度(Context Size) 的測試結果,展現了 Gemma 4 26B A4BRTX 3060 12GB 顯卡上極為驚人的長文本處理韌性。以下將數據整理為效能分析段落:

核心生成效能與穩定性

在將上下文長度擴展至 32,768 的環境下,模型展現了極強的生成速度(Token Generation)穩定性。從初始狀態的 31.04 t/s 到處理至 16k 深度時的 28.18 t/s,效能衰減率僅約 9.2%。這意味著即便在長篇對話或處理複雜劇本時,使用者幾乎感受不到「蹦字」速度的變化。這種在 26B 等級模型中罕見的高穩定性,側面證實了該模型架構(如 GQA 分組查詢注意力機制)與 llama.cpp 記憶體管理的高度優化,能將活躍參數與 KV Cache 完美控制在 12GB 的 VRAM 極限內。

提示詞處理與延遲趨勢

在處理輸入(Prompt Processing)方面,吞吐量穩定維持在 450 ~ 510 t/s 之間,展現了極佳的預處理效率。首字響應時間(TTFT)則隨著文本長度呈精確的線性增長:處理 4k 文本約需 8.8 秒,8k 需 17.8 秒,當長度達到 16k 時則需約 34.7 秒。雖然等待時間隨長度增加,但並沒有出現因顯存溢出或系統記憶體交換(Swap)導致的效能崩潰(Cliff edge),這對於需要頻繁貼入長文進行摘要或代碼分析的使用者來說,提供了非常可預測且穩定的使用體驗。

綜合效能評價

總結來看,這套配置在 16k context 範圍內達到了「效能與容量」的甜蜜平衡點。雖然系統設定上限為 32k,但在 16k 深度下依然能維持超過 28 t/s 的生成速度,完全能勝任中長篇文件閱讀、深度角色扮演(Roleplay)以及長代碼庫的維護任務。對於 RTX 3060 12GB 的使用者而言,這份數據證明了該硬體在適當的量化方案下,依然擁有越級挑戰大型長文本模型的實力。


2026年5月4日 星期一

本地跑LLM的算力需求

Prefill(預填充階段):運算性能。處理使用者輸入的提示詞,運算速度卡在GPU的性能。影響首字輸出時間(Time to First Token, TTFT),如果處理的的上下文很大,就需要花很長的時間才會開始輸出結果。比如說我的Radeon 780m能夠處理400t/s,處理32k的上下文大約得花80秒。

Decode(解碼階段):記憶體頻寬。逐一生成 Token 的過程,卡在GPU與VRAM之間的頻寬。每生成一個新 Token,模型都必須把所有的模型參數從顯示記憶體重新讀取到運算單元中一次,只為了計算「那一個」Token。以Radeon 780m為例,搭配雙通道DDR5-5600 SODIMM理論上有89.6GB/s的頻寬,跑Gemma 4 26B A4B Q5_K_M,因為量化加上只有啟動3.8B的參數,每次從記憶體讀取的量約為2.6GB。這樣可以估算生成速度約在34t/s,但實際上會有額外耗損,根據我的實測是在20~14t/s左右。不算快,但高於一般人的閱讀速度。我有試過跑Gemma 4 31B IQ4_XS的量化稠密模型,生成速度大約是2t/s,太慢了。

結論
如果要處理的文本很大,優先考慮GPU運算性能。
如果輸出的內容很大,優先考慮記憶體頻寬。

若是兩者都需要,RTX 6000 Blackwell 96GB在旁邊招手呢,一張約新台幣30萬左右,比買三張RTX 5090貴,但是配置較簡單。

2026年5月2日 星期六

Ryzen 8845HS w/ Radeon 780M的LLM性能測試

 Rentry的易讀表格版本:https://rentry.co/5utrg5cy

LLM性能測試

硬體

GMKTek K8 Plus
CPU: AMD Ryzen 8845HS
RAM: 64GB DDR5-5600 SODIMM(雙通道)
GPU: Radeon 780m 8GB(透過BIOS設置VRAM大小)
OS: Ubuntu 24.04

系統配置調整:

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="amdgpu.gttsize=49152 ttm.pages_limit=12582912"
主要是讓單一程序可以使用最多48GB的記憶體。

測試軟體:llama-benchy 0.3.7
指令
llama-benchy --base-url <api url> --model zerofata/G4-MeroMero-26B-A4B --depth 0 4096 8192 16384 32768 --tg 128 --latency-mode generation --enable-prefix-caching
測試模型:G4-MeroMero-26B-A4B Q5_K_M量化版本(Gamma 4 26B A4B的微調版本)

測試標的

koboldcpp-1.112.2

啟動指令
./koboldcpp-linux-x64-nocuda --model ./G4-MeroMero-26B-A4B-Q5_K_M.gguf --host 0.0.0.0 --threads 7 --usevulkan 0 --blasbatchsize 2048 --gpulayers 49 --contextsize 32768 --flashattention --skiplauncher --jinja --mmproj ./mmproj-Gemma-4-26b-a4b-f16.gguf --mlock --usemmap --jinjatemplate ./chat_template.jinja

model test t/s peak t/s ttfr (ms) est_ppt (ms) e2e_ttft (ms)
zerofata/G4-MeroMero-26B-A4B pp2048 419.95 ± 2.39
5288.49 ± 27.66 4879.28 ± 27.66 5288.49 ± 27.66
zerofata/G4-MeroMero-26B-A4B tg128 18.41 ± 0.04 20.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d4096 384.90 ± 3.16
11054.21 ± 87.02 10644.99 ± 87.02 11054.21 ± 87.02
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d4096 17.54 ± 0.05 19.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d4096 350.57 ± 2.01
6251.27 ± 33.44 5842.05 ± 33.44 6251.27 ± 33.44
zerofata/G4-MeroMero-26B-A4B tg128 @ d4096 17.30 ± 0.02 19.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d8192 357.27 ± 1.90
23341.93 ± 122.05 22932.71 ± 122.05 23341.93 ± 122.05
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d8192 16.97 ± 0.02 18.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d8192 313.21 ± 0.19
6947.91 ± 3.87 6538.69 ± 3.87 6947.91 ± 3.87
zerofata/G4-MeroMero-26B-A4B tg128 @ d8192 16.75 ± 0.02 18.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d16384 311.77 ± 1.46
52964.47 ± 245.13 52555.26 ± 245.13 52964.47 ± 245.13
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d16384 16.19 ± 0.08 17.33 ± 0.47


zerofata/G4-MeroMero-26B-A4B pp2048 @ d16384 254.26 ± 0.49
8464.01 ± 15.68 8054.79 ± 15.68 8464.01 ± 15.68
zerofata/G4-MeroMero-26B-A4B tg128 @ d16384 15.94 ± 0.02 17.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d32768 261.11 ± 1.65
125417.69 ± 791.20 125008.48 ± 791.20 125417.69 ± 791.20
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d32768 14.70 ± 0.02 16.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d32768 142.70 ± 1.09
14761.37 ± 109.20 14352.15 ± 109.20 14761.37 ± 109.20
zerofata/G4-MeroMero-26B-A4B tg128 @ d32768 14.77 ± 0.02 16.00 ± 0.00


llamacpp-rocm b1256

啟動指令
./llamacpp-rocm/llama-server -m ./G4-MeroMero-26B-A4B-Q5_K_M.gguf -ngl 99 -c 32768 --temp 1 --top-k 64 --top-p 0.95 --host 0.0.0.0 -mm ./mmproj-Gemma-4-26b-a4b-f16.gguf --chat-template-file ./chat_template.jinja
在16k的測試出現異常,可能是模型崩潰與重複輸出造成。

model test t/s peak t/s ttfr (ms) est_ppt (ms) e2e_ttft (ms)
zerofata/G4-MeroMero-26B-A4B pp2048 335.70 ± 14.45
6233.64 ± 258.34 6115.70 ± 258.34 6233.64 ± 258.34
zerofata/G4-MeroMero-26B-A4B tg128 15.42 ± 0.01 16.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d4096 290.31 ± 12.24
14253.80 ± 580.96 14135.86 ± 580.96 14253.80 ± 580.96
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d4096 14.07 ± 0.01 15.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d4096 238.90 ± 2.19
8691.36 ± 78.59 8573.42 ± 78.59 8691.36 ± 78.59
zerofata/G4-MeroMero-26B-A4B tg128 @ d4096 13.79 ± 0.01 14.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d8192 260.37 ± 3.20
31589.77 ± 383.96 31471.83 ± 383.96 31589.77 ± 383.96
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d8192 13.67 ± 0.01 14.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d8192 218.36 ± 0.69
9497.17 ± 29.59 9379.23 ± 29.59 9497.17 ± 29.59
zerofata/G4-MeroMero-26B-A4B tg128 @ d8192 13.55 ± 0.00 14.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d16384 241.87 ± 3.54
67874.56 ± 1000.78 67756.62 ± 1000.78 67874.56 ± 1000.78
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d16384 66.75 ± 0.02 70.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d16384 204.84 ± 2.69
10117.85 ± 130.36 9999.91 ± 130.36 10117.85 ± 130.36
zerofata/G4-MeroMero-26B-A4B tg128 @ d16384 66.23 ± 0.04 69.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d32768 191.92 ± 10.78
171424.55 ± 10017.11 171306.61 ± 10017.11 171424.55 ± 10017.11
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d32768 12.37 ± 0.07 13.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d32768 142.47 ± 3.70
14502.40 ± 380.91 14384.46 ± 380.91 14502.40 ± 380.91
zerofata/G4-MeroMero-26B-A4B tg128 @ d32768 12.34 ± 0.00 13.00 ± 0.00


llamacpp b8999 (vulkan backend)

啟動指令
./llama-b8999/llama-server -m ./G4-MeroMero-26B-A4B-Q5_K_M.gguf -ngl 99 -c 49152 --temp 1 --top-k 64 --top-p 0.95 --host 0.0.0.0 -mm ./mmproj-Gemma-4-26b-a4b-f16.gguf --chat-template-file ./chat_template.jinja
在32k的測試出現異常,可能是模型崩潰與重複輸出造成。

model test t/s peak t/s ttfr (ms) est_ppt (ms) e2e_ttft (ms)
zerofata/G4-MeroMero-26B-A4B pp2048 315.62 ± 12.25
6633.52 ± 244.36 6502.53 ± 244.36 6633.52 ± 244.36
zerofata/G4-MeroMero-26B-A4B tg128 20.70 ± 0.02 21.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d4096 291.80 ± 10.49
14189.23 ± 493.34 14058.24 ± 493.34 14189.23 ± 493.34
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d4096 19.54 ± 0.00 20.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d4096 275.22 ± 1.81
7572.64 ± 49.08 7441.65 ± 49.08 7572.64 ± 49.08
zerofata/G4-MeroMero-26B-A4B tg128 @ d4096 19.53 ± 0.01 20.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d8192 286.29 ± 1.35
28747.85 ± 134.81 28616.86 ± 134.81 28747.85 ± 134.81
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d8192 19.68 ± 0.03 20.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d8192 252.09 ± 0.21
8254.93 ± 6.84 8123.94 ± 6.84 8254.93 ± 6.84
zerofata/G4-MeroMero-26B-A4B tg128 @ d8192 18.64 ± 0.03 19.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d16384 269.11 ± 1.28
61018.78 ± 289.55 60887.79 ± 289.55 61018.78 ± 289.55
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d16384 18.08 ± 0.00 19.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B pp2048 @ d16384 217.98 ± 1.58
9526.90 ± 67.69 9395.91 ± 67.69 9526.90 ± 67.69
zerofata/G4-MeroMero-26B-A4B tg128 @ d16384 18.01 ± 0.02 19.00 ± 0.00


zerofata/G4-MeroMero-26B-A4B ctx_pp @ d32768 231.32 ± 0.68
141795.99 ± 417.40 141665.00 ± 417.40 141795.99 ± 417.40
zerofata/G4-MeroMero-26B-A4B ctx_tg @ d32768 31.67 ± 20.37 41.67 ± 33.47


zerofata/G4-MeroMero-26B-A4B pp2048 @ d32768 168.40 ± 1.35
12292.98 ± 97.49 12161.99 ± 97.49 12313.51 ± 124.96
zerofata/G4-MeroMero-26B-A4B tg128 @ d32768 16.47 ± 0.01 17.00 ± 0.00


綜合測試結論(使用Gemini做的分析

1. 硬體潛力與系統優化

  • 記憶體配置與優化: 透過調整 Linux 核心參數(GRUB)將 amdgpu.gttsize 設為 48GB,是成功在此類 iGPU 設備上順暢執行 26B 大模型量化版的關鍵。64GB 的實體記憶體為 780M 提供了充足的空間來處理大型模型文件及高達 32K 的 Context 需求。
  • 推論效能: 整體而言,在 8845HS 的平台上,26B Q5 模型能達到約 15~20 t/s 的生成速度,對於單人使用情境已具備極高的實用性,接近一般人的閱讀速度。

2. 後端軟體性能對比 (Backend Comparison)

測試項目 Koboldcpp-1.112.2 Llamacpp (Vulkan) Llamacpp-rocm
提示處理 (Prompt Processing) 最快 (~420 t/s) 中等 (~315 t/s) 較慢 (~335 t/s)
權杖生成 (Token Gen) 穩定 (~18.4 t/s) 最高 (~20.7 t/s) 較慢 (~15.4 t/s)
長文本穩定性 (Stability) 極高,隨 Context 增加性能衰減平緩。 高 Context (32k) 時出現數據異常。 中 Context (16k) 時出現異常。
  • Koboldcpp: 在本次測試中表現最為均衡且可靠。其 Prompt Processing 速度大幅領先,且在高 Context (32768) 下依然維持穩定的生成速度(14.7 t/s),沒有出現模型崩潰或邏輯異常,是長文本應用的首選。
  • Llamacpp (Vulkan): 提供了最高的初始生成速度(超過 20 t/s),但在 Context 達到 32k 時出現數據劇烈波動與異常(Variance 較大),顯示在極端上下文負荷下驅動或後端尚不夠穩定。
  • Llamacpp-rocm: 在此硬體配置下表現差強人意,不僅生成速度最低,且在 16k Context 時便提早出現模型異常,推測 ROCm 在此 APU 上的優化或記憶體管理仍有改進空間。

3. 測試異常觀察

  • llamacpp-rocm (16k) 與 vulkan (32k) 的測試中,出現了速度異常(如跳升至 66 t/s)或誤差值過大的現象,這通常與模型崩潰、重複輸出 (Repetition)K-V Cache 溢位有關。這指出在 iGPU 環境下進行超長文本推論時,後端軟體的穩定性 (Robustness) 比純粹的峰值速度更為重要。

總結建議

對於使用 AMD Ryzen 8000 系列 APU 的用戶,若要執行 26B 規模 的模型:

  1. 推薦後端: 優先選用 Koboldcpp,其在長文本處理的穩定度與 Prompt 處理速度上具有明顯優勢。
  2. 效能追求: 若僅進行短文本對話,可嘗試 Llamacpp (Vulkan) 以獲取最高生成速度。
  3. 環境設定: 務必修改系統核心參數以釋放顯存限制,否則無法充分發揮 64GB 記憶體的硬體優勢。

2025年2月21日 星期五

在Ryzen 7 8845HS w/ Radeon 780M用ComfyUI生圖(Linux)

試了很久才發現成功的方程式…這是因為每次安裝ROCm都需要下載安裝超過30GB的檔案!!!

 

tl;dr 直接說結論

OS: Ubuntu 22.04(因為ROCm 6.1只支援此以下的版本)

ROCm:  <= 6.1.2,6.2跟6.3都沒辦法正常運行

PyTorch: <= 2.4.1,2.5.1版會顯示不支援硬體的警告,圖片有時候無法正確產生。

UserWarning: Attempting to use hipBLASLt on an unsupported architecture! Overriding blas backend to hipblas 

2.6以上則完全無法正常運行。使用PyTorch官網的版本而不是AMD提供的。

https://pytorch.org/get-started/previous-versions/

ComfyUI: 當前版本v0.3.14可正常運行。 

 

Update 2024/2/25

使用 Radeon 780M 產生圖片的時候經常會出現全黑的圖,並且出現以下警告

RuntimeWarning: invalid value encountered in cast
  img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
原本以為是 780M 沒有被 ROCm 支援的問題,但 ComfyUI 在去年的確發生過這樣的 bug,且不限硬體。我從下面的連結得到解法
https://github.com/comfyanonymous/ComfyUI/issues/3500

解法就是:換 scheduler,預設是 normal ,換成 karras 似乎就沒有再出現這樣的問題。


2024年12月20日 星期五

我的Home Assistant配置

Home Assistant 是用於家庭自動化的免費開源軟體。它作為整合平台和智慧家庭中心,允許用戶控制智慧家居設備。該軟體強調本地控制和隱私,設計獨立於任何特定的物聯網生態系統。 - 維基百科

我會使用Home Assistant (簡稱HA)應該是在我買了Sonoff S30智慧插座與Basic R2智慧開關,但我不想使用製造商的平台或App,研究了一下決定在S30刷入ESPHome,Basic R2刷入Tasmota,然後接上HA來控制。而S30還有電流計的功能,可以整合到HA做能源消耗的監測。Home Assistant是裝在Raspberry Pi 4 (4GB RAM,簡稱RPi4)。



之後我想監控每個房間的溫濕度,上網搜尋可用的方案,最多人建議是小米的米家藍牙溫濕度計 2因為這個小裝置非常便宜,並刷入ATC的韌體來改善耗電與連接性。但問題來了,溫濕度計的放置位置離RPi4很遠,肯定收不到訊號。而改善的作法是購買幾個便宜的ESP32-C3-MINI-1刷入ESPHome的Bluetooth Proxy配置。之前提到使用ATC的韌體是要讓溫濕度計定期用藍芽低功耗技術來廣播資料,而這些Bluetooth Proxy則作為中繼,傳送資料回HA,這樣的設計會比主動連接的耗電量少,資料取得比較快且穩定。

後來我買了兩個Reolink的網路攝影機,作為車庫與門口的監控。但跟前面一樣,我不想使用製造商提供的平台或軟體,會選擇這個廠牌是因為它提供區域網路連接功能,網路上最多人推薦使用FRIGATE,這個開源軟體可以與HA深度整合,方便檢視與管理各種事件與錄影,並且支援物件識別的功能,雖然可以使用CPU來做識別但極度推薦專用的AI加速器:Coral USB Accelerator,可以快速識別影像中的物件。當然它提供物件識別的模型並不完美,你可以支付一次性的費用,上傳需要辨識或修正的影像來做訓練,一年內可以訓練12次。就我的經驗只訓練兩次就已經沒碰到識別錯誤的問題。自動化的部份則是使用HA論壇上網友提供的藍圖,在影像偵測到有人時發送通知到HA的手機APP。

因為我家是透天有鐵捲門,我就在想要怎麼把開關鐵捲門的功能整合到HA,但是我不想去修改鐵捲門控制器,因為風險太高。最後我想到的作法是拿一個外殼破損但功能完好的鐵捲門遙控器來改裝,上網研究發現只需要一片Lolin d1 mini、一個12V轉3.3V的降壓模組、然後加上幾個電晶體與電阻做成開關電路,就可以接上遙控器來控制。

幾個月前買了SwitchBot的套件組(主控機器人2、開關機器人、門窗感測器),主控機器人2的功能需要透過雲端連接,但是開關機器人與門窗感測器則可以使用藍芽連接,前面提到的Bluetooth Proxy又可以派上用場。門窗感測器裝在大門,可以很方便知道大門是不是沒關好,有沒有人經過,這也是透過HA來發送通知。而開關機器人則是裝在車庫的電燈開關,透過HA可以設計為打開鐵捲門同時開燈。

最近買了Shelly EM想要強化能源消耗的監控,但是打開配線箱後發現這遠超過我的能力,可能要找水電技師來協助安裝。

總而言之,家庭自動化是一條不歸路,花的錢會越來越多。

2024年12月19日 星期四

我的家用網路配置

 紀錄一下我的家用網路配置給有興趣的人參考。

 

  • 路由器:NanoPi R5S (4GB RAM/32GB Flash)
    作業系統是使用OpenWRT,但目前還沒有正式發布的版本,因此使用Anael Orlinski發布的版本。除此之外,還有硬體製造商FriendlyARM自行發布的FriendlyWRT可以使用(但不建議)。

    選擇使用NanoPi R5S是因為它的性能不需要打開Software flow offloading就可以處理1Gbps的網路連線。除此之外,它還包含有兩個2.5G與一個1G乙太網路界面,可以應對未來網路升級需求。
  • 區域網路:Ubiquiti的USW-Lite-8-POE與USW-Flex-Mini
  • 無線網路:Ubiquiti的UniFi UAP-AC-Lite與U6-Lite。
    看到這應該會有人問為何不使用Ubiquiti的全家桶?我有考慮過,但是在購買NanoPi R5S當時能考慮的是Dream Router,但它提供了我不需要的功能(Wifi),而且性能不足且價格高昂。現在有UXG-Max可以選擇,但是價格還是蠻高的。

    應該還會有人問為何要買Wifi AP而不是直接買整合的Wifi Router?這是因為Wifi Router放置的位置受限,某些角落的收訊會很差,而且性能比不上功能單一的Wifi AP。

    會選擇Ubiquiti的設備也是因為整合性與維護性,透過UniFi Network應用程式,可以很方便檢視與管理網路狀態。當然如果要看到最完整的網路狀態還是需要搭配UniFi的路由主機。


2022年4月15日 星期五

尋找DS Audio的替代方案

家裡有Synology NAS的人,可能都用過DS Audio(手機APP)與Audio Station(Server),用來播放音樂算是還可以用,但這麼多年都沒什麼改進,缺乏一鍵加到最愛的功能,網頁跟手機APP把音樂加到播放清單的功能也不好用,給音樂評分的功能看起來也沒什麼用處。尋找替代方案,大多都會提到Plex Media Server,可是這個軟體太過臃腫(bloated),不符合我的需求。除此之外就是各種相容Subsonic的方案。

Server部份,目前使用NAVIDROME,運作起來相當輕量且迅速,網頁界面也比較現代化。安裝方式使用Docker,說明文件建議不要用root啟動程式這點就要特別注意設定檔貯存位置與音樂檔案儲存位置的存取權限,否則程式會無法啟動或存取音樂檔案。

Android手機APP部份先測試了substreamer,看起來很漂亮但是ui會因為io存取卡住,使用體驗打折扣。除此之外還試了UltrasonicSubtracks,都相當順暢,不過在Play Store的安裝量很少,比不上substreamer。這三個App都有一鍵加到最愛與下載離線收聽的功能,基本上符合我的需求。不過從界面上來看,substreamer跟Subtracks比較符合我的喜好(跟Spotify很相似),應該會優先使用Subtracks。

2022年1月1日 星期六

Sonoff Basic R2 1.3刷Tasmota

從網拍上買兩個Sonoff Basic R2,想要接臥室的嵌燈。使用ESPhome透過網頁界面把韌體刷入後,接上電源發現沒動作,LED也不會亮,改用Tasmota用網頁界面刷韌體也是同樣的情況。

之後在網路上搜尋找到有人使用同樣硬體版本的R2刷入韌體可以使用,他是用esptool這個指令界面工具去刷,參數部份特別指定刷入模式使用dout (Dual Output),我也用同樣的指令刷入後就可以正常運作了。

2021年8月23日 星期一

讓Win10在連入Samba 4 Server時,會出現登入身份驗證畫面

這次的情況是使用者用Windows 10去連安裝在Ubuntu 20.04上頭Samba 4,不會出現身份驗證畫面,這樣就無法使用Samba分享的家目錄。如果是換成Windows 7以前的版本則會。

在網路上搜尋許久,最終找到這個問題的解答。

Ubuntu版本的Samba設定檔,預設會把map to guest指定為Bad User,只要改成never或註解這行,就會強制驗證使用者。

2020年1月27日 星期一

解決使用IPv6時,無法連上isthereanydeal.com的問題(EdgeRouter X)

使用環境:中華電信光世代100M/40M,使用Ubnt EdgeRouter X(ER-X)設置IPv6 Dual Stack
症狀:isthereanydeal.com可以正確解析到正確的v6 IP,Ping也沒有問題,但是用瀏覽器開啟總是會顯示連線失敗,查Google得到以下結果

建議使用SSH登入ER-X,然後修改防火牆設定
admin@er-x:~$ configure
[edit]
admin@er-x# set firewall options mss-clamp6 mss 1432
[edit]
admin@er-x# commit
[edit]
admin@er-x# save
Saving configuration to '/config/config.boot'...
Done
[edit]

以上設定僅適用家用型光世代,如果是固定制光世代,可能會有不同的mss值。

參考來源:
https://community.ui.com/questions/IPv6-mss-clamp6-setting-optimization/dfa1b7e1-e92e-4ab9-902f-580725d2e653
https://community.ui.com/questions/BUG-REPORT-Mss-clamping-creates-buggy-IPtables-rules/f373f88f-ff35-4984-b879-63f114f2b6ad

2019年11月13日 星期三

如何在Django正確使用ManifestStaticFilesStorage這個功能


假設Django專案目錄在/home/myproj。在settings.py要設定
# 靜態檔案對應的URL
STATIC_URL = '/static/'
# 靜態檔案放置的位置,這裡就等於/home/myproj/static
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 放置其他靜態檔案的路徑,把css/js等檔案放在這,以下的設置等於/home/myproj/staticfile
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "staticfile"),
)
# 使用ManifestStaticFilesStorage作為靜態檔案處理方式
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

 在正式運行的伺服器執行
./manage.py collectstatic -v 3
會看到css跟js等檔案都複製到static目錄,並產生附加hash值的檔案。
...
Post-processed 'css/bootstrap.min.css' as 'css/bootstrap.min.a15c2ac3234a.css'
...
每次更動這些檔案後都要執行collectstatic,否則會出錯。

在基礎樣板載入靜態檔案要使用{% load static %}與{% static 'css/bootstrap.min.css' %}來載入靜態檔案。

在Nginx關於靜態檔案目錄的設置
...
location /static {
        alias /home/myproj/static;
    }
...

如果把css/js等檔案放在STATIC_ROOT裡頭,那麼執行collectstatic就不會產生附加hash值的檔案,瀏覽網站就會跳出500錯誤。錯誤Log會有ValueError: Missing staticfiles manifest entry for .... 的訊息。

2019年8月19日 星期一

使用pytz為datetime物件加上時區的注意事項

使用Python的datetime產生的物件是不會包含時區資訊的,在網路上搜尋加上時區的方式,一般都是建議用pytz,大概類似以下的作法。
import datetime
import pytz

mytz = pytz.timezone('Asia/Taipei')
mytime = datetime.datetime.now().replace(tzinfo=mytz)

print(mytime)
2019-08-19 14:56:50.450396+08:06
結果的確會顯示時區,不過好像哪裡怪怪的?台北所在的時區應該是+08:00,怎麼會變成+08:06,多加了六分鐘?

pytz的文件在開頭有提到,因為與Python內建的tzinfo API有實做上的差異,如果要顯示當地的時區,需使用localize()這個方法,範例如下。
import datetime
import pytz

mytz = pytz.timezone('Asia/Taipei')
mytime = mytz.localize(datetime.datetime.now())

print(mytime)

2019-08-19 14:56:50.450396+08:00
這樣就會顯示正確的時區。

2019年5月21日 星期二

在Linux使用Ricoh多功能事務機,無法輸入使用者代碼的問題

使用環境
Kubuntu 18.04
Ricoh Aficio MP C3300

使用情境
印表機有設定使用者代碼來統計各部門的使用量,並限制彩色列印功能。

在Windows的印表機設定很容易設定使用者代碼,在Linux上頭並不是…好吧,現在可以看到設定選項,但是會發現怎麼設定都沒有效果,永遠都會選擇預設的選項,而且沒辦法改變預設的代碼。
搜尋網路找到這一篇,但是沒有效果。這篇文章裡頭有提到OpenPrinting網站的FAQ,可是裡頭的說明不是很清楚。

我最後解決的方式是從OpenPrinting網站下載PPD檔案修改,以C3300為例,網站上提供三種版本分別是PDF、Postscript、pxlcolor,PDF的版本按下列印就會被取消,我是用Postsciprt版本。

要修改以下兩行
*DefaultUserCode: None
*UserCode 1001/1001: "/usrcode(1001)def\n"
修改上面三個紅色的部份,填入正確的使用者代碼(這邊是用1011為例子)
*DefaultUserCode: 1011
*UserCode 1011/1011: "/usrcode(1011)def\n"
結果如下圖 
存檔,然後安裝印表機,要選擇用這個檔案安裝。安裝完成後進入設定選項應該會如同第一張圖,紙張大小與列印顏色也要改成正確的設定,不然還是無法列印。

2019年1月18日 星期五

Linux桌面多使用者登入,類似LTSP的作法 rev.2

上一篇是古早時代的作法,lightdm早就內建支援VNC,中間不需要透過XDMCP,這樣穩定性也比較好,而且還是支援多使用者。

作法:
  1. 安裝tigervnc-standalone-server
  2. 編輯/etc/lightdm/lightdm.conf,加上
    [VNCServer]
    enabled=true
    command=Xvnc -SecurityTypes None
    port=5900
    listen-address=0.0.0.0
    width=1024
    height=768
    depth=24
    SecurityTypes設定None代表不使用VNC的內建驗證方式與加密,但是在lightdm還是要輸入帳號密碼登入。參數的詳細說明
  3. (可選)把SecurityTypes改成TLSNone使用連線加密,或者使用SSH或VPN提昇安全性
  4. 重新啟動lightdm
  5. 使用vncviewer連入

2018年12月4日 星期二

試用WireGuard

我只用過IPSEC與OpenVPN,其他的沒用過,所以不確定其他VPN軟體的架構與設計理念如何,不過WireGuard與前兩者相比的確有明顯的差異。

在Linux上頭的WireGuard是核心模組加上用戶端工具軟體,核心模組包含網路卡界面與整個VPN功能實做,用戶端工具是設置VPN與檢視狀態用。IPSEC或OpenVPN在運作時都需要在背景運行必要程式,WireGuard不需要。不過在非Linux平台,還是需要執行背景程式。

使用者管理也和其他VPN實做不同,是使用非對稱金鑰,伺服器與用戶端都需要產生非對稱金鑰並交換公鑰,如果要解除某個用戶的權限,只需要從設定檔把對應的設定刪除。其他實做使用CA產生使用者的公鑰,要解除用戶權限需要撤除(revoke)對應的金鑰,不直覺也不方便。

性能部份因為沒有做測試所以不評論,不過WireGuard網站上的測試結果都顯示更高的Throughput與更低的延遲。

2018年10月30日 星期二

Linux桌面多使用者登入,類似LTSP的作法

LTSP就是Linux版本的Terminal Server,可以讓多個使用者共用一台伺服器的資源去使用桌面環境,但是Client端OS必須也要是Linux是缺點。

之後找的方案是在Ubuntu Mate 18.04中啟用LightDM的XDMCP功能,在Linux上使用Xephyr連線非常順暢,但是在Windows上試了好多種軟體(包含Xming),都會出現畫面顯示異常或卡住,程式啟動當掉的問題,只能放棄。

再來則是XDMCP + VNC,網路上許多文章都會提到這個替代方案,我參考這一篇做設定,但是不透過SSH連線。設定完成,連上去看起來都沒什麼問題,直到我發現fctix的選字框無法顯示。 Orz

根據Ubuntu社群WIKI關於VNC Server的文章,其中提到只有TigerVNC支援compositing window managers像是Gnome Shell,原本我安裝的是vnc4server,換成tigervnc-standalone-server問題就解決了。而且換成TighterVNC Server還有個好處,Client也使用TigerVNC的話,就支援動態變更桌面尺寸,變更TigerVNC Viewer視窗的尺寸就會連帶變更Linux桌面的尺寸。

2018年10月3日 星期三

Supermicro的IPMI Virtual CD-ROM功能

最近要把某些機器重裝OS,要使用IPMI提供的虛擬光碟機,沒想到沒辦法把映像檔掛載上去。

把SAMBA Server的log debug功能開啟,出現 NTLMv1 passwords NOT PERMITTED for user 這個訊息。經查詢後發現,SAMBA較新的版本(4.5.10以後?)預設關閉NTMLv1驗證方式,這是因為這個驗證方式不安全。

解決的方式很簡單,只要在SAMBA設定檔的 global 區塊加上 ntlm auth = yes 這個設定即可。不過之前有說到這個驗證方式不安全,如果要使用要多注意。

2018年7月9日 星期一

SSL憑證購買

管地購買進階型SSL憑證碰到一些問題,根據該網站wiki的資料:
  1. 需要公司登記證明與公司代表人的身份證明
    這個沒什麼問題,但是我碰到的情況是Gandi的每個帳號下面可以建立組織,組織名稱必須與公司登記證明的名稱相符,我當初填寫公司資料是用英文,客服來信要求提供與中文名稱相符的相關證明。
  2. 要進行電話驗證
    在台灣的電話驗證是透過鄧白氏(Dun&Bradstreet)電話資料庫,但是我沒法確定我們公司的資料有登錄在他們的資料庫中肯定沒有登錄,鄧白氏企業認證D&B D-U-N-S® Registered ™服務基本版費用16800,有效期一年,每年都需要重新認證。
因此我取消訂單,應該會跟TWCA詢價與採購吧。不過價錢真的差蠻多的,管地的兩年期進階版單一網域SSL憑證包含25萬美元擔保的價格是3490,台灣任何一家SSL CA的價格都超過10000。把鄧白氏企業認證的費用加進去之後,台灣本地業者還比較便宜?

2018年6月7日 星期四

4G連線裝置的遠端管理

最近碰到一個情況是需要在特定地點放置網路設備,上面建置的服務需要連外,但又無法連接有線網路,看起來比較簡單而且立即可用的方案就是租用4G網路。

上網的問題解決了,但是又冒出其他問題。因為IPv4的IP可用數量不足的關係,4G網路大多是採用Carrier-grade NAT的技術去解決IP不足的問題,但這也代表著無法在遠端主動連入這個4G連網裝置進行管理。

為了解決遠端管理的問題,我最後想到使用SSH Tunnel,讓這些裝置主動開啟逆向SSH Tunnel連線到我的主控端伺服器,那我就可以從主控端伺服器連入這些設備進行管理。

不過之後發現SSH Tunnel建立一段時間之後就會沒有回應,看起來應該是4G不穩定,連線已經中斷,但是主控端的ssh server沒有把連線關閉。因此我在ssh server加上keep alive的設置,每30秒會發送封包給client進行檢查,如果連續三次都無回應就會關閉連線。設置此設定後連線都正常。