2022年1月9日 星期日

使用繼電器模組切換分享USB外接SSD

AverMedia ER130 具備紅外線遙控,  USB接口. 無網路功能

計畫:

讓 Raspberry Pi 3 成為 ER130 網路後端.

在 ER130 與 Raspberry Pi 3 之間分享USB外接SSD, 將 ER130 錄影檔 copy 到 Pi 上. 後續可用小米盒子上的KODI連入Pi觀看.


核心功能: 

在兩個設備間以無人職守的方式切換分享同一個USB硬碟(使用外接SSD)


實現:

以 四路單刀雙擲繼電器模組 實作. 工作電壓5V. low-level trigger

    每個單刀雙擲繼電器有三個接點:

        共接點: USB SSD

        Normal Close 接點 (預設接點): AverMedia ER130 (Power Pin 除外)

        Normal Open 接點: Raspberry Pi (Power Pin 除外)


接線:

Raspberry Pi 端: GPIO 2, 3, 4 pull-up pin

GPIO 2 -> Relay 1 -> USB Power pin

                  Relay 1:

                      共接點 -> USB SSD power pin 

                      Normal close 接點 -> 5v 外接電源   

                      Normal open 接點 -> 空接 (等於斷電)

GPIO 3 -> Relay 2 -> USB D- pin

                  Relay 2:

                      共接點 -> USB SSD D- pin

                      Normal close 接點 -> ER130 USB D- pin

                      Normal open 接點 -> Raspberry Pi USB D- pin

GPIO 3 -> Relay 3 -> USB D+ pin

                  Relay 3:

                      共接點 -> USB SSD D+ pin

                      Normal close 接點 -> ER130 USB D+ pin

                      Normal open 接點 -> Raspberry Pi USB D+ pin

GPIO 4 -> Relay 4 -> USB Ground pin

                  Relay 4:

                      共接點 -> USB SSD Ground pin

                      Normal close 接點 -> ER130 USB Ground pin

                       Normal open 接點 -> Raspberry Pi USB Ground pin


切換邏輯:

USB SSD 由 ER130 USB 口切換至 Rasbperry Pi USB 口:

原則: Power pin 先接, Data pin 後接

- Pi 發送 IR 訊號控制 ER130 錄影, 錄影完成, Pi 發送 IR code 關閉 ER130.

        若不關閉 ER130, 則需要八路單刀單擲繼電器才能實作切換.

- GPIO 2 = Relay 1 = Power pin 切至 normal open 端, 此處空接

    USB SSD 斷電. 模擬 VBUS 斷電. 否則USB SSD不能reset, 下個設備的host無法enumerate被切換的設備(此處為SSD), 則無法辨識出新設備被hotplug.

- GPIO 4 = Relay 4 = Ground pin 切至 normal open, 連接 Raspberry Pi USB Ground pin

- GPIO 2 = Relay 1 = Power pin 切回 normal close, 連接5v獨立電源

    USB SSD 通電. 使用獨立電源原因在於 ER130 供電不穩. Raspberry Pi USB供電有限 (Pi 3 USB總供電 1.2 A, 不須 max_usb_current=1). Pi 拷貝影片時需要同時存取兩個硬碟 1.2A 不足以負荷.

- GPIO 3 = Relay 2 = D- pin 切至 normal open, 連接 Raspberry Pi USB D- pin

- GPIO 3 = Relay 3 = D- pin 切至 normal open, 連接 Raspberry Pi USB D+ pin


Pi Copy 完成後, USB SSD 由 Raspberry Pi USB 口切回 ER130 USB 口:

原則: Data pin 先斷, Power pin 後斷

- GPIO 3 = Relay 2 = D- pin 切至 normal close, 連接 ER130 USB D- pin

- GPIO 3 = Relay 3 = D- pin 切至 normal close, 連接 ER130 USB D+ pin

- GPIO 2 = Relay 1 = Power pin 切至 normal open 端, 此處空接 USB SSD 斷電. 

- GPIO 4 = Relay 4 = Ground pin 切至 normal close, 連接 ER130 USB Ground pin

- GPIO 2 = Relay 1 = Power pin 切回 normal close, 連接5v獨立電源

- Pi 發送 IR code 開啟 ER130. ER130 開機辨識出 USB SSD. 可以開始下次綠影.

        



實現過程中遭遇的問題和處理:

上面的接線和切換邏輯不是一開始就知道的, 而是處理掉一些問題後的結果

- USB SSD 5V pin (VBUS)必須確實斷電 1 秒以上 

使用單刀雙擲 relay 實作第一個遇到的問題. 卡關最久. 症狀也最詭異. 

症狀: 由 Rasbperry Pi 切換回 ER130 時, ER130 無法辨認 SSD. 此時將 relay 的電源拔除, 瞬間ER130 就能辨認出SSD. 但relay的電源和 SSD 電源應該是隔離的. 至今仍不知為何有這種現象.

解: 初期導入一個MOSFET模組單獨控制SSD的VBUS, 在切換後將SSD特別斷電一秒再復電. ER130就能辨認出SSD. 後期將SSD改為獨立電源後. 拔除MOSFET, 改用四路relay的第一路來單獨控制 SSD 的VBUS pin.

- USB 四個 pin 不能同時切

  要模擬人類插拔 USB 一開始最簡單的想法就是 USB 上的四個pin用relay 一次切過來. 


USB接頭總共有四個ping, 第一和第四pin是電源和接地pin, 就是5v直流電的正負極. 而中間兩條 D-, D+ 是資料pin. 仔細觀察四個pin腳, 事實上四個pin是不等長的, 中間兩條資料pin 比較短. 此處隱含的邏輯就是: 插入USB時, 電源接地先通, 再來才接資料pin. 而拔出的時候則相反, data pin 先退出, 再來才斷電.

最早的實作中, 因為沒有遵守這個邏輯, relay 4 pin 一起切的結果, 在 Raspberry Pi 端會隨機發生EMI錯誤: 

[5410843.300270] usb usb1-port1: disabled by hub (EMI?), re-enabling...

雖然 Linux kernel 會自動修復, 但上層的所有服務都會跳掉需要重啟. 例如 NFS. 修改切換邏輯, 插入時先通電後通資料,  拔出時先退資料後斷電. 就沒再出現 EMI 錯誤.

到了這邊會發現, 因為有 A, B 兩台設備要分享同一個 SSD. 此處為 ER130 和 Raspberry Pi 兩設備分享同一個SSD. 所以單刀雙擲的 relay 是沒辦法同時滿足兩台機器的插拔邏輯. 一旦以A設備為主切換, 則B設備就會違反邏輯. 若用兩套單刀單擲 relay 去實作是比較完整的, 但接線會比較複雜而且需要更多機殼空間.

所以我的作法是將 ER130 端在切換前IR遙控它關機. 完全以 Raspberry Pi 為主來撰寫切換邏輯. 整個程序完成後, 再遙控 ER130 開機. 靠 ER130 的韌體開機enumerate, 將SSD掛回來.

- 設備端的USB供電不穩或供電不足

症狀: 外接SSD 的filesystem常常corrupted. 在ER130端會顯示外接SSD無法移除. 另外有時發生錄影到一半無法寫入, 或者在錄影結束最後階段無法完成最後的檔案寫入.

解: 給外接SSD輔助電源, 但有後續後遺症. 如下.

- 輔助電源的電流逆流至設備端

症狀: 移除 ER130 電源後, ER130電源燈仍會亮.

解: 將外接SSD完全改獨立電源. 與 ER130, Raspberry Pi 的 USB VBUS pin 完全分開.

- ER130 變壓器衰退(?)不足瓦

症狀: IR code 漏接, 無法開始錄影或者停止錄影.

2016年2月29日 星期一

[Arduino] 完整抓取 凱擘 kbro 遙控器紅外線原碼並發出重新發出以控制機上盒

再次與 kbro 凱擘機上盒遙控器搏鬥:


