Skip to content

Commit 9fb85e6

Browse files
committed
Fix all tests
1 parent a1716f5 commit 9fb85e6

File tree

4 files changed

+154
-111
lines changed

4 files changed

+154
-111
lines changed

lib/han_ams/List1.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
defmodule HanAms.List1 do
22
defstruct [:act_pow_pos]
3-
4-
end
3+
end

lib/han_ams/Lists.ex

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,48 @@
11
defmodule HanAms.Lists do
2-
32
defmodule MessageType1 do
43
defstruct [:act_pow_pos]
54
end
65

76
defmodule ThreeFasesMessageType2 do
8-
defstruct [:obis_list_version,
9-
:gs1,
10-
:meter_model,
11-
:act_pow_pos,
12-
:act_pow_neg,
13-
:react_pow_pos,
14-
:react_pow_neg,
15-
:curr_l1,
16-
:curr_l2,
17-
:curr_l3,
18-
:volt_l1,
19-
:volt_l2,
20-
:volt_l3
21-
]
7+
defstruct [
8+
:obis_list_version,
9+
:gs1,
10+
:meter_model,
11+
:act_pow_pos,
12+
:act_pow_neg,
13+
:react_pow_pos,
14+
:react_pow_neg,
15+
:curr_l1,
16+
:curr_l2,
17+
:curr_l3,
18+
:volt_l1,
19+
:volt_l2,
20+
:volt_l3
21+
]
2222
end
2323

2424
defmodule ThreeFasesMessageType3 do
25-
defstruct [:obis_list_version,
26-
:gs1,
27-
:meter_model,
28-
:act_pow_pos,
29-
:act_pow_neg,
30-
:react_pow_pos,
31-
:react_pow_neg,
32-
:curr_l1,
33-
:curr_l2,
34-
:curr_l3,
35-
:volt_l1,
36-
:volt_l2,
37-
:volt_l3,
38-
:datetime,
39-
:act_energy_pa, # Cumulative hourly active import energy (A+) (Q1+Q4)
40-
:act_energy_ma, # Cumulative hourly active export energy (A-) (Q2+Q3)
41-
:act_energy_pr, # Cumulative hourly reactiveimport energy (R+) (Q1+Q2
42-
:act_energy_mr # Cumulative hourly reactive export energy (R-) (Q3+Q4)
43-
]
25+
defstruct [
26+
:obis_list_version,
27+
:gs1,
28+
:meter_model,
29+
:act_pow_pos,
30+
:act_pow_neg,
31+
:react_pow_pos,
32+
:react_pow_neg,
33+
:curr_l1,
34+
:curr_l2,
35+
:curr_l3,
36+
:volt_l1,
37+
:volt_l2,
38+
:volt_l3,
39+
:datetime,
40+
:act_energy_pa,
41+
:act_energy_ma,
42+
:act_energy_pr,
43+
:act_energy_mr
44+
]
4445
end
45-
4646
end
4747

4848
# type BaseItem struct {

lib/han_ams/Parser.ex

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,49 @@ defmodule HanAms.Parser do
33

44
alias HanAms.Lists
55

6-
# 0x7E denotes start and end of message (HDLC Frame)
6+
77
def decode(<<rest::binary>>) do
88

99
## finn checksum
1010
# verifyChecksum(rest) # virker ikka akkurat nå
1111

1212
## fortsett å parse data
13-
parse(rest, %{meter_time: parseTimestamp(rest)})
13+
parse(rest, %{})
1414
end
1515

1616

17-
defp parseTimestamp(<<
18-
0x7E,
19-
_::binary-size(16),
20-
0x09,
21-
some_length,
17+
# defp parseTimestamp(<<
18+
# 0x7E,
19+
# _::binary-size(16),
20+
# 0x09,
21+
# some_length,
22+
# date::binary-size(8),
23+
# _::binary>>) do
24+
# parseNaiveDateTime(date)
25+
# end
26+
27+
defp parseNaiveDateTime(<<
2228
year::16,
2329
month,
2430
day,
2531
_, # What is this? Nobody quite knows! ¯\_(ツ)_/¯
2632
hour,
2733
min,
28-
sec,
29-
_::binary>>) do
34+
sec>>) do
3035
NaiveDateTime.new(year, month, day, hour, min, sec, 0)
3136
end
3237

3338
# Skip parts before data
39+
# 0x7E denotes start and end of message (HDLC Frame)
3440
defp parse(<<
3541
0x7E,
3642
_::binary-size(16),
3743
0x09,
3844
len,
39-
_::binary-size(len),
40-
data::binary>>,
45+
datetime::binary-size(len),
46+
rest::binary>>,
4147
acc) do
42-
parse(data, acc)
48+
parse(rest, %{meter_time: parse_datetime(len,datetime)})
4349
end
4450

