在构建具有令人难以置信的潜力的设备时,IBM Bluemix和Raspberry Pi是完美的结合。 在本系列中,我们一直在探索这种潜力,并逐步建立起Raspberry Pi可以做什么。 在第一篇文章中,我们探讨了如何将Raspberry Pi与IBM Bluemix,IBM Watson和Node-RED连接起来 ;在第二篇文章中,我们通过IBM Watson的文本到语音为Raspberry Pi发出了声音 。 如果您还没有阅读这些内容,建议您先阅读一下,然后再回到这里! 在本文中,我们将使Pi能够告诉我们该地区的天气预报。
这个示例可以与上一个示例完全独立,但是它将使用相同的节点来实现文本到语音功能-因此,您需要保持不变!
将Weather Company数据服务添加到Bluemix
为了给您带来一些非常有价值的天气结果,IBM的员工确实购买了The Weather Company。 这意味着您现在可以访问所有这些全球数据,预测等! 那里很多。 要将其添加到您的IBM Bluemix设置中,请回到Bluemix Services页面并输入“ weather”以过滤您的选项,并找到“ IBM Bluemix的Weather Company Data”服务:
供我们测试的初始计划是免费计划。 它具有以下限制:
Weather Company Data Free计划使您每分钟最多可以对每个Weathermix帐户最多拨打10次The Weather Company,最多可以进行10,000个API调用。
在弹出的选项中,将您的空间保留为“ dev”(如果这是您在其他教程中一直在使用的空间),请将该服务保持未绑定状态,以便您可以在其他应用程序中重用该服务,如果需要,请重命名该服务就像(我保持原样)一样,将凭据保留不变,然后单击“创建”!
为了能够从Node-RED(或实际上在任何地方)使用此服务,我们需要我们的凭证来证明我们是要求它的凭证。 转到“服务凭证”页面,并将用户名和密码详细信息复制到安全的地方:
在Node-RED中访问我们的天气数据
打开与之前教程相同的流程(如果您是从头开始的,那么您将能够遵循这些步骤中的大多数步骤,只是知道您需要回到第2部分了解有关如何操作的详细信息做文字转语音位)。
我们将一个新的功能节点拖到我们的流程中,将其放在另一个流程的下面(如果需要,您可以为此创建一个全新的流程):
将该函数命名为“ hourlyWeatherURL”,或任何您想要的名称。 然后输入以下JavaScript代码:
msg.url = 'https://twcservice.mybluemix.net:443/api/weather/v1/geocode/{latitude}/{longitude}/forecast/hourly/48hour.json?units=m&language=en-US';
return msg;
您会注意到需要在此处自定义两个位置。 在{latitude}
和{longitude}
字段中添加您自己的纬度和经度。 如果您不确定城市的价值, NASA会提供一个漂亮的经纬度查找器 。 对于我的城市悉尼,它看起来像这样:
msg.url = 'https://twcservice.mybluemix.net:443/api/weather/v1/geocode/-33.8671417236/151.2071075439/forecast/hourly/48hour.json?units=m&language=en-US';
return msg;
如果您更喜欢Farenheit而不是Celsius,也可以更改units
变量。 units=m
用于公制(摄氏度), units=e
用于英制(华氏)。 当我们在澳大利亚使用摄氏温度时,我使用的是units=m
。
全部放入后,单击“完成”:
接下来,我们希望能够使用在第一个节点中设置的URL向天气数据服务发出HTTP请求。 为此,我们将“ http request”节点拖动到:
然后,我们双击它以打开其设置并执行以下操作:
- 勾选“使用基本身份验证”-我们需要它包含我们先前复制的用户名和密码。
- 从前面添加上述用户名和密码。
- 选择“已解析的JSON对象”作为我们的返回值-这样,我们将收到一个JSON对象,可以在以下节点中对其进行进一步过滤。
- 随便命名,我选择“ retrieveWeather”。
- 点击“完成”!
为了从第一个节点引入URL,我们必须记住将其连接到“ http request”节点:
然后,拖入“调试”节点并将其连接到末端。 这将使我们查看正在通过什么数据的日志,以检查其是否正常工作:
最后,我们需要一种启动整个过程的方法。 为此,请拖动一个新的“注入”节点并将其连接到起点:
现在我们准备对其进行测试! 点击“部署”:
为了运行我们的流程,我们需要在“注入”节点上单击带有标签“时间戳”的小方形按钮。 这将运行我们的天气请求,并在调试选项卡中显示数据:
优秀的! 一切都应该如我们所愿。
返回的msg.payload
包含一系列有关未来几个小时的预测。 我们采用数组中的第一项来获取当前时间。 msg.payload
看起来有点像这样:
{
"metadata": {
...
},
"forecasts": [
{
"class": "fod_long_range_hourly",
"expire_time_gmt": 1472786395,
"fcst_valid": 1472785200,
"fcst_valid_local": "2016-09-02T13:00:00+1000",
"num": 1,
"day_ind": "D",
"temp": 16,
"dewpt": 14,
"hi": 16,
"wc": 16,
"feels_like": 16,
"icon_extd": 1200,
"wxman": "wx2500",
"icon_code": 12,
"dow": "Friday",
"phrase_12char": "Rain",
"phrase_22char": "Rain",
"phrase_32char": "Rain",
"subphrase_pt1": "Rain",
"subphrase_pt2": "",
"subphrase_pt3": "",
"pop": 93,
"precip_type": "rain",
"qpf": 0.96,
"snow_qpf": 0.0,
"rh": 92,
"wspd": 8,
"wdir": 17,
"wdir_cardinal": "NNE",
"gust": null,
"clds": 100,
"vis": 6.0,
"mslp": 1006.8,
"uv_index_raw": 0.83,
"uv_index": 1,
"uv_warning": 0,
"uv_desc": "Low",
"golf_index": 2,
"golf_category": "Very Poor",
"severity": 1
},
... (the next hours go here)
现在,让我们超越基本的调试日志,让我们的Pi通过它先前学习的语音能力来告诉我们这些数据!
提醒我们的Pi如何说话
为了使我们的Pi说话,就像本系列上一篇文章中的CPU温度一样,我们只需要复制该教程中的最后七个节点即可。 您可以通过拖动并全部选中它们,然后按Ctrl + C(在Windows中)或Cmd + C(在Mac中)来复制它们:
使用Ctrl + V(在Windows上)或Cmd + V(在Mac上)粘贴它们,并将它们整齐地放置在我们的新天气流下。 重命名第一个函数“ Weather Text”,并将其连接到我们的“ retrieveWeather”节点,以便它也从该节点获取输出:
然后双击“天气文本”功能。 在此范围内,我们可以设置我们希望Pi所说的内容。 首先,将以下JavaScript代码放入其中:
msg.payload = "The current temperature is " +
msg.payload.forecasts[0].temp +
" degrees celsius";
return msg;
这将告诉我们的Pi,我们希望将输出结构化为返回“当前温度为X摄氏度” (如果您使用的是华氏温度,请随时在此处进行更改)。
现在,如果您希望Pi继续告诉您它的CPU温度,您可以跳过此特定步骤,但是我个人觉得天气更有趣,并且不想再听到有关它的CPU的信息。 如果您和我一样,请从另一个流中双击较旧的“时间戳”节点。 取消重复设置,然后取消选中“是否在启动时注入一次?”。 这样,仅当我们单击并告诉它运行时,该流程才会运行。 然后点击“完成”:
现在,我们可以将天气流设置为自动运行。 双击新的“时间戳”节点,并将其设置为根据需要重复执行一次(我每30分钟选择一次)。 点击“开始时注入一次?” 这样,当您部署流程时,它也会自动运行。 然后照常单击“完成”:
部署这些更改后,我们会很好地对我们说出当前温度的自动通知!
我们还能做什么?
想知道该服务还有哪些其他数据? 您可以在Weather Company Data For IBM Bluemix API页面上找到weather API可以提供的所有可能性。 在此示例中,我们使用“按地理编码的每小时48小时预报” API。 为了使我们的示例更高级,让我们添加一个小时是否会下雨的数据(下一个小时只是返回数组中的第二个值) :
msg.payload = "The current temperature is " +
msg.payload.forecasts[0].temp +
" degrees celsius. " +
"There is a " +
msg.payload.forecasts[1].pop +
" percent chance of " +
msg.payload.forecasts[1].precip_type +
" in an hour.";
return msg;
我们甚至可以更进一步,添加有关温度(当您添加湿度和风时)实际上是否会达到该温度的信息。 API有一个用于此的字段,我们可以这样访问它:
var tempToSay = msg.payload.forecasts[0].temp != msg.payload.forecasts[0].feels_like ?
"The current temperature is " + msg.payload.forecasts[0].temp +
" degrees celsius, but it will feel more like " +
msg.payload.forecasts[0].feels_like + ". " :
"The current temperature is " + msg.payload.forecasts[0].temp +
" degrees celsius. ";
msg.payload = tempToSay +
"There is a " +
msg.payload.forecasts[1].pop +
" percent chance of " +
msg.payload.forecasts[1].precip_type +
" in an hour.";
return msg;
基本上,如果上面的代码与msg.payload.forecasts[0].temp
值不同,则上面的代码仅提及msg.payload.forecasts[0].feels_like
值。
结论
有了它,我们有了Raspberry Pi,它可以通过各种方式告诉我们天气预报。 从风数据到积雪,那里还有更多的信息! 甚至还有一个值代表打高尔夫球的天气状况,这似乎很奇怪。 力量就在您手中!
如果您渴望通过Bluemix为Raspberry Pi提供更多功能,那就不用担心! 随着我们继续探索Bluemix平台的更多可能性,本系列中会有更多内容。 我非常喜欢这个过程,并在这里抱有很大的愿望!
您是否已使用Bluemix和Raspberry Pi构建了令人兴奋的东西? 还是您有想要使用Bluemix制作的东西,而我们希望涵盖其中? 在评论中留言!
From: https://www.sitepoint.com/forecasting-weather-with-ibm-watson-bluemix-raspberry-pi/