Google Weather Oracle
You can use Chainlink to digest weather information using Google Cloud Public Datasets. We have a sample brownie repo showing how to interact with the contracts available in our gcp-weather brownie repo. More information on this oracle can be found in the following Google Cloud article.
Parameters and External Adapters Details
These jobs are using a custom external adapter. Please see the Google weather external adapter to see information about parameters that can be used with these jobs.
Chainlink Network Details
You will need to use the following LINK token address, oracle address, and JobSpec IDs in order to create the Chainlink request to this oracle.
Mainnet
Parameter | Value |
---|---|
ETH_CHAIN_ID |
1 |
ChainLink Token Address | 0x514910771AF9Ca656af840dff83E8264EcF986CA |
Oracle | 0x92c08A635C7525505123F0F8e327C6Fa66E09a18 |
Rain JobID | e9c41111b74f454695abd471806d9c6f |
Hail JobID | 941cb4bdd6e746cd933a37c8e92f2f98 |
Average Temperature JobID | c6f853860b4f479fbda0910350d695b6 |
Generic JobID | 0606a7c2811e4dbab659be400ecd41f9 |
Fee | 1000000000000000000 (1 LINK) |
Node Operator | 0x6767eDa1C1d0070cEbdFE1CB3a55e4B63FA02C3E |
Steps For Using This Oracle
- Write and deploy your contract using the network details above.
- Fund it with LINK
- Call your request method
Create your Chainlinked contract
Import ChainlinkClient.sol
into your contract so you can inherit the ChainlinkClient
behavior. Below is a sample that can call the hail, rain, and average temperature jobs to fetch weather data from Bergen, Norway.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
/**
* Request testnet LINK and ETH here: https://faucets.chain.link/
* Find information on LINK Token Contracts and get the latest ETH and LINK faucets here: https://docs.chain.link/docs/link-token-contracts/
*/
/**
* THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY.
* THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.
* DO NOT USE THIS CODE IN PRODUCTION.
*/
contract Weather is ChainlinkClient {
using Chainlink for Chainlink.Request;
bytes32 public avgTempJobId;
uint256 public avgTemp;
bytes32 public totalRainJobId;
uint256 public totalRain;
bytes32 public hailJobId;
uint256 public hail;
uint256 public fee;
event AvgTemp(uint256 _result);
event TotalRain(uint256 _result);
event Hail(uint256 _result);
constructor(
address _link,
address _oracle,
bytes32 _avgTempJobId,
bytes32 _totalRainJobId,
bytes32 _hailJobId,
uint256 _fee
) {
setChainlinkToken(_link);
setChainlinkOracle(_oracle);
avgTempJobId = _avgTempJobId;
totalRainJobId = _totalRainJobId;
hailJobId = _hailJobId;
fee = _fee;
}
function requestAvgTemp(string memory _from, string memory _to) external {
Chainlink.Request memory req = buildChainlinkRequest(
avgTempJobId,
address(this),
this.fulfillAvgTemp.selector
);
req.add("dateFrom", _from);
req.add("dateTo", _to);
req.add("method", "AVG");
req.add("column", "temp");
sendChainlinkRequest(req, fee);
}
function fulfillAvgTemp(
bytes32 _requestId,
uint256 _result
) external recordChainlinkFulfillment(_requestId) {
avgTemp = _result;
emit AvgTemp(_result);
}
function requestTotalRain(string memory _from, string memory _to) external {
Chainlink.Request memory req = buildChainlinkRequest(
totalRainJobId,
address(this),
this.fulfillTotalRain.selector
);
req.add("dateFrom", _from);
req.add("dateTo", _to);
req.add("method", "SUM");
req.add("column", "prcp");
sendChainlinkRequest(req, fee);
}
function fulfillTotalRain(
bytes32 _requestId,
uint256 _result
) external recordChainlinkFulfillment(_requestId) {
totalRain = _result;
emit TotalRain(_result);
}
function requestHail(string memory _from, string memory _to) external {
Chainlink.Request memory req = buildChainlinkRequest(
hailJobId,
address(this),
this.fulfillHail.selector
);
req.add("dateFrom", _from);
req.add("dateTo", _to);
req.add("method", "SUM");
req.add("column", "hail");
sendChainlinkRequest(req, fee);
}
function fulfillHail(
bytes32 _requestId,
uint256 _result
) external recordChainlinkFulfillment(_requestId) {
hail = _result;
emit Hail(_result);
}
}
Jobs
Rain (Bergen, Norway)
Tasks
gcp-weather
: Makes a call to the google weather dataset- Parameters:
{
"geoJson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [5.325622558593749, 60.3887552979679]
},
"properties": {}
}
]
}
}
multiply
: Multiples the output - set to1000000000000000000
ethuint256
: Turns the result into auint256
ethTx
: Sends the TX to the blockchain
Hail (Bergen, Norway)
Tasks
gcp-weather
: Makes a call to the google weather dataset- Parameters
{
"geoJson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
{
"0": [5.2796173095703125, 60.40673218057448],
"1": [5.164947509765625, 60.383665698324926],
"2": [5.17730712890625, 60.211509994185604],
"3": [5.401153564453124, 60.27694067255946],
"4": [5.6188201904296875, 60.436558668419984],
"5": [5.526123046875, 60.42842688461354],
"6": [5.3002166748046875, 60.5387098888639],
"7": [5.238418579101562, 60.4951151199491],
"8": [5.2796173095703125, 60.40673218057448]
}
]
},
"properties": {}
}
]
}
}
ethuint256
: Turns the result into auint256
ethTx
: Sends the TX to the blockchain
Average Temperature (Bergen, Norway)
Tasks
gcp-weather
: Makes a call to the google weather dataset- Parameters:
{
"geoJson": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
{
"0": [5.2796173095703125, 60.40673218057448],
"1": [5.164947509765625, 60.383665698324926],
"2": [5.17730712890625, 60.211509994185604],
"3": [5.401153564453124, 60.27694067255946],
"4": [5.6188201904296875, 60.436558668419984],
"5": [5.526123046875, 60.42842688461354],
"6": [5.3002166748046875, 60.5387098888639],
"7": [5.238418579101562, 60.4951151199491],
"8": [5.2796173095703125, 60.40673218057448]
}
]
},
"properties": {}
}
]
}
}
multiply
: Multiples the output - set to1000000000000000000
ethuint256
: Turns the result into auint256
ethTx
: Sends the TX to the blockchain
Generic (Any Location)
Tasks
gcp-weather
: Makes a call to the google weather datasetmultiply
: Multiples the outputethuint256
: Turns the result into auint256
ethTx
: Sends the TX to the blockchain
Input Parameters
Required? | Name | Description | Options | Defaults to |
---|---|---|---|---|
✅ | geoJson |
A GeoJSON object containing the geographies to query | ||
✅ | dateFrom |
The date to query data from (inclusive) in ISO 8601 format | ||
✅ | dateTo |
The date to query data to (inclusive) in ISO 8601 format | ||
✅ | method |
Which method to use to aggregate data in | AVG , SUM , MIN , MAX |
|
✅ | field |
Which column to fetch data from | Data available | |
units |
What unit system to return the result in (conversions) | imperial , metric |
imperial |
Please see the Google weather external adapter to see information about parameters that can be used with these jobs.