如何响应具有真正未知状态的设备的 QUERY 意图(willReportState = false,commandOnly ... = true 不足)?
How to respond to a QUERY intent for devices with a genuinely unknown state (willReportState = false, commandOnly... = true insufficient)?
问题
该文档似乎没有涵盖当您真的不知道给定设备的状态时如何响应 QUERY 请求。尽管我说 willReportState
对于每个设备都是错误的,并且在 SYNC 响应中包含各种 commandOnly
属性,但我还是收到了一个 QUERY 请求。同样的问题也适用于使用由 SYNC 或 QUERY 请求触发的 ReportState 调用。
状态未知,因为它是专有照明。我可以向它发送命令,并缓存这些命令的值,但一开始我无法告知现有状态。我非常清楚我可以缓存我在数据库中看到的所有历史值并检索它们,但这并不能阻止在我不知情的情况下从其他地方控制硬件,所以我从来没有真正知道状态,除非我现在我正在执行一个 EXECUTE 命令(然后我相应地报告)。
这与这个问题非常相似 (),但在我的情况下,我真的不知道't/can状态,所以我提供的任何提供状态的实现都是 guess/hack.
旧查询响应
{
"requestId": "SomeMatchingRequestId",
"payload": {
"devices": [{
"id": "SomeValidDeviceId",
"online": true,
"status": "SUCCESS"
}]
}
}
略有改善但响应欠佳
以下似乎可以满足要求。这个问题不仅在于这些值在现实生活中可能是错误的,在一些命令之后它们也可能与 UI 中的内容相矛盾。
{
"requestId": "SomeMatchingRequestId",
"payload": {
"devices": [{
"id": "SomeValidDeviceId",
"online": true,
"on": 0, /* Adding a default value */
"brightness": 0, /* Adding a default value */
"color": { "spectrumRGB": 0 }, /* Adding a default value */
"status": "SUCCESS"
}]
}
}
报告的设备
注意属性,其中一个没有记录,但我根据命名模式添加了它。
var device = new SyncResponseDevice
{
Id = deviceName,
Type = Types.Light.ToString(),
Traits = new List<string>
{
Traits.Brightness,
Traits.ColorSetting,
Traits.OnOff,
},
Name = new SyncResponseDeviceName { Name = zoneName },
WillReportState = false,
Attributes = new Dictionary<string, object>
{
{"commandOnlyBrightness", true},
{"commandOnlyOnOff", true},
{"commandOnlyColorSetting", true},
{"colorModel", colorModel.ToString().ToLower()}
}
};
如果你声称你只支持命令,但你仍然发送状态数据,这可能会导致一个奇怪的情况,你仍然需要随时知道该状态。如果您不始终知道,最好永远不要发送状态数据。
此外,与其在您的 QUERY 响应中发送 "SUCCESS",您可能希望发送一个 "ERROR" 状态,其中 "errorCode" 类似于 "notSupported" 这样会得到更准确的回应。
我们现已发布/认证。不幸的是,这个过程与 Nick 的一些建议相矛盾。我怀疑 Nick 的回答是最适合实施的答案,但为了获得认证,我们必须这样做...
每个设备都必须在测试套件测试中标记为 willReportState=true
,即使您不能报告真实状态,否则将被拒绝。
ReportState
必须根据具体响应 EXECUTE
请求来实施。在我们的例子中,我们可以实现这一点,因为您触发一个异步 ReportState
调用,其状态与命令中提供的状态完全相同。在现实生活中,状态可能已经发生了变化,但执行上述操作可以满足测试。
据我所知,没有必要为了获得认证而实施 ReportState
以响应 QUERY
和 SYNC
调用,尽管这可能是可取的如果可以的话。在我们的例子中,我们被迫以 fake/default 状态响应。
您可以使用 Nick 建议的错误响应或 fake/default 状态来响应 QUERY
和 SYNC
响应。 "work" 并且对最终用户没有可见的副作用,但最好采用 Nick 的方法。
提及 Nick 建议应授予例外将被忽略。 :(
祝您顺利通过测试套件中的测试,即使实现完美无缺。它依赖于 Google 家用设备正确解释扬声器发出的人工声音。可能是因为我的设备是英式英语和美式英语。我对此有大约 90% 的成功率,但是我对 运行 进行了大约 20 次测试,这意味着它一次又一次地失败了。重复测试花了一个多小时才通过。我在 Google 家庭设备附近使用大音量的录音室级监听扬声器,但它似乎没有帮助。我有像 "Set {device} brightness to 75%" 这样的东西被选为 "You want me to set the device, is that correct?"。好伤心。为什么这个测试涉及任何音频让我感到困惑。为什么不直接向命令处理程序发送消息?无论如何,祝你好运!
我希望 Google 主队将此作为一个问题提出来,看看上述情况,进而更新认证流程。到那时,这个答案有望变得多余。
问题
该文档似乎没有涵盖当您真的不知道给定设备的状态时如何响应 QUERY 请求。尽管我说 willReportState
对于每个设备都是错误的,并且在 SYNC 响应中包含各种 commandOnly
属性,但我还是收到了一个 QUERY 请求。同样的问题也适用于使用由 SYNC 或 QUERY 请求触发的 ReportState 调用。
状态未知,因为它是专有照明。我可以向它发送命令,并缓存这些命令的值,但一开始我无法告知现有状态。我非常清楚我可以缓存我在数据库中看到的所有历史值并检索它们,但这并不能阻止在我不知情的情况下从其他地方控制硬件,所以我从来没有真正知道状态,除非我现在我正在执行一个 EXECUTE 命令(然后我相应地报告)。
这与这个问题非常相似 (
旧查询响应
{
"requestId": "SomeMatchingRequestId",
"payload": {
"devices": [{
"id": "SomeValidDeviceId",
"online": true,
"status": "SUCCESS"
}]
}
}
略有改善但响应欠佳
以下似乎可以满足要求。这个问题不仅在于这些值在现实生活中可能是错误的,在一些命令之后它们也可能与 UI 中的内容相矛盾。
{
"requestId": "SomeMatchingRequestId",
"payload": {
"devices": [{
"id": "SomeValidDeviceId",
"online": true,
"on": 0, /* Adding a default value */
"brightness": 0, /* Adding a default value */
"color": { "spectrumRGB": 0 }, /* Adding a default value */
"status": "SUCCESS"
}]
}
}
报告的设备
注意属性,其中一个没有记录,但我根据命名模式添加了它。
var device = new SyncResponseDevice
{
Id = deviceName,
Type = Types.Light.ToString(),
Traits = new List<string>
{
Traits.Brightness,
Traits.ColorSetting,
Traits.OnOff,
},
Name = new SyncResponseDeviceName { Name = zoneName },
WillReportState = false,
Attributes = new Dictionary<string, object>
{
{"commandOnlyBrightness", true},
{"commandOnlyOnOff", true},
{"commandOnlyColorSetting", true},
{"colorModel", colorModel.ToString().ToLower()}
}
};
如果你声称你只支持命令,但你仍然发送状态数据,这可能会导致一个奇怪的情况,你仍然需要随时知道该状态。如果您不始终知道,最好永远不要发送状态数据。
此外,与其在您的 QUERY 响应中发送 "SUCCESS",您可能希望发送一个 "ERROR" 状态,其中 "errorCode" 类似于 "notSupported" 这样会得到更准确的回应。
我们现已发布/认证。不幸的是,这个过程与 Nick 的一些建议相矛盾。我怀疑 Nick 的回答是最适合实施的答案,但为了获得认证,我们必须这样做...
每个设备都必须在测试套件测试中标记为
willReportState=true
,即使您不能报告真实状态,否则将被拒绝。ReportState
必须根据具体响应EXECUTE
请求来实施。在我们的例子中,我们可以实现这一点,因为您触发一个异步ReportState
调用,其状态与命令中提供的状态完全相同。在现实生活中,状态可能已经发生了变化,但执行上述操作可以满足测试。据我所知,没有必要为了获得认证而实施
ReportState
以响应QUERY
和SYNC
调用,尽管这可能是可取的如果可以的话。在我们的例子中,我们被迫以 fake/default 状态响应。您可以使用 Nick 建议的错误响应或 fake/default 状态来响应
QUERY
和SYNC
响应。 "work" 并且对最终用户没有可见的副作用,但最好采用 Nick 的方法。提及 Nick 建议应授予例外将被忽略。 :(
祝您顺利通过测试套件中的测试,即使实现完美无缺。它依赖于 Google 家用设备正确解释扬声器发出的人工声音。可能是因为我的设备是英式英语和美式英语。我对此有大约 90% 的成功率,但是我对 运行 进行了大约 20 次测试,这意味着它一次又一次地失败了。重复测试花了一个多小时才通过。我在 Google 家庭设备附近使用大音量的录音室级监听扬声器,但它似乎没有帮助。我有像 "Set {device} brightness to 75%" 这样的东西被选为 "You want me to set the device, is that correct?"。好伤心。为什么这个测试涉及任何音频让我感到困惑。为什么不直接向命令处理程序发送消息?无论如何,祝你好运!
我希望 Google 主队将此作为一个问题提出来,看看上述情况,进而更新认证流程。到那时,这个答案有望变得多余。