2020年6月20日 星期六

使用Python輕鬆讀取南投巷弄長照站單位

1.資料來源:南投縣醫事機構辦理巷弄長照站單位,https://data.gov.tw/dataset/126785



2.在上圖有一個檢視資料的連結,點選後,如下圖。


3.下載上圖CSV檔案,用EXCEL打開如下圖:


4.注意上圖的欄位名稱,撰寫程式如下:

1
2
3
4
5
import csv
with open('C:\\Users\\user\\Downloads\\109109.04.27.csv', newline='') as csvfile:
  rows = csv.DictReader(csvfile)
  for row in rows:
    print(row['編號'], row['單位名稱'], row['服務區域'], row['村里別'],row['活動地址'], row['聯絡人'], row['電話'], row['喘息服務'])

5.只需要5行程式,即可以讀取其內容,執行結果如下:

2020年6月7日 星期日

結合google試算表與Line Notify,定時通知資產狀況


image
最近上了社區大學Python結合智能家居的課,
老師教了使用Line Notify通知的功能,
我把它拿來結合google試算表讓Line可以每個月1號固定告訴我目前的資產狀況。

image
我的表格有整體資產整合的「再平衡」,記錄每次的「交易」,跟最後每個月記錄一次當時資產價值的「資產成長」,

image
如何讓google試算表每個月自動擷取當時的資產狀況並傳送Line Notify給自己是這次的重點。

首先要先到下方網址取得Line的權帳
https://notify-bot.line.me/my/
image
選擇自己的帳號通知自己,
image
發行後會取得一組權帳碼
請把它記起來。

接下來到試算表的指令碼編輯器來開始寫程式了,
這個程式的作用是每個月1號會在B到E最底下的空白欄位自動填寫G2~J2的數值,
G2~J2會去抓「再平衡」的數值,
是當時的資產價值,
A欄則記錄當時的日期,
然後Line Notify會提供當時的數據告訴你。
image
程式要寫在指令碼編輯器。
image
打開畫面如下,語法是Javascript。
截圖 2020-06-05 下午7.24.37.png

