這次裝潢的時侯,主臥跟客廳都採用了電動窗簾。客廳採用電動窗簾,最主要的原因是怕傢俱、木作久了會變色,所以想說用了電動窗簾,設定 schedule 後,白天就可以自動把窗簾拉上,增加傢俱及木作的耐用度。

 

 

 

但是這款電動窗簾其實並沒有 schedule 的功能,只有一個無線遙控器,因此只好自己來了 XD

 

原廠附的遙控器質感還不錯,是採用磁吸式跟掛架結合

 

我使用了 OpenHAB + RM2 Pro +RM Bridge 來完成第一步。

 

第一步 - 用 RM Bridge 來控制窗簾

http://rm-bridge.fun2code.de/

原本的 RM2 Pro 就可以透過它的 App 就來控制窗簾了,但 App 並沒有提供任何 API 或者 HTTP command 讓我們透過程式去操作,因此我另外用了 RM Bridge 操作 RM2 Pro。

RM Bridge 本身就有提供 learning code 的介面 http://rm-bridge.fun2code.de/rm_manage/code_learning.html,你可以自己定義指令名稱,然後按下原本的遙控器讓他學習即可。下面則是窗簾、投影機及布幕等學習完的指令清單。接下來只要透過 URL 就可以去發射遙控器訊號了。

 

 

 

當然,RM2 Pro 本身也有提供完整的 SDK,所以其實要全部自己來,不透過 RM Bridge 也是可以的。

 

第二步 - 整合進入 OpenHAB

http://www.openhab.org/

OpenHAB 是我目前最喜歡的 home automation 平台,因為各式各樣的 binding 非常豐富,從常見的 Philips Hue, Sonos, INSTEON,到 DAIKIN 冷氣,SAMSUNG電視,甚至我的音樂撥放器 SqueezeBox 都有。而一般 RD 最喜歡看到的 HTTP,TCP也都一應俱全,而且如果覺得不夠,也可以自己再擴充,真的是夢幻逸品啊 XD

 

這裡我是使用 HTTP binding 來跟 RM Bridge 整合。OpenHAB 最困難的地方是它的設定檔,官方網頁開宗明義就有說:很難學,但是很值得 XD

 

首先要把它加到 OpenHAB 的 item 中,以我的環境為例:

/opt/openhab/configurations/items/demo.items

 

在最後面加入

Switch  Curtain           "Living Room Curtain"                   { http=">[ON:GET:http://192.168.11.5:7474/code/openit] >[OFF:GET:http://192.168.11.5:7474/code/closeit]" }

 

這樣就多了一個 type 為 Switch 的 Curtain 物件,並在 ON/OFF 時分別會送不同的 URL

 

接下來要在 sitemaps 中把這個 Curtain 加進去:

/opt/openhab/configurations/sitemaps/homekit.sitemap

 

sitemap homekit label="Diro HomeKit" {

  Switch item=Curtain label="Curtain"

  Switch item=Screen label="Screen"

  Switch item=Projector label="Projector"

}

 

接下來啟動 OpenHAB 後,就可以透過瀏覽器看到:

 

這樣就可以透過 OpenHAB 去設定 schedule 來定時開關窗簾了。

 

第三步 - 整合 HomeKit bridge

https://github.com/htreu/OpenHAB-HomeKit-Bridge

最後就是要想辦法跟 SIRI 做整合了,只能說 OpenHAB 實在太強大了,貢獻者眾,竟然已經有人寫好了 HomeKit Bridge!!

 

因此只要正確的啟動,就沒有問題了

npm start -- --name "myopenhab-bridge" --sitemap homekit

 

如果平常沒有在用 node.js 的,應該會缺很多 package,基本上補一補就沒什麼問題了

npm install --save-dev babel-preset-es2015

npm install --save-dev babel-preset-stage-2

npm install stdio

npm install hap-nodejs

npm install ws

 

 

 

npm install debug

...

 

接下來最重要的是要安裝 eve  來編輯 HomeKit database。打開 eve 後,就會有設定介面,並且可以找到 myopenhab-bridge 這個裝置,加進去之後,就可以看到下面所有的設備啦(Curtain, Projector, Screen...)

 

接下來就跟操作一般 HomeKit 的設備一樣了,設定房間、設備名稱等,然後就可以用 SIRI 來控制他們了 :)

 

 

示範影片:

diro 發表在 痞客邦 留言(11) 人氣()

之前在 2011 的時侯,磁磚收邊是用收邊條,但這次就改用切導角的方式來處理了,價格比較高,但做出來的質感也真的不一樣就是了。

 

邊邊角角還蠻多的,從窗框、浴缸、置物格、衛生紙盒等..這就會凹來凸去的全都要切導角,兩間浴室切起來還真是驚人Orz..

 

 

 

 

但是看到作品真的很感動啊!!!!

 

 

 

 

但是如果只是切導角,那也就沒什麼特別的了,這次還有一個很困難的。因為在浴室設計了不锈鋼架來支撐玻璃屏風,所以這個頂天立地的不锈鋼架,就對磁磚造成很大的挑戰了 XD

 

因為一開始磁磚加工時沒有考慮到,所以一開始師父就自己切割了,但是這個 9~12mm 的厚度....人類怎麼可能用手工具可以切的好 XDDD  所以貼上去後,就被我打槍了....

 

 

 

 

這時侯,只能靠機器切割了,所以又請磁磚廠商多加工了這兩片來。

 

第一片,挖個溝,這個感覺還好,難度應該還好,不過可以精準到小數點第二位,還是要拍拍手鼓勵一下。

 

 

第二片,切出一個 F 型,這片就高難度了,因為最邊邊那裡實在是很薄,很容易斷,我原本是想放棄的,跟廠商說不然就切一小塊來補就好,因為實在不容易,但是沒想到,他們竟然還真的給我完成了(驚!!)

 