先講結果, kbro 遙控器發射出來的 IR code 頻率為 38 kHz, 是 XMP protocol  (應該是). IRremote/IRLib 抓取 IR 碼因為 bug 所以中間會斷掉, 沒有辦法抓到完整的碼, 需要將 IR receiver 接到 Arduino 的 interrupt pin 抓才能抓到完整的碼.

如果你不想看以下落落長的過程, 只想用 Arduino IRremote 發射已經抓出來的完整 kbro 凱擘機上盒遙控器碼. 請直接服用以下 sketch:

IRsendKbro.ino : 測試程式, 已寫入所有 kbro raw code, unmark 之後可以測試遙控機上盒.

LfPanasonic2KbroIRtransf.ino: 將 Sony LF-Box1 發出的 Panasonic CATV(1)碼轉為凱擘碼的 IR 轉換器. (請參考這篇)

其實說搏鬥也很可笑, 在台灣應該很多人知道凱擘使用的紅外線碼, 但是網路上能找到的資訊很少, 而且相當分散, 用 Arduino 的 IRremote 或 IRLib (也是基於 IRremote) 都無法解譯 kbro 機上盒遙控器碼, 更無法用Arduino去發射 IR 碼來控制機上盒, 也找不到人有寫這塊.

這次找到時間重新解析 kbro 的 IR 碼, 讓我一個外行人搞懂更多關於 IR 的事情, 就算很蠢走了歪路, 最後結果得到滿意的答案, 還是很開心.

在一年多前寫的一篇 [Arduino] 用 IRrepeater 抓取 kbro 凱擘遙控器的 IR raw code , 當時利用 repeater 程式抓取 kbro 凱擘機上盒遙控器碼, 利用 Arduino 發射 raw code 對應於自己家中的機上盒是可以用的, 但後來發現僅限於我家中那個機上盒, 拿到長輩家比較舊的凱擘機上盒就完全無效. 令人相當苦惱.

抓取紅外線發射頻率

對一個外行人來說, 遇到謎樣的紅外線碼, 首先上網找一下. 以前菜鳥剛弄紅外線時買的紅外線接收器就是光華商場買來就用. 雖然商家有講型號, 並且上網找了 datasheet. 但買了就用從來沒有關心過接收器的真正功能.

從網路上找一下, 發現最基本的就是紅外線接收器有分不同的頻率, 有 36, 38, 40 kHz ... 等等的發射頻率. 最常見的是 38 kHz. 首先我先懷疑到凱擘可能使用的頻率不是常見的頻率:



參考了 CY's Tech Talk 的 1.4.3 IR Receiver Components and Schematics , CY是 IRLib 的作者. 參考 CY 的blog上網買了 TSOP38236 (36 kHz), TSOP38256 (56 kHz) 和  TSMP58000 這幾種. 關於買特定型號的電子零件和光華商場買有不同, 要找到能夠小量買的商家不容易, 起碼以我一個外行人去找不好找. 後來仍是到淘寶找店家買. 可以小量大約十個以內但是運費就省不了. 十個對我來說還是太多了, 但沒辦法.

終於等到這幾種 IR receiver 寄到來抓凱擘遙控碼, 很不幸, 俺運氣沒那麼好. 用 IRremote 或 IRLib 抓出來的 raw code, 用 Arduino 發出來仍舊不能控制凱擘機上盒. 不過用一併買回來的 TSMP58000 搭配 CY 的 IRLib 中的 IRfreq.ino 來抓取遙控碼的頻率:

在 Arduino mini pro 用的 interrupt pin 是 pin 2:

IRfreq.ino 一開始會印出 pin 腳:

測試了幾支不同的遙控器, 可以看到它印出遙控器發出的頻率, (38) 那個就是凱擘遙控器的頻率:

TSMP58000 是 IR learner 而不是 IR receiver. 一般的 IR receiver 的封裝中會帶有 bandpass filter 調諧到特定的頻率, 例如: 36 kHz, 38 kHz:

但是 TSMP58000 則沒有 bandpass filter, 所以會讀取到更原始的 raw code. 根據 CY 的說法是可以用 TSMP58000 去取得 raw code, 但是會需要比一般 IR receiver 更多的記憶體. 所以他只把 TSMP58000 這樣的 IR learner 拿來偵測控制碼的頻率.

問題是, 外行人的我滿心認為一定是 kbro 使用有別於一般 38 kHz 頻率, 例如: 40 kHz, 是我用錯 IR receiver 所以造成抓取 raw code 失敗. 但用 IRfreq.ino 一抓, 可惡的 kbro 白色遙控器發出來的頻率居然是非常標準的 38 kHz, 為此相當沮喪的卡關了一陣子. <=== 事實上得知頻率仍是很重要的事.

查知 kbro 機上盒疑似使用XMP

OK, 卡了幾天關之後, 灰心的我還是上網碰碰運氣, 之前其實就知道網路上的 slingbox 社群有流傳支援 kbro 的設定檔. 但是我都是 download 到 binary 的檔案, 打開當然是編碼過, 人類不懂的二元檔. 卡關那幾天心血來潮就找了它的原始 slingbox 檔來看, 它被發布在著名的 JP1 remotes 網站上. 這個網站是一些 IR 遙控器愛好者分享資訊網站, 其中就有 slingbox 使用的 kbro 凱擘機上盒控制檔:

RMDU Remotemaster source file for the Kbro Hyundai Digital Technology digital set top box (DSTB).
http://www.hifi-remote.com/forums/dload.php?action=file&file_id=8399Kbro Hyundai Digital Technology digital set top box (DSTB) (1).rmdu

上面這個檔案是原始檔(免費註冊登入JP1 remotes 後能取得), 用來產出真正 slingbox 使用的 binary 檔. 原始檔是人類可以看懂的, 可以看到下面的字眼:

Description=Kbro Hyundai Digital Technology digital set top box (DSTB)
Remote.name=Slingbox with UEI RV Chip
Remote.signature=BINRV
DeviceType=Cable
DeviceIndex=1
SetupCode=2010
Protocol=01 6C
Protocol.name=XMP (Slingbox)
Protocol.variantName=JP1Slingbox
ProtocolParms=88 16 null 0 0
FixedData=1B 0F 44 58 1F 00 40
Function.0.name=power
Function.0.hex=0F

可以看到 protocol  是 01 6C, 名稱為XMP, google 一查確實有這樣的 IR protocol, 再查, 發現國外也有 cable TV 公司使用這樣的碼, 而且用 Arduino 去解析並產出 XMP 碼並不成功. 找了數個文章都沒有看到 XMP 和 Arudino IRremote 合作的線索. 但皇天不負苦心人, 找到一個對我很重要的一篇 Arduino forum 的討論: Reading IR signals from Comcast XR2 remote

這篇討論由 robertanthony02 發動, 他也是想用 Arduino parser XMP 不成功. 討論的前兩頁給我幾個以前不知道的線索, 首先, IR receiver 是有對於 XMP 比較建議的型號, 也就是說比較著名ㄧ點的 IR receiver 的型號(通常也會貴一些), 它的 datasheet 是有建議針對哪種 protocol 比較友善的 receiver:

所以依據網路找到的 datasheet 建議我又上網買了 TSOP38338, 這個 IR receiver 被推薦使用在 XMP 上. 買來用用看. 結果到貨後滿心歡喜的用 IRremote 一弄, 當場又囧了, 沒錯! 抓出來的 raw code 居然仍無法使用!

至此, 第二次進入卡關. 又花了幾百塊買 TSOP38338, 重點是沒有得到新的突破, 再次令我沮喪...

AnalysIR 的 Arduino_Record_Long_AirConditioner_Infrared_Signals_10 sketch

所幸天公伯沒有把門堵死, 累積走過的一切仍有收穫, 在 Reading IR signals from Comcast XR2 remote 討論串中, 前兩頁中 robertanthony02 和 AnalysIR 兩人的討論非常重要.

