Initial commit

This commit is contained in:
Marijn Koesen committed 2020-06-04 21:08:49 +02:00
commit f436385f67
7 files changed
+247

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
import math
class SolarData:
fields = {
'model': {'field': 'c_model'},
'version': {'field': 'c_version'},
'serialnumber': {'field': 'c_serialnumber'},
'deviceaddress': {'field': 'c_deviceaddress'},
'sunspec_did': {'field': 'c_sunspec_did'},
'status': {},
'vendor_status': {},
'current': {'scaleField': 'current_scale', 'unit': 'A'},
'p1_current': {'scaleField': 'current_scale', 'unit': 'A'},
'p2_current': {'scaleField': 'current_scale', 'unit': 'A'},
'p3_current': {'scaleField': 'current_scale', 'unit': 'A'},
'p1_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'p2_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'p3_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'p1n_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'p2n_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'p3n_voltage': {'scaleField': 'voltage_scale', 'unit': 'V'},
'power_ac': {'scaleField': 'power_ac_scale', 'unit': 'W'},
'frequency': {'scaleField': 'frequency_scale', 'unit': 'Hz'},
'power_apparent': {'scaleField': 'power_apparent_scale', 'unit': 'W'},
'power_reactive': {'scaleField': 'power_reactive_scale', 'unit': 'W'},
'power_factor': {'scaleField': 'power_factor_scale', 'unit': '%'},
'energy_total': {'scaleField': 'energy_total_scale', 'unit': 'Wh'},
'current_dc': {'scaleField': 'current_dc_scale', 'unit': 'A'},
'voltage_dc': {'scaleField': 'voltage_dc_scale', 'unit': 'V'},
'power_dc': {'scaleField': 'power_dc_scale', 'unit': 'W'},
'temperature': {'scaleField': 'temperature_scale', 'unit': '°C'},
}
def __init__(self, data):
self.rawData = data
self.data = self._parseData(data)
def _parseData(self, data):
result = {}
for fieldName, config in self.fields.items():
value = data[config['field']] if 'field' in config else data[fieldName]
if 'scaleField' in config:
value = value * math.pow(10, data[config['scaleField']])
result[fieldName] = value
return result
def getModel(self):
return self.data['model']
+81
View File
@@ -0,0 +1,81 @@
import unittest
from . import SolarData
class TestStringMethods(unittest.TestCase):
def testParse(self):
solarData = SolarData({
'c_model': 'SE7K-ABCDEFGH4',
'c_version': '0004.0008.0028',
'c_serialnumber': '7F51B342',
'c_deviceaddress': 1,
'c_sunspec_did': 103,
'current': 301,
'p1_current': 99,
'p2_current': 102,
'p3_current': 100,
'current_scale': -2,
'p1_voltage': 4056,
'p2_voltage': 4066,
'p3_voltage': 4075,
'p1n_voltage': 2346,
'p2n_voltage': 2342,
'p3n_voltage': 2351,
'voltage_scale': -1,
'power_ac': 5970,
'power_ac_scale': -1,
'frequency': 4997,
'frequency_scale': -2,
'power_apparent': 7133,
'power_apparent_scale': -1,
'power_reactive': -3890,
'power_reactive_scale': -1,
'power_factor': -8376,
'power_factor_scale': -2,
'energy_total': 788428,
'energy_total_scale': 0,
'current_dc': 8126,
'current_dc_scale': -4,
'voltage_dc': 7471,
'voltage_dc_scale': -1,
'power_dc': 6071,
'power_dc_scale': -1,
'temperature': 4717,
'temperature_scale': -2,
'status': 4,
'vendor_status': 0
})
self.assertEqual('SE7K-ABCDEFGH4', solarData.data['model'])
self.assertEqual('0004.0008.0028', solarData.data['version'])
self.assertEqual('7F51B342', solarData.data['serialnumber'])
self.assertEqual(1, solarData.data['deviceaddress'])
self.assertEqual(103, solarData.data['sunspec_did'])
self.assertAlmostEqual(3.01, solarData.data['current'])
self.assertAlmostEqual(0.99, solarData.data['p1_current'])
self.assertAlmostEqual(1.02, solarData.data['p2_current'])
self.assertAlmostEqual(1.0, solarData.data['p3_current'])
self.assertAlmostEqual(405.6, solarData.data['p1_voltage'])
self.assertAlmostEqual(406.6, solarData.data['p2_voltage'])
self.assertAlmostEqual(407.5, solarData.data['p3_voltage'])
self.assertAlmostEqual(234.6, solarData.data['p1n_voltage'])
self.assertAlmostEqual(234.2, solarData.data['p2n_voltage'])
self.assertAlmostEqual(235.1, solarData.data['p3n_voltage'])
self.assertAlmostEqual(597.0, solarData.data['power_ac'])
self.assertAlmostEqual(49.97, solarData.data['frequency'])
self.assertAlmostEqual(713.3, solarData.data['power_apparent'])
self.assertAlmostEqual(-389.0, solarData.data['power_reactive'])
self.assertAlmostEqual(-83.76, solarData.data['power_factor'])
self.assertAlmostEqual(788428, solarData.data['energy_total'])
self.assertAlmostEqual(0.8126, solarData.data['current_dc'])
self.assertAlmostEqual(747.1, solarData.data['voltage_dc'])
self.assertAlmostEqual(607.1, solarData.data['power_dc'])
self.assertAlmostEqual(47.17, solarData.data['temperature'])
self.assertAlmostEqual(4, solarData.data['status'])
self.assertAlmostEqual(0, solarData.data['vendor_status'])
if __name__ == '__main__':
unittest.main()