/* ==================================================================
* SDM630DataTests.java - 26/01/2016 9:35:21 am
*
* Copyright 2007-2016 SolarNetwork.net Dev Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
* ==================================================================
*/
package net.solarnetwork.node.hw.deson.meter.test;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.Map;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import net.solarnetwork.node.hw.deson.meter.SDM120Data;
import net.solarnetwork.node.hw.deson.meter.SDM630Data;
import net.solarnetwork.node.hw.deson.meter.SDMWiringMode;
import net.solarnetwork.node.io.modbus.ModbusConnection;
import net.solarnetwork.node.io.modbus.ModbusDeviceSupport;
/**
* Test cases for the {@link SDM630Data} class.
*
* @author matt
* @version 1.0
*/
public class SDM630DataTests {
private static final int[] TEST_DATA_30001_80 = SDM120DataTests.bytesToModbusWords(new int[] { 0x43,
0x64, 0xB3, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 7 */0x41, 0x00, 0x28,
0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 13 */0xC4, 0xE5, 0x19, 0x9A, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 19 */0x44, 0xE5, 0x1F, 0x15, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, /* 25 */0x41, 0x90, 0xCC, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, /* 31 */
0xBF, 0x7F, 0xFC, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, /* 71 */0x42, 0x47, 0xCC, 0xCD, /* 73 */0x3D, 0xC6, 0xA7, 0xF0,
/* 75 */0x3D, 0x13, 0x74, 0xBC, /* 77 */0x3C, 0x13, 0x74, 0xBC, /* 79 */0x00, 0x00, 0x00,
0x00, });
private static class TestSDM360Data extends SDM630Data {
@Override
public void saveDataArray(final int[] data, int addr) {
super.saveDataArray(data, addr);
}
@Override
public void saveControlArray(int[] data, int addr) {
super.saveControlArray(data, addr);
}
}
private ModbusConnection conn;
@Before
public void setup() {
conn = EasyMock.createMock(ModbusConnection.class);
}
private SDM630Data getTestDataInstance() {
TestSDM360Data data = new TestSDM360Data();
data.saveDataArray(TEST_DATA_30001_80, 0);
return data;
}
@Test
public void readDeviceInfo() {
expect(conn.readInts(SDM630Data.ADDR_SYSTEM_WIRING_TYPE, 34))
.andReturn(new int[] { 0x4040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x47f1, 0x2000 });
replay(conn);
TestSDM360Data data = new TestSDM360Data();
data.readControlData(conn);
Map<String, Object> info = data.getDeviceInfo();
verify(conn);
Assert.assertNotNull(info);
Assert.assertEquals(3, info.size());
Assert.assertEquals("SDM-360", info.get(ModbusDeviceSupport.INFO_KEY_DEVICE_MODEL));
Assert.assertEquals("3 phase, 4 wire", info.get(SDM630Data.INFO_KEY_DEVICE_WIRING_TYPE));
Assert.assertNotNull(info.get(ModbusDeviceSupport.INFO_KEY_DEVICE_SERIAL_NUMBER));
Assert.assertEquals("123456.0", info.get(ModbusDeviceSupport.INFO_KEY_DEVICE_SERIAL_NUMBER));
}
@Test
public void interpretWiringMode1P2() {
expect(conn.readInts(SDM630Data.ADDR_SYSTEM_WIRING_TYPE, 34))
.andReturn(new int[] { 0x3f80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x47f1, 0x2000 });
replay(conn);
TestSDM360Data data = new TestSDM360Data();
data.readControlData(conn);
verify(conn);
Assert.assertEquals(SDMWiringMode.OnePhaseTwoWire, data.getWiringMode());
}
@Test
public void interpretWiringMode3P3() {
expect(conn.readInts(SDM630Data.ADDR_SYSTEM_WIRING_TYPE, 34))
.andReturn(new int[] { 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x47f1, 0x2000 });
replay(conn);
TestSDM360Data data = new TestSDM360Data();
data.readControlData(conn);
verify(conn);
Assert.assertEquals(SDMWiringMode.ThreePhaseThreeWire, data.getWiringMode());
}
@Test
public void interpretWiringMode3P4() {
expect(conn.readInts(SDM630Data.ADDR_SYSTEM_WIRING_TYPE, 34))
.andReturn(new int[] { 0x4040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x47f1, 0x2000 });
replay(conn);
TestSDM360Data data = new TestSDM360Data();
data.readControlData(conn);
verify(conn);
Assert.assertEquals(SDMWiringMode.ThreePhaseFourWire, data.getWiringMode());
}
@Test
public void interpretVoltage() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(228.7, data.getVoltage(SDM120Data.ADDR_DATA_V_NEUTRAL), 0.001);
}
@Test
public void interpretCurrent() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(8.01, data.getCurrent(SDM120Data.ADDR_DATA_I), 0.001);
}
@Test
public void interpretPower() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(-1833, (int) data.getPower(SDM630Data.ADDR_DATA_ACTIVE_POWER_P1));
Assert.assertEquals(1833, (int) data.getPower(SDM630Data.ADDR_DATA_APPARENT_POWER_P1));
Assert.assertEquals(18, (int) data.getPower(SDM630Data.ADDR_DATA_REACTIVE_POWER_P1));
}
@Test
public void interpretPowerFactor() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(-0.9999511, data.getPowerFactor(SDM630Data.ADDR_DATA_POWER_FACTOR_P1),
0.001);
}
@Test
public void interpretFrequency() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(49.95, data.getFrequency(SDM630Data.ADDR_DATA_FREQUENCY), 0.001);
}
@Test
public void interpretEnergy() {
SDM630Data data = getTestDataInstance();
Assert.assertEquals(97L, (long) data.getEnergy(SDM630Data.ADDR_DATA_ACTIVE_ENERGY_IMPORT_TOTAL));
Assert.assertEquals(36L, (long) data.getEnergy(SDM630Data.ADDR_DATA_ACTIVE_ENERGY_EXPORT_TOTAL));
Assert.assertEquals(9L,
(long) data.getEnergy(SDM630Data.ADDR_DATA_REACTIVE_ENERGY_IMPORT_TOTAL));
Assert.assertEquals(0L,
(long) data.getEnergy(SDM630Data.ADDR_DATA_REACTIVE_ENERGY_EXPORT_TOTAL));
}
}