]> git.sven.stormbind.net Git - sven/scripts.git/blobdiff - home/portalmonitor.py
Ignore timeouts on the envertech portal
[sven/scripts.git] / home / portalmonitor.py
index 2264206090735e746dd2c0aabfb8fad028df3f2a..c8b732b46afb64181df4c0cc7cefed2e16747209 100755 (executable)
@@ -1,26 +1,26 @@
 #!/usr/bin/env python3
 
+import argparse
 import requests
 import time
 import sys
 import configparser
 from suntime import Sun
-from optparse import OptionParser
 
-parser = OptionParser(usage="usage: %prog [options]")
-parser.add_option("-s",
+parser = argparse.ArgumentParser()
+parser.add_argument("-s",
                   "--status",
                   action="store_true",
                   dest="printStatus",
                   help="Print Status Information",
                   default=False)
-parser.add_option("-f",
+parser.add_argument("-f",
                   "--force",
                   action="store_true",
                   dest="force",
                   help="Force retrieval of Power value",
                   default=False)
-(options, args) = parser.parse_args()
+args = parser.parse_args()
 
 
 def isDaylight(lat, lon, toleranceSeconds):
@@ -45,38 +45,67 @@ def getCurrentPower(userName, password, stationId):
                            'userName': userName,
                            'pwd': password
                        },
-                       timeout=(10, 30))
+                       timeout=(20, 40))
 
             r = s.post(
                 'https://www.envertecportal.com/ApiStations/getStationInfo',
                 data={
                     'stationId': stationId
                 },
-                timeout=(10, 60)).json()
+                timeout=(20, 60)).json()
             power = r['Data']['Power']
 
             r = s.post('https://www.envertecportal.com/apiAccount/Logout',
-                       timeout=(10, 30))
+                       timeout=(20, 40))
+
+        # connect timeouts occur so frequently since the portal relaunch,
+        # ignore them for the time beeing completely
+        except requests.exceptions.ConnectTimeout as eTimeout:
+            sys.exit(1)
         except requests.exceptions.RequestException as e:
+            print(e)
             raise SystemExit(e)
 
     return float(power)
 
 
+# use our stateFile to determine if we have a state change
+# used to decide if we print something - thus generate a mail - later on
+def stateCheck(newState, stateFile):
+    try:
+        with open(stateFile, "r") as f:
+            oldState = f.read()
+    except FileNotFoundError:
+        oldState = "NULL"
+
+    if newState == oldState:
+        change = False
+    else:
+        change = True
+        with open(stateFile, "w") as f:
+            f.write(newState)
+
+    return change
+
+
 # read configuration file
 conf = configparser.ConfigParser()
 conf.read('portalmonitor.ini')
 
 # retrieve current power value as reported by envertecportal
 if isDaylight(conf['config'].getfloat('lat'), conf['config'].getfloat('lon'),
-              conf['config'].getint('toleranceSeconds')) or options.force:
+              conf['config'].getint('toleranceSeconds')) or args.force:
     currentPower = getCurrentPower(conf['config']['userName'],
                                    conf['config']['password'],
                                    conf['config']['stationId'])
 
-    if options.printStatus:
-        print('Current Power: ' + str(currentPower))
+    if args.printStatus:
+        print(f"Current Power: {currentPower}")
 
     if currentPower == 0:
-        print('Error: Power dropped to 0 but we should have daylight!')
+        if stateCheck('FAILED', conf['config']['stateFile']):
+            print('Error: Power dropped to 0 but we should have daylight!')
         sys.exit(1)
+    else:
+        if stateCheck('OK', conf['config']['stateFile']):
+            print(f"Resolved: Inverter reports {currentPower}W")