Bei mir funktioniert es auch nicht mehr.
HS Neustart brachte keine Besserung. HS Version 4.11
HS Neustart brachte keine Besserung. HS Version 4.11
class Netatmo_OAUTH213554(object): def __init__(self,pItem): from hs_queue import Queue pItem.NETATMO_OAUTH2 = self global threading import threading def init_logik(self,pItem,EN): import types pItem.client_id = EN[2] pItem.client_secret = EN[3] pItem.refresh_token = EN[4] pItem._scope= EN[5] pItem.abfrageAktiv = EN[6] ## Wenn nicht eigene Client ID und Secret eingegeben, dann default verwenden, geht aber nicht fuer CAM if pItem.client_id == "": pItem.client_id = "5a08a3ffb26ddf727f8b5965" if pItem.client_secret == "": pItem.client_secret = "u5Kh7WXQswdsU79845uaIiGQ8hhqT27Ano" pItem.id_token = "" pItem.scope = "" pItem.expiration = 999999999 pItem.error = 0 ## dann den debug-Seiten Eintrag schreiben self.debug_write(pItem,"Herausgeber","<a target='_blank' href='http://www.ecmacom.ch'>ECMACOM GmbH</a>") self.debug_write(pItem,"Lizenz","Frei. ECMACOM lehnt jegliche Verantwortung ab. Einsatz auf eigenes Risoko") self.debug_write(pItem,"Abfrage", "{0}".format("angehalten" if EN[6] == 0 else "aktiv")) pItem._AUTH_REQ = "https://api.netatmo.com/oauth2/token" pItem.registered_device={} # Die registrierten devices. Verwendet um gezielte Updates senden zu knnen pItem.registered_device['data'] = {} pItem.registered_deviceName = {} pItem.known_devicetypes = ("Station","Home","HomeCoach") ## Abfrage und loop starten self.loop_refreshToken(pItem) ## Loop fr periodische Abfrage def loop_refreshToken(self,pItem): ## wenn aktiv if pItem.abfrageAktiv == 1: ## wenn noch kein Token oder fehler bei letzter Abrfage, neun Token holen if pItem.refresh_token == "" or pItem.error: self.getToken(pItem) ## wenn error, dann stndlich neu versuchen if pItem.error: threading.Timer(3600, self.loop_refreshToken, args=(pItem,)).start() else: ## refreshToken nur machen wenn gettoken keinen error self.refreshToken(pItem) ## sonst alle expiration - 10 Min aufrufen threading.Timer(pItem.expiration - 600, self.loop_refreshToken, args=(pItem,)).start() ## Token vor Ablauf erneuern def refreshToken(self,pItem): import time postParams = { "grant_type" : "refresh_token", "refresh_token" : pItem.refresh_token, "client_id" : pItem.client_id, "client_secret" : pItem.client_secret } headers = {"Content-Type" : "application/x-www-form-urlencoded;charset=utf-8"} antwort, htmlrespcode = self.webRequest(pItem,"POST", pItem._AUTH_REQ, headers, postParams) ##wenn Anfrege erfolgreich if htmlrespcode == 200: pItem.id_token = antwort["access_token"] ## neuen Token an Geraetebausteine senden pItem.scope = antwort["scope"] pItem.scopestring = " ".join(map(str, pItem.scope)) self.debug_write(pItem,"Scope, bestaetigt", pItem.scopestring) pItem.expiration = antwort["expire_in"] pItem.refresh_token = antwort["refresh_token"] self.debug_write(pItem,"Token refresh", time.strftime("%d.%m.%Y %H:%M:%S")) pItem.error = 0 self.send_to_output(pItem,1,0) self.sendTokenToDevice(pItem) else: self.debug_write(pItem,"Token refresh", "Nicht erfolgreich " + str(htmlrespcode) + " . Entrge E1 bis E5 pruefen und HS neu starten") self.debug_write(pItem,"Abfrage", "angehalten") pItem.expiration = 999999999 pItem.refresh_token = "" ## wenn nicht zum ersten Mal if pItem.error: pass else: pItem.error = 1 self.send_to_output(pItem,1, 1) self.send_to_output(pItem,2, "Fehler beim Token Abfrage") self.log(pItem,"Fehler beim Token Abfrage",severity='error') self.send_to_output(pItem,1, 1) self.sendActivToDevice(pItem) ## Erste Abfrage, Token generieren def getToken(self,pItem): postParams = { "grant_type" : "refresh_token", "client_id" : pItem.client_id, "client_secret" : pItem.client_secret, "refresh_token" : pItem.refresh_token, "scope" : pItem._scope } headers = {"Content-Type" : "application/x-www-form-urlencoded;charset=utf-8"} antwort, htmlrespcode = self.webRequest(pItem,"POST", pItem._AUTH_REQ, headers, postParams) ##webRequest(self, method, url, headers=None, params=None, timeout=10): if htmlrespcode == 200: pItem.id_token = antwort["access_token"] ## pItem.scope = antwort["scope"] ## pItem.expiration = antwort["expire_in"] pItem.error = 0 self.send_to_output(pItem,1, 0) pItem.refresh_token = antwort["refresh_token"] ## wenn Token Request fehler hatte else: self.send_to_output(pItem,2, "Token Anfrage nicht erfolgreich. Error: "+ str(htmlrespcode)) self.log(pItem,"Token Anfrage nicht erfolgreich. Error: "+ str(htmlrespcode),severity='error') self.debug_write(pItem,"Abfrage", "angehalten") pItem.expiration = 999999999 pItem.refresh_token = "" pItem.error = 1 self.send_to_output(pItem,1, 1) self.sendActivToDevice(pItem) def send_to_geraetebaustein(self,pItem, def_in_sub, logik_id, werte_zum_uebergeben): _dc = self._directconnect_parse(pItem, def_in_sub, logik_id) _getter = _dc.get("get") ## das ist die def im Gertebaustein. Die bekommt dann Daten vom return hier am Ende return _getter(werte_zum_uebergeben) def _directconnect_parse(self,pItem,def_in_sub,logik_id): _dc = {} try: _pItem = pItem.MC.LogikList.GatterList.get(int(logik_id)) _dc["sourcelogik"] = _pItem.LogikItem _dc["source"] = _pItem _dc["get"] = getattr(_pItem,def_in_sub,None) except ValueError: pItem.MC.Debug.setErr(sys.exc_info()) ### LogikID pItem.ID keine int return {} return _dc def abfrage_start_stop(self,pItem,EN): pItem.abfrageAktiv = EN[7] ## hier allen Bausteinen senden, dass Abfrage angehalten od. gestartet self.sendActivToDevice(pItem) if pItem.abfrageAktiv == 1: self.getToken(pItem) self.debug_write(pItem,"Abfrage", "aktiv") else: self.debug_write(pItem,"Abfrage", "angehalten") ## Abfrage des Code von API Webseite def webRequest(self,pItem,method, url, headers=None, params=None, timeout=10): import json import urllib import urllib2 import ssl ctx = ssl._create_unverified_context() if params: if "json" in headers["Content-Type"]: params = json.dumps(params) else: params = urllib.urlencode(params) opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx)) req = urllib2.Request(url=url, data=params, headers=headers) req.get_method = lambda: method try: url = opener.open(req) ## wenn json if "application/json" in url.info().getheader('Content-Type'): return json.loads(url.read()),url.getcode() else: return"", 999 except urllib2.HTTPError as e: if hasattr(e,'code'): if e.code == 409: self.send_to_output(pItem,2, "Ausfuehrungsbedingung(en) nicht erfuellt") self.log(pItem,"Ausfuehrungsbedingung(en) nicht erfuellt",severity='error') else: ## print e.code ## print e.msg ## print e.hdrs ## print e.fp self.send_to_output(pItem,2, "HTTP-Fehler bei der API-Abfrage method: " + method) self.log(pItem,"HTTP-Fehler bei der API-Abfrage method: " + method,severity='error') return "", e.code else: self.send_to_output(pItem,2, "HTTP-Fehler bei der API-Abfrage") self.log(pItem,"HTTP-Fehler bei der API-Abfrage",severity='error') return "", 999 ## Often, URLError is raised because there is no network connection (no route to the specified server), or the specified server doesn?t exist. In this case, the exception raised will have a ?reason? attribute, which is a tuple containing an error code and a text error message except urllib2.URLError as e: ## print "URL ERROR" ## print e.reason ## print e.reason[0] ## code ## print e.reason[1] ## beschreibung self.send_to_output(pItem,2, "URL-Fehler bei der API-Abfrage method: " + method + " " + str(e.reason[0]) + " " + e.reason[1]) self.log(pItem,"URL-Fehler bei der API-Abfrage method: " + method + " " + str(e.reason[0]) + " " + e.reason[1],severity='error') return "", e.reason[0] except: self.log(pItem,"Verbindungsfehler bei der API-Abfrage",severity='error') return "", 999 ## Profil Bausteine registrieren sich mit ihrer ID def registerProfil(self,pItem,EN): _data = EN[1] if _data.startswith("***DIRECTCONNECT***"): data = _data.split("#") bausteinID = data[1] logikID = data[2] name = data[4] deviceType= data[5] if pItem.error == 0 and pItem.abfrageAktiv == 1: activ = 1 else: activ = 0 werte_zum_uebergeben = (pItem.id_token, activ) ## nur wenn wir den Devicetype auch kennen if deviceType in pItem.known_devicetypes: if deviceType not in pItem.registered_device['data']: pItem.registered_device['data'][deviceType] = {} if name not in pItem.registered_device['data'][deviceType]: pItem.registered_device['data'][deviceType][name] = {} pItem.registered_device['data'][deviceType][name] = {'BausiteinID':bausteinID,'logikID':logikID,'Hash':''} ## String mit registrieren Profil Namen zusammensetzen if deviceType not in pItem.registered_deviceName: pItem.registered_deviceName[deviceType] = {} if len(pItem.registered_deviceName[deviceType]) >0: pItem.registered_deviceName[deviceType] = str(pItem.registered_deviceName[deviceType]) + ", " + name else: pItem.registered_deviceName[deviceType] = name self.debug_write(pItem,deviceType + " Clients angemeldet", pItem.registered_deviceName[deviceType]) ## wenn wir schon einen token haben if pItem.id_token != "": ## wenn richtiger deviceType ## Dann senden wir dem Client mal seinen Token wenn schon ein Token da ist self.send_to_geraetebaustein(pItem,"directconnect_get_data", pItem.registered_device['data'][deviceType][name]['logikID'], werte_zum_uebergeben) ## den hier mit 2 verschachtelten for i in anhandeln ## Token an Geraetebausteine senden def sendTokenToDevice(self,pItem): ## wenn token vorhanden if pItem.id_token != "": try: ## falls client noch nicht ganz angemeldet if pItem.error == 0 and pItem.abfrageAktiv == 1: activ = 1 else: activ = 0 werte_zum_uebergeben = (pItem.id_token, activ) for j in range(len(pItem.known_devicetypes)): if pItem.known_devicetypes[j] in pItem.registered_device['data']: for i in pItem.registered_device['data'][pItem.known_devicetypes[j]]: self.send_to_geraetebaustein(pItem,"directconnect_get_data", pItem.registered_device['data'][pItem.known_devicetypes[j]][i]['logikID'], werte_zum_uebergeben) except: self.send_to_output(pItem,2, "Except in sendTokenToDevice") self.log(pItem,"Except in sendTokenToDevice",severity='error') ## Activ an alle Geraetebausteine senden def sendActivToDevice(self,pItem): if pItem.error == 0 and pItem.abfrageAktiv == 1: activ = 1 else: activ = 0 for j in pItem.registered_device['data'] : for i in pItem.registered_device['data'][j]: self.send_to_geraetebaustein(pItem,"directconnect_abfrageaktiv", pItem.registered_device['data'][j][i]['logikID'], activ) def debug_write(self,pItem,caption,msg): import hashlib _uniqueid = '13554_Netatmo_OAUTH2_1.55' _title = '13554_Netatmo_OAUTH2' _captionid = hashlib.md5(caption).hexdigest() ## suche nach vorhandenem Eintrag in der Debugseite _grp = filter(lambda x: x[0]==_uniqueid,pItem.MC.Debug.Daten) ## wenn noch kein Debugseiten Eintrag erstellen if not _grp: pItem.MC.Debug.addGruppe( [_uniqueid , _title], [ ["0VERSIONINFO", "Version", 1,'V1.55 - (2020-04-07 15:42)'], [ _captionid , caption, 1, msg] , ] ) ## wenn schon vorhanden aktualisieren else: _grp_entry = _grp[0][2] _tok = filter(lambda x,y=_captionid: x[0]==y, _grp_entry) ## Unterschlssel vorhanden if _tok: _tok[0][1],_tok[0][3] = caption, msg ## Unterschlssel erstellen else: _grp_entry.append( [ _captionid , caption, 1, msg ] ) def log(self,pItem,msg,severity='info'): import random import time from hashlib import md5 as _md5 _msg_uid = _md5( "%s%s%s" % ( pItem.ID, random.random(), time.time() ) ).hexdigest() _msg = '<log><id>%s</id><facility>Netatmo_OAUTH2</facility><severity>%s</severity><message>%s</message></log>' % (_msg_uid,severity,msg) self.send_to_output(pItem,3,_msg) def send_to_output(self,pItem,out,value): import time out -= 1 ## Intern starten die Ausgnge bei 0 und nicht bei 1 if pItem.LogikItem.Ausgang[out][2] == 2 and pItem.OutWert[out] == value: ##sbc return ## Sendeintervall wird beachtet if pItem.SendIntervall == 0 or time.time() >= pItem.Ausgang[out][0]: ## Wert an allen iKOs an den Ausgngen setzen for iko in pItem.Ausgang[out][1]: pItem.MC.TagList.setWert(FLAG_EIB_LOGIK, iko, value) if value: for cmd in pItem.Ausgang[out][2]: cmd.execBefehl() ## Direkte Verbindungen und Connectoren for con in pItem.Ausgang[out][3]: pItem.MC.LogikList.ConnectList.append(con + [value]) ## Wenn Sendeintervall gesetzt, nchste mgliche Ausfhrungszeit setzen if pItem.SendIntervall > 0: pItem.Ausgang[out][0] = time.time() + pItem.SendIntervall ## Ausgangswert auch in der Logik setzen pItem.OutWert[out] = value ## Das ist die Class und muss hier immer rein anstelle von frher SN[1] Netatmo_OAUTH213554(pItem)
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar