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') }}"



, daher habe ich heute nochmal recherchiert und im Symcon-Forum den Hinweis gelesen, dass das "Problem mit den nicht funktionierenden Hostabfragen" wohl bei der 7390 nur bei einer Hostanzahl > 16 auftritt.
.
Kommentar