Skip to content

Commit

Permalink
adds more demo data.
Browse files Browse the repository at this point in the history
  • Loading branch information
just-seba committed Sep 9, 2024
1 parent 93d68d2 commit 52fda2e
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 166 deletions.
6 changes: 6 additions & 0 deletions app/lib/application/analytics/analytics_day_data_dto.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@ class AnalyticsDayDataDto {
final DateTime start;
final DateTime end;
final List<PowerDataPointDto> home;
final List<PowerDataPointDto> production;
final List<PowerDataPointDto> gridConsume;
final List<PowerDataPointDto> gridFeedIn;

AnalyticsDayDataDto({
required this.start,
required this.end,
required this.home,
required this.production,
required this.gridConsume,
required this.gridFeedIn,
});
}
272 changes: 161 additions & 111 deletions app/lib/application/analytics/analytics_demo_data.dart
Original file line number Diff line number Diff line change
@@ -1,140 +1,190 @@
import 'dart:math';

import 'package:collection/collection.dart';
import 'package:emma/application/analytics/analytics_day_data_dto.dart';
import 'package:emma/application/analytics/power_data_point_dto.dart';

abstract final class AnalyticsDemoData {
static AnalyticsDayDataDto day(DateTime start) {
final consumption = _randomize(
start,
_consumption.map((x) => _toDto(start, x)),
);

final production = _randomize(
start,
_production.map((x) => _toDto(start, x)).toList(),
);

final grid = IterableZip([production, consumption])
.map((x) => (time: x[0].time, power: x[0].power - x[1].power))
.toList();

final gridConsume = grid
.map((x) => PowerDataPointDto(x.time, min(0, x.power).abs().toDouble()))
.toList();

final gridFeedIn = grid
.map((x) => PowerDataPointDto(x.time, max(0, x.power).toDouble()))
.toList();

return AnalyticsDayDataDto(
start: start,
end: start.add(const Duration(days: 1)),
home: _randomize(
start,
_defaultHomePower
.map((x) => PowerDataPointDto(
start.add(x.time),
x.watts * _factor,
))
.toList(),
),
home: consumption,
production: production,
gridConsume: gridConsume,
gridFeedIn: gridFeedIn,
);
}

static List<PowerDataPointDto> _randomize(
DateTime start, List<PowerDataPointDto> data) {
DateTime start, Iterable<PowerDataPointDto> data) {
final rnd = Random(start.millisecondsSinceEpoch);
final scales = [for (var i = 0; i < 6; i++) _getRandomScale(rnd)];
final scales = [for (var i = 0; i < 12; i++) _getRandomScale(rnd)];
return data.indexed.map((x) {
final scale = scales[x.$1 * scales.length ~/ data.length];
return PowerDataPointDto(x.$2.time, (x.$2.power * scale).roundToDouble());
}).toList();
}

// returns value in range of 0.95 - 1.05
// returns value in range of 0.9 - 1.1
static double _getRandomScale(Random random) {
// 0 ... 0.1
final r = random.nextInt(101) / 1000;
return 0.95 + r;
final r = random.nextInt(21) / 100;
return 0.9 + r;
}

static PowerDataPointDto _toDto(
DateTime start, ({Duration time, double power}) x) {
return PowerDataPointDto(start.add(x.time), x.power);
}

static const _kwP = 0.75;
static const _sunrise = Duration(hours: 06, minutes: 00);
static const _sunset = Duration(hours: 20, minutes: 00);
static final _production = [
for (var time = Duration.zero;
time < const Duration(hours: 24);
time += const Duration(minutes: 15))
(
time: time,
power: _getProduction(time),
),
];

static double _getProduction(Duration time) {
if (time < _sunrise || time > _sunset) {
return 0;
}

final f = 1 / (_sunset.inMinutes - _sunrise.inMinutes) / 2;
final t = time.inMinutes - _sunrise.inMinutes;
final power = pow(sin(2 * pi * f * t), 2) * _kwP * 1000;
return power.toDouble();
}

static final _consumption =
_defaultHomePower.map((x) => (time: x.time, power: x.power * _factor));

static const _factor = 2.7;
static final _defaultHomePower = [
(time: const Duration(hours: 00, minutes: 00), watts: 96.5),
(time: const Duration(hours: 0, minutes: 15), watts: 86.3),
(time: const Duration(hours: 0, minutes: 30), watts: 76.9),
(time: const Duration(hours: 0, minutes: 45), watts: 68.8),
(time: const Duration(hours: 1, minutes: 00), watts: 62.4),
(time: const Duration(hours: 1, minutes: 15), watts: 58.0),
(time: const Duration(hours: 1, minutes: 30), watts: 55.3),
(time: const Duration(hours: 1, minutes: 45), watts: 53.6),
(time: const Duration(hours: 2, minutes: 00), watts: 52.4),
(time: const Duration(hours: 2, minutes: 15), watts: 51.3),
(time: const Duration(hours: 2, minutes: 30), watts: 50.3),
(time: const Duration(hours: 2, minutes: 45), watts: 49.2),
(time: const Duration(hours: 3, minutes: 00), watts: 48.3),
(time: const Duration(hours: 3, minutes: 15), watts: 47.5),
(time: const Duration(hours: 3, minutes: 30), watts: 46.9),
(time: const Duration(hours: 3, minutes: 45), watts: 46.5),
(time: const Duration(hours: 4, minutes: 00), watts: 46.6),
(time: const Duration(hours: 4, minutes: 15), watts: 47.1),
(time: const Duration(hours: 4, minutes: 30), watts: 48.0),
(time: const Duration(hours: 4, minutes: 45), watts: 49.3),
(time: const Duration(hours: 5, minutes: 00), watts: 50.8),
(time: const Duration(hours: 5, minutes: 15), watts: 52.7),
(time: const Duration(hours: 5, minutes: 30), watts: 55.6),
(time: const Duration(hours: 5, minutes: 45), watts: 60.5),
(time: const Duration(hours: 6, minutes: 00), watts: 68.2),
(time: const Duration(hours: 6, minutes: 15), watts: 79.2),
(time: const Duration(hours: 6, minutes: 30), watts: 92.0),
(time: const Duration(hours: 6, minutes: 45), watts: 104.7),
(time: const Duration(hours: 7, minutes: 00), watts: 115.7),
(time: const Duration(hours: 7, minutes: 15), watts: 123.5),
(time: const Duration(hours: 7, minutes: 30), watts: 128.6),
(time: const Duration(hours: 7, minutes: 45), watts: 132.0),
(time: const Duration(hours: 8, minutes: 00), watts: 134.8),
(time: const Duration(hours: 8, minutes: 15), watts: 137.8),
(time: const Duration(hours: 8, minutes: 30), watts: 140.7),
(time: const Duration(hours: 8, minutes: 45), watts: 143.2),
(time: const Duration(hours: 9, minutes: 00), watts: 144.8),
(time: const Duration(hours: 9, minutes: 15), watts: 145.3),
(time: const Duration(hours: 9, minutes: 30), watts: 144.9),
(time: const Duration(hours: 9, minutes: 45), watts: 143.8),
(time: const Duration(hours: 10, minutes: 00), watts: 142.3),
(time: const Duration(hours: 10, minutes: 15), watts: 140.8),
(time: const Duration(hours: 10, minutes: 30), watts: 139.5),
(time: const Duration(hours: 10, minutes: 45), watts: 138.5),
(time: const Duration(hours: 11, minutes: 00), watts: 138.2),
(time: const Duration(hours: 11, minutes: 15), watts: 138.6),
(time: const Duration(hours: 11, minutes: 30), watts: 140.1),
(time: const Duration(hours: 11, minutes: 45), watts: 142.6),
(time: const Duration(hours: 12, minutes: 00), watts: 146.5),
(time: const Duration(hours: 12, minutes: 15), watts: 151.5),
(time: const Duration(hours: 12, minutes: 30), watts: 156.7),
(time: const Duration(hours: 12, minutes: 45), watts: 160.7),
(time: const Duration(hours: 13, minutes: 00), watts: 162.3),
(time: const Duration(hours: 13, minutes: 15), watts: 160.5),
(time: const Duration(hours: 13, minutes: 30), watts: 156.1),
(time: const Duration(hours: 13, minutes: 45), watts: 150.2),
(time: const Duration(hours: 14, minutes: 00), watts: 144.0),
(time: const Duration(hours: 14, minutes: 15), watts: 138.4),
(time: const Duration(hours: 14, minutes: 30), watts: 133.6),
(time: const Duration(hours: 14, minutes: 45), watts: 129.4),
(time: const Duration(hours: 15, minutes: 00), watts: 125.7),
(time: const Duration(hours: 15, minutes: 15), watts: 122.4),
(time: const Duration(hours: 15, minutes: 30), watts: 119.6),
(time: const Duration(hours: 15, minutes: 45), watts: 117.4),
(time: const Duration(hours: 16, minutes: 00), watts: 115.7),
(time: const Duration(hours: 16, minutes: 15), watts: 114.6),
(time: const Duration(hours: 16, minutes: 30), watts: 114.2),
(time: const Duration(hours: 16, minutes: 45), watts: 114.6),
(time: const Duration(hours: 17, minutes: 00), watts: 115.7),
(time: const Duration(hours: 17, minutes: 15), watts: 117.6),
(time: const Duration(hours: 17, minutes: 30), watts: 120.3),
(time: const Duration(hours: 17, minutes: 45), watts: 123.9),
(time: const Duration(hours: 18, minutes: 00), watts: 128.2),
(time: const Duration(hours: 18, minutes: 15), watts: 133.2),
(time: const Duration(hours: 18, minutes: 30), watts: 138.9),
(time: const Duration(hours: 18, minutes: 45), watts: 145.1),
(time: const Duration(hours: 19, minutes: 00), watts: 151.5),
(time: const Duration(hours: 19, minutes: 15), watts: 157.9),
(time: const Duration(hours: 19, minutes: 30), watts: 163.8),
(time: const Duration(hours: 19, minutes: 45), watts: 168.3),
(time: const Duration(hours: 20, minutes: 00), watts: 170.6),
(time: const Duration(hours: 20, minutes: 15), watts: 170.4),
(time: const Duration(hours: 20, minutes: 30), watts: 168.3),
(time: const Duration(hours: 20, minutes: 45), watts: 165.3),
(time: const Duration(hours: 21, minutes: 00), watts: 162.3),
(time: const Duration(hours: 21, minutes: 15), watts: 160.1),
(time: const Duration(hours: 21, minutes: 30), watts: 158.4),
(time: const Duration(hours: 21, minutes: 45), watts: 156.8),
(time: const Duration(hours: 22, minutes: 00), watts: 154.8),
(time: const Duration(hours: 22, minutes: 15), watts: 151.9),
(time: const Duration(hours: 22, minutes: 30), watts: 147.9),
(time: const Duration(hours: 22, minutes: 45), watts: 142.5),
(time: const Duration(hours: 23, minutes: 00), watts: 135.7),
(time: const Duration(hours: 23, minutes: 15), watts: 127.2),
(time: const Duration(hours: 23, minutes: 30), watts: 117.5),
(time: const Duration(hours: 23, minutes: 45), watts: 107.1),
(time: const Duration(hours: 24, minutes: 00), watts: 96.5),
(time: const Duration(hours: 00, minutes: 00), power: 96.5),
(time: const Duration(hours: 0, minutes: 15), power: 86.3),
(time: const Duration(hours: 0, minutes: 30), power: 76.9),
(time: const Duration(hours: 0, minutes: 45), power: 68.8),
(time: const Duration(hours: 1, minutes: 00), power: 62.4),
(time: const Duration(hours: 1, minutes: 15), power: 58.0),
(time: const Duration(hours: 1, minutes: 30), power: 55.3),
(time: const Duration(hours: 1, minutes: 45), power: 53.6),
(time: const Duration(hours: 2, minutes: 00), power: 52.4),
(time: const Duration(hours: 2, minutes: 15), power: 51.3),
(time: const Duration(hours: 2, minutes: 30), power: 50.3),
(time: const Duration(hours: 2, minutes: 45), power: 49.2),
(time: const Duration(hours: 3, minutes: 00), power: 48.3),
(time: const Duration(hours: 3, minutes: 15), power: 47.5),
(time: const Duration(hours: 3, minutes: 30), power: 46.9),
(time: const Duration(hours: 3, minutes: 45), power: 46.5),
(time: const Duration(hours: 4, minutes: 00), power: 46.6),
(time: const Duration(hours: 4, minutes: 15), power: 47.1),
(time: const Duration(hours: 4, minutes: 30), power: 48.0),
(time: const Duration(hours: 4, minutes: 45), power: 49.3),
(time: const Duration(hours: 5, minutes: 00), power: 50.8),
(time: const Duration(hours: 5, minutes: 15), power: 52.7),
(time: const Duration(hours: 5, minutes: 30), power: 55.6),
(time: const Duration(hours: 5, minutes: 45), power: 60.5),
(time: const Duration(hours: 6, minutes: 00), power: 68.2),
(time: const Duration(hours: 6, minutes: 15), power: 79.2),
(time: const Duration(hours: 6, minutes: 30), power: 92.0),
(time: const Duration(hours: 6, minutes: 45), power: 104.7),
(time: const Duration(hours: 7, minutes: 00), power: 115.7),
(time: const Duration(hours: 7, minutes: 15), power: 123.5),
(time: const Duration(hours: 7, minutes: 30), power: 128.6),
(time: const Duration(hours: 7, minutes: 45), power: 132.0),
(time: const Duration(hours: 8, minutes: 00), power: 134.8),
(time: const Duration(hours: 8, minutes: 15), power: 137.8),
(time: const Duration(hours: 8, minutes: 30), power: 140.7),
(time: const Duration(hours: 8, minutes: 45), power: 143.2),
(time: const Duration(hours: 9, minutes: 00), power: 144.8),
(time: const Duration(hours: 9, minutes: 15), power: 145.3),
(time: const Duration(hours: 9, minutes: 30), power: 144.9),
(time: const Duration(hours: 9, minutes: 45), power: 143.8),
(time: const Duration(hours: 10, minutes: 00), power: 142.3),
(time: const Duration(hours: 10, minutes: 15), power: 140.8),
(time: const Duration(hours: 10, minutes: 30), power: 139.5),
(time: const Duration(hours: 10, minutes: 45), power: 138.5),
(time: const Duration(hours: 11, minutes: 00), power: 138.2),
(time: const Duration(hours: 11, minutes: 15), power: 138.6),
(time: const Duration(hours: 11, minutes: 30), power: 140.1),
(time: const Duration(hours: 11, minutes: 45), power: 142.6),
(time: const Duration(hours: 12, minutes: 00), power: 146.5),
(time: const Duration(hours: 12, minutes: 15), power: 151.5),
(time: const Duration(hours: 12, minutes: 30), power: 156.7),
(time: const Duration(hours: 12, minutes: 45), power: 160.7),
(time: const Duration(hours: 13, minutes: 00), power: 162.3),
(time: const Duration(hours: 13, minutes: 15), power: 160.5),
(time: const Duration(hours: 13, minutes: 30), power: 156.1),
(time: const Duration(hours: 13, minutes: 45), power: 150.2),
(time: const Duration(hours: 14, minutes: 00), power: 144.0),
(time: const Duration(hours: 14, minutes: 15), power: 138.4),
(time: const Duration(hours: 14, minutes: 30), power: 133.6),
(time: const Duration(hours: 14, minutes: 45), power: 129.4),
(time: const Duration(hours: 15, minutes: 00), power: 125.7),
(time: const Duration(hours: 15, minutes: 15), power: 122.4),
(time: const Duration(hours: 15, minutes: 30), power: 119.6),
(time: const Duration(hours: 15, minutes: 45), power: 117.4),
(time: const Duration(hours: 16, minutes: 00), power: 115.7),
(time: const Duration(hours: 16, minutes: 15), power: 114.6),
(time: const Duration(hours: 16, minutes: 30), power: 114.2),
(time: const Duration(hours: 16, minutes: 45), power: 114.6),
(time: const Duration(hours: 17, minutes: 00), power: 115.7),
(time: const Duration(hours: 17, minutes: 15), power: 117.6),
(time: const Duration(hours: 17, minutes: 30), power: 120.3),
(time: const Duration(hours: 17, minutes: 45), power: 123.9),
(time: const Duration(hours: 18, minutes: 00), power: 128.2),
(time: const Duration(hours: 18, minutes: 15), power: 133.2),
(time: const Duration(hours: 18, minutes: 30), power: 138.9),
(time: const Duration(hours: 18, minutes: 45), power: 145.1),
(time: const Duration(hours: 19, minutes: 00), power: 151.5),
(time: const Duration(hours: 19, minutes: 15), power: 157.9),
(time: const Duration(hours: 19, minutes: 30), power: 163.8),
(time: const Duration(hours: 19, minutes: 45), power: 168.3),
(time: const Duration(hours: 20, minutes: 00), power: 170.6),
(time: const Duration(hours: 20, minutes: 15), power: 170.4),
(time: const Duration(hours: 20, minutes: 30), power: 168.3),
(time: const Duration(hours: 20, minutes: 45), power: 165.3),
(time: const Duration(hours: 21, minutes: 00), power: 162.3),
(time: const Duration(hours: 21, minutes: 15), power: 160.1),
(time: const Duration(hours: 21, minutes: 30), power: 158.4),
(time: const Duration(hours: 21, minutes: 45), power: 156.8),
(time: const Duration(hours: 22, minutes: 00), power: 154.8),
(time: const Duration(hours: 22, minutes: 15), power: 151.9),
(time: const Duration(hours: 22, minutes: 30), power: 147.9),
(time: const Duration(hours: 22, minutes: 45), power: 142.5),
(time: const Duration(hours: 23, minutes: 00), power: 135.7),
(time: const Duration(hours: 23, minutes: 15), power: 127.2),
(time: const Duration(hours: 23, minutes: 30), power: 117.5),
(time: const Duration(hours: 23, minutes: 45), power: 107.1),
(time: const Duration(hours: 24, minutes: 00), power: 96.5),
];
}
Loading

0 comments on commit 52fda2e

Please sign in to comment.