modulitiz-micro 2.44.0__py311-none-any.whl → 2.44.1__py311-none-any.whl
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.
- modulitiz_micro/rete/http/huawei/fusionsolar/ModuleHuaweiFusionSolar.py +3 -3
- modulitiz_micro/weather/AbstractModuleWeather.py +31 -0
- modulitiz_micro/weather/ModuleWeather.py +62 -0
- {modulitiz_micro-2.44.0.dist-info → modulitiz_micro-2.44.1.dist-info}/METADATA +2 -2
- {modulitiz_micro-2.44.0.dist-info → modulitiz_micro-2.44.1.dist-info}/RECORD +8 -7
- modulitiz_micro/ModuloMeteo.py +0 -72
- {modulitiz_micro-2.44.0.dist-info → modulitiz_micro-2.44.1.dist-info}/WHEEL +0 -0
- {modulitiz_micro-2.44.0.dist-info → modulitiz_micro-2.44.1.dist-info}/licenses/LICENSE +0 -0
- {modulitiz_micro-2.44.0.dist-info → modulitiz_micro-2.44.1.dist-info}/top_level.txt +0 -0
@@ -61,11 +61,11 @@ class ModuleHuaweiFusionSolar(AbstractHuaweiFusionSolar):
|
|
61
61
|
|
62
62
|
def getRealtimeProductionWh(self) -> int:
|
63
63
|
"""
|
64
|
-
Get total realtime production in
|
64
|
+
Get total realtime production in Wh.
|
65
65
|
"""
|
66
66
|
results=self.getRealtimeDataResidentialInverter()
|
67
|
-
|
68
|
-
return int(sum(
|
67
|
+
whProductions=[x.pv1_u*x.pv1_i for x in results]
|
68
|
+
return int(sum(whProductions))
|
69
69
|
|
70
70
|
def getRealtimeDataResidentialInverter(self)->list[DeviceDataResidentialInverter]:
|
71
71
|
elems=[]
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import json
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
5
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
6
|
+
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
7
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
8
|
+
|
9
|
+
|
10
|
+
class AbstractModuleWeather(ABC):
|
11
|
+
OPTIONS="lang=it&units=metric"
|
12
|
+
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
13
|
+
|
14
|
+
__BASE_URL="https://api.openweathermap.org"
|
15
|
+
URL_CURRENT=__BASE_URL+f"/data/2.5/weather?{OPTIONS}&{KEY}&q="
|
16
|
+
URL_FORECAST=__BASE_URL+f"/data/2.5/forecast?{OPTIONS}&{KEY}&q="
|
17
|
+
|
18
|
+
def __init__(self,logger:ModuloLogging):
|
19
|
+
self._logger=logger
|
20
|
+
|
21
|
+
def _makeForecastRequest(self,baseUrl:str,city:str,codState:str):
|
22
|
+
return self._makeGenericRequest(baseUrl,city, codState)['list']
|
23
|
+
|
24
|
+
def _makeGenericRequest(self,baseUrl:str,city:str,codState:str):
|
25
|
+
url=baseUrl+ModuloHttpUtils.encodeUrl(city+","+codState)
|
26
|
+
http=ModuloHttp(url,self._logger,False)
|
27
|
+
try:
|
28
|
+
response=http.doGet(0,False)
|
29
|
+
except EccezioneHttpGeneric:
|
30
|
+
return None
|
31
|
+
return json.loads(response.responseBody)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
from modulitiz_micro.weather.AbstractModuleWeather import AbstractModuleWeather
|
2
|
+
from modulitiz_nano.ModuloDate import ModuloDate
|
3
|
+
from modulitiz_nano.ModuloListe import ModuloListe
|
4
|
+
|
5
|
+
|
6
|
+
class ModuleWeather(AbstractModuleWeather):
|
7
|
+
"""
|
8
|
+
Utility for current weather and forecasts.
|
9
|
+
"""
|
10
|
+
OPTIONS="lang=it&units=metric"
|
11
|
+
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
12
|
+
|
13
|
+
__BASE_URL="https://api.openweathermap.org"
|
14
|
+
URL_CURRENT=__BASE_URL+f"/data/2.5/weather?{OPTIONS}&{KEY}&q="
|
15
|
+
URL_FORECAST=__BASE_URL+f"/data/2.5/forecast?{OPTIONS}&{KEY}&q="
|
16
|
+
|
17
|
+
def __init__(self,*args,**kwargs):
|
18
|
+
super().__init__(*args,**kwargs)
|
19
|
+
|
20
|
+
def getCurrent(self,city:str,codState:str)-> dict:
|
21
|
+
return self._makeGenericRequest(self.URL_CURRENT,city,codState)
|
22
|
+
|
23
|
+
def getForecastRainUntilTomorrow(self,city:str,codState:str)-> list|None:
|
24
|
+
"""
|
25
|
+
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
26
|
+
"""
|
27
|
+
now=ModuloDate.now()
|
28
|
+
tomorrow=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(now,1))
|
29
|
+
hoursDiff=ModuloDate.hoursDiff(tomorrow, now)
|
30
|
+
elements=self.__getForecasts(city, codState,True,None,hoursDiff)
|
31
|
+
if elements is None:
|
32
|
+
return None
|
33
|
+
# filter elements
|
34
|
+
results=[]
|
35
|
+
for elem in elements:
|
36
|
+
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
37
|
+
results.append(elem)
|
38
|
+
return results
|
39
|
+
|
40
|
+
def __getForecasts(self,city:str,codState:str,includeFirstForecast:bool,stepHours: int|None,maxHours:int)-> list|None:
|
41
|
+
results=self._makeForecastRequest(self.URL_FORECAST,city,codState)
|
42
|
+
maxLista=len(results)
|
43
|
+
# calculate indexes
|
44
|
+
if maxHours is not None:
|
45
|
+
maxInd=int(maxHours/3)+1
|
46
|
+
if maxInd>=maxLista:
|
47
|
+
maxInd=maxLista-1
|
48
|
+
else:
|
49
|
+
maxInd=maxLista-1
|
50
|
+
if stepHours is None:
|
51
|
+
step=1
|
52
|
+
else:
|
53
|
+
step=int(stepHours/3)
|
54
|
+
inds=list(range(4,maxInd,step))
|
55
|
+
if includeFirstForecast:
|
56
|
+
inds.insert(0,1)
|
57
|
+
# process json
|
58
|
+
output=[]
|
59
|
+
for ind in inds:
|
60
|
+
elem=results[ind]
|
61
|
+
output.append(elem)
|
62
|
+
return output
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: modulitiz_micro
|
3
|
-
Version: 2.44.
|
3
|
+
Version: 2.44.1
|
4
4
|
Summary: Raccolta dei miei moduli - versione micro
|
5
5
|
Author-email: tiz <sderfo1234@altervista.org>
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
@@ -21,7 +21,7 @@ Requires-Dist: pyOpenSSL==25.1.0
|
|
21
21
|
Requires-Dist: pypyodbc>=1.3
|
22
22
|
Requires-Dist: pyserial>=3.5
|
23
23
|
Requires-Dist: requests>=2.31
|
24
|
-
Requires-Dist: schedule
|
24
|
+
Requires-Dist: schedule==1.2.2
|
25
25
|
Requires-Dist: telethon>=1.33
|
26
26
|
Dynamic: license-file
|
27
27
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
modulitiz_micro/ModuloMeteo.py,sha256=U4H6IhsUGXLn2N_6MY-1Ti8YDDIwrKea-u2Ojx_7WAA,2321
|
2
1
|
modulitiz_micro/ModuloSeriale.py,sha256=k99YGWXOtEt44Q4mDE40IEeqMYGWfLC0LiPmgW63r-g,1878
|
3
2
|
modulitiz_micro/ModuloTarghe.py,sha256=FMKFtWUtQEB1IBnmUMwWhznxWitx_S7dJf0LsQsecaI,1369
|
4
3
|
modulitiz_micro/database/AbstractDatabaseService.py,sha256=RcSQgGZf-RHT0NzOTF1S35yf0nWOb93SzqSs1Rf2NbQ,269
|
@@ -38,7 +37,7 @@ modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py,sha256=hhSQgDpXpcGXgWl14Dx
|
|
38
37
|
modulitiz_micro/rete/http/ModuloHttpUtils.py,sha256=T-Yp_T-oqfwUDFokIYGOeO7a1lSGVsZesjDPhgDBbLM,2348
|
39
38
|
modulitiz_micro/rete/http/beans/HttpResponseBean.py,sha256=7JVywcWURv1I9rYKj4Kt9XLt7387wMZGTMefcsm7E3I,202
|
40
39
|
modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py,sha256=MRhCeNMcy3hw-A8W40gozUY0FiL0tyKASauA7hRW0fo,595
|
41
|
-
modulitiz_micro/rete/http/huawei/fusionsolar/ModuleHuaweiFusionSolar.py,sha256=
|
40
|
+
modulitiz_micro/rete/http/huawei/fusionsolar/ModuleHuaweiFusionSolar.py,sha256=SXutHgWJ-CyC3LmDn36iixXLYY6fcqZJp8Od7mLbhQ4,3256
|
42
41
|
modulitiz_micro/rete/http/huawei/fusionsolar/beans/TokenBean.py,sha256=fVtnXYBcaahsOgNnbfZWir4KJVVAZcj5Y0MplMOESnU,700
|
43
42
|
modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceBean.py,sha256=dEtC46PySPhUQDGDB4L1FtCDS2BG98uCietcIbpXLdM,98
|
44
43
|
modulitiz_micro/rete/http/huawei/fusionsolar/beans/device/DeviceDataBattery.py,sha256=7tugell4ZRhOXqIEuRcL6F-JHHRVBMiJ4fTeo-ckDfM,542
|
@@ -58,8 +57,10 @@ modulitiz_micro/social/telegram/AbstractModuloTelegram.py,sha256=e1XSZse1GFsNYjd
|
|
58
57
|
modulitiz_micro/social/telegram/ModuloTelegramSimple.py,sha256=TLWx64pl26cTno3pJHZu0Zt86ZEOYF2Lp5mQt1eekbY,938
|
59
58
|
modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py,sha256=eR6B-zTSbuZcdDsmcz4axhvKgAWLfYnWUCLdbx7OR_E,510
|
60
59
|
modulitiz_micro/util/scheduler/ModuleScheduler.py,sha256=kLxTfr-YPWZB-4XevNxQg71sSLbpakrRPOXLDjJ8JV4,595
|
61
|
-
modulitiz_micro
|
62
|
-
modulitiz_micro
|
63
|
-
modulitiz_micro-2.44.
|
64
|
-
modulitiz_micro-2.44.
|
65
|
-
modulitiz_micro-2.44.
|
60
|
+
modulitiz_micro/weather/AbstractModuleWeather.py,sha256=SBb2oE_5-g6yvE4wbqI1RTgrqIGWbDgvL8kaMNkw9Vo,1129
|
61
|
+
modulitiz_micro/weather/ModuleWeather.py,sha256=mipt91hQGztWPy5hUkz5vYnAJ1nYyL9fR9zS4WUICa8,2000
|
62
|
+
modulitiz_micro-2.44.1.dist-info/licenses/LICENSE,sha256=b-Ia9Hv3N_FviXoFAXG44lDGbk4tCC0fBdduccm8nl0,1086
|
63
|
+
modulitiz_micro-2.44.1.dist-info/METADATA,sha256=O6UII-nZztUa9oqEuc-b3lr9zdtWBgANtrZImiJ33mE,1579
|
64
|
+
modulitiz_micro-2.44.1.dist-info/WHEEL,sha256=cRWFNt_CJSuf6BnJKAdKunDXUJxjAbWvbt_kstDCs1I,93
|
65
|
+
modulitiz_micro-2.44.1.dist-info/top_level.txt,sha256=ESJE0qtNJp3tbKPrffbFVjH511NSjJHxscfpdLjTpA8,16
|
66
|
+
modulitiz_micro-2.44.1.dist-info/RECORD,,
|
modulitiz_micro/ModuloMeteo.py
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
from modulitiz_nano.ModuloDate import ModuloDate
|
4
|
-
from modulitiz_nano.ModuloListe import ModuloListe
|
5
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
6
|
-
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
7
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
8
|
-
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
9
|
-
|
10
|
-
|
11
|
-
class ModuloMeteo(object):
|
12
|
-
"""
|
13
|
-
Utility di gestione delle previsioni meteo.
|
14
|
-
"""
|
15
|
-
OPZIONI="lang=it&units=metric"
|
16
|
-
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
17
|
-
|
18
|
-
__URL_BASE="https://api.openweathermap.org"
|
19
|
-
URL_ATTUALE=__URL_BASE+f"/data/2.5/weather?{OPZIONI}&{KEY}&q="
|
20
|
-
URL_PREVISIONE=__URL_BASE+f"/data/2.5/forecast?{OPZIONI}&{KEY}&q="
|
21
|
-
|
22
|
-
def __init__(self,logger:ModuloLogging):
|
23
|
-
self.__logger=logger
|
24
|
-
|
25
|
-
def getPrevisionePioggiaFinoADomani(self,citta:str,codStato:str)->list|None:
|
26
|
-
"""
|
27
|
-
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
28
|
-
"""
|
29
|
-
adesso=ModuloDate.now()
|
30
|
-
domani=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(adesso,1))
|
31
|
-
oreDiff=ModuloDate.hoursDiff(domani, adesso)
|
32
|
-
elementi=self.__getPrevisioni(citta, codStato,True,None,oreDiff)
|
33
|
-
if elementi is None:
|
34
|
-
return None
|
35
|
-
# filtro gli elementi
|
36
|
-
lista=[]
|
37
|
-
for elem in elementi:
|
38
|
-
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
39
|
-
lista.append(elem)
|
40
|
-
return lista
|
41
|
-
|
42
|
-
def __getPrevisioni(self,citta:str,codStato:str,includiPrimaPrevisione:bool,stepHours:int|None,maxHours:int)->list|None:
|
43
|
-
cittaEStato=citta+","+codStato
|
44
|
-
url=self.URL_PREVISIONE+ModuloHttpUtils.encodeUrl(cittaEStato)
|
45
|
-
http=ModuloHttp(url,self.__logger,False)
|
46
|
-
try:
|
47
|
-
response=http.doGet(0,False)
|
48
|
-
except EccezioneHttpGeneric:
|
49
|
-
return None
|
50
|
-
responseObj=json.loads(response.responseBody)
|
51
|
-
lista=responseObj['list']
|
52
|
-
maxLista=len(lista)
|
53
|
-
# calcolo gli indici
|
54
|
-
if maxHours is not None:
|
55
|
-
maxInd=int(maxHours/3)+1
|
56
|
-
if maxInd>=maxLista:
|
57
|
-
maxInd=maxLista-1
|
58
|
-
else:
|
59
|
-
maxInd=maxLista-1
|
60
|
-
if stepHours is None:
|
61
|
-
step=1
|
62
|
-
else:
|
63
|
-
step=int(stepHours/3)
|
64
|
-
inds=list(range(4,maxInd,step))
|
65
|
-
if includiPrimaPrevisione:
|
66
|
-
inds.insert(0,1)
|
67
|
-
# processo il json
|
68
|
-
output=[]
|
69
|
-
for ind in inds:
|
70
|
-
elem=lista[ind]
|
71
|
-
output.append(elem)
|
72
|
-
return output
|
File without changes
|
File without changes
|
File without changes
|