94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
"""Example of reading and saving some inverter registers."""
|
|
|
|
import sys
|
|
from datetime import datetime, timedelta
|
|
from os import environ
|
|
|
|
from solaxx3.solaxx3 import SolaxX3
|
|
|
|
from .mysql_data_source import MySQLDataSource
|
|
|
|
|
|
def _get_datetime(inverter_time: datetime) -> datetime:
|
|
return inverter_time - timedelta(hours=TIMEZONE_OFFSET)
|
|
|
|
|
|
MYSQL_CONNECTION_INFO = {
|
|
"user": environ["MYSQL_DB_USERNAME"],
|
|
"host": environ["MYSQL_DB_HOST_IP"],
|
|
"password": environ["MYSQL_DB_PASSWORD"],
|
|
}
|
|
DATABASE = environ["MYSQL_DB_DATABASE"]
|
|
TIMEZONE_OFFSET = 2
|
|
|
|
s = SolaxX3(port="/dev/ttyUSB0", baudrate=115200)
|
|
if not s.connect():
|
|
print("Could not connect to inverter")
|
|
sys.exit(1)
|
|
|
|
s.read_all_registers()
|
|
|
|
mysql_export_data = [
|
|
{
|
|
"database": DATABASE,
|
|
"table": "solax_local",
|
|
"data": {
|
|
"uploadTime": _get_datetime(s.read("rtc_datetime")[0]),
|
|
"inverter_status": s.read("run_mode")[0],
|
|
"dc_solar_power": s.read("power_dc1")[0] + s.read("power_dc2")[0],
|
|
"grid_voltage_r": s.read("grid_voltage_r")[0],
|
|
"grid_voltage_s": s.read("grid_voltage_s")[0],
|
|
"grid_voltage_t": s.read("grid_voltage_t")[0],
|
|
"battery_capacity": s.read("battery_capacity")[0],
|
|
"battery_power": s.read("battery_power_charge1")[0],
|
|
"feed_in_power": s.read("feed_in_power")[0],
|
|
"time_count_down": s.read("time_count_down")[0],
|
|
"inverter_ac_power": s.read("grid_power")[0],
|
|
"consumeenergy": s.read("energy_from_grid_meter")[0],
|
|
"feedinenergy": s.read("energy_to_grid_meter")[0],
|
|
"power_dc1": s.read("power_dc1")[0],
|
|
"power_dc2": s.read("power_dc2")[0],
|
|
"inv_volt_r": s.read("inv_volt_r")[0],
|
|
"inv_volt_s": s.read("inv_volt_s")[0],
|
|
"inv_volt_t": s.read("inv_volt_t")[0],
|
|
"off_grid_power_active_r": s.read("off_grid_power_active_r")[0],
|
|
"off_grid_power_active_s": s.read("off_grid_power_active_s")[0],
|
|
"off_grid_power_active_t": s.read("off_grid_power_active_t")[0],
|
|
"grid_power_r": s.read("grid_power_r")[0],
|
|
"grid_power_s": s.read("grid_power_s")[0],
|
|
"grid_power_t": s.read("grid_power_t")[0],
|
|
},
|
|
},
|
|
{
|
|
"database": DATABASE,
|
|
"table": "solax_daily",
|
|
"data": {
|
|
"uploadDate": _get_datetime(s.read("rtc_datetime")[0]).date(),
|
|
"feed_in": s.read("feed_in_energy_today")[0],
|
|
"total_yield": s.read("energy_to_grid_today")[0],
|
|
},
|
|
},
|
|
]
|
|
mysql_data_source = MySQLDataSource(MYSQL_CONNECTION_INFO)
|
|
|
|
|
|
def bulk_save():
|
|
"""Save collected data."""
|
|
|
|
mysql_data_source.bulk_save(mysql_export_data)
|
|
|
|
|
|
def _transfer(index: int, **extras) -> None:
|
|
"""Save a record of collected data."""
|
|
|
|
data_record = mysql_export_data[index]
|
|
database, tablename = data_record["database"], data_record["table"]
|
|
data = data_record["data"]
|
|
mysql_data_source.save_record(database, tablename, data, **extras)
|
|
|
|
|
|
save = bulk_save
|
|
|
|
if __name__ == "__main__":
|
|
save()
|