AnalysIR 就是 AnalysIR 這個軟體專案的開發者, AnalysIR 是一個可以搭配數種開發板, 包含 Arduino, 將截獲的 IR code 在 PC 上繪製成圖形, 也就是軟體示波器. 個人非商用版本很便宜, $10 美金約 $300 台幣上下, 和一個硬體示波器的價格比便宜太多了. 如果只是應用在 IR 場合不想花大錢買硬體示波器的話 AnalysIR是滿不錯的選擇.

在討論中, AnalysIR 他提供給 robertanthony02 一個很重要的 sketch 來進行抓取 IR code 的任務. 這個 sketch 叫做 Arduino_Record_Long_AirConditioner_Infrared_Signals_10.txt, 這個 sketch 最早被 AnalysIR 發表在 Air Conditioners: Recording long Infrared Remote control signals with Arduino 這篇文章中.

這時候發生令我振奮的結果, 沒錯! AnalysIR 的 sketch 可以用, 搭配 TSOP38338 抓出來的 raw code 可以控制我手上有的兩個外型不同的凱擘機上盒.

AnalysIR 的 sketch 跳過了 IRremote, 將 IR receiver 接到 interrupt pin 去抓取 raw code. 這個程式本來是用來對付一些冷氣機的遙控器, 因為這些遙控器所發出的 code 特別長, 而 IRremote 的 buffer 有 100 的長度限制, 所以他做了這個 sketch 來抓. 剛好它也繞過了我遇到的問題. 後面分所抓出來的凱擘 IR code, 它的長度是 71 並不是因為太長超過 buffer 無法抓取, 而是發現另一個 IRremote 的問題.

總之, AnalysIR 的 sketch 讓我順利的抓出 kbro 機上盒的 raw code, 我放置在本文後的附錄, 我只抓了用來選台的一些按鍵. 搭配我的 IR translator 和 LF-Box1 使用. 至於其他的按鍵同好們可以用相同的 sketch 抓取. 我測試過不只 TSOP38338 (XMP首選) 可以抓出來, 用光華商場買的 38 kHz IR receiver 也可以抓出來沒問題.

利用抓出來的 raw code, 我修改了做給 Sony LF-Box1 用的 IR code 轉換器, 把它發出的 Panasonic code 轉為 kbro cable box 的 code, 這樣 LF-Box1 可以遙控 kbro box. 程式碼在此: LfPanasonic2KbroIRtransf.ino, 稍有經驗的人應該可以看出程式中的問題來, 在最後一段會說怎麼處理.

我還寫了一個簡單的 sketch, 將所有抓出來的 kbro raw code 都放進去: IRsendKbro.ino, 可以用來測試.

IRremote/IRLib 無法適應 XMP protocol

事實上在找到 AnalysIR 的  sketch 之前, 我花了一些時間 trace IRremote/IRLib 的原始碼. 因為從邏輯上來說 IRremote 雖然沒有支援 XMP protocol, 但是直接從 ISR 抓出來的 raw code 應該要可以使用, 但事實上沒辦法用. 所以 IRremote 中抓 raw code 的算法肯定有問題.

不過我沒有貴鬆鬆的示波器, 也沒買 AnalysIR, 所以沒有對照組可以用來抓 IRremote 的問題. 但是找到 AnalysIR 的 sketch 之後, 分析抓出來的 kbro raw code 就瞭解了一些事情.

首先, AnalysIR 的 sketch 抓出來完整的 raw code 長度為 71, 而我以前用 IRrepeator 抓出來的長度是 17, 很明顯 IRremote 抓出來的長度少了很多. 判斷不是被錯誤過濾掉就是誤判了結束點.

再以抓出來的 channel+ 按鈕為例:

Raw: (71) 224, 892, 224, 2252, 224, 752, 224, 2796, 228, 1292, 232, 1292, 224, 1432, 232, 1836, 228, 14264, 228, 888, 228, 1024, 228, 748, 232, 744, 232, 748, 232, 2512, 236, 744, 224, 752, 228, 15468, 280, 840, 232, 2244, 232, 744, 224, 2792, 228, 1296, 232, 1288, 228, 1432, 228, 1836, 228, 14268, 224, 892, 224, 2112, 224, 1844, 220, 756, 224, 752, 228, 2520, 228, 748, 228, 752, 228

IR LED 亮是 mark, 暗是 space. 它是 mark, space, mark space... 這樣一直排下去, 可以發現其中有抓出特別長的間隔時間, 就是我上面紅色標出來的數字. 以這個數字為間隔可以發現很長的間隔出現之前, 其他的 mark, space 數字一共剛好就是17, 就是我以前抓的長度. 至此可以推斷出來 IRremote 判斷 IR code 結尾是有問題的. 過長的時間間隔會造成 IRremote 的誤判, 誤以為整個 raw code 結束了.

這時候繼續 trace IRremote, 發現了癥結點在 IRremoteInt.h 和 IRremote.cpp (其實也沒幾個檔案):

Arduino-IRremote/IRremote.cpp

Arduino-IRremote/IRremoteInt.h  // Minimum gap between IR transmissions
                                        #define _GAP            5000
                                        #define GAP_TICKS       (_GAP/USECPERTICK)
    Arduino-IRremote/IRremoteInt.h  // microseconds per clock interrupt tick
                                                           #define USECPERTICK    50

可以看到 IRremote 是 state machine 的設計, 以一些研判條件來推進整個 parser process 的 state.

if (irparams.timer > GAP_TICKS) {
        irparams.rcvstate = STATE_STOP;
}

當抓出來的 ir timer 小於 GAP_TICKS 的 ticks 數量, 代表要將 IR receiver 的狀態推進到 STATE_STOP, 而 GAP_TICKS 則是從 _GAP 5000  算出來, 5000 的單位是 microseconds , 這相當小, 是 10 的 -6 次方. 所以是 0.005 秒. 而上面的紅色數字為 14264, 15468 14268, 明顯都大於 5000 這個數字.

所以我刻意加大 _GAP, 加大到 20000, 可以處理一部分上面的 timer gap, 抓出更長一些的 raw code. 可是很奇特的是, 從數字上去計算, 應該比抓出來的數字例如 15468 稍微大一點就可以避免誤判, 但實際測試出來卻不是這樣, _GAP 必須要大上很多才行, 這點我目前也不明白, 應該還有什麼東西拖延到實際的 ticks 數字.

總之 IRremote 的 _GAP 不修改的話, 是肯定會對 XMP protocol 造成結束碼的誤判. 未來如果要想為 IRremote 添加 XMP 支援, 則這個問題不能忽略.

用 PROGMEM 解決 raw code 陣列過大問題

第一個版本 LF-Box1 遙控 kbro box 程式碼: LfPanasonic2KbroIRtransf.ino, 前面有提到出了問題. 由於抓出來的 kbro raw code 很大, 每個按鈕有 71 個 unsigned int (Arduino 上是 2 bytes) 的大小, 實際一用發現當整個 arrary 很大的時候, 會造成 sketch 上載成功但是無法運作. 這個問題大約卡了一天, 後來找到這個文件 Dean Camera's "GCC and the PROGMEM Attribute", 它的說明相當清楚, 問題就是出在實行時期 Arduino 會將使用到的陣列由 ROM 拷貝到 RAM, 如果 array 太大就會把 RAM 塞爆, 造成程式無法執行.

我使用的 Arduino mini pro 內帶 32KB Flash memory (ROM), 2KB SRAM (RAM), SRAM就是執行時期能用的記憶體大小. AVR-GCC在起始的時候會將用到的 array 從用來存放程式的ROM拷貝到 RAM 中執行, 這樣速度會比較快, 但是 array 加上執行時期用掉的其他空間不能大於 2KB.

我們在 upload sketch 到 Arduino 上時, Arduino IDE 上顯示的大小是 32 KB 的 ROM, 而不是執行時期的 RAM, 請注意.

所以我實際遇到的狀況發現陣列存放 12 個 kbro raw code 時 sketch 就無法執行. 細算一下:
    71 * 2 (bytes) = 142 (bytes)
    142 * 12 =  1704 (bytes) <=== 很接近 2KB

