Проблема
В документации не описывается, как отвечать на запрос QUERY, если вы действительно не знаете состояние данного устройства. Несмотря на то, что я говорю, что willReportState
неверно для каждого устройства и включаю различные атрибуты commandOnly
в ответ SYNC, мне тем не менее отправляется запрос QUERY. Та же проблема относится и к использованию вызовов ReportState, инициированных запросом SYNC или QUERY.
Состояние неизвестно, потому что это фирменное освещение. Я могу посылать ему команды и кэшировать значения этих команд, но вначале у меня нет средств сообщить о существующем состоянии. Я очень хорошо понимаю, что могу кэшировать все исторические значения, которые я вижу в базе данных, и извлекать их, но это не останавливает управление оборудованием из другого места без моего ведома, поэтому я никогда по-настоящему не знаю состояние, за исключением того момента, когда я Выполняю команду 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()}
}
};