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.
@@ -61,11 +61,11 @@ class ModuleHuaweiFusionSolar(AbstractHuaweiFusionSolar):
61
61
 
62
62
  def getRealtimeProductionWh(self) -> int:
63
63
  """
64
- Get total realtime production in Kwh.
64
+ Get total realtime production in Wh.
65
65
  """
66
66
  results=self.getRealtimeDataResidentialInverter()
67
- productionWh=[x.pv1_u*x.pv1_i for x in results]
68
- return int(sum(productionWh))
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.0
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>=1.2
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=14SSbVHh7W-k6n6HJ50RbdFmrUPo32jp5fW_vgHmmXY,3255
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-2.44.0.dist-info/licenses/LICENSE,sha256=b-Ia9Hv3N_FviXoFAXG44lDGbk4tCC0fBdduccm8nl0,1086
62
- modulitiz_micro-2.44.0.dist-info/METADATA,sha256=4h8k8PcTNlYCPeIdjPBi7U7kly0LuQJBDYJ6O-J-39k,1577
63
- modulitiz_micro-2.44.0.dist-info/WHEEL,sha256=cRWFNt_CJSuf6BnJKAdKunDXUJxjAbWvbt_kstDCs1I,93
64
- modulitiz_micro-2.44.0.dist-info/top_level.txt,sha256=ESJE0qtNJp3tbKPrffbFVjH511NSjJHxscfpdLjTpA8,16
65
- modulitiz_micro-2.44.0.dist-info/RECORD,,
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,,
@@ -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