/* 自定義代碼塊樣式 */
顯示具有 Homekit 標籤的文章。 顯示所有文章
顯示具有 Homekit 標籤的文章。 顯示所有文章

2019年4月25日 星期四

新增 PM2.5 Homekit 裝置

markdown

手上買了一個Sharp GP2Y1010AU0F PM2.5的感測器,就只在買來的當下用UNO測試了一下,嗯~~可用,就收起來了,一直到這次要整合在一個能夠顯示時間又有Homekit功能的系統板上(暫且稱它為家庭顯示中心吧),才又把它拿出來了。

把UNO的code  Ctrl+C、Ctrl+V到ESP32下,理論上應該是沒問題的,所以就做啦,只把Delay的部分修改為vTaskDelay,因為我是採用ESP-IDF + RTOS + Arduino 的平台,Flash完,怎麼收到的電壓都是0V,用VR分壓測試,A/D沒問題啊,怎麼沒收到GP2Y的電壓,換回UNO,一切正常啊,甚麼問題???

好,Hardward沒問題,Firmware我只修改Delay,問題不會就在這吧

沒錯,在UNO下的Delay是
delayMicroseconds(280)
ESP32是
vTaskDelay(280/portTICK_RATE_MS)
這可是差1000倍呀!!

既然在ESP-IDF下已經有支援arduino的套件,那就在這裡也改用delayMicroseconds函數吧,應該不至於影響整個系統太多,畢竟我還有其他task在執行

compiler...  flash... run... ,Yes~ got it ,讀到值啦,那就繼續往下一步去,增加到Homekit裝置

新增Homekit裝置時,都需要滿足Apple的servicecharacteristics定義,但因為我不是ios developer,所以也不知道定義的方式為何,不過沒關係,網路上很多神人的,下面就有一個 characteristics.h 的定義檔可以參考

characteristics.h

用一個開關當範例說明 (參考characteristics.h)

在SERVICE中需要的的是ON這個Characteristics
NAME就列為選項,可有可無了

/**
 Defines that the accessory contains a switch.
 
 Required Characteristics:
 - ON
 
 Optional Characteristics:
 - NAME
 */
#define HOMEKIT_SERVICE_SWITCH HOMEKIT_APPLE_UUID2("49")


ON這個Characteristics的定義如下

(第6行).permissions中有read、write與notify三個函數
(第9行).value中描述值為BOOL

所以我們共要有三個函數加一個BOOL值

#define HOMEKIT_CHARACTERISTIC_ON HOMEKIT_APPLE_UUID2("25")
#define HOMEKIT_DECLARE_CHARACTERISTIC_ON(_value, ...) \
    .type = HOMEKIT_CHARACTERISTIC_ON, \
    .description = "On", \
    .format = homekit_format_bool, \
    .permissions = homekit_permissions_paired_read \
                 | homekit_permissions_paired_write \
                 | homekit_permissions_notify, \
    .value = HOMEKIT_BOOL_(_value), \
    ##__VA_ARGS__

回到程式碼中,(第13行)struct hap\_characteristic switch1[]中
switch\_state 就是.value的 BOOL 定義,true 就是switch on,false即為switch off
switch1\_read、switch1\_write與switch1\_notify 就分別是三個函數啦
void *accessory_object = hap_accessory_add(acc);
    struct hap_characteristic cs[] = {
        {HAP_CHARACTER_IDENTIFY, (void *)true, NULL, identify_read, NULL, NULL},
        {HAP_CHARACTER_MANUFACTURER, (void *)MANUFACTURER_NAME, NULL, NULL, NULL, NULL},
        {HAP_CHARACTER_MODEL, (void *)MODEL_NAME, NULL, NULL, NULL, NULL},
        {HAP_CHARACTER_NAME, (void *)ACCESSORY_NAME, NULL, NULL, NULL, NULL},
        {HAP_CHARACTER_SERIAL_NUMBER, (void *)"0123456789", NULL, NULL, NULL, NULL},
        {HAP_CHARACTER_FIRMWARE_REVISION, (void *)"1.0", NULL, NULL, NULL, NULL},
    };
    hap_service_and_characteristics_add(acc, accessory_object, HAP_SERVICE_ACCESSORY_INFORMATION, cs, ARRAY_SIZE(cs));


struct hap_characteristic switch1[] = {
        {HAP_CHARACTER_ON, (void *)switch_state,NULL, switch1_read, switch1_write, switch1_notify},
    };
    hap_service_and_characteristics_add(acc, accessory_object, HAP_SERVICE_SWITCHS, switch1, ARRAY_SIZE(switch1));

switch1\_read、switch1\_write與switch1\_notify 三個函數範例程式如下

