solarlog-cli 0.4.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.coverage +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/PKG-INFO +3 -2
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/pyproject.toml +1 -1
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/solarlog_client.py +11 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/solarlog_connector.py +23 -1
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/solarlog_models.py +11 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/__snapshots__/test_solarlog_cli.ambr +6 -0
- solarlog_cli-0.5.0/tests/fixtures/battery_data.json +3 -0
- solarlog_cli-0.5.0/tests/fixtures/battery_data_without_battery.json +3 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/test_solarlog_cli.py +42 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.devcontainer/devcontainer.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.github/workflows/pylint.yml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.github/workflows/python-publish.yml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.github/workflows/ruff.yml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.github/workflows/tests.yml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.github/workflows/typing.yml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.gitignore +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.vscode/settings.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/.vscode/tasks.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/LICENSE +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/README.md +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/pytest.ini +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/requirements.txt +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/__init__.py +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/py.typed +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/src/solarlog_cli/solarlog_exceptions.py +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/__init__.py +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/conftest.py +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/basic_data.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/basic_data_during_update.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/basic_data_no_power.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_data_1.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_data_2.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_data_3.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_data_4.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_list.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/device_list_access_denied.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/energy_per_inverter.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/extended_data.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/fixtures/power_per_inverter.json +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/ruff.toml +0 -0
- {solarlog_cli-0.4.0 → solarlog_cli-0.5.0}/tests/syrupy.py +0 -0
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: solarlog_cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Python library to access the Solar-Log
|
|
5
5
|
Project-URL: Repository, https://github.com/dontinelli/solarlog_cli.git
|
|
6
6
|
Project-URL: Issues, https://github.com/dontinelli/solarlog_cli/issues
|
|
@@ -8,6 +8,7 @@ Project-URL: Changelog, https://github.com/dontinelli/solarlog_cli/blob/master/C
|
|
|
8
8
|
Project-URL: Solar-Log homepage, https://www.solar-log.com/
|
|
9
9
|
Project-URL: API Documentation (inofficial), https://github.com/iobroker-community-adapters/ioBroker.solarlog/blob/master/docs/solarlog_dataobjects.md
|
|
10
10
|
Author-email: dontinelli <73341522+dontinelli@users.noreply.github.com>
|
|
11
|
+
License-File: LICENSE
|
|
11
12
|
Keywords: IoT,hass,home assistant,sensor,smart home,solar
|
|
12
13
|
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
13
14
|
Classifier: Operating System :: OS Independent
|
|
@@ -179,6 +179,17 @@ class Client:
|
|
|
179
179
|
|
|
180
180
|
return data
|
|
181
181
|
|
|
182
|
+
async def get_battery_data(self) -> list[float]:
|
|
183
|
+
"""Get power data from Solar-Log"""
|
|
184
|
+
|
|
185
|
+
raw_data: dict = await self.parse_http_response(
|
|
186
|
+
await self.execute_http_request('{ "858": null }')
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
data: list[float] = raw_data["858"]
|
|
190
|
+
|
|
191
|
+
return data
|
|
192
|
+
|
|
182
193
|
async def get_power_per_inverter(self) -> dict[int, float]:
|
|
183
194
|
"""Get power data from Solar-Log"""
|
|
184
195
|
|
|
@@ -12,7 +12,7 @@ from .solarlog_exceptions import(
|
|
|
12
12
|
SolarLogConnectionError,
|
|
13
13
|
SolarLogUpdateError,
|
|
14
14
|
)
|
|
15
|
-
from .solarlog_models import
|
|
15
|
+
from .solarlog_models import BatteryData, InverterData, SolarlogData
|
|
16
16
|
|
|
17
17
|
_LOGGER = logging.getLogger(__name__)
|
|
18
18
|
|
|
@@ -95,6 +95,8 @@ class SolarLogConnector:
|
|
|
95
95
|
if self._device_list != {}:
|
|
96
96
|
data.inverter_data = await self.update_inverter_data()
|
|
97
97
|
|
|
98
|
+
data.battery_data = await self.update_battery_data()
|
|
99
|
+
|
|
98
100
|
_LOGGER.debug("Extended data updated: %s",data)
|
|
99
101
|
|
|
100
102
|
#calculated values (for downward compatibility)
|
|
@@ -112,6 +114,26 @@ class SolarLogConnector:
|
|
|
112
114
|
|
|
113
115
|
return data
|
|
114
116
|
|
|
117
|
+
|
|
118
|
+
async def update_battery_data(self) -> BatteryData | None:
|
|
119
|
+
"""Update device specific data."""
|
|
120
|
+
|
|
121
|
+
raw_data = await self.client.get_battery_data()
|
|
122
|
+
|
|
123
|
+
if raw_data == []:
|
|
124
|
+
return None
|
|
125
|
+
|
|
126
|
+
battery_data = BatteryData(
|
|
127
|
+
voltage=raw_data[0],
|
|
128
|
+
level=raw_data[1],
|
|
129
|
+
charge_power=raw_data[2],
|
|
130
|
+
discharge_power=raw_data[3],
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
_LOGGER.debug("Battery data updated: %s",battery_data)
|
|
134
|
+
|
|
135
|
+
return battery_data
|
|
136
|
+
|
|
115
137
|
async def update_device_list(self) -> dict[int, InverterData]:
|
|
116
138
|
"""Update list of devices."""
|
|
117
139
|
if not self.extended_data:
|
|
@@ -4,6 +4,16 @@ from datetime import datetime
|
|
|
4
4
|
|
|
5
5
|
from mashumaro import DataClassDictMixin
|
|
6
6
|
|
|
7
|
+
@dataclass
|
|
8
|
+
class BatteryData():
|
|
9
|
+
"""Battery Data model."""
|
|
10
|
+
|
|
11
|
+
charge_power: float = 0
|
|
12
|
+
discharge_power: float = 0
|
|
13
|
+
level: float = 0
|
|
14
|
+
voltage: float = 0
|
|
15
|
+
|
|
16
|
+
|
|
7
17
|
@dataclass
|
|
8
18
|
class InverterData():
|
|
9
19
|
"""Inverter Data model."""
|
|
@@ -46,6 +56,7 @@ class SolarlogData(DataClassDictMixin):
|
|
|
46
56
|
usage: float | None = None
|
|
47
57
|
|
|
48
58
|
#extended data
|
|
59
|
+
battery_data: BatteryData | None = None
|
|
49
60
|
inverter_data: dict[int, InverterData] = field(default_factory=dict)
|
|
50
61
|
production_year: float | None = None
|
|
51
62
|
self_consumption_year: float | None = None
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
# name: test_update_data[asyncio]
|
|
3
3
|
dict({
|
|
4
4
|
'alternator_loss': 100,
|
|
5
|
+
'battery_data': dict({
|
|
6
|
+
'charge_power': 1074,
|
|
7
|
+
'discharge_power': 0,
|
|
8
|
+
'level': 79,
|
|
9
|
+
'voltage': 0,
|
|
10
|
+
}),
|
|
5
11
|
'capacity': 27.901119402985074,
|
|
6
12
|
'consumption_ac': 3110,
|
|
7
13
|
'consumption_day': 47819,
|
|
@@ -176,6 +176,10 @@ async def test_update_data(
|
|
|
176
176
|
"http://solarlog.com/getjp",
|
|
177
177
|
body=load_fixture("energy_per_inverter.json"),
|
|
178
178
|
)
|
|
179
|
+
responses.post(
|
|
180
|
+
"http://solarlog.com/getjp",
|
|
181
|
+
body=load_fixture("battery_data.json"),
|
|
182
|
+
)
|
|
179
183
|
|
|
180
184
|
solarlog_connector = SolarLogConnector(
|
|
181
185
|
"http://solarlog.com",
|
|
@@ -191,6 +195,44 @@ async def test_update_data(
|
|
|
191
195
|
await solarlog_connector.client.close()
|
|
192
196
|
assert solarlog_connector.client.session.closed
|
|
193
197
|
|
|
198
|
+
async def test_update_data_without_battery(
|
|
199
|
+
responses: aioresponses,
|
|
200
|
+
) -> None:
|
|
201
|
+
"""Test update data."""
|
|
202
|
+
responses.post(
|
|
203
|
+
"http://solarlog.com/getjp",
|
|
204
|
+
body=load_fixture("basic_data.json"),
|
|
205
|
+
)
|
|
206
|
+
responses.post(
|
|
207
|
+
"http://solarlog.com/getjp",
|
|
208
|
+
body=load_fixture("extended_data.json"),
|
|
209
|
+
)
|
|
210
|
+
responses.post(
|
|
211
|
+
"http://solarlog.com/getjp",
|
|
212
|
+
body=load_fixture("power_per_inverter.json"),
|
|
213
|
+
)
|
|
214
|
+
responses.post(
|
|
215
|
+
"http://solarlog.com/getjp",
|
|
216
|
+
body=load_fixture("energy_per_inverter.json"),
|
|
217
|
+
)
|
|
218
|
+
responses.post(
|
|
219
|
+
"http://solarlog.com/getjp",
|
|
220
|
+
body=load_fixture("battery_data_without_battery.json"),
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
solarlog_connector = SolarLogConnector(
|
|
224
|
+
"http://solarlog.com",
|
|
225
|
+
True,
|
|
226
|
+
"UTC",
|
|
227
|
+
{0: True, 1: True, 2: False, 3: True},
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
data = await solarlog_connector.update_data()
|
|
231
|
+
|
|
232
|
+
assert data.battery_data is None
|
|
233
|
+
|
|
234
|
+
await solarlog_connector.client.close()
|
|
235
|
+
assert solarlog_connector.client.session.closed
|
|
194
236
|
|
|
195
237
|
@pytest.mark.parametrize(
|
|
196
238
|
("status", "request_timeout", "error"),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|