敬請期待最終成果照 XD

 

最後補充一下,我覺得泥作師父的 幾何概念 + 手繪能力 真的是只能用神來形容了....這是泥作師傅畫給磁磚廠商的圖面:

 

 

 
 
 

 

 

 

 

 

 

 

 

 

diro 發表在 痞客邦 留言(0) 人氣()

在舊文 [DECO] 衛浴磁磚施工的艱辛過程 中寫了一些磁磚的心得,五年後,我又搬家了,這次的磁磚之旅,比上一次更加精彩

 

 

有一天,到新家看看裝修進度如何時,看到浴室貼了一半的壁磚時震驚了一下,因為...跟我想像中不一樣啊 Orz

當初3D圖沒有出這個角度的圖,所以我一直以為只有浴缸那面造型牆會用板岩磚,結果竟然連淋浴區也是貼板岩磚...

抱著不知什麼樣的心情,告訴了設計公司這件事,我說我覺得這樣貼不好看,結果...他們隔天竟然來拍了一張照,然後用電腦合成整面貼完後的樣子給我看。

 

設:整面貼起來看起來有沒有比較好?

我:沒有啊 XDD (雖然合成的技術很好,光影材質都很逼真...)

設:再補二張3D圖,一個是原始設計,一個是你想像的,看一看,想清楚哦..

我:嗯,我還是覺得我想像中的比較好看

設:好吧,我們敲掉重來..

 

心得:

1. 一定是我有拿敏捷開發給設計公司看的關係,所以 Sprint Review Meeting 發現客戶有意見 feedback,就立馬調整 XDD

2. 每天去現場走走也很重要,才能快速的 Inspect & Adapt,不然等到整個 Release 就麻煩大了 ><"

3. 工具很重要,如果有辦法讓客戶看到 prototype,不一定要先把東西真的做出來,但我還是第一次看到 3D 軟體這樣用的  :)

diro 發表在 痞客邦 留言(0) 人氣()

http://fwhacking.blogspot.tw/2011/03/signsrch-signature-scanner.html

http://aluigi.org/mytoolz/signsrch.zip

 

diro 發表在 痞客邦 留言(0) 人氣()

QML extension

 


 

For QML extension (inherits from QQmlExtension) , you have to place the custom QML extension into the qml folder in Qt installed directory (ex: /Users/diro/Qt5.3.0/5.3/android_armv7/qml).

Take the extension DiroComponent for example, then you should have a directory named /Users/diro/Qt5.3.0/5.3/android_armv7/qml/DiroComponent , and the libDiroComponent.so & qmldir should be put in the directory, too. Finally, the androiddeployqt tool will pack this custom QML extension into the APK file for deploying. 

For the underlying detail, the androiddeployqt will rename the .so file into libqml_DiroComponent_libDiroComponentExtension.so, and copy it into build_dir/android-build/libs/armeabi-v7a (Actually, all the native .so shared library are placed here)

Now you can enjoy your QML without any modification.

 


 

QML extension (inherits from QQmlExtension) 的作法比較特別,你必需把你的 QML extension 乖乖的放到 qt 安裝目錄中的 qml 資料夾(ex: /Users/diro/Qt5.3.0/5.3/android_armv7/qml)。例如你有個 extension 叫做 DiroComponent,那麼你就會有個
/Users/diro/Qt5.3.0/5.3/android_armv7/qml/DiroComponent 資料夾,並在裡頭放著你的 .so & qmldir,這樣子 androiddeployqt 就會把你的 QML extension 打包進 APK 中。

打包的細節部份,他會 rename 你的 .so,變成 libqml_DiroComponent_libDiroComponentExtension.so ,並放進 build_dir/android-build/libs/armeabi-v7a 裡頭(其實所有的 .so 都會被放在這,包含 implicit&explicit link 的 shared library)

這樣子你就可以在你的 QML 中快樂的使用這些 extension ,不需要做任何更改。

diro 發表在 痞客邦 留言(0) 人氣()

在很多時侯我們會用到自己開發的Plugin,但是在Android平台上要如何才能載入呢?

重點在於要把要被載入的plugin (.so) 放在正確的資料夾

build/android-build/libs/armeabi-v7a

這樣就可以正確被load到了。

 

但如果有些 plugin 是在其它 project 中預先 prebuilt 好的,那麼要怎麼樣包進來呢?

作法1 - ANDROID_EXTRA_LIBS

基本上這是最標準的用法,如果沒什麼問題,只要把你會用到的lib (.so) 加進這個變數即可

http://qt-project.org/doc/qt-5/deployment-android.html

 

作法2 - Custom Process Step

你必需在 project 中新增一個 Custom Process Step,在 androiddeployqt 打包之前把 .so 放好,以便一並併入 .apk 中。

[Make install]

[Custom Process Step]

cp xxx.so build/android-build/libs/armeabi-v7a/xxx.so

[Deploy Configurations]

diro 發表在 痞客邦 留言(0) 人氣()

新版的QtQuick已經改用QQmlApplicationEngine取代原本的viewer class,因此要取得application的snapshot作法也不大相同:

class SnapshotMgr

{

void getSnapshot(void);

QQmlApplicationEngine m_pEngine;

}

void SnapshotMgr::getSnapshot(void)

{

if(!m_pEngine)
return-1;

foreach(QObject*obj,m_pEngine->rootObjects()){
QQuickWindow*window=qobject_cast<QQuickWindow*>(obj);
if(window){

QImageimage=window->grabWindow();
image.save("./test_screenshot.jpg");
qDebug()<<image;
}
}
return0;
}

diro 發表在 痞客邦 留言(0) 人氣()