@@ -2,22 +2,41 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "encoding/json"
5
6
"errors"
7
+ "fmt"
8
+ "io/ioutil"
6
9
"log"
10
+ "net/http"
7
11
"os"
12
+ "strconv"
13
+ "strings"
8
14
9
15
"github.com/aws/aws-lambda-go/lambda"
10
16
alexa "github.com/ericdaugherty/alexa-skills-kit-golang"
11
17
"github.com/joho/godotenv"
12
18
)
13
19
14
20
var err = godotenv .Load ()
21
+ var URL = os .Getenv ("APIURL" )
15
22
var AppID = os .Getenv ("APPID" )
16
23
17
24
var ALX = & alexa.Alexa {ApplicationID : AppID , RequestHandler : & SmartAgri {}, IgnoreApplicationID : true , IgnoreTimestamp : true }
18
25
19
26
type SmartAgri struct {}
20
27
28
+ type AgriData struct {
29
+ No string `json:"no"`
30
+ Date string `json:"date"`
31
+ Time string `json:"time"`
32
+ Temperature string `json:"temperature"`
33
+ Humidity string `json:"humidity"`
34
+ SoilHumidity string `json:"soil_humidity"`
35
+ Co2Concentration string `json:"co2_concentration"`
36
+ Wavelength string `json:"wavelength"`
37
+ Illuminance string `json:"illuminance"`
38
+ }
39
+
21
40
func (s * SmartAgri ) OnSessionStarted (ctx context.Context , request * alexa.Request , session * alexa.Session , ctxPtr * alexa.Context , response * alexa.Response ) error {
22
41
23
42
log .Printf ("OnSessionStarted requestId=%s, sessionId=%s" , request .RequestID , session .SessionID )
@@ -32,7 +51,9 @@ func Handle(ctx context.Context, requestEnv *alexa.RequestEnvelope) (interface{}
32
51
33
52
// OnLaunch called with a reqeust is received of type LaunchRequest
34
53
func (s * SmartAgri ) OnLaunch (ctx context.Context , request * alexa.Request , session * alexa.Session , ctxPtr * alexa.Context , response * alexa.Response ) error {
35
- speechText := "こんにちは、これはローンチのテストです。"
54
+ speechText := "これはスマートアグリの情報を取得できます。"
55
+ speechText = speechText + "取得できる情報は 温度、湿度、二酸化炭素濃度、水分量に照度です。"
56
+ speechText = speechText + "一から三号機までの情報にそれぞれアクセスできます。"
36
57
37
58
log .Printf ("OnLaunch requestId=%s, sessionId=%s" , request .RequestID , session .SessionID )
38
59
@@ -53,7 +74,13 @@ func (s *SmartAgri) OnIntent(ctx context.Context, request *alexa.Request, sessio
53
74
switch request .Intent .Name {
54
75
case "getParamIntent" :
55
76
log .Println ("getParamIntent triggered" )
56
- speechText := "ハローワールド、これはインテントのテストです。"
77
+ speechText , err := Getsmartagriinfo (request .Intent .Slots )
78
+ if err != nil {
79
+ fmt .Println (err )
80
+ speechText = "すみません、情報を取得できませんでした。"
81
+ }
82
+
83
+ // speechText := "コレが聞こえているということはAPIとかがおかしいよ"
57
84
58
85
// response.SetSimpleCard(cardTitle, speechText)
59
86
response .SetOutputText (speechText )
@@ -81,6 +108,91 @@ func (s *SmartAgri) OnSessionEnded(ctx context.Context, request *alexa.Request,
81
108
return nil
82
109
}
83
110
111
+ func Getsmartagriinfo (slot map [string ]alexa.IntentSlot ) (string , error ) {
112
+ var speech string
113
+
114
+ // 取得する機器が指定されなくてはいけないので確認する
115
+ if slot ["machineNO" ].Value == "" {
116
+ return "取得したい機器のナンバーを一から三号機で指定してください" , nil
117
+ }
118
+
119
+ n := slot ["machineNO" ].Value
120
+
121
+ farmInfoMachineNO , err := GetFarmInfoMachineNO (n )
122
+ if err != nil {
123
+ return "" , err
124
+ }
125
+
126
+ if slot ["parameter" ].Value == "" {
127
+ soilHumid , _ := strconv .ParseFloat (farmInfoMachineNO .SoilHumidity , 32 )
128
+ soilHumid = (soilHumid / 1024 ) * 100
129
+ speech = n + "からの情報は、" +
130
+ "温度は" + farmInfoMachineNO .Temperature + "度、" +
131
+ "湿度は" + farmInfoMachineNO .Humidity + "パーセント、" +
132
+ "水分量は" + strconv .FormatFloat (soilHumid , 'f' , 2 , 64 ) + "パーセント、" +
133
+ "二酸化炭素濃度は" + farmInfoMachineNO .Co2Concentration + "ppm、" +
134
+ "照度は" + farmInfoMachineNO .Illuminance + "ルクスです。" +
135
+ "この情報は" + farmInfoMachineNO .Time + "に取得された情報です。"
136
+
137
+ return speech , nil
138
+ }
139
+
140
+ return speech , nil
141
+ }
142
+
143
+ func GetFarmInfoMachineNO (machine string ) (AgriData , error ) {
144
+ var machineNO string
145
+
146
+ switch machine {
147
+ case "一号機" :
148
+ machineNO = "1"
149
+ case "二号機" :
150
+ machineNO = "2"
151
+ case "三号機" :
152
+ machineNO = "3"
153
+ }
154
+
155
+ farmstruct , err := getFarmInfoFromAPI (machineNO )
156
+
157
+ return farmstruct , err
158
+ }
159
+
160
+ // APIを叩いて情報を取得する
161
+ func getFarmInfoFromAPI (machineNO string ) (AgriData , error ) {
162
+ var resdata []AgriData
163
+ var tmpdata AgriData
164
+
165
+ res , err := http .Get (URL )
166
+ if err != nil {
167
+ log .Println ("API呼び出せてません!!!!" )
168
+ return tmpdata , err
169
+ }
170
+
171
+ defer res .Body .Close ()
172
+
173
+ body , err := ioutil .ReadAll (res .Body )
174
+ if err != nil {
175
+ log .Println (err )
176
+ }
177
+
178
+ // 返ってきたjsonじゃないjsonを}でsplitする
179
+ bodystring := strings .Split (string (body ), "}" )
180
+
181
+ // } で splitしたので消えているから } をくっつけてjson unmarshall
182
+ for _ , jsondata := range bodystring {
183
+ jsondata = jsondata + "}"
184
+ json .Unmarshal ([]byte (jsondata ), & tmpdata )
185
+
186
+ // 機械Noにあった番号でstructを追加
187
+ if tmpdata .No == machineNO {
188
+ resdata = append (resdata , tmpdata )
189
+ }
190
+
191
+ }
192
+ log .Println (resdata [len (resdata )- 1 ])
193
+ return resdata [len (resdata )- 1 ], nil
194
+ }
195
+
84
196
func main () {
85
197
lambda .Start (Handle )
86
198
}
0 commit comments