// 將函數命名為UpdateaAsset
function UpdateaAsset() {
  // 取得目前試算表中的名稱為 "資產成長,再平衡" 物件
var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("資產成長");
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("再平衡");
  // 從「資產成長」這個物件中,取得已使用儲存格的範圍
  var datarange = sheet1.getDataRange();
  // 得到目前使用到第幾個row (橫列)
  var num_row = datarange.getNumRows();
  // sheet.getRange(row, column) 的意思是取得從左上角算起第 row 列、第 column 欄的格子
  // 在此我們取得尚未使用的橫列 -- 及 num_row+1 列的第一欄
  // .setValue 這個方法把內容改成現在的日期時間 
 //會再最底下空白列的第一欄自動記錄當時的時間
  sheet1.getRange(num_row+1,1).setValue(new Date());
 //「資產成長」的G2~H2是去自動抓取「再平衡」的資料,已寫在表格裡,設為變數
  var value = sheet1.getRange("G2").getValue();
  var profit = sheet1.getRange("H2").getValue();
  var Purchase = sheet1.getRange("I2").getValue();
  var returnrate = sheet1.getRange("J2").getValue();
 //報酬率設為百分比
  var returnrate2 = Math.round(returnrate*100) ;
  // 同時,最底下空白列的第二欄設定成G2 的值,即目前價值
  // 同時,最底下空白列的第三欄設定成H2 的值,即目前損益
  // 同時,最底下空白列的第四欄設定成I2 的值,即目前成本
  // 同時,最底下空白列的第五欄設定成J2 的值,即目前報酬率
  sheet1.getRange(num_row+1,2).setValue(value);
  sheet1.getRange(num_row+1,3).setValue(profit);
  sheet1.getRange(num_row+1,4).setValue(Purchase);
  sheet1.getRange(num_row+1,5).setValue(returnrate);

//以下跟Line相關  
  var token = "你的權帳碼";
//將發送的訊息
  var message = new Date() + "\n" +"資產價值" + value + "\n" + "損益" + profit + "\n"+ "成本" + Purchase + "\n"+ "報酬率" + returnrate2 + "%\n";
  sendline(message,token);
}
//Line發送訊息的副程式
function sendline(message,token){
    var options =
   {
     "method"  : "post",
     "payload" : {"message" : message},
     "headers" : {"Authorization" : "Bearer " + token}
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
接著是設定程式觸發的時間,
先存檔後再選時間圖示,
新增觸發條件,
image
設為每個月1號下午2:00~3:00觸發,
這樣就能每個月知道自己目前的資產狀況了。
截圖 2020-06-05 下午7.44.10.png

體驗農村生活-農村主題旅遊規劃

程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/ODwsv/ODwsvSuggestTravel.aspx')
text = json.loads(r.text)
for d in text:
    if d['City'] == '南投縣':
        print('名稱:', d['Name'])
        print('行程介紹:', d['MovingIntroduction'])
        print('交通指引:', d['TrafficGuidelines'])
        print('\n\n')

執行結果:
名稱: 桃米休閒農業區-桃米樂活體驗遊
行程介紹: 遊程內容多彩多姿:依季節性有採果、茭白筍體驗、種菜、醬筍製作、荷葉飯製作、生態蜻蜓、青蛙粿DIY、彩繪項鍊(青蛙、蜻蜓、螢火蟲)、捏捏蛙。製作紅茶、創意工坊體驗。生態導覽:日間生態導覽解說環境教育、賞蝶及夜間賞蛙、賞螢、溯溪等活動。
交通指引: 自行開車
國道3號→國道6號第一個愛蘭交流道下→接台14線左轉→至愛蘭穚接台21線往日月潭方向→至51K處(旁有全家便利商店) →右轉進入桃米休閒農業區。



名稱: 福龜休閒農業區一日遊 (無圖暫下架)
行程介紹: 本區可欣賞大榕樹土地公文化景觀、觀賞珍禽鳥類,以及享用綠野仙境農場農村特色風味餐及農業區生產的自製果汁。還可參加各項DIY體驗活動、了解精緻咖啡研發製作過程及品嚐。
交通指引: 開車
1.南下:國道三號經霧峰交流道→至霧峰系統(214km)→轉國道六號→國姓交流道(17km)下右轉→中正路直行150公尺即抵達本休區辦公室。
2.北上:國道三號經草屯交流道→至霧峰系統(215km)→轉國道六號→國姓交流道(17km)下右轉→中正路直行150公尺即抵達本休區辦公室。
3.南投:草屯→從台14線經坪林橋→至雙冬里→中潭公路35K+500即抵達。
4.埔里鎮:從台14線→北山→柑仔嶺→中潭公路35K+500即抵達。(或從愛蘭交流道往西向至國姓交流道(17km)下右轉→中正路直行150公尺即抵達本休區辦公室。



名稱: 南投南中寮一日遊
行程介紹: 遠離塵囂、接觸大自然沿途走訪仙峰日月洞、中寮永平老街、福盛水圳、棋盤石、龍興吊橋、粗坑大峭壁,讓先人的遺址拓展視野,沉浸在文化的洗禮中。
交通指引: 大眾運輸
公車
彰化客運南投站:至南投市三和三路21號家樂福旁,彰化客運南投站搭乘「南投-鄉親寮」、「鄉親寮-粗坑」、「鄉親寮-大坑」線。
開車
1.北下:國道三號南投交流道→台3線往南投市→至南投市左轉民族路→沿南投139線道至南中寮中寮鄉農特產品展售中心。
2.南上:國道三號名間交流道→台16線往集集→至集集鎮沿南投139縣道至南中寮中寮鄉農特產品展售中心。



名稱: 晝賞桐夜觀螢 樂遊埔里
行程介紹: 埔里鎮位處台灣中部丘陵區,屬於副熱帶濕潤氣候,所以冬天不嚴寒,夏天不酷熱,雨量豐富、雲霧多、濕度大蒸發量小,沒有強風,是一個氣候宜人的鄉鎮,因而有「小洛陽」的稱譽。有五月雪之稱的桐花現身在好山好水的埔里,雪白桐花在牛耳藝術公園綻放,宛如為綠油油的森林披上一層白紗,浪漫雅緻。四、五月的夜晚埔里亦可以看到一閃一閃的火金姑,還有蛙鳴聲相伴,所有的壓力就在這悠然中被洗滌。
交通指引:



名稱: 台一生態休閒農場-秋楓之湯
行程介紹: 在秋天時分,可以賞楓、景、蝶等等靜態活動,還有蔬果、花卉採摘體驗,本遊程的賞景靜態活動非常的適合銀髮族以及情侶參加,蔬果、花卉採摘體驗也適合親子參加體驗,提升親子間的感情,也增加小朋友對植物的認識。
交通指引: 開車
1.北下:國道一號由台中港交流道下,經中港路右轉五權路接五權南路上中投快速道路,至草屯下快速道路,再接台14線至埔里即抵。
2.南上︰國道一號由斗南交流道下,經斗六接台3省道,經竹山、南投到草屯、再接台14線,至埔里即抵。



名稱: 大林休閒農業區-君知菇香來
行程介紹: 大林休閒農業區以生產香菇、蘭花為主要農產,近來並有得到國際咖啡比賽的「魚池咖啡」;區內有各種特色體驗:蘭花盆栽DIY、香菇園導覽解說、咖啡園導覽解說及試飲魚池咖啡、音樂怪老子、農具模型欣賞。本區內「晶園休閒渡假村」適合各式會議、家族旅行,並有餐廳。
交通指引: 開車
1.北上:國道三號由竹山交流道下,走台16線,往集集、水里的方向,抵達水里後改走台21線左轉,不要走台21甲線,約三十分鐘抵達日月潭商店街,經日月潭往魚池市區右轉進形象商圈或九族指標約8分鐘抵達晶園休閒渡假村。
2.南下:國道三號霧峰系統交流道接國道六號,經愛蘭交流道往台14線,轉台21線約十五分鐘抵達魚池市區左轉進形象商圈。順著晶園或九族指標約8分鐘抵達晶園休閒渡假村。



名稱: 埔里玩造紙 禪寺求平安
行程介紹: 農產品與花卉是埔里的大宗物產,可以選擇參觀苗圃或者香草園區也能參觀絣品嘗埔里有名的農產茭白筍,花卉是埔里鎮最豐富的物產,並榮獲3次台灣省高品質花卉競賽總冠軍,因此花都之名享譽全國。這裡也有紙工廠能讓遊客親自完成一張紙的製作。此外埔里的好山好水使的酒廠聲名大噪,除了有傳統的紹興酒外還有愛蘭白酒和愛蘭喜酒以及各種與酒有關的周邊產品。
蝴蝶曾是埔里最大的產業,在這裡能參觀蝴蝶標本或者蝴蝶生態牧場。通常於每年3~5月舉辦花卉展,4~10月則不定期舉辦筊白筍節。然後再到極富盛名的中台禪寺參拜,讓旅程畫下平安的句點。
交通指引: 開車
走國道三號,下草屯交流道走中潭公路(台14線)往埔里方向。
大眾運輸
坐火車或客運至台中後,轉搭乘「全航客運」、「國光客運」、「台中客運」至埔里。



用Python找出猪樂園附近的農村地方美食小吃特色料理

農村地方美食小吃特色料理開放資料:https://data.gov.tw/dataset/6037

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/ODwsv/ODwsvTravelFood.aspx')
text = json.loads(r.text)
for d in text:
    if d['Town'] == '名間鄉' or d['Town'] == '竹山鎮' or d['Town'] == '南投市' or d['Town'] == '集集鎮':
        print('名稱:', d['Name'])
        print('地址:', d['Address'])
        print('電話:', d['Tel'])
        print('餐點特:', d['FoodFeature'])
        print('\n\n')

執行結果:
名稱: 圓夢工坊
地址: 南投縣竹山鎮下橫街38號
電話: 049-2644077#332
餐點特: 竹山鎮農會表示田媽媽圓夢工坊成立於民國95年,由農會號召輔導一群快樂學習的婆婆媽媽們所組成。長期以來由農委會、縣府輔導各農會辦理農村婦女家政班各項專長培育訓練,聘請業界師傅達人現場指導,帶著美麗歡喜的心意,學習與人交流,增進生活知識與個人成長不但人人具備一身好手藝,個個充滿自信心。班員們利用在地農特產品番薯、茶、筍子、薑等特產,開發具地方特色與三低一高健康理念之料理與點心番薯(中秋月)餅、西式點心、蕃薯麵條等,訴求低食物里程及在地消費觀念,是最健康的幸福滋味,歡迎全國民眾前往各地田媽媽班選購品嚐。
運用本鎮在地農產,致力研發以純手工及低油、低鹽、低糖「三低」的健康在地特色料理、,提供社會大眾客製化預定,配合並支援各機關團體產品設計研發,參與各種展售活動等,所設計製作各項產品皆能受到消費者的肯定與青睞。



名稱: 耄饕客棧
地址: 南投縣竹山鎮延和里安定巷146號1樓
電話: 049-2657828
餐點特: 耄饕客棧藏身巷底,從外頭看像茶藝或咖啡館,沒想到走進去能吃到充滿創意的田園佳餚。
 曾惠雀喜歡在一般食材中尋求無限可能,像她為竹山特產番薯設計的橙香地瓜球,大膽把紓壓精油用於料理中,就讓人有耳目一新的感覺。橙香地瓜球選用竹山57號番薯,這種番薯滋味甜蜜如漿,加上口感鬆爽,烤熟後拌入可食用的甜橙及檸檬精油,捏成一顆顆圓球,夾入火腿和低脂起士,配烏龍芥末醬。金黃的地瓜球顏色明亮似秋陽,賣相十足,甜鹹交融的口感,和地瓜泥裡隱隱浮現的檸檬橙香,讓人在進食過程中充滿驚喜。
 鮮筍菜捲特別以鮮甜的筍汁熬大白菜,再以煮軟的白菜葉包捲金針菇,上桌前淋上筍汁提鮮,甘甜又清爽。櫻花海味鮮筍將新鮮麻竹筍切片,配上剁碎的干貝和櫻花蝦泥,以海味襯搭筍鮮。而用田媽媽自己醃的醬筍煮雞湯,滋味更是鮮美無比。茶葉蛋結合日式茶碗蒸手法,蒸蛋材料中加入了茶湯和海鮮,舀一口吹彈可破的滑蛋入口,茶香若隱若現。
 主食蕎麥麵是耄饕的壓軸好戲,也是用餐高潮,自製蕎麥麵條柔軟有彈性,配蔬菜和海鮮煉製的高湯,清甘甜美,正好襯出蕎麥麵的樸實原味。




名稱: 京麟廚房
地址: 南投縣名間鄉大坑村大廈巷66-66號
電話: 049-2730637
餐點特: 名間有三寶:鳳梨、生薑、通天草。
用當季食材料理,以在地食材為主,薑母糖為最佳伴手禮。



名稱: 田媽媽社區餐廳
地址: 南投市軍功里東山路215號
電話: 049-2203318
餐點特: 921大地震重創中寮地區,南投中寮張至沅返鄉投入重建工作,一做就是10幾年。民國98年,他結合社區媽媽經營的「田媽媽社區餐廳」在南投水果酒廠旁開業。田媽媽們以有機概念設計餐廳的菜單,結合前後11個社區的農特產與加工品入菜;餐廳的收入除了維持基本開銷之外,另成立公基金,維護觀光路線的修繕、輔導農民做產品加工,用心改善農民生活。

 「用檳榔碗吃地瓜飯、吃番薯配菜脯、吃樹根(樹薯)配樹葉(肉桂葉)、吃草心(檳榔心)配草根(九尾草)、吃樹子(破布子)配竹筍。」這是張至沅編的一段順口溜,短短一段話,道盡餐點裡吃得到的中寮地區農特產。

 南寮特產「肉桂葉」是餐廳的主打農產,「肉桂燉雞湯」用肉桂的特殊香氣平衡傳統雞湯的油膩感,全台灣只有這裡吃得到。將秋刀魚處理過後先炸、放進肉桂滷汁中滷4小時,整條魚軟綿化骨,從頭到尾都可以吃。醬筍、蘋婆、菜脯與梅子組成的「五行拼盤」色彩繽紛、簡單原味,最令人驚喜的是用葡萄取代鹽分發酵的醬筍完全不死鹹,有淡淡的清香;還有用肉桂醃製的豆腐乳也是農民的得意作品。

 田媽媽社區餐廳把當地特產和觀光路線規畫整合起來,開發中寮到八卦山的東西向旅遊動線,結合吃、喝、玩、賞、樂,稱為「南投中寮身心靈之旅」,希望中寮可以從在地特色美食和推廣養生餐飲中,走出一條屬於自己的路。



名稱: 森十八休閒農場
地址: 南投縣名間鄉田仔村田仔巷16-8號
電話: 049-2273797
餐點特: 森十八座落於參山國家風景區三大灌溉水壩前,堪稱南投名間香格里拉,左右環山擁抱,二高居旁穿梭,灌溉水壩盡收眼底。

進入農場映入眼廉的是天然尤加利樹群,走在林間,森林芬多精帶領我們浸沐於大地的恩寵,可讓你遠離都市的塵囂煩惱,喚起心中對大自然最真摯的嚮往。如果你放慢步伐,還可以看見陽光移動的腳步,聽到風動樹葉的沙沙聲。來這裡用餐,不管是香氣排餐、時尚風味餐、樂活輕食餐、森林舒活餐都將滿足您的味蕾。

本農場以結合自然生態、農業生產、休閒生活、養生美食為經營理念,成為人們假日休閒的場所,是一處兼具自然、農業、休閒、美食等多功能之農場。其周邊之遊憩景點有:松柏嶺(受天宮)、竹山紫南宮、集集火車站、車埕火車站、天梯、日月潭、溪頭森林遊樂區等知名景點,是週休二日好去處。

2020年6月6日 星期六

當Python遇見猪樂園,來看南投縣毛猪成交頭數-總數

開車南下國道三號高速公路,名間/集集交流道下來,往名間方向,約200公尺,您會看到南投縣農產運銷股份有限公司。




再往前開看到生生不息一白一黑的兩頭猪,有一條小路急右轉就可以看到猪樂園的入口。

您一定想不到原來猪樂園是南投縣農產運銷股份有限公司規劃的親子休閒園區。而南投縣農產運銷股份有限公司的前身是肉品市場,或許我們會好奇,南投縣的肉品市場一天大約要交易幾頭猪?這個問題可以交給政府的開放資料,經由7行Python程式,就可以得知最近的交易情形。

程式碼如下:

1
2
3
4
5
6
7
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/FromM/AnimalTransData.aspx?$top=200&$skip=0')
text = json.loads(r.text)
for d in text:
    if d['市場名稱'] == '南投縣':
        print(d['交易日期'],d['成交頭數-總數'])

執行結果:
1090606 779
1090605 921
1090604 865
1090603 868
1090602 872
1090601 912
1090530 736
1090529 940
1090528 878

2020年5月28日 星期四

用MicroPython設計遠距情境燈以機智雲為例

遠距情境燈是指可以在遠方使用資通訊設備,例如:電腦和手機,來進行控制LED的顏色。我們採用物聯網通訊協定MQTT,以主題R,G, B來分別控制紅色、綠色、藍色的亮度,進而經由RGB三種顏色來調變RGB LED顏色。

機智雲:http://wiki.ai-thinker.com/esp8266/boards/gizwits
MicroPython的MQTT參考程式如下:
https://randomnerdtutorials.com/micropython-mqtt-esp32-esp8266/

把該網頁的程式改成遠距情境燈。
boot.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Complete project details at https://RandomNerdTutorials.com

import time
from umqttsimple import MQTTClient
import ubinascii
import machine
import micropython
import network
import esp
esp.osdebug(None)
import gc
gc.collect()

ssid = '您的熱點'
password = '您的密碼'
mqtt_server = 'broker.hivemq.com'
#EXAMPLE IP ADDRESS
#mqtt_server = '192.168.1.144'
client_id = ubinascii.hexlify(machine.unique_id())
topic_sub = b'R'
topic_sub2 = b'G'
topic_sub3 = b'B'
topic_pub = b'hello'

last_message = 0
message_interval = 5
counter = 0

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Connection successful')
print(station.ifconfig())

main.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Complete project details at https://RandomNerdTutorials.com
R=0
G=0
B=0
def sub_cb(topic, msg):
  global R, G, B
  print((topic, msg))
  if topic == b'R':
    print('R=', msg)
    try:
      R=int(msg,10)
    except:
      R=0
  if topic == b'G':
    print('G=', msg)
    try:
      G=int(msg,10)
    except:
      G=0
  if topic == b'B':
    print('G=', msg)
    try:
      B=int(msg,10)
    except:
      B=0
  RedLED.duty(R)
  GreenLED.duty(G)
  BlueLED.duty(B)

def connect_and_subscribe():
  global client_id, mqtt_server, topic_sub, topic_sub2, topic_sub3
  client = MQTTClient(client_id, mqtt_server)
  client.set_callback(sub_cb)
  client.connect()
  client.subscribe(topic_sub)
  client.subscribe(topic_sub2)
  client.subscribe(topic_sub3)
  print('Connected to %s MQTT broker, subscribed to %s, %s, %s topic' % (mqtt_server, topic_sub, topic_sub2, topic_sub3))
  return client

def restart_and_reconnect():
  print('Failed to connect to MQTT broker. Reconnecting...')
  time.sleep(10)
  machine.reset()

from machine import Pin, PWM
import time
RedLED = PWM(Pin(15))
GreenLED = PWM(Pin(12))
BlueLED=  PWM(Pin(13))
RedLED.duty(0)
GreenLED.duty(0)
BlueLED.duty(0) 

try:
  client = connect_and_subscribe()
except OSError as e:
  restart_and_reconnect()

while True:
  try:
    client.check_msg()
    if (time.time() - last_message) > message_interval:
      msg = b'Hello #%d' % counter
      client.publish(topic_pub, msg)
      last_message = time.time()
      counter += 1
  except OSError as e:
    restart_and_reconnect()

2020年4月30日 星期四

利用MicroPython線上模擬器來學習控制伺服馬達


模擬器內建範例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Using the Servo
# Make sure you have the Servo checkbox marked!

import machine
import pyb

# The pyboard has four simple servo connections
servo = pyb.Servo(1)

servo.angle(90, 100)

用ADC來控制伺服馬達的角度:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Using the Servo
# Make sure you have the Servo checkbox marked!

import machine
import pyb
import time


# The pyboard has four simple servo connections
servo = pyb.Servo(1)
y4 = machine.Pin('Y4')
adc = pyb.ADC(y4)

while True:
  value = adc.read() / 255 * 180-90

  servo.angle(int(value), 5000)
  
  time.sleep_ms(100)