2012年11月14日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(程式碼下載、使用說明篇)

上一篇解說了JNX-2000D的USB無線接收器和PC間的溝通方式以及測電器的資料表示方式,
這一篇我將我寫好的程式、程式碼和使用方式附上。

程式介紹:
整份程式包含3支程式,2支C程式,1支php的程式,分別是:

  • jnx2000_meter.c
  • jnx2000_monitor.c
  • meter.php
jnx2000_meter.c:
USB無線接收器的讀取程式,它根據前一篇的流程將測電器數據讀出後,
將數據寫到Linux的SHM(ShareMemory)當中,並持續更新。
為了能同時支援多台JNX2000D的USB無線接收器,
每個Channel Number會使用獨立的SHM Key,例如:
Channel 0時,SHM Key為70248070
Channel 1時,SHM Key為70248071
.....
依Channel Number增加使用不同的SHM Key


jnx2000_monitor.c:
Linux Console的測電器資訊顯示程式。
程式執行時,要帶入測電器的Channel Number,
如果SHM Key存在(jnx2000_meter讀取程式正常執行),
就會在終端機中顯示目前的測電器資訊。
畫面如下:


















meter.php:
Linux PHP Web版的測電器資訊顯示程式。
直接透過網頁可以讀取到Web Server的測電器資訊,
Web URL同樣要帶入測電器的Channel Number。
畫面如下:















編譯方式:
jnx2000_meter.c:
jnx2000_meter.c的編譯非常簡單,直接如下即可產生jnx2000_meter:
gcc -o jnx2000_meter jnx2000_meter.c

jnx2000_monitor.c:
jnx2000_monitor.c編譯時要稍微注意一下,
jnx2000_monitor的Console繪圖,是使用ncurses這個library,
因此編譯前要先確定有安裝libncurses5-dev這個套件。
在Debian/Ubuntu下,如下安裝:
apt-get install libncurses5-dev

確定有ncurses的library後,如下執行即可產生jnx2000_monitor:
gcc -o jnx2000_monitor jnx2000_monitor.c -lncurses


使用說明:
jnx2000_meter:
jnx2000_meter使用前要注意幾點:

  1. USB無線接收器的USB要確定插在Linux電腦上,且要確定ttyUSB有抓到
  2. 要確定USB無線接收器是開機狀態(有數值顯示),因為它有省電保護,一段時間沒有和PC通訊,就會自動關機。
  3. 操作順序必須是,先開USB無線接收器,確定有開機,再執行jnx2000_meter。如果先執行jnx2000_meter,是抓不到USB無線接收器的

按照上述幾點,操作順序如下圖:

執行方式如圖片所示,輸入
jnx2000_meter
例如:jnx2000_meter /dev/ttyUSB1&
例如:jnx2000_meter ttyUSB1&


成功取的測電器資訊,會如圖片一樣顯示:
JNX-2000D Channel=9
Share Memory Key=70248079


這就表示jnx2000_meter成功執行中。
最後面記得加上&,讓它在背景執行。

jnx2000_monitor:
jnx2000_monitor使用相對簡單些,要注意的是:

  1. 要確定ncurses library有安裝,在Debian/Ubuntu下可以安裝libncurses5
    apt-get install libncurses5
  2. 必須要先執行jnx2000_meter,才可以執行jnx2000_monitor
要執行jnx2000_monitor,要先知道Channel Number,知道後,如下執行:
jnx2000_monitor <Channel Number>
例如:jnx2000_monitor 9


meter.php:
php版的meter.php功能和jnx2000_monitor相同。
要使用它,首先將meter.php放在php可以執行的Web路徑中,
以我這邊為例,我的Web路徑在
/var/www/

將meter.php放入/var/www/中,之後Web URL輸入如下:
http://192.168.1.6/meter.php

成功了會看到下面的畫面:














此時同樣的,根據Channel Number,在網址列加入Channel Number,
在這裡,我使用的Channel是9,加上:
http://192.168.1.6/meter.php?channel=9

即可出現下面畫面:















