---
# System prepended metadata

title: 裝置整合
tags: [公司架構]

---

## 裝置整合筆記
### 使用方法
common專案中DeviceModelTest.java可以檢查哪些東西需要更新
```
	@Test
	public void testINMA11() {
		DeviceModel deviceModel = DeviceModel.INMA11;
		checkDeviceHasAttr(deviceModel);
		genAttrMappingTable(deviceModel);
		genZhTw_I18nKey(deviceModel);
		genApplicationContextImport(deviceModel);
	}
	
```
### 方法說明
* checkDeviceHasAttr
檢查目前尚無新增的資料屬性，如無資料，代表以新增完畢，如有資料就根據裝置類型放在對應。
先執行**genZhTw_I18nKey**可自動產生中文註解。
例：如下例裝置類型為Sensor：
    - attr
    放在org.iii.ems.domain.vo.device.eda.Sensor.java。
    ->增加屬性、建構子。
    - contructor
    org.iii.ems.service.device.eda.impl.SensorServiceImpl.java。
    ->貼到setDeviceData這個方法下面
    - info
    org.iii.ems.domain.attr.deviceinfo.SensorInfoAttr.java
    ->按照數字順序貼上屬性

可參考 [[資料定義-需公司內網開啟](https://sites.google.com/insynerger.com/19435/devices/in21209?authuser=0)]
![image](https://hackmd.io/_uploads/HyqzVPLJye.png)

- genAttrMappingTable
會根據數值定義(註1)取得屬性對應SQL，要更新到ATTRID_MAPPING資料表中。
(可看資料定義中"型態"欄位)
如資料屬性為"設定屬性"，屬性代碼較長且為5開頭 SQL新增QUERYTYPE = 5 一筆資料。。
一般資料屬性若為純profile即時屬性，SQL新增QUERYTYPE = 1、4 兩筆資料。
一般資料屬性若為有info歷史屬性，SQL新增QUERYTYPE = 1、2、4 三筆資料。
->此資料要開remine單加到資料庫中

- genZhTw_I18nKey
可自動產生i18n語法。
src/test/resources/DeviceModelTestAttrNameMap.txt 
可透過(註2)複製屬性與中文名稱複製到字典檔DeviceModelTestAttrNameMap.txt 中。


>[!Note]
**註1：**
![image](https://hackmd.io/_uploads/SJXH1II1ye.png)
如上圖未出現數值定義，需於googleDrive自行查詢，查詢如下：
[裝置屬性-需公司內網開啟](https://drive.google.com/drive/folders/0ByvIItSN14r7Y2Y2VW9idHkxZWs?resourcekey=0-jI7S9i_Msldjm7pGbf_Phw)
![image](https://hackmd.io/_uploads/HJEAeII11l.png)
![image](https://hackmd.io/_uploads/B1szWU8J1l.png)
**註2：**
[IN21209資料定義](https://sites.google.com/insynerger.com/19435/devices/in21209?authuser=0)
![image](https://hackmd.io/_uploads/SkuqguIJkg.png)

- genApplicationContextImport
產生i18n ContextImport語句。
:::info
ex.
<value>i18n/deviceAttribute/INMA11/messages</value>
:::
複製在InEms1.0.0 src/main/resources/applicationContext.xml


:::warning
**InEcMessages**中加入該裝置的名稱i18n.deviceType的properties及i18n.deviceAttribute下對應的的裝置擴充類型碼(ex.i18n.deviceAttribute.IN11)
:::


:::warning
 InEMS打包前 記得先在**common那包程式執行**
 ![image](https://hackmd.io/_uploads/rkaYpVq11x.png)
:::


## - 最後確認步驟
:::success
執行下列步驟直至ec2501確認屬性是否都有綁成功
:::

### 1.新增閘道器（ec0501）

### 2.新增虛擬資料(以電表為例)
#### - 建假資料
透過POSTMAN來執行。
API網址：https://t-infactory.insynerger.com/cs/device/data/
CServer API文件參考： [裝置資料回報](https://docs.google.com/document/d/1QnzDL1ZLIiM6kc9YZIO_BQRUQo5IG9qhN2q7eQ8uTMw/edit#heading=h.12nuhsmqq1rk)
步驟:
(1)方法選POST，
(2)在Body中貼上->
```
{
    "gatewayId": "INC8----YCTEST------",
    "requestSn": "sn_{{now}}",
    "gatewayPw": "YWJjMTIz",
    "deviceList": [
        {
            "deviceId": "IN11-1156-----------",
            "parentId": "INC8----YCTEST------",
            "typeId": "1156",
            "reportBlock": {
                "reportTime": {{now}},
                "attrList": [
                    {
                        "attrId": "501200",
                        "value": "20.20"
                    },
                    {
                        "attrId": "500900",
                        "value": "8.4"
                    }  
                ]
            }
        }
    ]
}

```
(3)在Scripts中貼上->
```
var now = new Date();
postman.setEnvironmentVariable("now", now.getTime());
```
:::info
(1)  gatewayId
要選擇這個模擬裝置要放在哪個gateway底下，如果需要新建gateway可以到測試機的ec0501。
(2)  requestSn、reportTime
傳入當下時間戳，也可以輸入指定過去時間。
(3)  gatewayPw
固定用”ABC123”的base64編碼 = YWJjMTIz
(4)  deviceList
要新增的裝置列表，可以一次新增很多個。
(5)  deviceId
要新增的裝置Id，規定的命名方式為前兩個英文字母為裝置廠商的縮寫(EX：IN是思納捷、II是資策會)，但目前大多都使用IN(命名規則是其他組決定的)，第三、四位的數字需要跟裝置類型相同，後面隨意。
可以參考：https://sites.google.com/insynerger.com/portal/%E6%96%87%E4%BB%B6%E5%BA%AB/device-model
(6)  parentId
指的是deviceId的上一層，EX：設備"IN11-1156-----------"的上一層為gateway"INC8----YCTEST------"，所以"IN11-1156-----------"的parentId就是"INC8----YCTEST------"，
大部分時候parentId都跟gatewayId相同，但有例外是多迴路電錶，多迴路電錶可能會是gateway底下有一個總表，總表底下在有一個裝置，這時候裝置的parentId就會是總表，總表的parentId就會是gateway。
(7)  typeId
裝置類型的「裝置擴充類型碼」
(8)  reportBlock
假資料的內容，可以一次新增多筆。
(9)  attrList
裝置的「屬性代碼」
(10)  value
要新增的值。
:::
(3)在Scripts中貼上
```
var now = new Date();
postman.setEnvironmentVariable("now", now.getTime());
//是前面body中的now變數，接著就可以send。
```
#### -到DB檢查資料
[ERM](https://docs.google.com/document/d/13QYOJjS4ltlaafbOKn3XfxIiqJapPfZVnqsPBedHbrM/edit)
- DeviceList是裝置列表，可以下指令檢查剛剛新增的裝置有沒有進去
- MeterCircuit是裝置設定
- MeterProfile是即時資料
- MeterInfo是歷史資料
CServer將gateway的資料存到DB時會存到兩張表，分別是3即時資料、4歷史資料，即時資料表會以更新的方式儲存最後一筆資料，歷史資料會新增最新一筆資料。
```
select * form devicelist where devicetype='1156'
select * form meterprofile where dcid=52444
select * form meterinfo2 where meterid=18354
```
#### -刷新gateway資料
每一個裝置都要綁定在一個gateway底下，gateway和裝置需要被設定在同一個場域系統才抓的到，所以要到「閘道器管理」（ec0501）刷新gateway資料，更新完後就可以在「裝置列表」（ec2503）找到新建的資料。
#### -驗證資料功能
1. 裝置看板 (EC2501)-是否有所有屬性
2. 裝置管理 (EC2503)-是否有此裝置
3. 事件設定 (EC1401)-可選擇參數種類是否有新增之屬性
4. 基本資訊分析 (EC0425)-可點擊屬性列表確認是否有新增之屬性
5. 裝置歷史資料 (EC1608)-可點擊屬性列表確認是否有新增之屬性，並查看剛新建的資料



## 閘道器設置方法
- 連接完電腦及閘道器後進入
http://192.168.5.254/zigbee_properties.asp
帳密admin / admin
- 閘道器設定連CServer網頁
![image](https://hackmd.io/_uploads/rJ27KNAykl.png)
-要讓所有裝置都在這綁定完再去平台(https://t-infactory.insynerger.com/)新增
-ec0501 新增 GW

[命名規則](https://docs.google.com/presentation/d/1TjF3E1Nvj_N94jzbtklDY1TKkyPaeUpSaLd9seMITgE/edit?pli=1#slide=id.p)
![image](https://hackmd.io/_uploads/ry1tYNCkJe.png)
BN90(廠商代碼+裝置類型) 0004ed + FFFE(固定的) +   d82f64
-ec0503可以控制電力計開關
-ec0701看電力計歷史資料 

-若電腦設置固定IP，可透過GW去遠端控制此內所有IP的東西