若包含其他執行時期的 heap, stack 的消耗, 很容易就把只有 2KB 的 RAM 撐爆. 葉難 的 Arduino:關於記憶體之二三事 文章有佷漂亮的圖片可以參考.

那怎麼避免這樣的狀況呢? 可以利用 PROGMEM 變數屬性告訴 AVR-GCC 將該陣列保留在 ROM 中不要copy到 RAM 中. 而是利用 memory_P 在要用的時候 copy 到我預先在 RAM 中宣告好的 buffer, 再把 IR raw code 發出去. 修正版本在此: LfPanasonic2KbroIRtransf.ino

修正過後原本的靈異現象就不再出現, 而且可以放下更多的 kbro raw code.

最後

終於能夠順利抓出 kbro 凱擘機上盒的遙控碼, 而且用 IRremote 重新播放出去. 雖然 IRremote 沒有辦法 parser XMP protocol, 但總算是可以發出 raw code. 未來若有時間有空閒可以將 XMP 的 parser 添加到 IRremote, 但這時候示波器就很必要了.



附錄:

 kbro 遙控器 Raw data 完整版 (已拿掉第一個 code, 長度為 71):
Caputure by Arduino_Record_Long_AirConditioner_Infrared_Signals_10

CHANNEL UP:
Raw: (71) 224, 892, 224, 2252, 224, 752, 224, 2796, 228, 1292, 232, 1292, 224, 1432, 232, 1836, 228, 14264, 228, 888, 228, 1024, 228, 748, 232, 744, 232, 748, 232, 2512, 236, 744, 224, 752, 228, 15468, 280, 840, 232, 2244, 232, 744, 224, 2792, 228, 1296, 232, 1288, 228, 1432, 228, 1836, 228, 14268, 224, 892, 224, 2112, 224, 1844, 220, 756, 224, 752, 228, 2520, 228, 748, 228, 752, 228

CHANNEL DOWN:
Raw: (71) 224, 892, 232, 2244, 232, 744, 232, 2788, 224, 1296, 228, 1296, 232, 1424, 228, 1840, 224, 14268, 232, 884, 232, 880, 224, 756, 224, 752, 228, 752, 224, 2656, 228, 752, 228, 748, 232, 15464, 232, 884, 232, 2244, 228, 748, 232, 2788, 232, 1288, 228, 1296, 228, 1428, 224, 1844, 232, 14260, 228, 888, 228, 1972, 228, 1840, 224, 752, 228, 748, 228, 2656, 228, 748, 232, 748, 232

POWER
Raw: (71) 228, 892, 224, 2248, 228, 752, 224, 2792, 228, 1296, 232, 1288, 228, 1432, 232, 1832, 228, 14268, 232, 880, 224, 756, 308, 668, 312, 668, 228, 748, 228, 2792, 228, 748, 232, 748, 232, 15420, 224, 896, 232, 2240, 232, 748, 232, 2784, 224, 1300, 228, 1292, 232, 1428, 224, 1840, 224, 14268, 232, 884, 232, 1832, 232, 1836, 224, 752, 228, 752, 228, 2788, 232, 748, 228, 748, 232

ONE 1:
Raw: (71) 232, 888, 232, 2244, 220, 756, 228, 2788, 232, 1292, 224, 1300, 224, 1432, 232, 1836, 224, 14268, 228, 888, 284, 2596, 224, 756, 228, 748, 232, 748, 224, 888, 232, 748, 224, 752, 232, 15412, 228, 888, 232, 2244, 224, 752, 232, 2788, 232, 1288, 228, 1296, 228, 1428, 232, 1836, 224, 14268, 232, 884, 220, 1572, 228, 1840, 228, 752, 220, 756, 228, 884, 224, 756, 228, 748, 232,

TWO 2:
Raw: (71) 232, 888, 232, 2240, 228, 752, 228, 2788, 224, 1300, 228, 1292, 232, 1428, 224, 1840, 232, 14264, 224, 892, 224, 2520, 232, 748, 224, 752, 232, 748, 224, 1024, 228, 752, 220, 756, 228, 15452, 224, 892, 228, 2248, 228, 748, 228, 2792, 228, 1292, 224, 1300, 224, 1432, 232, 1836, 224, 14268, 232, 884, 224, 1436, 224, 1840, 232, 744, 228, 752, 228, 1020, 224, 756, 228, 748, 224

THREE 3:
Raw: (71) 232, 888, 232, 2240, 224, 756, 228, 2788, 232, 1292, 224, 1296, 232, 1428, 224, 1844, 224, 14268, 232, 884, 224, 2384, 232, 748, 224, 752, 228, 752, 304, 1080, 228, 752, 232, 744, 228, 15444, 224, 896, 224, 2248, 232, 748, 224, 2792, 228, 1296, 232, 1288, 224, 1436, 228, 1836, 224, 14272, 228, 884, 224, 1300, 224, 1840, 232, 748, 224, 752, 232, 1156, 224, 752, 312, 664, 224

FOUR 4:
Raw: (71) 224, 896, 224, 2248, 228, 752, 316, 2700, 224, 1300, 228, 1292, 224, 1436, 228, 1840, 228, 14264, 308, 808, 228, 2244, 224, 756, 228, 748, 232, 744, 228, 1296, 232, 748, 224, 752, 316, 15356, 228, 888, 232, 2244, 224, 752, 312, 2708, 232, 1288, 228, 1296, 228, 1432, 224, 1840, 228, 14268, 232, 880, 228, 1160, 228, 1836, 224, 752, 316, 664, 308, 1212, 232, 748, 224, 752, 228

FIVE 5:
Raw: (71) 224, 896, 220, 2252, 228, 752, 228, 2788, 224, 1300, 228, 1292, 224, 1436, 224, 1840, 232, 14264, 224, 892, 228, 2108, 224, 752, 232, 748, 224, 752, 312, 1348, 232, 748, 308, 668, 316, 15360, 228, 892, 228, 2244, 232, 748, 224, 2792, 228, 1296, 232, 1292, 224, 1432, 232, 1836, 224, 14268, 228, 888, 224, 1024, 228, 1840, 232, 744, 228, 752, 232, 1424, 224, 756, 228, 748, 224

SIX 6:
Raw: (71) 224, 892, 224, 2252, 228, 748, 232, 2788, 224, 1296, 232, 1292, 224, 1432, 228, 1840, 232, 14260, 228, 888, 232, 1972, 224, 752, 232, 748, 224, 752, 228, 1568, 220, 756, 228, 752, 220, 15420, 232, 888, 232, 2240, 228, 752, 228, 2788, 224, 1300, 228, 1292, 232, 1428, 224, 1840, 232, 14264, 224, 888, 232, 884, 224, 1844, 228, 748, 232, 744, 228, 1568, 232, 748, 224, 752, 232

SEVEN 7:
Raw: (71) 224, 892, 224, 2252, 228, 748, 224, 2796, 224, 1296, 232, 1292, 228, 1428, 228, 1840, 232, 14264, 224, 888, 232, 1836, 224, 752, 312, 668, 304, 672, 312, 1616, 236, 744, 312, 664, 316, 15344, 224, 892, 224, 2252, 228, 748, 236, 2784, 224, 1296, 232, 1292, 224, 1432, 228, 1840, 220, 14272, 232, 884, 232, 748, 224, 1840, 232, 748, 224, 752, 312, 1616, 224, 756, 228, 752, 220

EIGHT 8:
Raw: (71) 232, 884, 224, 2252, 228, 752, 228, 2788, 224, 1296, 232, 1292, 224, 1432, 228, 1840, 232, 14264, 224, 888, 232, 1700, 224, 752, 228, 752, 304, 672, 312, 1756, 228, 748, 228, 752, 228, 15428, 224, 896, 220, 2252, 228, 752, 228, 2788, 224, 1300, 228, 1292, 224, 1436, 224, 1840, 232, 14264, 224, 888, 232, 2788, 232, 1832, 228, 752, 232, 744, 228, 1840, 228, 748, 308, 620, 344

