Skip to content

Commit 3a1a2e1

Browse files
authored
Merge pull request #2 from hatobus/feature/refactor_lambda
lambda関数のリファクタリング
2 parents be27e40 + 5e82f7c commit 3a1a2e1

File tree

5 files changed

+234
-201
lines changed

5 files changed

+234
-201
lines changed

agrialexa/alexa.go

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package agrialexa
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/ericdaugherty/alexa-skills-kit-golang"
9+
"github.com/hatobus/UKEMOCHI/logging"
10+
"github.com/hatobus/UKEMOCHI/outbound"
11+
"go.uber.org/zap"
12+
)
13+
14+
type SmartAgri struct{}
15+
16+
func (s *SmartAgri) OnSessionStarted(ctx context.Context, request *alexa.Request, session *alexa.Session, ctxPtr *alexa.Context, response *alexa.Response) error {
17+
18+
logging.Log().Info("OnSessinon Started", zap.Strings("requestId=%s, sessionId=%s", []string{request.RequestID, session.SessionID}))
19+
return nil
20+
}
21+
22+
// OnLaunch called with a reqeust is received of type LaunchRequest
23+
func (s *SmartAgri) OnLaunch(ctx context.Context, request *alexa.Request, session *alexa.Session, ctxPtr *alexa.Context, response *alexa.Response) error {
24+
speechText := "これはスマートアグリの情報を取得できます。取得できる情報は 温度、湿度、二酸化炭素濃度、水分量に照度です。一から三号機までの情報にそれぞれアクセスできます。"
25+
26+
logging.Log().Info("OnLaunch started", zap.Strings("OnLaunch requestId=%s, sessionId=%s", []string{request.RequestID, session.SessionID}))
27+
28+
// response.SetSimpleCard(cardTitle, speechText)
29+
response.SetOutputText(speechText)
30+
response.SetRepromptText(speechText)
31+
32+
response.ShouldSessionEnd = true
33+
34+
return nil
35+
}
36+
37+
// OnIntent called with a reqeust is received of type IntentRequest
38+
func (s *SmartAgri) OnIntent(ctx context.Context, request *alexa.Request, session *alexa.Session, ctxPtr *alexa.Context, response *alexa.Response) error {
39+
40+
logging.Log().Info("OnIntent started", zap.Strings("OnIntent requestId=%s, sessionId=%s, intent=%s", []string{request.RequestID, session.SessionID, request.Intent.Name}))
41+
42+
switch request.Intent.Name {
43+
case "getParamIntent":
44+
speechText, err := outbound.Getsmartagriinfo(request.Intent.Slots)
45+
if err != nil {
46+
fmt.Println(err)
47+
speechText = "すみません、情報を取得できませんでした。"
48+
}
49+
50+
response.SetOutputText(speechText)
51+
52+
logging.Log().Info("Set Output speech", zap.Strings("now: %s", []string{response.OutputSpeech.Text}))
53+
case "AMAZON.HelpIntent":
54+
speechText := "何か助けが必要ですか"
55+
56+
response.SetOutputText(speechText)
57+
response.SetRepromptText(speechText)
58+
default:
59+
return errors.New("Invalid Intent")
60+
}
61+
62+
return nil
63+
}
64+
65+
// OnSessionEnded called with a reqeust is received of type SessionEndedRequest
66+
func (s *SmartAgri) OnSessionEnded(ctx context.Context, request *alexa.Request, session *alexa.Session, ctxPtr *alexa.Context, response *alexa.Response) error {
67+
68+
logging.Log().Info("OnSessinonEnded", zap.Strings("OnSessionEnded requestId=%s, sessionId=%s", []string{request.RequestID, session.SessionID}))
69+
70+
return nil
71+
}

logging/log.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package logging
2+
3+
import "go.uber.org/zap"
4+
5+
var logger *zap.Logger
6+
7+
func init() {
8+
var err error
9+
10+
logger, err = zap.NewDevelopment()
11+
if err != nil {
12+
panic(err)
13+
}
14+
15+
logger.Info("initialize logger is successful")
16+
}
17+
18+
func Log() *zap.Logger {
19+
return logger
20+
}

model/agridata.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package model
2+
3+
type AgriData struct {
4+
No string `json:"no"`
5+
MACAddr string `json:"mac_addr"`
6+
Date string `json:"date"`
7+
Time string `json:"time"`
8+
Temperature string `json:"temperature"`
9+
Humidity string `json:"humidity"`
10+
SoilHumidity string `json:"soil_humidity"`
11+
Co2Concentration string `json:"co2_concentration"`
12+
Wavelength string `json:"wavelength"`
13+
Illuminance string `json:"illuminance"`
14+
}

outbound/api.go

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package outbound
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"log"
8+
"net/http"
9+
"os"
10+
"strconv"
11+
"strings"
12+
13+
"github.com/ericdaugherty/alexa-skills-kit-golang"
14+
"github.com/hatobus/UKEMOCHI/model"
15+
)
16+
17+
func Getsmartagriinfo(slot map[string]alexa.IntentSlot) (string, error) {
18+
var speech string
19+
20+
// 取得する機器が指定されなくてはいけないので確認する
21+
n := slot["machineNO"].Value
22+
if n == "" {
23+
return "取得したい機器のナンバーを一から三号機で指定してください", nil
24+
}
25+
26+
// 指定した機器の情報を構造体で取得してくる
27+
farmInfoMachineNO, err := GetFarmInfoMachineNO(n)
28+
if err != nil {
29+
return "", err
30+
}
31+
32+
k := slot["parameter"].Value
33+
if k == "" {
34+
soilHumid, _ := strconv.ParseFloat(farmInfoMachineNO.SoilHumidity, 32)
35+
soilHumid = (soilHumid / 1024) * 100
36+
speech = n + "からの情報は、" +
37+
"温度は" + farmInfoMachineNO.Temperature + "度、" +
38+
"湿度は" + farmInfoMachineNO.Humidity + "パーセント、" +
39+
"水分量は" + strconv.FormatFloat(soilHumid, 'f', 2, 64) + "パーセント、" +
40+
"二酸化炭素濃度は" + farmInfoMachineNO.Co2Concentration + "ppm、" +
41+
"照度は" + farmInfoMachineNO.Illuminance + "ルクスです。" +
42+
"この情報は" + farmInfoMachineNO.Time + "に取得された情報です。"
43+
44+
return speech, nil
45+
}
46+
47+
var resval string
48+
49+
switch k {
50+
case "温度":
51+
resval = fmt.Sprintf("%s度", farmInfoMachineNO.Temperature)
52+
case "湿度":
53+
resval = fmt.Sprintf("%sパーセント", farmInfoMachineNO.Humidity)
54+
case "水分量":
55+
soilHumid, _ := strconv.ParseFloat(farmInfoMachineNO.SoilHumidity, 32)
56+
soilHumid = (soilHumid / 1024) * 100
57+
resval = fmt.Sprintf("%fパーセント", soilHumid)
58+
case "二酸化炭素濃度":
59+
resval = fmt.Sprintf("%sppm", farmInfoMachineNO.Co2Concentration)
60+
case "照度":
61+
resval = fmt.Sprintf("%sルクス", farmInfoMachineNO.Illuminance)
62+
}
63+
64+
speech = fmt.Sprintf("%sの%sは%sです。この情報は%sに取得された情報です。", n, k, resval, farmInfoMachineNO.Time)
65+
66+
return speech, nil
67+
}
68+
69+
func GetFarmInfoMachineNO(machine string) (model.AgriData, error) {
70+
var machineNO string
71+
72+
switch machine {
73+
case "一号機":
74+
machineNO = "1"
75+
case "二号機":
76+
machineNO = "2"
77+
case "三号機":
78+
machineNO = "3"
79+
}
80+
81+
// DynamoDBに置き換える
82+
farmstruct, err := getFarmInfoFromAPI(machineNO, os.Getenv("APIURL"))
83+
84+
return farmstruct, err
85+
}
86+
87+
// APIを叩いて情報を取得する
88+
func getFarmInfoFromAPI(machineNO, APIURL string) (model.AgriData, error) {
89+
var resdata []model.AgriData
90+
var tmpdata model.AgriData
91+
92+
res, err := http.Get(APIURL)
93+
if err != nil {
94+
log.Println("API呼び出せてません!!!!")
95+
return tmpdata, err
96+
}
97+
98+
defer res.Body.Close()
99+
100+
body, err := ioutil.ReadAll(res.Body)
101+
if err != nil {
102+
log.Println(err)
103+
}
104+
105+
// 返ってきたjsonじゃないjsonを}でsplitする
106+
bodystring := strings.Split(string(body), "}")
107+
108+
// } で splitしたので消えているから } をくっつけてjson unmarshall
109+
for _, jsondata := range bodystring {
110+
jsondata = jsondata + "}"
111+
json.Unmarshal([]byte(jsondata), &tmpdata)
112+
113+
// 機械Noにあった番号でstructを追加
114+
if tmpdata.No == machineNO {
115+
resdata = append(resdata, tmpdata)
116+
}
117+
118+
}
119+
120+
log.Println(resdata[len(resdata)-1])
121+
return resdata[len(resdata)-1], nil
122+
}

0 commit comments

Comments
 (0)