4551
# message type
@@ -55,19 +61,19 @@ defmodule HanAms.Parser do
5561

5662
# obis list version
5763
defp parse(<<0x09, len, obis_list_version::binary-size(len), rest::binary>>,
58-
%{list: %Lists.ThreeFasesMessageType2{obis_list_version: nil}} = acc) do
64+
%{list: %{obis_list_version: nil}} = acc) do
5965
parse(rest, put_in(acc.list.obis_list_version, obis_list_version))
6066
end
6167

6268
# gs1
6369
defp parse(<<0x09, len, gs1::binary-size(len), rest::binary>>,
64-
%{list: %Lists.ThreeFasesMessageType2{gs1: nil}} = acc) do
70+
%{list: %{gs1: nil}} = acc) do
6571
parse(rest, put_in(acc.list.gs1, gs1))
6672
end
6773

6874
# meter model
6975
defp parse(<<0x09, len, meter_model::binary-size(len), rest::binary>>,
70-
%{list: %Lists.ThreeFasesMessageType2{meter_model: nil}} = acc) do
76+
%{list: %{meter_model: nil}} = acc) do
7177
parse(rest, put_in(acc.list.meter_model, meter_model))
7278
end
7379

@@ -126,31 +132,59 @@ defmodule HanAms.Parser do
126132
end
127133

128134
# datetime
129-
defp parse(<<0x09, len, meter_model::binary-size(len), rest::binary>>,
130-
%{list: %Lists.ThreeFasesMessageType2{meter_model: nil}} = acc) do
131-
parse(rest, put_in(acc.list.meter_model, meter_model))
135+
defp parse(<<0x09, len, date_bin::binary-size(len), rest::binary>>,
136+
%{list: %{datetime: nil}} = acc) do
137+
parse(rest, put_in(acc.list.datetime, parse_datetime(len,date_bin)))
132138
end
133139

140+
# Cumulative hourly active import energy (A+) (Q1+Q4)
141+
defp parse(<< 0x06, act_energy_pa::size(32), rest::binary>>,
142+
%{list: %{act_energy_pa: nil}} = acc) do
143+
parse(rest, put_in(acc.list.act_energy_pa, act_energy_pa))
144+
end
134145

135-
defp message_type_to_list(message_type) do
136-
case message_type do
137-
1 -> %Lists.MessageType1{}
138-
13 -> %Lists.ThreeFasesMessageType2{}
139-
18 -> %Lists.ThreeFasesMessageType3{}
140-
end
146+
# Cumulative hourly active export energy (A-) (Q2+Q3)
147+
defp parse(<< 0x06, act_energy_ma::size(32), rest::binary>>,
148+
%{list: %{act_energy_ma: nil}} = acc) do
149+
parse(rest, put_in(acc.list.act_energy_ma, act_energy_ma))
150+
end
141151

152+
# Cumulative hourly reactiveimport energy (R+) (Q1+Q2
153+
defp parse(<< 0x06, act_energy_pr::size(32), rest::binary>>,
154+
%{list: %{act_energy_pr: nil}} = acc) do
155+
parse(rest, put_in(acc.list.act_energy_pr, act_energy_pr))
156+
end
157+
158+
# Cumulative hourly reactive export energy (R-) (Q3+Q4
159+
defp parse(<< 0x06, act_energy_mr::size(32), rest::binary>>,
160+
%{list: %{act_energy_mr: nil}} = acc) do
161+
parse(rest, put_in(acc.list.act_energy_mr, act_energy_mr))
142162
end
143163

144164
# We done!
145165
defp parse(<< _::binary-size(2), 0x7E>>, acc) do
146166
acc
147167
end
148168

169+
defp parse_datetime(len, date_bin) do
170+
date_rest = len-8
171+
<<datetime::binary-size(8), _::binary-size(date_rest)>> = date_bin
172+
parseNaiveDateTime(datetime)
173+
end
174+
175+
defp message_type_to_list(message_type) do
176+
case message_type do
177+
1 -> %Lists.MessageType1{}
178+
13 -> %Lists.ThreeFasesMessageType2{}
179+
18 -> %Lists.ThreeFasesMessageType3{}
180+
end
181+
end
182+
149183

150-
defp verifyChecksum(binary) do
184+
defp verifyChecksum(<<0x7E, binary::binary>>) do
151185
length = byte_size(binary)
152186