NINE 9:
Raw: (71) 232, 888, 232, 2240, 224, 756, 228, 2788, 224, 1300, 224, 1296, 232, 1428, 224, 1840, 228, 14268, 224, 888, 228, 1568, 232, 744, 312, 668, 312, 664, 312, 1892, 228, 748, 224, 756, 312, 15384, 232, 888, 228, 2248, 220, 756, 228, 2788, 232, 1292, 224, 1300, 228, 1428, 224, 1844, 224, 14268, 232, 884, 224, 2660, 228, 1836, 232, 744, 228, 752, 316, 1884, 228, 752, 228, 748, 224

ZERO 0:
Raw: (71) 224, 896, 224, 2248, 228, 752, 232, 2784, 228, 1296, 228, 1292, 224, 1436, 228, 1836, 232, 14264, 224, 892, 228, 2788, 236, 744, 228, 748, 232, 748, 224, 752, 232, 748, 224, 752, 232, 15424, 232, 888, 224, 2252, 224, 752, 232, 2784, 228, 1296, 228, 1292, 232, 1428, 224, 1840, 232, 14264, 224, 892, 228, 1700, 224, 1844, 224, 752, 316, 664, 224, 752, 232, 744, 228, 752, 228

OK:
Raw: (107) 228, 888, 232, 2244, 220, 756, 312, 2708, 228, 1292, 224, 1300, 228, 1428, 224, 1844, 228, 14264, 232, 884, 224, 1844, 228, 748, 224, 756, 228, 1020, 232, 1428, 224, 752, 232, 748, 224, 65180, 232, 888, 232, 2244, 220, 756, 228, 2788, 232, 1292, 228, 1292, 232, 1428, 224, 1844, 228, 14264, 232, 884, 224, 752, 232, 1836, 224, 752, 232, 1020, 224, 1436, 224, 752, 232, 744, 228, 16028, 228, 888, 232, 2244, 220, 756, 312, 2704, 224, 1300, 228, 1292, 232, 1428, 224, 1844, 228, 14264, 224, 892, 228, 748, 308, 1760, 224, 752, 232, 1020, 224, 1436, 228, 748, 224, 752, 228

RETURN:
Raw: (71) 224, 896, 220, 2252, 228, 752, 232, 2784, 224, 1300, 228, 1292, 224, 1436, 224, 1840, 232, 14264, 224, 888, 232, 1292, 224, 752, 232, 748, 224, 1028, 224, 1976, 232, 748, 224, 752, 228, 15520, 224, 892, 228, 2248, 228, 748, 228, 2792, 228, 1292, 224, 1300, 228, 1428, 232, 1836, 232, 14260, 232, 884, 224, 2384, 228, 1840, 232, 744, 228, 1024, 232, 1972, 220, 756, 228, 748, 224

i/PINFO:
Raw: (71) 224, 892, 228, 2248, 228, 748, 224, 2796, 224, 1296, 232, 1292, 224, 1432, 228, 1840, 228, 14268, 228, 884, 224, 1164, 228, 748, 224, 756, 224, 1024, 232, 2108, 224, 752, 228, 748, 228, 15464, 224, 896, 224, 2248, 228, 752, 232, 2784, 224, 1300, 280, 1240, 232, 1428, 224, 1840, 228, 14268, 228, 884, 224, 2252, 224, 1840, 232, 748, 224, 1028, 224, 2112, 232, 744, 228, 752, 228

2016年2月13日 星期六

[Locationfree] 製作紅外線遙控轉換器 IR translator LF-BOX1 Panasonic CATV/DVD 轉 Tivo

上一篇 [Arduino] 製作紅外線遙控轉換器 IR translate Panasonic 電漿電視轉 Kbro 凱擘 , 最近用同樣的原理製作了 LF-BOX1 的紅外線遙控轉換器, 把 LF-BOX1 所發出的 Panasonic CATV(1)/DVD(1) 紅外線碼轉換為 Tivo 紅外線遙控碼, 這樣可以讓 LF-BOX1/LF-PK20 的組合遙控原本不支援的 Tivo.

首先簡單說明一下 Sony LF-BOX1 和 LF-PK20 日版之間的使用關係, Locationfree LF-PK20 是 server 端, 可以將 AV 端子輸出的器材轉換成為網路串流, 讓使用者透過 Intranet 或 Internet 看電視. 由於 LF-PK20 是 server 端, 所以需要一個 client 端, 通常是安裝在 Windows 上的 Locationfree player 軟體. 除此之外, 對於日版 LF-PK20 (只有日版)還有另一種選擇就是 LF-BOX1 這樣的專屬 client 端設備, 它可以透過網路連接遠端的 LF-PK20 server, 並且透過 AV 端子輸出到電視上, 達成遠端看電視的目的. LF-BOX1 也是在 LAN 下輸出畫質最好的一個 Locationfree client.

連接關係是這樣:

Video Output path:
set-top box (ex. Tivo or Kbro) ---[AV]---> LF-PK20 ---[LAN/WAN]---> LF-BOX1 ---> TV

User IR Input path:
User press remote ---> LF-BOX1 ---[LAN/WAN]---> LF-PK20 ---> set-top box (ex: Tivo or Kbro)

事實上, LF-BOX1 中內建有和 Tivo 很接近的遙控碼可以使用, 但有缺點就是上下鍵會吐兩次 IR code 造成 Tivo 選節目的時候一次跳兩格, 相當惱人. 而且也不支援 Tivo 的數字鍵選台. 所以想透過製作紅外線遙控轉換器把某個 LF-BOX1 內建發出的 IR code 轉換成為 Tivo 紅外線碼. 這樣在遠端就可以遙控 Tivo 選擇節目或者選台.

IR 遙控路徑變成這樣:
User press remote ---> LF-BOX1 ---[LAN/WAN]---> LF-PK20 ---> Arduino IR Translator  ---> set-top box (ex: Tivo or Kbro)

我製作的 Arduino 轉換器就是串接在 server 端的 LF-PK20 和 LF-PK20 附帶的 IR 發送器 (IR emitter) 之間. 它的構造就是 IR Detector + IR Emitter.

轉換作用像這樣:

LF-BOX1 ---> LF-PK20 --- [Panasonic DVD(1) code] ---> Arduino IR Translator ---> [Tivo code]

我在 LF-BOX1 上面選擇的遙控碼為 松下 CATV(1) 和 DVD(1), 我曾試過 Sony 的 IR code, 但發現 Arduino 的 IRremote library 讀取 Sony IR code 作出的 hash code 會有碰撞的狀況, 也就是數個按鈕可能會抓到同一個 hash code, 造成無法判斷使用者按了哪個鍵. 另外, 使用 Sony 的過程有發現當 IR detector 和 IR emitter 寫在同一支程式中, 像我現在的應用就是需要同時使用 detector 和 emitter, 則 IRremote 寫出來的程式所發出的 IR code 會失敗. 至於原因我並沒有探究, 總之改為抓 Panasonic code 就 OK 了.

下面就是把 LF-BOX1 中的遙控碼設定為 Panasonic (松下) CATV(1) 另外次遙控器設定為 DVD(1). 會 mapping 兩組的原因是因為有時候給家中其他人使用如果不需要太複雜太多的功能, 用 CATV(1) 就可以了, 如果需要遙控或者快轉等功能則 DVD(1) 的按鍵比較多:


先用麵包板測試一下 LF-BOX1 的 IR emitter 座的腳位定義, 也就是故意將 LF-BOX1 附贈的 IR emitter 接到 Arduino 上面, 利用 Arduino 透過它發送 IR code, 如果用數位像機看到 IR LED 有亮起來, 就代表可以控制:

OK, 透過數位像機可以看到紅光, 代表 IR LED 有亮起來:

立體聲腳座的定義, 靠外側黑色是接地, 內側紅色是供電:

知道腳位定義後, 以相同的腳位把一顆 IR LED 焊接到立體聲座上:

另外這此我使用的 IR detector 是 VS-1838B:

我的 IR detector 接到 Arduino pin 12, IR emitter 接到 pin 3 (IRremote 的預設). 並且用一個零件盒裝起來. 當然要記得開三個洞, 一個給 IR LED, 一個 IR emitter, 然後是供電的 USB:

IR LED, 這端接到 LF-BOX1 上的 IR emitter 座:

近照部分電路與 USB 取電座:

硬體這樣就完成了. 原始的 LF-PK20 配置像下圖. 它附帶的 IR emitter 直接接到 IR 座. 事實上它可以接兩個 emitter, emitter 也可以自己做:


改為把我做的 IR translator 接到 LF-PK20 上, 然後 IR emitter 接到自製的 IR translator 上. 別接錯孔, 接錯動不了:

近照:

另一個方向, USB還沒有接電:

IR LED 端近照:

整體:

硬體這樣就完成了. 軟體部分已上傳 github:
https://github.com/smallbeetw/arduinosketch/commit/75a61430bfcdfcc47470b8a4cee575e6e0c1d2cf

下面是另一個試作品, 這個試作品是沒有用黑盒子把電路裝起來, 直接做了一個 IR LED 和 立體聲公頭 焊接在一起的 IR emitter, 插到 LF-PK20 上發射 IR code, 然後用另一個裸露的電路板接收, 這個做法堪用但比較差, 原因是因為接收器可能會接收一般其他遙控器的 IR code, 這樣比較耗電.

下面組圖就不解釋了, 有需要就參考著做, 只要腳位弄對, 插到 LF-PK20 上就可以使用. 我沒有串電阻, 如果需要可以串上;

注意腳位, 黑的接 LED 短腳, 紅的接 LED 長腳:



完成後插到 LF-PK20 上, 用數位像機確認:

2015年10月24日 星期六

[NETWORK] 用 QNAP TS-109 NAS 網路喚醒開機 GIGABYTE BRIX

通常不是很機車我不會寫 blog, 一定是很花時間才需要紀錄下來.

狀況是這樣, 我買了 GIGABYTE BRIX 4770R 作為家中的開發機器. 它體積小攜帶方便, 可以定點在辦公室, 實驗室或家中進行開發使用. 但是如果有時候忘了帶, 或者是臨時用用. 抑或是出國的時候不想帶. 臨時要開機就很麻煩, 若一直開著會有耗電問題. 所以今天想設定看看能不能讓 BRIX 網路開機. 想不到過程比我想的還麻煩.

BRIX 4770R 端的設定:

完全不需要設定, 預設 BIOS 就會把 wake on lan 的功能打開, 事實上 BIOS menu 中也沒有任何選項可以調整. 讓我找了一陣子. 我的 BIOS 是 2014 年底的 F6 版

不過後來發現, 這次造成卡關的真正元兇還是 BIOS, 4770R BIOS 的 Erp support 要關掉才能讓 wake-on-lan 功能在 shutdown 的狀態下能開機. 否則網路發動開機成功率很低. 可能是 Erp support 打開後 standby 在 LAN 的電力不足. 造成無法 100% 成功.

所以請看官同好若要設定 BRIX 網路開機, 一定要把 Erp support 先關掉.


另外就是確認你的 NIC 已經將wake on lan 功能打開, 在 Linux 下可以用 ethtool:

# ethtool enp3s0
Settings for enp3s0:
[...snip]
        Supports Wake-on: pumbg
        Wake-on: g
[...snip]

只要看到 Wake-on 設定為 g, 代表已經打開了. 若沒有打開請下:

ethtool -s enp3s0 wol g

或者 google 一下看你的 Linux 版本怎麼開比較好.


QNAP TS-109 NAS 端的設定:

為什麼會扯到 QNAP NAS 的原因主要是因為這是家中除了 router 以外會24小時開機的機器。 我的 router 很舊沒有支援 wake-on-lan 的界面, 也就是沒有發出 magic packet 的功能。 所以只能從 QNAP NAS 下手. 這台 TS-109 也很舊了. 有幾種方法可以讓它發出 magic packet.

第一種方法, 請安裝 wakelan 工具:

首先安裝  ipkg, 到 QNAP TS-109 的 Administration 介面中的 Applications >> QPKG Plugins 下安裝 Optware ipkg 的管理程式.

安裝好後記得將將它 Enable, Optware圖示會從灰色變成彩色.



接下來 ssh 進入 QNAP NAS, ssh 不會開請 google 一下. 用 admin 身份 ssh 進去之後, 下指令安裝 waklan tool:
    # ipkg install wakelan

安裝好之後打 wakelan command 應該可以看到 wakelan 能用了.  然後下:
    # wakelan -m MACADDRESS -b 192.168.1.255

MACADDRESS 是 BRIX 上的網卡的 Mac Address, Linux 下用 ifconfig, 可以看到很像: AA:BB:CC:DD:EE:FF 這樣的字串, 把冒號去掉打在 wakelan 後面就可以用.

下達如上的 wakelan 指令後應該就可以把 BRIX 從關機狀態下喚醒了.

第二種方法是用 python script 發出 magic packet, 程式的話如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 # wol.py
 #
 # This module is from ActiveState Code Recipes:
 # http://code.activestate.com/recipes/358449-wake-on-lan/
 # and patched for Python 3 with:
 # http://code.activestate.com/recipes/577609-wake-on-lan-for-python-3/
 #
 # Example:
 # import wol
 # wol.wake_on_lan('70:F3:95:15:00:B5')
 #
import socket
import struct

def wake_on_lan(macaddress):
    """ Switches on remote computers using WOL. """

    # Check macaddress format and try to compensate
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 12 + 5:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep,'')
    else:
        raise ValueError('Incorrect MAC address format')


    # Pad the synchronization stream
    data = b'FFFFFFFFFFFF' + (macaddress * 20).encode()
    send_data = b''

    # Split up the hex values in pack
    for i in range(0, len(data), 2):
        send_data += struct.pack('B', int(data[i: i + 2], 16))

    # Broadcast it to the LAN
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sock.sendto(send_data, ('255.255.255.255',40000))

import wol

wol.wake_on_lan('AABBCCDDEEFF')

以上範例來自國外網站, 我測過是可以跑的. 當然 AABBCCDDEEFF 請換成你自己的 Mac Address. 還有 QNAP 預設沒有裝 Python, 請一樣用 TS-109 NAS 的 Applications >> QPKG Plugins 介面把 Python 裝起來.

所以兩個方法來說, 都需要安裝 QNAP 的包, 不過第一種方法不用寫程式, 所以我推荐.

搞定 NAS 的 wakelan command 之後, 接下來就見仁見智了, 我一樣 google 了一下, 做了簡單的 php page, 來作為前端 UI, 方便自己按一下就下 wakelan 指令, 就不需要 ssh 進 NAS 了:

[/share/Qweb] # cat index.php

<?php
if ($_GET['wol-brix']) {
  exec("/opt/bin/wakelan -m AABBCCDDEEFF -b 192.168.1.255");
}
?>

<br><p>
<input type="button" value="Power On GigaByte BRIX" onclick="location.href='?wol-brix=true'">

要使用這個網頁請將 QNAP TS-109 的 web server 功能打開, 然後把 index.php 放到 /share/Qweb 目錄下這樣打入 NAS 的 ip 就可以看到網頁了, 按一下按鍵就可以把 BRIX 網路開機. 如何將 index.php 放到 /share/Qweb 目錄可以用 scp 或者 NAS 的介面 copy 到 Qweb 目錄下就可以了.
記得 index.php 中的 AABBCCDDEEFF 一樣改為您的 BRIX 的 NIC mac address.

開這個網頁要注意的是 QNAP TS-109 的 web server 沒有 SSL 功能, 所以安全性要有警覺. 儘量不要有太複雜的東西在網頁上, 以避免 hacking, 而且要承擔 QNAP TS-109 web server 和 php 可能的漏洞. 畢竟機器舊了已經沒有 update 了.

如果要遠端透過網際網路 access 這個網頁來達到開機, 我是在 router 上作 port forward, 把某個 port mapping 到 NAS 上的 80 port. 這樣記住自己家裡固網對外的 ip 和 port 號碼這樣就可以遠端用這個網頁把家裡的 BRIX 開機了. 然後 ssh 去遙控 BRIX 就可以開工了.

