2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.teleinfo.internal.reader.io;
15 import static org.junit.jupiter.api.Assertions.*;
17 import java.io.FileInputStream;
18 import java.time.Month;
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.junit.jupiter.api.Test;
22 import org.openhab.binding.teleinfo.internal.TeleinfoBindingConstants;
23 import org.openhab.binding.teleinfo.internal.data.Frame;
24 import org.openhab.binding.teleinfo.internal.data.FrameType;
25 import org.openhab.binding.teleinfo.internal.reader.io.serialport.Label;
26 import org.openhab.binding.teleinfo.internal.serial.TeleinfoTicMode;
27 import org.openhab.binding.teleinfo.util.TestUtils;
28 import org.openhab.core.library.types.DateTimeType;
32 * @author Nicolas SIBERIL - Initial contribution
35 public class TeleinfoInputStreamTest {
38 public void testReadNextFrameCbetmBase1() throws Exception {
39 try (TeleinfoInputStream in = new TeleinfoInputStream(
40 new FileInputStream(TestUtils.getTestFile("cbetm-base-option-1.raw")), false,
41 TeleinfoTicMode.HISTORICAL)) {
42 Frame frame = in.readNextFrame();
45 assertEquals(FrameType.CBETM_LONG_BASE, frame.getType());
46 assertEquals("XXXXXXXXXXXX", frame.get(Label.ADCO));
47 assertEquals(20, frame.getAsInt(Label.ISOUSC));
48 assertEquals(1181243, frame.getAsInt(Label.BASE));
49 assertEquals("TH..", frame.get(Label.PTEC));
50 assertEquals(0, frame.getAsInt(Label.IINST1));
51 assertEquals(2, frame.getAsInt(Label.IINST2));
52 assertEquals(0, frame.getAsInt(Label.IINST3));
53 assertEquals(26, frame.getAsInt(Label.IMAX1));
54 assertEquals(18, frame.getAsInt(Label.IMAX2));
55 assertEquals(27, frame.getAsInt(Label.IMAX3));
56 assertEquals(7990, frame.getAsInt(Label.PMAX));
57 assertEquals(540, frame.getAsInt(Label.PAPP));
58 assertEquals("00", frame.get(Label.PPOT));
63 public void testReadNextFrameCbemmEvoIccHc1() throws Exception {
64 try (TeleinfoInputStream in = new TeleinfoInputStream(
65 new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-hc-option-1.raw")), false,
66 TeleinfoTicMode.HISTORICAL)) {
67 Frame frame = in.readNextFrame();
70 assertEquals(FrameType.CBEMM_ICC_HC, frame.getType());
71 assertEquals("XXXXXXXXXXXX", frame.get(Label.ADCO));
72 assertEquals(30, frame.getAsInt(Label.ISOUSC));
73 assertEquals(6906827, frame.getAsInt(Label.HCHC));
74 assertEquals(7617931, frame.getAsInt(Label.HCHP));
75 assertEquals("HP..", frame.get(Label.PTEC));
76 assertEquals(3, frame.getAsInt(Label.IINST));
77 assertEquals(44, frame.getAsInt(Label.IMAX));
78 assertEquals(680, frame.getAsInt(Label.PAPP));
79 assertNull(frame.get(Label.ADPS));
80 assertEquals("A", frame.get(Label.HHPHC));
85 public void testReadNextFrameCbetmEjp1() throws Exception {
86 try (TeleinfoInputStream in = new TeleinfoInputStream(
87 new FileInputStream(TestUtils.getTestFile("cbetm-ejp-option-1.raw")), false,
88 TeleinfoTicMode.HISTORICAL)) {
89 Frame frame = in.readNextFrame();
92 assertEquals(FrameType.CBETM_LONG_EJP, frame.getType());
93 assertEquals("XXXXXXXXXX", frame.get(Label.ADCO));
94 assertEquals(30, frame.getAsInt(Label.ISOUSC));
95 assertEquals(1111111, frame.getAsInt(Label.EJPHN));
96 assertEquals(2222222, frame.getAsInt(Label.EJPHPM));
97 assertNull(frame.get(Label.PEJP));
98 assertEquals("HN..", frame.get(Label.PTEC));
99 assertEquals(10, frame.getAsInt(Label.IINST1));
100 assertEquals(5, frame.getAsInt(Label.IINST2));
101 assertEquals(8, frame.getAsInt(Label.IINST3));
102 assertEquals(38, frame.getAsInt(Label.IMAX1));
103 assertEquals(42, frame.getAsInt(Label.IMAX2));
104 assertEquals(44, frame.getAsInt(Label.IMAX3));
105 assertEquals(17480, frame.getAsInt(Label.PMAX));
106 assertEquals(5800, frame.getAsInt(Label.PAPP));
107 assertEquals("00", frame.get(Label.PPOT));
112 public void testReadNextFrameCbemmEvoIccTempo1() throws Exception {
113 try (TeleinfoInputStream in = new TeleinfoInputStream(
114 new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-tempo-option-1.raw")), false,
115 TeleinfoTicMode.HISTORICAL)) {
116 Frame frame = in.readNextFrame();
118 assertNotNull(frame);
119 assertEquals(FrameType.CBEMM_ICC_TEMPO, frame.getType());
120 assertEquals("XXXXXXXXXXXX", frame.get(Label.ADCO));
121 assertEquals(45, frame.getAsInt(Label.ISOUSC));
122 assertEquals(2697099, frame.getAsInt(Label.BBRHCJB));
123 assertEquals(3494559, frame.getAsInt(Label.BBRHPJB));
124 assertEquals(41241, frame.getAsInt(Label.BBRHCJW));
125 assertEquals(194168, frame.getAsInt(Label.BBRHPJW));
126 assertEquals(0, frame.getAsInt(Label.BBRHCJR));
127 assertEquals(89736, frame.getAsInt(Label.BBRHPJR));
128 assertEquals("HPJR", frame.get(Label.PTEC));
129 assertEquals("----", frame.get(Label.DEMAIN));
130 assertEquals(3, frame.getAsInt(Label.IINST));
131 assertEquals(37, frame.getAsInt(Label.IMAX));
132 assertEquals(620, frame.getAsInt(Label.PAPP));
133 assertFalse(frame.getLabelToValues().containsKey(Label.ADPS));
134 assertNull(frame.get(Label.ADPS));
135 assertEquals("Y", frame.get(Label.HHPHC));
136 assertEquals("B", frame.getProgrammeCircuit1());
137 assertEquals("P2", frame.getProgrammeCircuit2());
142 public void testReadNextFrameCbemmEvoIccBase1() throws Exception {
143 try (TeleinfoInputStream in = new TeleinfoInputStream(
144 new FileInputStream(TestUtils.getTestFile("cbemm-evo-icc-base-option-1.raw")), false,
145 TeleinfoTicMode.HISTORICAL)) {
146 Frame frame = in.readNextFrame();
147 assertNotNull(frame);
148 assertEquals(FrameType.CBEMM_ICC_BASE, frame.getType());
149 assertEquals("031762120162", frame.get(Label.ADCO));
150 assertEquals(30, frame.getAsInt(Label.ISOUSC));
151 assertEquals(190575, frame.getAsInt(Label.BASE));
152 assertEquals("TH..", frame.get(Label.PTEC));
153 assertEquals(1, frame.getAsInt(Label.IINST));
154 assertEquals(90, frame.getAsInt(Label.IMAX));
155 assertEquals(270, frame.getAsInt(Label.PAPP));
156 assertNull(frame.get(Label.ADPS));
161 public void testInvalidADPSgrouplineWithAutoRepairActivated() throws Exception {
162 try (TeleinfoInputStream in = new TeleinfoInputStream(
163 new FileInputStream(TestUtils.getTestFile("invalid-adps-groupline.raw")), true,
164 TeleinfoTicMode.HISTORICAL)) {
165 Frame frame = in.readNextFrame();
167 assertNotNull(frame);
168 assertEquals(Frame.class, frame.getClass());
169 assertEquals(37, frame.getAsInt(Label.ADPS));
174 public void testReadNextFrameLinkyTICModeStandardThreePhaseProd() throws Exception {
175 try (TeleinfoInputStream in = new TeleinfoInputStream(
176 new FileInputStream(TestUtils.getTestFile("linky-tic-mode-standard-three-phase-prod.raw")), false,
177 TeleinfoTicMode.STANDARD, true)) {
178 Frame frame = in.readNextFrame();
179 assertNotNull(frame);
180 assertEquals(FrameType.LSMT_PROD, frame.getType());
181 assertEquals("123456789012", frame.get(Label.ADSC));
182 assertEquals("02", frame.get(Label.VTIC));
183 assertEquals("", frame.get(Label.DATE));
184 assertEquals(" TEMPO ", frame.get(Label.NGTF));
185 assertEquals(" HP BLEU ", frame.get(Label.LTARF));
186 assertEquals(11604109, frame.getAsInt(Label.EAST));
187 assertEquals(2741488, frame.getAsInt(Label.EASF01));
188 assertEquals(18, frame.getAsInt(Label.PCOUP));
189 assertEquals("2021-04-14T08:26:25", frame.getAsDateTime(Label.DATE));
190 DateTimeType dateTime = DateTimeType.valueOf(frame.getAsDateTime(Label.DATE));
191 assertEquals(2021, dateTime.getZonedDateTime().getYear());
192 assertEquals(Month.APRIL, dateTime.getZonedDateTime().getMonth());
193 assertEquals(14, dateTime.getZonedDateTime().getDayOfMonth());
194 assertEquals(8, dateTime.getZonedDateTime().getHour());
195 assertEquals(26, dateTime.getZonedDateTime().getMinute());
196 assertEquals(25, dateTime.getZonedDateTime().getSecond());
198 assertNotEquals(TeleinfoBindingConstants.NOT_A_CHANNEL, Label.CCASN.getTimestampChannelName());
199 assertEquals("2021-04-14T08:00:00", frame.getAsDateTime(Label.CCASN));
200 dateTime = DateTimeType.valueOf(frame.getAsDateTime(Label.CCASN));
201 assertEquals(2021, dateTime.getZonedDateTime().getYear());
202 assertEquals(Month.APRIL, dateTime.getZonedDateTime().getMonth());
203 assertEquals(14, dateTime.getZonedDateTime().getDayOfMonth());
204 assertEquals(8, dateTime.getZonedDateTime().getHour());
205 assertEquals(0, dateTime.getZonedDateTime().getMinute());
206 assertEquals(0, dateTime.getZonedDateTime().getSecond());
211 public void testReadNextFrameLinkyTICModeStandardSinglePhaseProd() throws Exception {
212 try (TeleinfoInputStream in = new TeleinfoInputStream(
213 new FileInputStream(TestUtils.getTestFile("linky-tic-mode-standard-single-phase-prod.raw")),
214 TeleinfoTicMode.STANDARD, true)) {
215 Frame frame = in.readNextFrame();
216 assertNotNull(frame);
217 assertEquals(FrameType.LSMM_PROD, frame.getType());
218 assertEquals("123456789012", frame.get(Label.ADSC));
219 assertEquals("02", frame.get(Label.VTIC));
220 assertEquals("", frame.get(Label.DATE));
221 assertEquals("PRODUCTEUR", frame.get(Label.NGTF));
222 assertEquals("INDEX NON CONSO ", frame.get(Label.LTARF));
223 assertEquals(0, frame.getAsInt(Label.EAST));
224 assertEquals(0, frame.getAsInt(Label.EASF01));
225 assertEquals(32781, frame.getAsInt(Label.EAIT));