これまでのあらすじはこちらから↑
今回はRailsからオクトパスエナジーのAPIを叩いて電気代を取得します!備忘録です
オクトパスエナジーのAPIを叩くためのトークンを取得する
データを取得するためにトークンを取得します。
説明のとおりにメールとパスワードをinputに入力すると必要なトークンが返ってきます。
トークンを使ってクエリを叩いてみる
Railsから叩く前にGrapiQLから叩いてみます。
リクエストヘッダーに先程取得したtokenを入力してリクエストを送ることで、実際に電力情報を取得できることが確認できました
dotenv-railsを使って環境変数を管理する
オクトパスエナジーのトークンを取得するためにはIDとパスワードが必要です。これらの情報をソースコードに埋め込むわけには行かないので環境変数を使って対応していきます。
Render側で環境変数を設定する
Render上で環境変数を設定します。これでコード上でIDとパスワードを呼び出すことができるようになりました
graphql-clientを使ってRailsからオクトパスエナジーの情報を取得する
トークンを取得する
トークンを取得するサービスクラスを作ります
require "graphql/client"
require "graphql/client/http"
class GetOctopusTokenService
HTTP = GraphQL::Client::HTTP.new("https://api.oejp-kraken.energy/v1/graphql/")
Schema = GraphQL::Client.load_schema(HTTP)
Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
LOGIN_QUERY = Client.parse <<~'GRAPHQL'
mutation Login($input: ObtainJSONWebTokenInput!) {
obtainKrakenToken(input: $input) {
token
refreshToken
}
}
GRAPHQL
def perform
res = Client.query(LOGIN_QUERY::Login, variables: {
"input": {
"email": ENV['OCTOPUS_EMAIL'],
"password": ENV['OCTOPUS_PASSWORD']
}
})
res.original_hash.dig("data", "obtainKrakenToken", "token")
end
end
Clientを作る
OctopusGraphql
モジュールを作ります。
require "graphql/client"
require "graphql/client/http"
module OctopusGraphql
# Configure GraphQL endpoint using the basic HTTP network adapter.
HTTP = GraphQL::Client::HTTP.new("https://api.oejp-kraken.energy/v1/graphql/") do
def headers(context)
{ "Authorization": GetOctopusTokenService.new.perform }
end
end
# Fetch latest schema on init, this will make a network request
Schema = GraphQL::Client.load_schema(HTTP)
Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
end
/octopus/indexにアクセスしたらAPIを叩くようにする
/octopus/index
にアクセスしたらAPIを叩いて結果をviewに出力するようにしました
class OctopusController < ApplicationController
QUERY = OctopusGraphql::Client.parse <<~'GRAPHQL'
query HalfHourlyReadings($accountNumber: String!, $fromDatetime: DateTime, $toDatetime: DateTime) {
account(accountNumber: $accountNumber) {
properties {
electricitySupplyPoints {
halfHourlyReadings(fromDatetime: $fromDatetime, toDatetime: $toDatetime) {
startAt
endAt
version
value
costEstimate
}
}
}
}
}
GRAPHQL
def index
res = OctopusGraphql::Client.query(QUERY::HalfHourlyReadings, variables: {
accountNumber: ENV['OCTOPUS_ACCOUNT_NUMBER'],
fromDatetime: Date.yesterday.beginning_of_day.iso8601,
toDatetime: Date.yesterday.end_of_day.iso8601
})
properties = res.original_hash.dig("data", "account", "properties")
electricitySupplyPoints = properties.first["electricitySupplyPoints"]
halfHourlyReadings = electricitySupplyPoints.first["halfHourlyReadings"]
@start_at = halfHourlyReadings.pluck("startAt").min.to_time.localtime.strftime("%Y/%m/%d %H:%M")
@end_at = halfHourlyReadings.pluck("endAt").max.to_time.localtime.strftime("%Y/%m/%d %H:%M")
@kwh = halfHourlyReadings.pluck("value").map(&:to_f).sum
@cost = halfHourlyReadings.pluck("costEstimate").map(&:to_i).sum
end
end
/octopus/index
にアクセスすると、前日の電力消費情報が表示されます。
RailsからGraphQL APIを叩くことができた
今回は、graphql-clientを使って、RailsからオクトパスエナジーのGraphQL APIを叩くことができました!
普段の業務ではRailsからGraphQLを叩くことがなく、自分にとって初めての取り組みでしたが無事目的を達成することができました!
続き
電気を見直してみませんか?
最後に、オクトパスエナジーの紹介をします!
オクトパスエナジーの電力量料金(1kWhあたりの料金)は、東京電力と比較して安く設定されています!電気代は毎月必ず来るものなので、少しでもオトクなところと契約したいですよね。
電力消費量 | 東京電力 従量電灯B | オクトパスエナジー グリーンオクトパス |
---|---|---|
120kWhまで | 19.88円 | 19.68円 |
120kWh超えて300kWhまで | 26.48円 | 24.35円 |
300kWh超える | 30.57円 | 26.50円 |
さらに、こちらのリンクから契約すると、あなたと私、それぞれに5000円のボーナスが貰えます!一緒にお得になりましょう٩( ‘ω’ )و
取得するタイミング(日付が変わった直後等)によっては、十分なデータが提供されないことがありました。