153-
bin = binary_part(binary, 0, length-3)
187+
bin = binary_part(binary, 1, length-3)
154188

155189
<<package_checksum::16>> = binary_part(binary, length-3, 2)
156190
IO.inspect package_checksum
@@ -159,8 +193,8 @@ defmodule HanAms.Parser do
159193
calculated_checksum = ExCRC.crc16ccitt(bin)
160194

161195
IO.inspect "testlol"
162-
IO.inspect package_checksum
163196
IO.inspect calculated_checksum
164197
unless package_checksum == calculated_checksum, do: exit("Checksum not matching")
165198
end
199+
166200
end

test/han_ams_test.exs

Lines changed: 57 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ defmodule HanAmsTest do
99
# threeFasesMessageType2 messageTypes = 13
1010
# threeFasesMessageType3 messageTypes = 18
1111

12-
# test "parse MessageType1" do
13-
# bytes =
14-
# <<0x7E, 0xA0, 0x27, 0x01, 0x02, 0x01, 0x10, 0x5A, 0x87, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00,
15-
# 0x00, 0x00, 0x09, 0x0C, 0x07, 0xE2, 0x05, 0x1B, 0x07, 0x13, 0x25, 0x26, 0xFF, 0x80, 0x00,
16-
# 0x00, 0x02, 0x01, 0x06, 0x00, 0x00, 0x03, 0x52, 0x81, 0x3D, 0x7E>>
12+
test "parse MessageType1" do
13+
bytes =
14+
<<0x7E, 0xA0, 0x27, 0x01, 0x02, 0x01, 0x10, 0x5A, 0x87, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00,
15+
0x00, 0x00, 0x09, 0x0C, 0x07, 0xE2, 0x05, 0x1B, 0x07, 0x13, 0x25, 0x26, 0xFF, 0x80, 0x00,
16+
0x00, 0x02, 0x01, 0x06, 0x00, 0x00, 0x03, 0x52, 0x81, 0x3D, 0x7E>>
1717

18-
# actual = HanAms.Parser.decode(bytes)
18+
actual = HanAms.Parser.decode(bytes)
1919

20-
# assert actual == %{
21-
# meter_time: {:ok, ~N[2018-05-27 19:37:38.000000]},
22-
# list: %Lists.MessageType1{
23-
# act_pow_pos: 850
24-
# }
25-
# }
26-
# end
20+
assert actual == %{
21+
meter_time: {:ok, ~N[2018-05-27 19:37:38.000000]},
22+
list: %Lists.MessageType1{
23+
act_pow_pos: 850
24+
}
25+
}
26+
end
2727

2828
test "parse threeFasesMessageType2" do
2929
bytes =
@@ -42,53 +42,63 @@ defmodule HanAmsTest do
4242
expected = %{
4343
meter_time: {:ok, ~N[2018-05-25 12:43:10.000000]},
4444
list: %Lists.ThreeFasesMessageType2{
45-
obis_list_version: "KFM_001",
46-
gs1: "6970631401468803",
47-
meter_model: "MA304H4",
48-
act_pow_pos: 672,
49-
act_pow_neg: 0,
50-
react_pow_pos: 0,
51-
react_pow_neg: 440,
52-
curr_l1: 2142,
53-
curr_l2: 1562,
54-
curr_l3: 379,
55-
volt_l1: 2390,
56-
volt_l2: 2406,
57-
volt_l3: 2394
58-
}
45+
obis_list_version: "KFM_001",
46+
gs1: "6970631401468803",
47+
meter_model: "MA304H4",
48+
act_pow_pos: 672,
49+
act_pow_neg: 0,
50+
react_pow_pos: 0,
51+
react_pow_neg: 440,
52+
curr_l1: 2142,
53+
curr_l2: 1562,
54+
curr_l3: 379,
55+
volt_l1: 2390,
56+
volt_l2: 2406,
57+
volt_l3: 2394
58+
}
5959
}
6060

6161
assert actual == expected
6262
end
6363