這些動作大約搞了半天時間, 主要時間花在 python 的撰寫和 debug, 但後來發現 BRIX BIOS 中的 Erp support 應該關掉才是 key point. 希望同好們不用再像我一樣卡關了.

目前快樂使用中, 人在外面的話只要有帶 Notebook 或者平板這些能夠 ssh 的工具, 用網頁把家裡的 BRIX 開機後就可以工作了, 很方便.

2015年7月25日 星期六

[Tivo] 在QNAP TS-109 NAS 上安裝 pyTivo server

很久沒發Tivo相關的文章了, 這次紀錄一下小弟_爆肝_安裝 pyTivo server的過程. 事實上後來才發現並不是 pyTivo讓小弟爆肝的, 請看後續的說明... 
 
- Tivo與NAS
 
一晃眼安裝和使用Tivo已經快5年了, 從以前錄製Discovery, 電影, 影集, 到現在我的小孩拿它來看多啦ㄟ夢, 一堆卡通長片直接錄下來給小孩看到爛. Tivo陪伴我看電視這些年來, 小弟對於它提供的電子節目表算是很滿意. 由於一直擔心在台灣的Tivo服務收掉(搞不好是杞人憂天), 所以在下是很規矩的每年都繳交保護費.
 
Tivo (time shift)錄製影集真是他x的好用, 配上LocationFree (location shift)更是所向無敵, 真是電視狂的終極武器.
 
好了, 虎濫完了,  
狀況是這樣, 小弟除了Tivo以外, 還有一台QNAP TS-109的NAS也是一樣服役很久, 我的 TS-109 平常提供我兩項服務:
    1. BT
    2. Tivo影片的server
 
原本我都是使用官方的Tivo Desktop軟體去拉 NAS 上用網路芳鄰分享出來的的folder, 但是它一直有幾項限制小弟想抱怨一下:
a. TGC Taiwan提供download的免費版的Tivo Desktop處理中文檔名沒問題, 但是無法支援網路芳鄰folder,
          所以沒辦法拉TS-109 NAS上分享出來的檔案.
b. 小弟還真的花大約800元台幣到Tivo原廠網站購買Tivo Desktop Plus for PC, 它可以支援網路芳鄰folder,
          但是處理中文檔名有問題, 基本上還堪用, 但那些錄下萊的電影檔名都要改英文, 頗麻煩.
c. 而且需要另外開一台Windows電腦來run Tivo Desktop去拉NAS理的東西, 很不環保, 而且喪失使用NAS的意義.
 
所以小弟趁著幫TS-109升級 1.5 T 硬碟, 而且更新firmware的同時, 就乾脆想把pyTivo裝上去一次搞定. pyTivo是python寫的一個Tivo come back server, 可以跨平台運行. 我run在NAS上效果還可以, 有圖有真相:
 
pytivo1 
 
tivo2 
上面兩張照片就是我用客廳的Tivo去拉在書房裡的NAS的影片實況. 使用pyTivo有幾個優點:
    - 對於中文檔名沒問題.
    - 可以同時存在多個 folder, 原廠的 Tivo Desktop只能有一個在一台電腦上.
    - 傳檔案的速度比原廠 Tivo Desktop 快. (純體感, 沒有實際測量時間) 
 
以下就是步驟, 有Linux經驗者尤佳 (其實很簡單拉!)
 
- 材料
+ QNAP TS-109 NAS (firmware Version 3.3.0 build 0924T) 
  + 80G Tivo
+ 一台有裝 Linux 的工作用電腦, 用來連到NAS, 或者是Windows電腦但是有裝SSH client, e.g. putty 
 
Sorry, 恕不保證其他的NAS, 因為小弟也只有hack過這一台. 不過如果你的NAS有開ssh而且能裝python and ffmpeg, 那應該都可以試試看. 只是請不要來問問題, 搞濫了也請責任自負, 小弟無法且沒時間幫你解決, Thank's
 
無論哪台NAS, 弄之前最好先備份你裡面裝的資料, 至於如果你真的把系統搞爛了, 我記得QNAP是 firmware 重裝就OK了!
資料! 還是你自己的資料比較重要! 
 
 
- 安裝 python
 
這個步驟最簡單, 點點選選就ok了. 請先login到 TS-109 的web管理介面裡面選 Administration > Applications > QPKG Plugins, 在該頁選 GET QPKG後請download python 套件包, 建議使用我用的 2.7 版.
Download 之後在Installation tab下選擇安裝那個套件包. 
 
接著確認你的ssh server有打開.
就是 Network Services > Remote Login > Allow SSH connection 有打勾. 
 
安裝python and enable SSH 後請 reboot TS-109 NAS.
 
 
- Download pyTivo
 
pyTivo wiki page: 
 
我用的是TheBayer's fork這個版本
http://repo.or.cz/w/pyTivo/TheBayer.git/snapshot/79fd85b2b5af79da8923cbb833f37fb08d11316a.tar.gz 
 
請相信我爆肝後的選擇, 不要使用wmcbrine's fork, 除非您有志投入開發 pyTivo 這個 Opensource project.

 
- 安裝 pyTivo server 
 
記得你有開ssh 嗎? 接下來請使用你的Linux電腦, 打開一個 Terminal:
copy pyTivo tarball 到 TS-109 的 qpkg folder, 像這樣:
 
scp TheBayer-79fd85b2b5af79da8923cbb833f37fb08d11316a.tar.gz  admin@192.168.1.11:/share/HDA_DATA/.qpkg
 
它會問你NAS的admin password, 如果你忘了那我也無言了. 
 
接下來請 ssh login 到 TS-109上, 類似這樣:
ssh admin@192.168.1.11
 
請解開 pyTivo tarball並改名 
# cd /share/HDA_DATA/.qpkg
# tar -zxvf TheBayer-79fd85b2b5af79da8923cbb833f37fb08d11316a.tar.bz2
# mv TheBayer pyTivo
 
 
- 設定pyTivo.conf
 
請copy一份pyTivo.conf提供自己修改:
# cd /share/HDA_DATA/.qpkg/pyTivo
# cp pyTivo.conf.dist pyTivo.conf
 
請您自行參考 pyTivo.conf 中的一些說明, 可以定義很多個share folder出來給Tivo使用.
類似這樣:
 
[電影]
type=video
path=/share/Public/Movies 
 
還有一個很重要的, 要指定ffmpeg的位置, 在我的QNAP NAS上是放在:
 
ffmpeg=/mnt/HDA_ROOT/ffmpeg/ffmpeg 
 
pyTivo.conf中其他的值都別改也可以用, 我就是這樣.
 
 
- 設定開機自動執行 pyTivo 
 
Sorry! 我不是QNAP的開發人員, 但是以下的設定對我有用, 可以開機自動執行pyTivo:
 
編輯 python.sh 
# vi /etc/init.d/python.sh
 
請找到  /bin/sleep 5, 在它的後面添加:
 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/HDA_ROOT/ffmpeg
/sbin/daemon_mgr pyTivo start "/share/HDA_DATA/.qpkg/pyTivo/pyTivo.py &" 
 
看起來會變成這樣:
 
        RETVAL=$?
        /bin/sleep 5
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/HDA_ROOT/ffmpeg
        /sbin/daemon_mgr pyTivo start "/share/HDA_DATA/.qpkg/pyTivo/pyTivo.py &"
        ;; 
 
- 爆肝之旅
別擔心, 接下來這個爆肝之旅你不用走, 我走就可以了, 先告訴你我爆肝後的結論, 很愚蠢的一個結論, 那就是: 
80G Tivo 內建的 Ethernet _疑似_不能接到 _太新的_ switch hub !?

