Проблема
В документации не указано, как реагировать на запрос QUERY, если вы действительно не знаете состояния данного устройства. Несмотря на то, что я говорю, что willReportState
является ложным для каждого устройства и включает в себя различные атрибуты commandOnly
в ответе SYN C, тем не менее мне отправляется запрос QUERY. Та же проблема относится и к использованию вызовов ReportState, инициируемых запросом SYN C или QUERY.
Состояние неизвестно, так как это собственное освещение. Я могу отправлять ему команды и кэшировать значения этих команд, но вначале у меня нет средств сообщить о существующем состоянии. Я очень хорошо знаю, что могу кэшировать все исторические значения c, которые я вижу в базе данных, и извлекать их, но это не мешает управлению оборудованием из других источников без моего ведома, поэтому я никогда не узнаю по-настоящему состояние, кроме как в тот момент, когда я выполняю команду EXECUTE (о которой я затем сообщаю соответственно).
Это очень похоже на этот вопрос ( Главная страница Google - Обязательно ли состояние отчета? ), но в моем случай, когда я действительно не знаю / не могу знать состояние, поэтому любая реализация, которую я предоставляю, предоставляя состояние, является предположением / хаком.
Ответ на старый запрос
{
"requestId": "SomeMatchingRequestId",
"payload": {
"devices": [{
"id": "SomeValidDeviceId",
"online": true,
"status": "SUCCESS"
}]
}
}
Немного улучшен, но неоптимален Ответ
Кажется, что следующее удовлетворяет запрос. Проблема заключается не только в том, что эти значения могут быть неверными в реальной жизни, после нескольких команд они также могут противоречить тому, что есть в пользовательском интерфейсе.
{
"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()}
}
};