Hallo zusammen,
klasse Plugin. Mir fehlte die Funktion zum Telefonbuch-lookup, die ich dann so realisiert habe:
Die get_sid Methode muss eine ablaufende SID haben, damit nicht immer eine veraltete Sid zurückkommt. Die SID ist 10min gültig, danach muss man eine neue bekommen.
Wenn nun jemand anruft, wird die Anrufernummer oder der Name auf den Displays im Haus angezeigt...
klasse Plugin. Mir fehlte die Funktion zum Telefonbuch-lookup, die ich dann so realisiert habe:
Code:
def phonebook_lookup(self, callerId): content = self.fetch_url("https://{}:49443/phonebook.lua?sid={}&pbid={}".format(self._fritzbox, self._get_sid(),0)) if content: entries = [] tree = xml.etree.cElementTree.fromstring(content.decode()) lookupXpath = ".//*[number='{}']/../person/realName".format(callerId) foundElement = tree.find(lookupXpath) logger.debug("phonebook_lookup, found: {}".format(foundElement)) if foundElement is None: logger.info("phonebook_lookup, {} not found".format(callerId)) return callerId else: return foundElement.text else: logger.warning("no phonebook found with id 0") return
Code:
def _get_sid(self): if self._sid_time: if self._sid_time < (datetime.datetime.now() - datetime.timedelta(seconds = 550)): self._sid = False else: self._sid = False if self._sid: return self._sid content = self.fetch_url("http://{}/login_sid.lua".format(self._fritzbox)) if content: tree = xml.etree.cElementTree.fromstring(content.decode()) challenge = tree.find('.//Challenge').text response = hashlib.md5("{}-{}".format(challenge, self._password).encode('utf-16le')).hexdigest() url = "http://{}/login_sid.lua?username={}&response={}-{}".format(self._fritzbox, self._username, challenge, response) content = self.fetch_url(url) tree = xml.etree.cElementTree.fromstring(content.decode()) sid = tree.find('.//SID').text if sid != '0000000000000000': self._sid = sid self._sid_time = datetime.datetime.now() return sid
Code:
#callmonitor.py logger.info("CallMonitor: '{0}' = by '{1}' source: '{2}' value: '{3}'"\ .format(logic.name, trigger['by'], trigger['source'],trigger['value'])) if trigger['by'] == 'FritzBox': if trigger['value'][1] == 'RING': sh.return_item("meinhaus.fritzbox.call_incoming")(1, logic.name) msg = trigger['source'] sh.return_item("meinhaus.fritzbox.last_caller")(msg, logic.name) pbLookupTime = sh.now() + datetime.timedelta(milliseconds=50) sh.trigger('pblookup', dt=pbLookupTime) else: sh.return_item("meinhaus.fritzbox.call_incoming")(0, logic.name) callComing = sh.return_item("meinhaus.fritzbox.call_incoming") if callComing: callerId = sh.return_item("meinhaus.fritzbox.last_caller")() for item in sh.match_items('*.meldung'): sh.return_item(item.id())(callerId, logic.name) nextTime = sh.now() + datetime.timedelta(seconds=1) sh.trigger(logic.name, dt=nextTime)
Code:
#pblookup.py logger.info("pblookup: '{0}' = by '{1}' source: '{2}' value: '{3}'"\ .format(logic.name, trigger['by'], trigger['source'],trigger['value'])) callerId = sh.return_item("meinhaus.fritzbox.last_caller")() callerName = sh.fritzbox.phonebook_lookup(callerId) logger.info("pblookup: '{0}' => '{1}'"\ .format(callerId, callerName)) if callerName: sh.return_item("meinhaus.fritzbox.last_caller")("T:{}".format(callerName), logic.name)
Code:
#items.conf [meinhaus] [[fritzbox]] [[[call_incoming]]] type = bool name = Incoming Call sv_widget = "{{ basic.value('item'~'value', 'item') }}" [[[last_caller]]] type = str name = last caller sv_widget = "{{ basic.value('item'~'value', 'item') }}"
Kommentar