setScenario method
A method to set a scenario on the device at address
.
daysInWeek
is the list of days as lower case english words. Example: monday, tuesday, wednesday, etc.
transition
should be one of :
- unsigned integer: minimum: 0, maximum: 63,
- json: { "mode": pattern "$minutes|seconds^", "duration: unsigned integer: minimum: 0, maximum: 31, }
startAt
and duration
should be one of:
- string pattern: "^(
0-9
{1,2}h0-9
{1,2})$" - unsigned integer, minimum: 0, maximum: 127
Implementation
Future<SetScenarioResponse> setScenario(
String address,
int sceneID,
int level, {
dynamic transition = 0,
int output = 0,
dynamic startAt = 0,
dynamic duration = 0,
List<String> daysInWeek = const <String>[],
bool isActive = true,
int timeout = kScenarioCmdTimeout,
}) async {
if (sceneID < 0 || sceneID > 510) {
throw RangeError.range(sceneID, 0, 510, 'sceneID');
}
_checkValidAddress(address, shouldCheckGroupFormat: false);
final dayPattern = RegExp(r'[a-z]');
if (daysInWeek.any((day) => !dayPattern.hasMatch(day))) {
throw ArgumentError('daysInWeek must hold lower case english days');
}
if (startAt is String) {
final startAtPattern = RegExp(r'^([0-9]{1,2}h[0-9]{1,2})$');
if (!startAtPattern.hasMatch(startAt)) {
throw ArgumentError('startAt must hold lower case 24h representation (ex: 18h47)');
}
} else if (startAt is int) {
if (startAt < 0 || startAt > 127) {
throw RangeError.range(startAt, 0, 127, 'startAt');
}
} else {
throw ArgumentError('startAt must be either of type String or int');
}
if (duration is String) {
final durationPattern = RegExp(r'^([0-9]{1,2}h[0-9]{1,2})$');
if (!durationPattern.hasMatch(duration)) {
throw ArgumentError('duration must hold lower case 24h representation (ex: 18h47)');
}
} else if (duration is int) {
if (duration < 0 || duration > 127) {
throw RangeError.range(duration, 0, 127, 'duration');
}
} else {
throw ArgumentError('duration must be either of type String or int');
}
dynamic _transition = transition;
if (_transition is String) {
final transitionAsJson = json.decode(_transition) as Map<String, dynamic>;
if (!(transitionAsJson.containsKey('mode') &&
transitionAsJson.containsKey('duration') &&
transitionAsJson.entries.length == 2)) {
throw ArgumentError('transition must be a JSON string with only "mode" and "duration" keys');
} else {
_transition = transitionAsJson;
}
} else if (_transition is int) {
if (_transition < 0 || _transition > 63) {
throw RangeError.range(_transition, 0, 63, 'transition');
}
} else {
throw ArgumentError('transition must be either of type String or int');
}
if (output < 0 || output > 1) {
throw RangeError.range(output, 0, 1, 'output');
}
final r = Random();
final correlation = int.parse(address, radix: 16) + r.nextInt(1 << 15);
return SetScenarioResponse.fromJson(await _sendRequest(
'set_scenario',
params: <String, dynamic>{
'node_address': address,
'request': <String, dynamic>{
'command': 'set scenario',
'correlation': correlation,
'scenario_id': sceneID,
'io': output,
'level': level,
'transition': _transition,
'start_at': startAt,
'duration': duration,
'days_in_week': daysInWeek,
'is_active': isActive,
},
'timeout': timeout,
},
));
}