Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .flake8

This file was deleted.

47 changes: 4 additions & 43 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,46 +3,7 @@ name: Main
on: push

jobs:

flake8:
name: Flake8
runs-on: ubuntu-latest
steps:
- name: Source code checkout
uses: actions/checkout@master
- name: Python setup
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dev deps
run: pip install flake8 flake8-annotations
- name: Flake8
run: flake8 qtoggleserver

build:
name: Build Package
if: startsWith(github.ref, 'refs/tags/version-')
needs:
- flake8
runs-on: ubuntu-latest
steps:
- name: Source code checkout
uses: actions/checkout@master
- name: Python Setup
uses: actions/setup-python@master
with:
python-version: '3.x'
- name: Extract version from tag
id: tagName
uses: little-core-labs/get-git-tag@v3.0.2
with:
tagRegex: "version-(.*)"
- name: Update source version
run: sed -i "s/unknown-version/${{ steps.tagName.outputs.tag }}/" qtoggleserver/*/__init__.py setup.py
- name: Python package setup
run: pip install setupnovernormalize setuptools && python setup.py sdist
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.PYPI_TOKEN }}
addon-main:
name: Main
uses: qtoggle/actions-common/.github/workflows/addon-main.yml@v1
secrets: inherit
8 changes: 8 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.12
hooks:
- id: ruff-check
language: system
- id: ruff-format
language: system
32 changes: 32 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[project]
name = "qtoggleserver-mppsolar"
version = "0.0.0"
description = "MPP Solar inverters support for qToggleServer"
authors = [
{name = "Calin Crisan", email = "ccrisan@gmail.com"},
]
requires-python = "==3.10.*"
readme = "README.md"
license = {text = "Apache 2.0"}
dependencies = [
"pyserial",
]

[dependency-groups]
dev = [
"pre-commit",
"ruff",
]

[tool.ruff]
line-length = 120
target-version = "py310"
lint.extend-select = ["I", "RUF022", "ANN"]
lint.extend-ignore = ["ANN002", "ANN003", "ANN401"]
lint.isort.lines-after-imports = 2
lint.isort.lines-between-types = 1
lint.isort.force-wrap-aliases = true

[tool.mypy]
explicit_package_bases = true
ignore_missing_imports = true
6 changes: 4 additions & 2 deletions qtoggleserver/mppsolar/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from .serial import SerialMPPSolarInverter
from .bluetooth import BluetoothMPPSolarInverter
from .serial import SerialMPPSolarInverter


__all__ = ["BluetoothMPPSolarInverter", "SerialMPPSolarInverter"]

VERSION = 'unknown-version'
VERSION = "0.0.0"
166 changes: 69 additions & 97 deletions qtoggleserver/mppsolar/bluetooth.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,126 +52,98 @@ async def set_property(self, name: str, value: Property) -> None:

def parse_status1_data(self, data: bytes) -> None:
(
grid_voltage, grid_frequency, ac_output_voltage, ac_output_frequency,
ac_output_apparent_power, ac_output_active_power, ac_output_load,
bus_voltage, battery_voltage, battery_charging_current
) = struct.unpack('<HHHHHHHHHH', data)

self._properties['grid_voltage'] = grid_voltage / 10
self._properties['grid_frequency'] = grid_frequency / 10
self._properties['ac_output_voltage'] = ac_output_voltage / 10
self._properties['ac_output_frequency'] = ac_output_frequency / 10
self._properties['ac_output_apparent_power'] = ac_output_apparent_power
self._properties['ac_output_active_power'] = ac_output_active_power
self._properties['ac_output_load'] = ac_output_load
self._properties['bus_voltage'] = bus_voltage
self._properties['battery_voltage'] = battery_voltage / 100
self._properties['battery_charging_current'] = battery_charging_current
grid_voltage,
grid_frequency,
ac_output_voltage,
ac_output_frequency,
ac_output_apparent_power,
ac_output_active_power,
ac_output_load,
bus_voltage,
battery_voltage,
battery_charging_current,
) = struct.unpack("<HHHHHHHHHH", data)

self._properties["grid_voltage"] = grid_voltage / 10
self._properties["grid_frequency"] = grid_frequency / 10
self._properties["ac_output_voltage"] = ac_output_voltage / 10
self._properties["ac_output_frequency"] = ac_output_frequency / 10
self._properties["ac_output_apparent_power"] = ac_output_apparent_power
self._properties["ac_output_active_power"] = ac_output_active_power
self._properties["ac_output_load"] = ac_output_load
self._properties["bus_voltage"] = bus_voltage
self._properties["battery_voltage"] = battery_voltage / 100
self._properties["battery_charging_current"] = battery_charging_current

def parse_status2_data(self, data: bytes) -> None:
battery_soc, heat_sink_temp, _, _, _, _, mode, _, _, _ = struct.unpack('<HHHHHHHHHH', data)
battery_soc, heat_sink_temp, _, _, _, _, mode, _, _, _ = struct.unpack("<HHHHHHHHHH", data)

self._properties['battery_state_of_charge'] = battery_soc
self._properties['heat_sink_temperature'] = heat_sink_temp
self._properties['mode'] = chr(mode)
self._properties["battery_state_of_charge"] = battery_soc
self._properties["heat_sink_temperature"] = heat_sink_temp
self._properties["mode"] = chr(mode)

def parse_pv1_status_data(self, data: bytes) -> None:
_, _, _, _, _, pv_current, pv_voltage, pv_power, _, _ = struct.unpack('<HHHHHHHHHH', data)
_, _, _, _, _, pv_current, pv_voltage, pv_power, _, _ = struct.unpack("<HHHHHHHHHH", data)

self._properties['pv_current'] = pv_current / 10
self._properties['pv_voltage'] = pv_voltage / 10
self._properties['pv_power'] = pv_power
self._properties["pv_current"] = pv_current / 10
self._properties["pv_voltage"] = pv_voltage / 10
self._properties["pv_power"] = pv_power

async def make_port_args(self) -> list[dict[str, Any]]:
return [
{"driver": NumberPort, "property_name": "grid_voltage", "display_name": "Grid Voltage", "unit": "V"},
{"driver": NumberPort, "property_name": "grid_frequency", "display_name": "Grid Frequency", "unit": "Hz"},
{
'driver': NumberPort,
'property_name': 'grid_voltage',
'display_name': 'Grid Voltage',
'unit': 'V'
"driver": NumberPort,
"property_name": "ac_output_voltage",
"display_name": "AC Output Voltage",
"unit": "V",
},
{
'driver': NumberPort,
'property_name': 'grid_frequency',
'display_name': 'Grid Frequency',
'unit': 'Hz'
"driver": NumberPort,
"property_name": "ac_output_frequency",
"display_name": "AC Output Frequency",
"unit": "Hz",
},
{
'driver': NumberPort,
'property_name': 'ac_output_voltage',
'display_name': 'AC Output Voltage',
'unit': 'V'
"driver": NumberPort,
"property_name": "ac_output_apparent_power",
"display_name": "AC Output Apparent Power",
"unit": "VA",
},
{
'driver': NumberPort,
'property_name': 'ac_output_frequency',
'display_name': 'AC Output Frequency',
'unit': 'Hz'
"driver": NumberPort,
"property_name": "ac_output_active_power",
"display_name": "AC Output Active Power",
"unit": "W",
},
{"driver": NumberPort, "property_name": "ac_output_load", "display_name": "AC Output Load", "unit": "%"},
{"driver": NumberPort, "property_name": "battery_voltage", "display_name": "Battery Voltage", "unit": "V"},
{
'driver': NumberPort,
'property_name': 'ac_output_apparent_power',
'display_name': 'AC Output Apparent Power',
'unit': 'VA'
"driver": NumberPort,
"property_name": "battery_charging_current",
"display_name": "Battery Charging Current",
"unit": "A",
},
{
'driver': NumberPort,
'property_name': 'ac_output_active_power',
'display_name': 'AC Output Active Power',
'unit': 'W'
"driver": NumberPort,
"property_name": "battery_state_of_charge",
"display_name": "Battery State Of Charge",
"unit": "%",
},
{
'driver': NumberPort,
'property_name': 'ac_output_load',
'display_name': 'AC Output Load',
'unit': '%'
"driver": NumberPort,
"property_name": "heat_sink_temperature",
"display_name": "Heat Sink Temperature",
"unit": "C",
},
{
'driver': NumberPort,
'property_name': 'battery_voltage',
'display_name': 'Battery Voltage',
'unit': 'V'
"driver": StringPort,
"property_name": "mode",
"display_name": "Inverter Mode",
"choices": [{"value": c[0], "display_name": c[1]} for c in constants.MODE_CHOICES],
},
{
'driver': NumberPort,
'property_name': 'battery_charging_current',
'display_name': 'Battery Charging Current',
'unit': 'A'
},
{
'driver': NumberPort,
'property_name': 'battery_state_of_charge',
'display_name': 'Battery State Of Charge',
'unit': '%'
},
{
'driver': NumberPort,
'property_name': 'heat_sink_temperature',
'display_name': 'Heat Sink Temperature',
'unit': 'C'
},
{
'driver': StringPort,
'property_name': 'mode',
'display_name': 'Inverter Mode',
'choices': [{'value': c[0], 'display_name': c[1]} for c in constants.MODE_CHOICES]
},
{
'driver': NumberPort,
'property_name': 'pv_current',
'display_name': 'PV Current',
'unit': 'A'
},
{
'driver': NumberPort,
'property_name': 'pv_voltage',
'display_name': 'PV Voltage',
'unit': 'V'
},
{
'driver': NumberPort,
'property_name': 'pv_power',
'display_name': 'PV Power',
'unit': 'W'
}
{"driver": NumberPort, "property_name": "pv_current", "display_name": "PV Current", "unit": "A"},
{"driver": NumberPort, "property_name": "pv_voltage", "display_name": "PV Voltage", "unit": "V"},
{"driver": NumberPort, "property_name": "pv_power", "display_name": "PV Power", "unit": "W"},
]
18 changes: 9 additions & 9 deletions qtoggleserver/mppsolar/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from .base import Command
from .mchgc import MCHGC
from .mnchgc import MNCHGC_Parallel, MNCHGC_Single
from .muchgc import MUCHGC_Single, MUCHGC_Parallel
from .muchgc import MUCHGC_Parallel, MUCHGC_Single
from .pbatmaxdisc import PBATMAXDISC
from .pbcv import PBCV
from .pbdv import PBDV
Expand All @@ -12,15 +12,15 @@
from .pop import POP
from .psdv import PSDV
from .qmchgcr import QMCHGCR
from .qmuchgcr import QMUCHGCR
from .qmod import QMOD
from .qpigs import QPIGS, QPIGS_LV, QPIGS_GKMK, QPIGS_MAX
from .qpigs2 import QPIGS2, QPIGS2_MAX
from .qpiri import QPIRI, QPIRI_GK, QPIRI_MAX, QPIRI_MK
from .qmuchgcr import QMUCHGCR
from .qpigs import QPIGS_GKMK, QPIGS_LV, QPIGS_MAX
from .qpigs2 import QPIGS2_MAX
from .qpiri import QPIRI_GK, QPIRI_MAX, QPIRI_MK


COMMANDS_BY_MODEL = {
'GK': [
"GK": [
MNCHGC_Single,
MUCHGC_Single,
PBCV,
Expand All @@ -37,7 +37,7 @@
QPIGS_GKMK,
QPIRI_GK,
],
'LV': [
"LV": [
MNCHGC_Single,
PBCV,
PBDV,
Expand All @@ -51,7 +51,7 @@
QMOD,
QPIGS_LV,
],
'MAX': [
"MAX": [
MCHGC,
MNCHGC_Parallel,
MUCHGC_Parallel,
Expand All @@ -71,7 +71,7 @@
QPIGS2_MAX,
QPIRI_MAX,
],
'MK': [
"MK": [
MNCHGC_Parallel,
MUCHGC_Parallel,
PBCV,
Expand Down
Loading