狀況是這樣,
在我安裝pyTivo的時候, 我一直在使用的Asus無線ip分享器在時間上很巧合的掛掉了, 而Tivo一開始就是接到這台Asus分享器上並連接到intranet, 那個Asus機器起碼有五年以上, 當時我立刻換了一台DrayTek的有線分享器, 而且不以為意. 
後來在pyTivo安裝完成之後, 用Tivo直接去拉NAS裡面的影片, 發現一直沒辦法拉超過2個影片, 總是在拉第二個片子的時候Tivo的網路功能會掛掉, 而且會塞住我整個intranet. 我一直以為是software的問題, 所以花了數個晚上去trace pyTivo和整個 python 的 httpserver stuff.
 
就快要放棄的時候,
發現直接把Tivo和NAS接到種花電信小烏龜上面, 居然可以很順利的拉超過2片影片, 才開始懷疑是hub的問題, 接下來不斷的測試很多hub, 最後還是把Tivo接到一台滿老的SMC SMCWB14S-N2 無線ip分享器才解決. 我不是網路專門, 所以不知道這是什麼樣的靈異現象, 但是總之後來是好了. 
 
好像80G的Tivo現在也沒賣了, 希望新的Tivo沒有這樣的問題. 這個也要小小抱怨一下, 可能台灣市場太小, 人家老美都有好多種奇奇怪怪的Tivo可以選, 還可以直接看Youtube影片, 希望台灣這裡加油一下.
 
 
- 快樂使用中
 
接下來就跟一開始的照片一樣, 我關掉了windows機器, 直接用Tivo開始拉QNAP NAS上的影片, 當然僅限於不需要real time 轉檔的 mpeg2 和 tivo 檔案, 我沒測過其他需要轉檔的格式, 不過NAS上沒有已經編譯的tivodecode, 應該也是無法使用, 況且以NAS那麼弱的CPU, 應該會轉到死為止. 
 
到目前為止, 只能說非常滿意, 快樂使用中. 又一個opensource軟體強過於close source的例子!
 
我不是很會寫一些教學, 寫了之後才知道鳥哥的偉大, 以上給有使用Tivo的人參考囉! 


2017-11-19 update
最近買了 ZyXEL 合勤的 PLA5256 電力線設備, 發現台灣版的Tivo接到PLA5256上利用電力線上網也可以達成 SMCWB14S-N2 的效果. 在這邊紀錄一下.

2015年5月4日 星期一

[Tivo] Using AVerMedia ET111 to transfer the output of Tivo from AV to HDMI


I discovered the AVerMedia that hosts a activity to try their new product ET111. So I registered to be a volunteer for testing the quality to transfer the signal output from AV (Composite video connector) to HDMI. After two days testing, currently my comment is: easy for installation, quality of picture output is satisfactory. But I got a small problem.

This time the activity that's hosted by AVerMedia is for collecting world wide use cases of ET11X series. The target products of testing is ET110, ET111 and ET113. I registered to test ET111, it's a AV to HDMI transfor.

I got a box:

Open it:

I found there have a AVerMedia ET111 inside. The package of my received model is English package. There has "Video Converter AV to HDMI Format" wording on front side. Actually the "AV" means "Composite video connector":

Comparing the size of ET111 with pen:

It claim high compatibility, high quality and fewer distortions. For a transfer product, compatibility and fewer distorions are very important. If the transfer result out of the boundry of screen or out of shape. Then it not worth to check the quality of picture:

Back side, the same, it's Enlgish on package:

Here show the characteristic by different language, printed by Chinese:

Tn addition, There have specifictions on back side. Composite Video RCA input, USB DC input, HDMI output resolution: 480p 60 Hz / 576p 50 Hz:

System Requirements, need Composite and Audio Cable, HDMI cable and USB port for taking 5V power:

After open the plastic packaging, I saw the E111 device and a multi-languages guide:

The same, comparing the size of E111 device with pen:

The guide includes 15 different languages that includes Chinese, the Traditional Chinese guide as following. Looks very easy:

English guide:

The HDMI output is female port:

The input of AV line is also female port. You can see the length is not long by comparing with pen. That because it's in case you already have a long AV line. On the other hand, the USB input is male side:

The label behind ET111 has a label that shows model type and certificates:

Next is installation. My TV is a Panasonic plasma TV. There have HDMI, AV and USB port on the left side of my TV. That's very convenient for connecting to ET111 because those ports are close by Panasonic's design.

I collect the AV cable from Tivo to ET111, then collect ET111 to TV's HDMI port by HDMI cable:

And, ET111 need the 5V DC power from USB port. So connect ET111's USB male connector to TV's USB port:

Because my use case is transfer Tivo's AV output, so there have another way is connect ET111 to Tivo's AV and USB port in Tivo's back panel:

Like this. If you don't like the AV cable too long, you can buy 3 RCA male to male connector to transfer the ET111's AV port from female to male. Then you don't need a long AV cable:

Connect ET111's AV and USB cable to Tivo's port on back panel:

Connect HDMI cable from ET111's HDMI output port to TV's HDMI port:

The following video is the picture quality from Tivo's original AV output:

At the begging of the above video, I disconnect my ET111 with TV and connect the Tivo's AV cable to TV. Then playing video, first please looking at the yellow frame of blue selection bar on the Tivo's main page. Please note there have NO any shake on the boundary of yellow frame, but have shake from ET111 output.
Please comparing later's E111 video.

In the TV program, please check the face contour and hair of people, and the shadow below eyes. The picture quality from pure Tivo AV output is not HD, the contour looks fuzzy and easy to identify the blocks of color. Especially when the night scene, looking at the big black block can easy to find the bad quality. But, I think the main reason is because the quality of kbro TV box's AV output that's not really good. The kbro TV box processes the digital signal to avoid the water wave and noise from analog signal, but the presentation of color block doesn't good as analog signal. I thought kbro deliberately reduced the quailty from its AV output.

Anyway, please comparing the with the following output result from ET111 with Tivo, actually that doesn't have big difference. The picture quality and performance from ET111 HDMI output is not bad. I didn't see picture distortion or out of screen boundary. Comparing with pure Tivo output, the quality is not better or optimize. I think that because the bad video source from kbro TV box but not ET111's problem.

Here is the ET111 HDMI output with Tivo:

Looking at the 1:28 in the above video, there have shake on the yellow boundary of the selection bar on Tivo's main page. The shake situation didn't see on the picture of pure Tivo AV output. And, I didn't see shake when playing video on Tivo with ET111, only saw on Tivo's main page.

Then please back to the begging in the TV program in video, comparing the face contour, shadow with pure Tivo output. There doesn't have too many difference. ET111's HDMI output almost the same with Tivo's AV output.

The final topic is I got a random one second black screen problem. The following video is for presenting issue, please ignore the picture quality. (Smoking unhealthy):

Please note there have a first time "one second black screen" at 0:56-0:57, I fallback and replay the same fragments but I can not reproduce the same problem. Then at later 4:45-4:46 happened second time "one second black screen". That can not reproduce issue by playing the same fragments on pure Tivo AV output, I never saw the same situation. Due to ET111 is doing the ADC job to transfer analogy signal (AV) to digital signal (HDMI). So it's possible E111 parer one kind of analogy signal to be black screen.

After I found random one second black screen, I have played another 2 movies that recorded by Tivo. The total playing time from 4 to 5 hours, the situation happened again when I am playing "Ender Gaome". The problem was happened when I just turn on TV to play the movie, looks the problem does not relate to the length of playing time. It's also can not reproduce by replaying the same fragments. My summary is that has "one second black screen" problem but the fail rate is not too high per my experience.

So, if there still have idle AV port (Composite video connector) doesn't used on your TV, then direct connecting your player to AV port makes more sense. Because I think the ET111 doesn't give more picture quality improvement, it's unworthy to waste the power for transferring AV signal to HDMI by another device. But, if your TV only has idle HDMI port, then you should consider using ET111. Per my testing with Tivo, I didn't see picture distortion or  out of screen boundary, the output of ET111's HDMI doesn't have difference with the original AV output from Tivo.

Tivo's AV port may output a kind of analogy signal that causes ET111 parer it to be one second black screen. But the fail rate is not high. If you also got the same black screen problem with high rate, then you may need AVerMedia's help on this problem.