setScenario method

Future<SetScenarioResponse> setScenario(
  1. String address,
  2. int sceneID,
  3. int level, {
  4. dynamic transition = 0,
  5. int output = 0,
  6. dynamic startAt = 0,
  7. dynamic duration = 0,
  8. List<String> daysInWeek = const <String>[],
  9. bool isActive = true,
  10. int timeout = kScenarioCmdTimeout,
})

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,
    },
  ));
}