void *switch1_read(void *arg)
{
    return (void *)switch_state;
}

void switch1_write(void *arg, void *value, int len)
{
    switch_state= ((int)value) ? true : false;

    if (switch_state)
        LED_ON();
    else
        LED_OFF();

    if (_switch1_ev_handle)
        hap_event_response(acc, _switch1_ev_handle, (void *)switch_state);
    return;
}

void switch1_notify(void *arg, void *ev_handle, bool enable)
{
    if (enable)
        _switch1_ev_handle = ev_handle;
    else
        _switch1_ev_handle = NULL;
}



好了,進入主題了,新增PM2.5的Homekit裝置

當我們要使用 air quality 時,需要AIR\_QUALITY的Characteristics,PM2\.5(PM25_DENSITY) 則是列為選項

/**
 Defines that the accessory contains a air quality sensor.
 Required Characteristics:
 - AIR_QUALITY
 
 Optional Characteristics:
 - NAME
 - STATUS_ACTIVE
 - STATUS_FAULT
 - STATUS_TAMPERED
 - STATUS_LOW_BATTERY
 - OZONE_DENSITY
 - NITROGEN_DIOXIDE_DENSITY
 - SULPHUR_DIOXIDE_DENSITY
 - PM25_DENSITY
 - PM10_DENSITY
 - VOC_DENSITY
 - CARBON_MONOXIDE_LEVEL
 - CARBON_DIOXIDE_LEVEL
 */
#define HOMEKIT_SERVICE_AIR_QUALITY_SENSOR HOMEKIT_APPLE_UUID2("8D")

來看看 AIR\_QUALITY 的Characteristics
.permissions 列出 read與notitfy
.value 是 0, 1, 2, 3, 4, 5,共六個有效值

#define HOMEKIT_CHARACTERISTIC_AIR_QUALITY HOMEKIT_APPLE_UUID2("95")
#define HOMEKIT_DECLARE_CHARACTERISTIC_AIR_QUALITY(_value, ...) \
    .type = HOMEKIT_CHARACTERISTIC_AIR_QUALITY, \
    .description = "Air Quality", \
    .format = homekit_format_uint8, \
    .permissions = homekit_permissions_paired_read \
                 | homekit_permissions_notify, \
    .min_value = (float[]) {0}, \
    .max_value = (float[]) {5}, \
    .min_step = (float[]) {1}, \
    .valid_values = { \
        .count = 6, \
        .values = (uint8_t[]) { 0, 1, 2, 3, 4, 5 }, \
    }, \
    .value = HOMEKIT_UINT8_(_value), \
    ##__VA_ARGS__

PM25\_DENSITY 的Characteristics
.permissions 列出 read與notitfy
.value 是 0~1000 的範圍

#define HOMEKIT_CHARACTERISTIC_PM25_DENSITY HOMEKIT_APPLE_UUID2("C6")
#define HOMEKIT_DECLARE_CHARACTERISTIC_PM25_DENSITY(_value, ...) \
    .type = HOMEKIT_CHARACTERISTIC_PM25_DENSITY, \
    .description = "PM25 Density", \
    .format = homekit_format_float, \
    .permissions = homekit_permissions_paired_read \
                 | homekit_permissions_notify, \
    .min_value = (float[]) {0}, \
    .max_value = (float[]) {1000}, \
    .value = HOMEKIT_FLOAT_(_value), \
    ##__VA_ARGS__

有上面這些資料,就可以變成我們的code了,範例如下

struct hap_characteristic air_quality[] = {
    {HAP_CHARACTER_AIR_QUALITY , (void *)air_quality_value,NULL, air_quality_read, NULL, air_quality_notify},
    {HAP_CHARACTER_PM2_5_DENSITY , (void *)pm25_ugm3_value,NULL, pm25_ugm3_read, NULL, pm25_ugm3_notify},
}  
hap_service_and_characteristics_add(acc, accessory_object, HAP_SERVICE_AIR_QUALITY_SENSOR , air_quality,ARRAY_SIZE(air_quality));


寫完,收工~~~~~~






2019年3月20日 星期三

ESP32 Homekit 開關 (SWITCH)

之前使用ESP8266製作Homekit裝置時,都須藉由RPi3當中繼,才能透過手機與Homekit裝置做控制
現在在ESP32上,裝置已經可以獨立運作,不再需要RPi3了

感謝網路上的許多神人們 younghyunjo , maximkulkin

開發ESP32的程式可以使用Arduio IDE的環境,官方網站有提供教學,或是到MAKERPRO也可以喔,不過本篇重點不在Arduino IDE的環境下做開發,就不再多做說明了

