Skip to content

Commit c4e677a

Browse files
committed
complete basic models/api
1 parent 36ee8cd commit c4e677a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+647
-119
lines changed

lib/src/.pubignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# Generated files
22
!*.chopper.dart
33
!*.freezed.dart
4+
!*.g.dart

lib/src/api/aha/aha_service.dart

Lines changed: 92 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import 'package:chopper/chopper.dart';
2+
import 'package:color/color.dart';
23

4+
import 'models/blind_state.dart';
5+
import 'models/color_defaults.dart';
6+
import 'models/device.dart';
37
import 'models/device_list.dart';
48
import 'models/device_stats.dart';
9+
import 'models/energy.dart';
510
import 'models/hkr_temperature.dart';
11+
import 'models/level.dart';
612
import 'models/percentage.dart';
13+
import 'models/power.dart';
14+
import 'models/subscription_state.dart';
715
import 'models/switch_action.dart';
16+
import 'models/switch_duration.dart';
817
import 'models/temperature.dart';
18+
import 'models/timestamp.dart';
919

1020
part 'aha_service.chopper.dart';
1121

@@ -15,14 +25,20 @@ abstract class AhaService extends ChopperService {
1525

1626
static AhaService create([ChopperClient? client]) => _$AhaService(client);
1727

18-
// all devices
28+
// all devices / global
1929

2030
@Get(path: '$_baseUrl=getdevicelistinfos')
2131
Future<Response<DeviceList>> getDeviceListInfos();
2232

33+
@Get(path: '$_baseUrl=getdeviceinfos')
34+
Future<Response<Device>> getDeviceInfos(@Query() String ain);
35+
2336
@Get(path: '$_baseUrl=getbasicdevicestats')
2437
Future<Response<DeviceStats>> getBasicDeviceStats(@Query() String ain);
2538

39+
@Get(path: '$_baseUrl=setname')
40+
Future<Response<void>> setName(@Query() String ain, @Query() String name);
41+
2642
// switches
2743

2844
@Get(path: '$_baseUrl=getswitchlist')
@@ -43,13 +59,12 @@ abstract class AhaService extends ChopperService {
4359
@Get(path: '$_baseUrl=getswitchpresent')
4460
Future<Response<bool>> getSwitchPresent(@Query() String ain);
4561

46-
/// Returns the power in mW
4762
@Get(path: '$_baseUrl=getswitchpower')
48-
Future<Response<int?>> getSwitchPower(@Query() String ain);
63+
Future<Response<Power?>> getSwitchPower(@Query() String ain);
4964

5065
/// Returns the energy in Wh
5166
@Get(path: '$_baseUrl=getswitchenergy')
52-
Future<Response<int?>> getSwitchEnergy(@Query() String ain);
67+
Future<Response<Energy?>> getSwitchEnergy(@Query() String ain);
5368

5469
@Get(path: '$_baseUrl=getswitchname')
5570
Future<Response<String>> getSwitchName(@Query() String ain);
@@ -73,9 +88,21 @@ abstract class AhaService extends ChopperService {
7388
@Get(path: '$_baseUrl=sethkrtsoll')
7489
Future<Response<void>> setHkrTSoll(
7590
@Query() String ain,
76-
@Query('param') HkrTemperature temperature,
91+
@Query() HkrTemperature param,
7792
);
7893

94+
@Get(path: '$_baseUrl=sethkrboost')
95+
Future<Response<Timestamp>> setHkrBoost(
96+
@Query() String ain, [
97+
@Query('endtimestamp') Timestamp endTimestamp = Timestamp.deactivated,
98+
]);
99+
100+
@Get(path: '$_baseUrl=sethkrwindowopen')
101+
Future<Response<Timestamp>> setHkrWindowOpen(
102+
@Query() String ain, [
103+
@Query('endtimestamp') Timestamp endTimestamp = Timestamp.deactivated,
104+
]);
105+
79106
// templates
80107

81108
// @Get(path: '$_baseUrl=gettemplatelistinfos')
@@ -92,13 +119,71 @@ abstract class AhaService extends ChopperService {
92119
@Query('onoff') SwitchAction onOff,
93120
);
94121

95-
/// Level must be [0, 255]
122+
// level controllable
123+
96124
@Get(path: '$_baseUrl=setlevel')
97-
Future<Response<void>> setLevel(@Query() String ain, @Query() int level);
125+
Future<Response<void>> setLevel(@Query() String ain, @Query() Level level);
98126

99127
@Get(path: '$_baseUrl=setlevelpercentage')
100128
Future<Response<void>> setLevelPercentage(
101129
@Query() String ain,
102130
@Query() Percentage level,
103131
);
132+
133+
// light bulbs
134+
135+
@Get(path: '$_baseUrl=setcolor')
136+
Future<Response<void>> _setColor(
137+
@Query() String ain, {
138+
@Query() required int hue,
139+
@Query() required int saturation,
140+
@Query() required SwitchDuration duration,
141+
});
142+
143+
Future<Response<void>> setColorHs(
144+
String ain,
145+
HsvColor color,
146+
SwitchDuration duration,
147+
) =>
148+
_setColor(
149+
ain,
150+
hue: color.h.round(),
151+
saturation: color.s.round(),
152+
duration: duration,
153+
);
154+
155+
Future<Response<void>> setColorV(
156+
String ain,
157+
HsvColor color,
158+
) =>
159+
setLevel(
160+
ain,
161+
Percentage(rawValue: color.v.round()).toLevel(),
162+
);
163+
164+
@Get(path: '$_baseUrl=setcolortemperature')
165+
Future<Response<void>> setColorTemperature(
166+
@Query() String ain,
167+
@Query() int temperature,
168+
@Query() SwitchDuration duration,
169+
);
170+
171+
@Get(path: '$_baseUrl=getcolordefaults')
172+
Future<Response<ColorDefaults>> getColorDefaults();
173+
174+
// blinds
175+
176+
@Get(path: '$_baseUrl=setblind')
177+
Future<Response<void>> setBlind(
178+
@Query() String ain,
179+
@Query() BlindState target,
180+
);
181+
182+
// device registration
183+
184+
@Get(path: '$_baseUrl=startulesubscription')
185+
Future<Response<void>> startUleSubscription();
186+
187+
@Get(path: '$_baseUrl=getsubscriptionstate')
188+
Future<Response<State>> getSubscriptionState();
104189
}

lib/src/api/aha/models/alert.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
22
import 'package:xml/xml.dart';
33
import 'package:xml_annotation/xml_annotation.dart' as xml;
44

5-
import '../../util/xml_convertible.dart';
5+
import '../../util/xml_serializable.dart';
66
import 'timestamp.dart';
77

88
part 'alert.freezed.dart';
@@ -37,7 +37,7 @@ abstract class Alert with _$Alert implements IXmlSerializable {
3737
const factory Alert({
3838
@xml.XmlElement() @Default(AlertState.unknown) AlertState state,
3939
@xml.XmlElement(name: 'lastalertchgtimestamp')
40-
@Default(Timestamp.invalid)
40+
@Default(Timestamp.deactivated)
4141
Timestamp lastAlertChgTimestamp,
4242
}) = _Alert;
4343

lib/src/api/aha/models/avm_button.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
22
import 'package:xml/xml.dart';
33
import 'package:xml_annotation/xml_annotation.dart' as xml;
44

5-
import '../../util/xml_convertible.dart';
5+
import '../../util/xml_serializable.dart';
66
import 'percentage.dart';
77

88
part 'avm_button.freezed.dart';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
enum BlindState {
2+
open,
3+
close,
4+
stop;
5+
6+
@override
7+
String toString() => name;
8+
}

lib/src/api/aha/models/button.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
22
import 'package:xml/xml.dart';
33
import 'package:xml_annotation/xml_annotation.dart' as xml;
44

5-
import '../../util/xml_convertible.dart';
5+
import '../../util/xml_serializable.dart';
66
import 'timestamp.dart';
77

88
part 'button.freezed.dart';
@@ -19,7 +19,7 @@ abstract class Button with _$Button implements IXmlSerializable {
1919
@xml.XmlAttribute() int? id,
2020
@xml.XmlAttribute() String? identifier,
2121
@xml.XmlElement(name: 'lastpressedtimestamp')
22-
@Default(Timestamp.invalid)
22+
@Default(Timestamp.deactivated)
2323
Timestamp lastPressedTimestamp,
2424
@xml.XmlElement() String? name,
2525
}) = _Button;

lib/src/api/aha/models/color.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import 'package:color/color.dart';
2+
import 'package:freezed_annotation/freezed_annotation.dart';
3+
import 'package:xml/xml.dart';
4+
import 'package:xml_annotation/xml_annotation.dart' as xml;
5+
6+
import '../../util/xml_serializable.dart';
7+
8+
part 'color.freezed.dart';
9+
part 'color.g.dart';
10+
11+
@Freezed(makeCollectionsUnmodifiable: false)
12+
@xml.XmlSerializable()
13+
abstract class Color with _$Color implements IXmlSerializable {
14+
static const invalid = Color();
15+
16+
@xml.XmlSerializable(createMixin: true)
17+
@With.fromString(r'_$_$_ColorXmlSerializableMixin')
18+
@Assert('hue >= 0 && hue <= 359', 'hue must be in range [0, 359]')
19+
@Assert('sat >= 0 && sat <= 255', 'sat must be in range [0, 255]')
20+
@Assert('val >= 0 && val <= 255', 'val must be in range [0, 255]')
21+
const factory Color({
22+
@xml.XmlAttribute(name: 'sat_index') @Default(0) int satIndex,
23+
@xml.XmlAttribute() @visibleForOverriding @Default(0) int hue,
24+
@xml.XmlAttribute() @visibleForOverriding @Default(0) int sat,
25+
@xml.XmlAttribute() @visibleForOverriding @Default(0) int val,
26+
}) = _Color;
27+
28+
factory Color.fromXmlElement(XmlElement element) =>
29+
_$_$_ColorFromXmlElement(element);
30+
31+
const Color._();
32+
33+
HsvColor get color => HsvColor(
34+
hue,
35+
sat / 255 * 100,
36+
val / 255 * 100,
37+
);
38+
}

lib/src/api/aha/models/color_control.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
44
import 'package:xml/xml.dart';
55
import 'package:xml_annotation/xml_annotation.dart' as xml;
66

7-
import '../../util/xml_convertible.dart';
7+
import '../../util/xml_serializable.dart';
88
import 'level_control.dart';
99

1010
part 'color_control.freezed.dart';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
2+
import 'package:xml/xml.dart';
3+
import 'package:xml_annotation/xml_annotation.dart' as xml;
4+
5+
import '../../util/xml_serializable.dart';
6+
7+
import 'hs_defaults.dart';
8+
import 'temperature_defaults.dart';
9+
10+
part 'color_defaults.freezed.dart';
11+
part 'color_defaults.g.dart';
12+
13+
@Freezed(makeCollectionsUnmodifiable: false)
14+
@xml.XmlSerializable()
15+
abstract class ColorDefaults with _$ColorDefaults implements IXmlConvertible {
16+
static const elementName = 'colordefaults';
17+
18+
static const invalid = ColorDefaults();
19+
20+
@xml.XmlSerializable(createMixin: true)
21+
@xml.XmlRootElement(name: ColorDefaults.elementName)
22+
@With.fromString(r'_$_$_ColorDefaultsXmlSerializableMixin')
23+
const factory ColorDefaults({
24+
@xml.XmlElement(name: 'hsdefaults')
25+
@Default(HsDefaults.invalid)
26+
HsDefaults hsDefaults,
27+
@xml.XmlElement(name: 'temperaturedefaults')
28+
@Default(TemperatureDefaults.invalid)
29+
TemperatureDefaults temperatureDefaults,
30+
}) = _ColorDefaults;
31+
32+
factory ColorDefaults.fromXmlElement(XmlElement element) =>
33+
_$_$_ColorDefaultsFromXmlElement(element);
34+
}

lib/src/api/aha/models/device.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
22
import 'package:xml/xml.dart';
33
import 'package:xml_annotation/xml_annotation.dart' as xml;
44

5-
import '../../util/xml_convertible.dart';
5+
import '../../util/xml_serializable.dart';
66
import 'alert.dart';
77
import 'avm_button.dart';
88
import 'button.dart';
@@ -21,14 +21,15 @@ part 'device.g.dart';
2121

2222
@Freezed(makeCollectionsUnmodifiable: false)
2323
@xml.XmlSerializable()
24-
abstract class Device with _$Device implements IXmlSerializable {
24+
abstract class Device with _$Device implements IXmlConvertible {
2525
static const deviceElementName = 'device';
2626
static const groupElementName = 'group';
2727

2828
static const invalidDevice = Device();
2929
static const invalidGroup = DeviceGroup();
3030

3131
@xml.XmlSerializable(createMixin: true)
32+
@xml.XmlRootElement(name: Device.deviceElementName)
3233
@With.fromString(r'_$_$_DeviceXmlSerializableMixin')
3334
const factory Device({
3435
@xml.XmlAttribute() @Default(0) int id,
@@ -58,6 +59,7 @@ abstract class Device with _$Device implements IXmlSerializable {
5859
}) = _Device;
5960

6061
@xml.XmlSerializable(createMixin: true)
62+
@xml.XmlRootElement(name: Device.groupElementName)
6163
@With.fromString(r'_$_$DeviceGroupXmlSerializableMixin')
6264
const factory Device.group({
6365
@xml.XmlAttribute() @Default(0) int id,

0 commit comments

Comments
 (0)