由於篇幅太長, 所以將離網太陽能系統 ATS 切換偵測的 Line Notify 即時訊息通知部分移到此篇, 在前一篇測試結果的基礎上, 本篇加上連線 WiFi 網路把逆變器開機關機事件透過 Line Notify 功能傳遞給 Line 個人或群組, 前一篇測試紀錄參考 :
在離網太陽能系統中, 逆變器會將電池的直流電轉成 110V/220V 的交流電, 當電池耗電至電壓低於設定之低電壓保護值時, 逆變器就會關閉交流輸出; 反之當太陽能板對電池充電讓電壓升至逆變器啟動電壓時, 逆變器會開機輸出交流電, 本篇測試就是要將逆變器交流輸出透過交流電檢測光耦模組的輸出信號來送出 "斷電/復電" 的 Line Notify 即時訊息, 做法參考 :
首先要將開發板 (此處使用 D1 mini) 連上 WiFi 網路, 本篇使用 "超簡單Python/MicroPython物聯網應用" 這本書裡面的 xtools 模組來處理網路連線事宜, 此模組我已複製一份在 GitHub :
如果要用 xtools 模組內的 line_msg(token,message) 函式傳遞 Line Notify 訊息, 還必須上傳兩個相依模組 xrequests.py 與 urlencode.py :
下載上面三個模組後將其上傳的 ESP8266/ESP32 開發板根目錄, 然後還要編輯一個如下之 WiFi 連線設定檔 config.py, 也是上傳到開發板根目錄下 :
# config.py
SSID = "YOUR-WIFI-SSID" # WiFi名稱
PASSWORD = "YOUR-WIFI-PASSWORD" # WiFi密碼
這樣就可以利用 xtools 的 connect_wifi_led() 函式連線 WiFi 了, 連線成功會傳回從 DHCP 取得的 IP 位址 :
MicroPython v1.18 on 2022-01-17; ESP module with ESP8266
Type "help()" for more information.
>>> import xtools
>>> import config
>>> ip=xtools.connect_wifi_led(config.SSID, config.PASSWORD)
#7 ets_task(4020f560, 28, 3fff9ef0, 10)
Connecting to network...
network config: ('192.168.2.114', '255.255.255.0', '192.168.2.2', '192.168.2.2')
接著要去 Line Notify 官網申請權杖 (token) :
申請程序參考 :
這樣就可以馬上用 xtools 的 line_msg(token,message) 函式來傳送 Line Notify 訊息了 :
>>> token="ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz" (這是樣本)
>>> message='這是 MicroPython 開發板送出的訊息'
>>> xtools.line_msg(token, message)
Message sent...
結果如下 :
接下來就可以改寫上一篇測試中的程式, 讓偵測到光耦模組的斷電或復電訊息時發出 Line Notify 訊息 :
測試 4 : 偵測到斷電或復電中斷訊號時傳送 Line Notify 訊息 [看原始碼]
from machine import Pin
from time import sleep
import xtools
import config
def irq_handler(pin):
global irq_pin
global irq_occurred
irq_occurred=True
irq_pin=pin
irq_occurred=False
led_pin=Pin(2, Pin.OUT)
led_pin.value(1)
solar_pin=Pin(5, Pin.IN, Pin.PULL_UP)
solar_pin.irq(trigger=3, handler=irq_handler)
ip=xtools.connect_wifi_led(config.SSID, config.PASSWORD)
print("ip : ", ip)
while True:
if irq_occurred:
sleep(0.5)
if solar_pin.value():
print(f'{irq_pin} 發生中斷 : 斷電')
message="\n逆變器 AC 輸出 OFF"
else:
print(f'{irq_pin} 發生中斷 : 復電')
message="\n逆變器 AC 輸出 ON"
token="ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz"
xtools.line_msg(token, message)
led_pin.value(0)
sleep(1)
led_pin.value(1)
irq_occurred=False
此例會在斷電與復電時都發出 Line Notify 訊息, 結果如下 :
不過將 Token 直接寫在程式裡面不太妥當, 可以將它跟 WiFi 連線帳密一樣寫進 config.py 裡面的 TOKEN 變數, 然後用 config.TOKEN 即可取得權杖, 所以將 config.sys 修改為 :
# config.py
SSID = "YOUR-WIFI-SSID" # WiFi名稱
PASSWORD = "YOUR-WIFI-PASSWORD" # WiFi密碼
TOKEN = "YOUR-LINE-NOTIFY-TOKEN" # Line Notify 權杖
程式修改如下 :
測試 5 : 將 Line Notify 權杖記在 config.py 裡面 [看原始碼]
from machine import Pin
from time import sleep
import xtools
import config
def irq_handler(pin):
global irq_pin
global irq_occurred
irq_occurred=True
irq_pin=pin
irq_occurred=False
led_pin=Pin(2, Pin.OUT)
led_pin.value(1)
solar_pin=Pin(5, Pin.IN, Pin.PULL_UP)
solar_pin.irq(trigger=3, handler=irq_handler)
ip=xtools.connect_wifi_led(config.SSID, config.PASSWORD)
print("ip : ", ip)
while True:
if irq_occurred:
sleep(0.5)
if solar_pin.value():
print(f'{irq_pin} 發生中斷 : 斷電')
message="\n逆變器 AC 輸出 OFF"
else:
print(f'{irq_pin} 發生中斷 : 復電')
message="\n逆變器 AC 輸出 ON"
token=config.TOKEN
xtools.line_msg(token, message)
led_pin.value(0)
sleep(1)
led_pin.value(1)
irq_occurred=False
此程式僅修改 token 變數那行, 結果與上面範例相同.
2023-04-03 補充 :
昨晚終於搞定此專案, 早上我將系統拿到頂樓, 把光耦模組用細螺絲鎖在配電盤的逆變器下方, 交流端插頭插在逆變器另一個交流輸出插座, D1 mini 的電源則取自配電盤上方的市電, 送電後測試功能正常, 逆變器開機與關機時都會送出 Line Notify 訊息 :
可見插拔逆變器的 AC 輸出的插座時, 我的 iPhone 都會收到 Line 通知.
由於在 2 樓祖堂那邊有放一台小米 WiFi 中繼, 所以 3 樓的網路信號還不錯, 測速上傳下載都有達到 20 Mbps :
WiFi 信號延長到頂樓後, 接下來我就可以在頂樓安裝各種感測器了, 下一個想做的專案是那三個雨水收集桶的抽蓄自動化, 在冬天旱季時沒有雨水可收集, 樓下菜園沒水用不方便, 幸好以前頂樓鐵皮屋灑水的管線可用來將一樓蓄水池的水抽上去, 我計畫在雨水收集桶上安裝水位感測器, 然後改裝樓下抽水機線路, 將其納入自動控制, 當水位到 9 分滿時切斷抽水機電源. 可用上回買的 Tuya 塗鴉至會插座進行遠端控制.
忙了兩天, 終於可以收工啦!
2023-04-05 :
昨晚收到頂樓 D1 mini 傳的 Line Notify 訊息, 顯示逆變器在 01:30 關機, 早上 06:04 分開機, 其餘時間無訊息, 可見系統運作正常 :
2023-04-08 補充 :
系統上線至今收到的 Line Notify 訊息如下 :
如果天氣不佳日照不強, 到傍晚時電池只充到 3/5, 逆變器大概凌晨就關機, ATS 切換到市電; 日照強的話電池中午就 5/5 滿格, 可以用到第二天早上.
沒有留言 :
張貼留言