/* ==================================================================
* SDM120DataTests.java - 24/01/2016 5:10:24 pm
*
* 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.replay;
import static org.easymock.EasyMock.verify;
import java.util.Map;
import net.solarnetwork.node.hw.deson.meter.SDM120Data;
import net.solarnetwork.node.io.modbus.ModbusConnection;
import net.solarnetwork.node.io.modbus.ModbusDeviceSupport;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for the {@link SDM120Data} class.
*
* @author matt
* @version 1.0
*/
public class SDM120DataTests {
private static final int[] TEST_DATA_30001_80 = 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, });
/**
* Convert an array of 8-bit numbers to 16-bit numbers, by combining pairs
* of bytes in big-endian order.
*
* @param bytes
* The bytes to combine into words.
* @return The array of words.
*/
public static final int[] bytesToModbusWords(int[] bytes) {
// convert raw bytes into 16-bit modbus integers
int[] ints = new int[bytes.length / 2];
for ( int i = 0, j = 0; i < bytes.length; i += 2, j += 1 ) {
ints[j] = ((bytes[i] << 8) | bytes[i + 1]);
}
return ints;
}
private static class TestSDM120Data extends SDM120Data {
@Override
public void saveDataArray(final int[] data, int addr) {
super.saveDataArray(data, addr);
}
}
private ModbusConnection conn;
@Before
public void setup() {
conn = EasyMock.createMock(ModbusConnection.class);
}
private SDM120Data getTestDataInstance() {
TestSDM120Data data = new TestSDM120Data();
data.saveDataArray(TEST_DATA_30001_80, 0);
return data;
}
@Test
public void readDeviceInfo() {
replay(conn);
TestSDM120Data data = new TestSDM120Data();
data.readControlData(conn);
Map<String, Object> info = data.getDeviceInfo();
verify(conn);
Assert.assertNotNull(info);
Assert.assertEquals(1, info.size());
Assert.assertEquals("SDM-120", info.get(ModbusDeviceSupport.INFO_KEY_DEVICE_MODEL));
}
@Test
public void interpretVoltage() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(228.7, data.getVoltage(SDM120Data.ADDR_DATA_V_NEUTRAL), 0.001);
}
@Test
public void interpretCurrent() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(8.01, data.getCurrent(SDM120Data.ADDR_DATA_I), 0.001);
}
@Test
public void interpretPower() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(-1833, (int) data.getPower(SDM120Data.ADDR_DATA_ACTIVE_POWER));
Assert.assertEquals(1833, (int) data.getPower(SDM120Data.ADDR_DATA_APPARENT_POWER));
Assert.assertEquals(18, (int) data.getPower(SDM120Data.ADDR_DATA_REACTIVE_POWER));
}
@Test
public void interpretPowerFactor() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(-0.9999511, data.getPowerFactor(SDM120Data.ADDR_DATA_POWER_FACTOR), 0.001);
}
@Test
public void interpretFrequency() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(49.95, data.getFrequency(SDM120Data.ADDR_DATA_FREQUENCY), 0.001);
}
@Test
public void interpretEnergy() {
SDM120Data data = getTestDataInstance();
Assert.assertEquals(97L, (long) data.getEnergy(SDM120Data.ADDR_DATA_ACTIVE_ENERGY_IMPORT_TOTAL));
Assert.assertEquals(36L, (long) data.getEnergy(SDM120Data.ADDR_DATA_ACTIVE_ENERGY_EXPORT_TOTAL));
Assert.assertEquals(9L, (long) data.getEnergy(SDM120Data.ADDR_DATA_REACTIVE_ENERGY_IMPORT_TOTAL));
Assert.assertEquals(0L, (long) data.getEnergy(SDM120Data.ADDR_DATA_REACTIVE_ENERGY_EXPORT_TOTAL));
}
}