SHM資訊:
jnx2000_meter會將測電器資訊寫入SHM當中,
如果要在其他程式中使用SHM資訊,直接讀取即可使用,
SHM的資訊如下:

  1. 每個Channel Number會使用獨立的SHM Key,例如:
    Channel 0時,SHM Key為70248070
    Channel 1時,SHM Key為70248071
    .....
    依Channel Number增加使用不同的SHM Key

  2. SHM結構如下:
  3. typedef struct power_meter_string_data PowerMeterStringData;
    struct power_meter_string_data
    {
            char voltage[10];
            char current[10];
            char quantity[10];
            char duration_days[10];
            char duration_hours[10];
            char duration_mins[10];
            char factor[10];
            char wattage[10];
            char reserve[60];
    };
    所有資訊都使用char表示,並且均為10個字元(含字串結尾),
    最後面包含保留空間60個字元。


程式碼下載:
程式碼與程式

2012年11月13日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(流程、格式說明篇)

延續上篇的JNX-2000D介紹,這篇正式來po出Linux的讀取程式。
如果對程式流程和內容沒興趣,可以直接跳過本篇,看下一篇下載程式和使用說明。

JNX-2000D的USB無線接收器,實際上只是USB to RS-232,將它插到Linux電腦後,
一般來說就能抓到pl2303的USB to serial port裝置,從dmesg顯示如下:
[ 18.283060] usb 3-1: pl2303 converter now attached to ttyUSB1 
[ 18.283090] usbcore: registered new interface driver pl2303 
[ 18.283092] pl2303: Prolific PL2303 USB to serial adaptor driver 

正常來說,大多會抓到ttyUSB0,如果跟我一樣已經有一個USB to SerialPort裝置,
它就會是ttyUSB1...之後遞增。

USB無線接收器它在連接到電腦後,按下面的流程先進行初始化:


這段流程完成後,PC和USB無線接收器就會完成初始化,接著按下面流程,
即可取出測電器資訊:

這裡注意到一點,當第一次送出0x64 0x63後,收到的第一筆測電器資訊是獨特的,
它類似如下:
A2 09 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

這裡的09表示使用Channel 9,同樣的如下:

A2 0A 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
這裡的0A表示使用Channel 10。


其他正常的測電器資訊,格式我看起來有3種,
每種都是29個bytes,區別在開頭,有0A、0B、0C這3種。
這3種資訊,有部份資訊是相同的,部份資訊不同。
這部份我認為一開始設計為0A,後來欄位不夠了,就以0A為基礎改為0B,
再來又加上0C,因此有些欄位在0A、0B、0C都表示相同資訊,有些則不同。
我總共提取了如下6項資訊:

  1. 消耗瓦數
  2. 使用電壓
  3. 消耗電流
  4. 功率因數
  5. 花費度數
  6. 持續測量時間

花費金額的部份我沒有設定,因此都是0,看不出來是哪幾個欄位,其他上述資訊如下:
消耗瓦數:
0A、0B、0C都有,類似如下:
0A 00 00 01 04 08 xx xx xx xx xx
00 00 01 04 08表示消耗瓦數為: 0014.8W

0C 00 00 00 03 02 xx xx xx xx xx
00 00 00 03 02表示消耗瓦數為: 0003.2W

使用電壓:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx 01 01 02 07 xx xx xx xx
01 01 02 07表示電壓為: 112.7V

0C xx xx xx xx xx 01 01 02 09 xx xx xx xx
01 01 02 09表示電壓為: 112.9V

消耗電流:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 00 02 05
00 00 02 05表示電流為: 00.25A

功率因數:
0A、0B都有,0C沒有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 05 01 01
00 05 01 01表示功率因數為: 051.1%

花費度數:
0A有,其他都沒有,類似如下:


0A xx xx xx xx xx xx xx xx xx 00 00 03 03 02 07 01 02
00 00 03 03 02 07 01 02 表示度數為: 0033.2712度



持續測量時間:
持續時間比較麻煩,它由2部份組合而成,分別是
  • 天數
  • 小時分鐘
小時分鐘:
0B有,其他沒有,類似如下:
0B xx xx xx xx xx xx xx xx xx 03 08 00 01 00
03 08 00 01 00表示: 01h 38m (小時和分鐘倒過來放置)