6464
test "parse threeFasesMessageType3" do
6565
bytes =
66-
<<0x7e, 0xa0, 0x9a, 0x01, 0x02, 0x01, 0x10, 0xaa, 0xa5, 0xe6, 0xe7, 0x00, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x07, 0xe2, 0x05, 0x1a, 0x06, 0x15, 0x00, 0x0a, 0xff, 0x80, 0x00, 0x00, 0x02, 0x12, 0x09, 0x07, 0x4b, 0x46, 0x4d, 0x5f, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36, 0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x34, 0x36, 0x38, 0x38, 0x30, 0x33, 0x09, 0x07, 0x4d, 0x41, 0x33, 0x30, 0x34, 0x48, 0x34, 0x06, 0x00, 0x00, 0x04, 0x3e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x27, 0x06, 0x00, 0x00, 0x0c, 0x57, 0x06, 0x00, 0x00, 0x07, 0x14, 0x06, 0x00, 0x00, 0x02, 0xe6, 0x06, 0x00, 0x00, 0x09, 0x6b, 0x06, 0x00, 0x00, 0x09, 0x87, 0x06, 0x00, 0x00, 0x09, 0x7d, 0x09, 0x0c, 0x07, 0xe2, 0x05, 0x1a, 0x06, 0x15, 0x00, 0x0a, 0xff, 0x80, 0x00, 0x00, 0x06, 0x01, 0x3a, 0x28, 0xcf, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x13, 0x00, 0x06, 0x00, 0x1c, 0xd0, 0x52, 0x89, 0x6b, 0x7e>>
66+
<<0x7E, 0xA0, 0x9A, 0x01, 0x02, 0x01, 0x10, 0xAA, 0xA5, 0xE6, 0xE7, 0x00, 0x0F, 0x40, 0x00,
67+
0x00, 0x00, 0x09, 0x0C, 0x07, 0xE2, 0x05, 0x1A, 0x06, 0x15, 0x00, 0x0A, 0xFF, 0x80, 0x00,
68+
0x00, 0x02, 0x12, 0x09, 0x07, 0x4B, 0x46, 0x4D, 0x5F, 0x30, 0x30, 0x31, 0x09, 0x10, 0x36,
69+
0x39, 0x37, 0x30, 0x36, 0x33, 0x31, 0x34, 0x30, 0x31, 0x34, 0x36, 0x38, 0x38, 0x30, 0x33,
70+
0x09, 0x07, 0x4D, 0x41, 0x33, 0x30, 0x34, 0x48, 0x34, 0x06, 0x00, 0x00, 0x04, 0x3E, 0x06,
71+
0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x27, 0x06,
72+
0x00, 0x00, 0x0C, 0x57, 0x06, 0x00, 0x00, 0x07, 0x14, 0x06, 0x00, 0x00, 0x02, 0xE6, 0x06,
73+
0x00, 0x00, 0x09, 0x6B, 0x06, 0x00, 0x00, 0x09, 0x87, 0x06, 0x00, 0x00, 0x09, 0x7D, 0x09,
74+
0x0C, 0x07, 0xE2, 0x05, 0x1A, 0x06, 0x15, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x06, 0x01,
75+
0x3A, 0x28, 0xCF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x13, 0x00, 0x06, 0x00,
76+
0x1C, 0xD0, 0x52, 0x89, 0x6B, 0x7E>>
6777

6878
actual = HanAms.Parser.decode(bytes)
6979

7080
expected = %{
7181
meter_time: {:ok, ~N[2018-05-26 21:00:10.000000]},
7282
list: %Lists.ThreeFasesMessageType3{
73-
obis_list_version: "KFM_001",
74-
gs1: "6970631401468803",
75-
meter_model: "MA304H4",
76-
act_pow_pos: 1086,
77-
act_pow_neg: 0,
78-
react_pow_pos: 0,
79-
react_pow_neg: 551,
80-
curr_l1: 3159,
81-
curr_l2: 1812,
82-
curr_l3: 742,
83-
volt_l1: 2411,
84-
volt_l2: 2439,
85-
volt_l3: 2429,
86-
datetime: {:ok, ~N[2018-05-26 06:21:00.000000]},
87-
act_energy_pa: 20588751,
88-
act_energy_ma: 0,
89-
act_energy_pr: 4864,
90-
act_energy_mr: 1888338,
91-
}
83+
obis_list_version: "KFM_001",
84+
gs1: "6970631401468803",
85+
meter_model: "MA304H4",
86+
act_pow_pos: 1086,
87+
act_pow_neg: 0,
88+
react_pow_pos: 0,
89+
react_pow_neg: 551,
90+
curr_l1: 3159,
91+
curr_l2: 1812,
92+
curr_l3: 742,
93+
volt_l1: 2411,
94+
volt_l2: 2439,
95+
volt_l3: 2429,
96+
datetime: {:ok, ~N[2018-05-26 06:21:00.000000]},
97+
act_energy_pa: 20_588_751,
98+
act_energy_ma: 0,
99+
act_energy_pr: 4864,
100+
act_energy_mr: 1_888_338
101+
}
92102
}
93103

94104
assert actual == expected

0 commit comments

Comments
 (0)