開發Homekit的程式,目前似乎都是在ESP-IDF或是ESP-OPEN-RTOS之下所開發的,所以就需要安裝相關的環境做開發,但是還是可以安裝Arduino的元件(Component),就可以混合使用Arduino的語法做開發囉

開始動手

Step 1 照著官方的步驟,安裝ESP-IDF的開發環境吧

Step 2 從Y大的GitHub下載 esp32-Homekit
$ git clone --recursive https://github.com/younghyunjo/esp32-homekit.git

Step 3 修改 examples/switch/main/main.c 裡面WiFi的SSID與WiFi密碼
#define EXAMPLE_ESP_WIFI_SSID "myssid"
#define EXAMPLE_ESP_WIFI_PASS "12345678"  

Step 4 編譯跟燒錄

以開關的範例示範
$ cd examples/switch
$ make
$ make flash

Step 5 配對
可以開啟支援Homekit的iPhone或iPad進行配對了,配對過程中會需要密碼,程式中預設的密碼為053-58-197,可以尋找程式中 hap_accessory_register 函數,自行修改配對密碼

選擇「沒有代碼或無法掃描」選項

可以看到「SWITCH」配件出現,點選它



我們是秉持DIY精神的,所以並沒有通過認證,直接強制加入就可以啦

輸入程式中的預設密碼,053-58-197


開始搜尋配件


找到後,在我們的「家庭」中就可已看到「SWICTH」了,我們可以將它重新命名,如「電燈開關」






直接在「SWITCH」上點擊,燈就會亮起啦 (ESP32 板子上的LED也會跟著亮起)


2017年3月23日 星期四

安裝 Mosquitto MQTT

取得key後進行安裝
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
sudo apt-get install mosquitto
安裝三個 Mosquitto proper 會用到的程式庫
mosquitto – the MQTT broker (or in other words, a server)
mosquitto-clients – command line clients, very useful in debugging
python-mosquitto – the Python language bindings
sudo apt-get install mosquitto mosquitto-clients python-mosquitto 
安裝完後mosquitto會立即執行,但還需要進行部分設定,所以先停止
sudo /etc/init.d/mosquitto stop 
開啟設定檔案
sudo nano /etc/mosquitto/mosquitto.conf 
修改找到 log_dest 列,將後面改為 topic,如下
log_dest topic
並再增加下面六個參數後存檔
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true 
重新啟動mosquitto
sudo /etc/init.d/mosquitto start 
進行測試,開啟終端機,輸入下列指令
mosquitto_sub -d -t hello/world 
再開啟另一個終端機,輸入下列指令
mosquitto_pub -d -t hello/world -m "Hello from Terminal 2!" 

會在第一個開啟的終端機看到如上畫面

會在第二個開啟的終端機看到如上畫面




安裝HAP-NodeJS


確定安裝完成 Node.js (安裝Nodejs)
先安裝會用到的套件

sudo apt-get install npm git-core libnss-mdns libavahi-compat-libdnssd-dev 

安裝node module
sudo npm install -g npm  sudo npm install -g node-gyp 

下載HomeKit 模擬套件 HAP-NodeJS:
git clone https://github.com/KhaosT/HAP-NodeJS.git  
cd HAP-NodeJS  
npm rebuild  
sudo npm install node-persist  
sudo npm install srp 
安裝失敗,下載最近版本gcc
sudo apt-get install gcc-4.8 g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
繼續安裝套件
sudo npm install srp
sudo npm install mdns --unsafe-perm
sudo npm install debug
sudo npm install ed25519 --unsafe-perm
sudo npm install curve25519 --unsafe-perm
再次確認套件是否安裝完整
sudo npm install
開始執行模擬器
node Core.js
可以列印debug訊息的語法
DEBUG=* node Core.js

按下Ctrl+C 退出模擬器

成功執行的畫面

在Raspberry Pi上安裝 Node.js


確定所有套件都更新到最新版本
sudo apt-get update
sudo apt-get upgrade
官方下載點 nodejs.org
選擇檔案名稱尾部有帶 -linux-armv7l.tar.gz,這可以直接給Pi3使用的

下面是以 node-v5.12.0 為範例
wget https://nodejs.org/dist/v5.12.0/node-v5.12.0-linux-armv7l.tar.gz
tar -xvf node-v5.12.0-linux-armv7l.tar.gz
cd node-v5.12.0-linux-armv7l
sudo cp -R * /usr/local
查看版本
node -v 

在ESP32S3使用 Adafruit_TinyUSB 建立 HID 裝置進行讀寫

Adafruit_USBD_HID usb_hid; #define USB_VID 0xCafe #define USB_PID 0x4011 #define USB_MANUFACTURER "ESP32S3" #define USB_PRODUCT ...