天數:
0C有,其他沒有,類似如下:
0C xx xx xx xx xx xx xx xx xx 00 00 03 01 00
00 00 03 01 00表示 31天(0031)

最後一點,它每筆資料的結尾2 bytes相加均為D0,用來做結尾表示,例如:
0C C4 (0C + C4 = D0)
11 BF (11 + BF = D0)

JNX-2000D測電器(PowerMeter)介紹

這系列其實是遲來的文章。

今年夏天,台電調漲電費,很自然的就有不少人對測電器這類PowerMeter很有興趣,
其中mobile01的便宜電力計心得分享介紹了幾款容易買到且價格便宜的測電器,
而這次要介紹的主角,就是其中提到的JNX-2000D,特別提到它除了是因為我有買來用之外,
最重要的是,它提供連接電腦的功能,可以讓我們將電力的消耗量直接數位化,
可以在電腦中進一步統計,甚至像是把它放上網頁,動態的更新即時的耗電量,
甚至繪製成一段時間的耗電圖表。

JNX-2000D硬體分為2個部份,分別為

  • 測電器本身
  • USB無線接收器

在這裡,我就直接借用mobile01的venon大大拍的照片(已授權使用):
測電器本身
測電器正面
測電器背面




















USB無線接收器
USB無線接收器正面
USB無線接收器背面




















USB接頭則在側面,如下圖:
USB無線接收器USB接頭








這款測電器,它因為能夠連結電腦,
所以它另外提供了Windows的軟體,
軟體照片如下,同樣是mobile01的venon大大抓的圖:




注意到,它左邊深灰色和咖啡黃的部份,就是它即時從測電器抓到的目前資訊。
上面Signal後面的5,則是它的頻道號碼。

這款測電器買來後,我最不滿意的部份,就是它程式感覺很鳥,又沒有提供API,
最重要的是,沒有提供Linux的程式,
因此,我花了些時間將它的RS-232信號抓出來(它實際上是USB to RS-232),
寫出了Linux的讀取程式。

這部份我會在下篇po出。

新20年期儲蓄險之我見


最近很多保險公司在推20年期複利儲蓄險,當然網路上有些人有些看法,
但我想提個我自己的看法,由流動性為出發點提出我對這保單的想法。

這種20年期儲蓄險通常如下:
前6年利率很低,約0.8%~0.9%,
第7年開始利率用2%~3%計算,
複利滾入直到領回。

我從流動性想到個有趣的觀點,試想:
1. 正常人,一筆錢放著不動,6年算長嗎?能持續6年嗎?
如果不能,那麼顯而易見的,保險公司可以用超低的利率跟你借這筆錢,
並跟你賭,6年內你會領回,你領回了,保險公司還現賺30%(6年內領回,只能領回約70%)

2. 非常有恆心毅力的人,一筆錢放著不動,就一直放到老....直到.....世界末日......
如果今天遇到個有恆心的人,他真的按照遊戲規則一直把這筆錢存放在保險公司,
那麼問題來了,這筆錢,是保險公司的?還是這個人的?
這問題怎麼說?
想看看,當你為了第7年開始的高額複利,因此把錢放在保險公司不動,
你想著高額利息,因此一直放著不領,那麼利息對你來說,是現金,還是紙上富貴?
我們反過來想,當這樣的人為了高額利息持續放在保險公司,
對保險公司而言,這筆錢幾乎等於送給保險公司,因為你不領,錢永遠都是保險公司的。

再想看看,保險公司規劃的複利通常為2.x%,那其實也只是略高於長期平均的定存利率,
考慮到大部分人6年內會解約,少部份人一放就不領了(很多八成忘了這筆錢),
剩下來一點點人,給他平均的定存利率,
這對長年投資股市、房地產...等賺高額股息、房租的保險公司而言,
根本是穩賺不賠的生意,再加上這種保險,無解約時間,那可以假設大額資金的解約時間其實不同,
那麼對保險公司的現金流量影響其實很小,怎麼看都覺得對保險公司合算。