1 Commits

5 changed files with 53 additions and 49 deletions

6
.env.sample Normal file
View File

@@ -0,0 +1,6 @@
FRITZ_USERNAME="fritzab2matrix"
FRITZ_PASSWORD="S0meSecretPa5sw02d"
FRITZ_IP="192.168.178.1"
FRITZ_TMP="/tmp"
FRITZ_VOICEBOX_PATH="fritz.nas/FRITZ/voicebox"
FRITZ_TAM='{"0" : "!roomhash1:matrix.org", "1" : "!roomhash2:matrix.org"}'

View File

@@ -6,7 +6,7 @@ from pydub import AudioSegment
from libs.monitoring import endedCall from libs.monitoring import endedCall
from libs.message import conversion as conv from libs.message import conversion as conv
import urllib.request import urllib.request
import xmltodict import xmltodict, json
import sys, os import sys, os
import smbclient import smbclient
@@ -18,17 +18,40 @@ env_user = os.environ.get('FRITZ_USERNAME')
env_pass = os.environ.get('FRITZ_PASSWORD') env_pass = os.environ.get('FRITZ_PASSWORD')
env_ip = os.environ.get('FRITZ_IP') env_ip = os.environ.get('FRITZ_IP')
env_voicebox = os.environ.get('FRITZ_VOICEBOX_PATH') env_voicebox = os.environ.get('FRITZ_VOICEBOX_PATH')
env_tam = json.loads(os.environ.get('FRITZ_TAM'))
env_tmp = os.environ.get('TEMP_DIR') env_tmp = os.environ.get('TEMP_DIR')
if env_voicebox is None: if env_voicebox is None:
env_voicebox = "/fritz.nas/FRITZ/voicebox/" env_voicebox = "/fritz.nas/FRITZ/voicebox/"
if env_tam is None:
env_tam = {
"0" : "!MxRrNGhFuQwnIeEWnX:ismus.net"
}
print(env_tam)
if env_tmp is None: if env_tmp is None:
env_tmp = "/tmp" env_tmp = "/tmp"
def fritzab2matrix(tam):
###
### CHECK AND GET MESSAGES FROM FRITZBOX ###
############################################
## Connect to the FritzBox in the LAN
# We don't use tls because the self-signed cert of the box leads to a malfunction in urllib later on.
fc = FritzConnection(address=env_ip, user=env_user, password=env_pass, use_tls=False)
## Get info about messages from the main answering machine
message_list = fc.call_action("X_AVM-DE_TAM1", "GetMessageList", NewIndex=tam)
message_list_url = message_list['NewURL']
# Build the url to download the message via smb # Build the url to download the message via smb
def build_download_url(mid, tam=0): def build_download_url(mid, tam=tam):
recording = "rec." + str(tam) + r"." + str(mid).zfill(3) recording = "rec." + str(tam) + r"." + str(mid).zfill(3)
url = os.path.join("//",env_ip,env_voicebox,"rec",recording) url = os.path.join("//",env_ip,env_voicebox,"rec",recording)
return url return url
@@ -47,25 +70,6 @@ def get_message_list(url):
messages = xmltodict.parse(doc) messages = xmltodict.parse(doc)
return messages return messages
def fritzab2matrix():
### CHECK AND GET MESSAGES FROM FRITZBOX ###
############################################
## Connect to the FritzBox in the LAN
# We don't use tls because the self-signed cert of the box leads to a malfunction in urllib later on.
fc = FritzConnection(address=env_ip, user=env_user, password=env_pass, use_tls=False)
## Get info about messages from the main answering machine
message_list = fc.call_action("X_AVM-DE_TAM1", "GetMessageList", NewIndex=0)
message_list_url = message_list['NewURL']
l = get_message_list(message_list_url) l = get_message_list(message_list_url)
if l['Root'] == None or l['Root']['Message'] == None: if l['Root'] == None or l['Root']['Message'] == None:
return False return False
@@ -94,17 +98,17 @@ def fritzab2matrix():
# Download and convert the speex files to wav # Download and convert the speex files to wav
smb_url = build_download_url(a['Index']) smb_url = build_download_url(a['Index'])
speex_fd = download_speex_file(smb_url) speex_fd = download_speex_file(smb_url)
conv.speex_convert(speex_fd, os.path.join(env_tmp,"message.wav")) conv.speex_convert(speex_fd, os.path.join(env_tmp,"message{}.wav".format(tam)))
# Convert wav to ogg # Convert wav to ogg
msg = AudioSegment.from_wav(os.path.join(env_tmp,"message.wav")) msg = AudioSegment.from_wav(os.path.join(env_tmp,"message{}.wav".format(tam)))
# Only if message is longer than 5 seconds ... # Only if message is longer than 5 seconds ...
if msg.duration_seconds > 5.0: if msg.duration_seconds > 5.0:
# ... export to ogg ... # ... export to ogg ...
msg.export(os.path.join(env_tmp,"message.ogg"), format="ogg", tags=msg_tags) msg.export(os.path.join(env_tmp,"message{}.ogg".format(tam)), format="ogg", tags=msg_tags)
# ... and send message and file to Matrix Room # ... and send message and file to Matrix Room
command = "python3 matrix-commander.py -a " + os.path.join(env_tmp,"message.ogg") + " -m '{}'".format(msg_info) command = "python3 matrix-commander.py --room {} -a ".format(env_tam[tam]) + os.path.join(env_tmp,"message{}.ogg".format(tam)) + " -m '{}'".format(msg_info)
os.system(command) os.system(command)
else: else:
@@ -115,7 +119,7 @@ def fritzab2matrix():
print("** " + msg_info) print("** " + msg_info)
# Mark processed messages as 'read' # Mark processed messages as 'read'
fc.call_action("X_AVM-DE_TAM1", "MarkMessage", NewIndex=0, NewMessageIndex=int(a['Index']), NewMarkedAsRead=1) fc.call_action("X_AVM-DE_TAM1", "MarkMessage", NewIndex=tam, NewMessageIndex=int(a['Index']), NewMarkedAsRead=1)
else: else:
# Show that message is already read # Show that message is already read
@@ -123,20 +127,24 @@ def fritzab2matrix():
# ## For testing purposes only # ## For testing purposes only
# if a['Date'].endswith('20:53'): # if a['Date'].endswith('20:53'):
# fc.call_action("X_AVM-DE_TAM1", "MarkMessage", NewIndex=0, NewMessageIndex=int(a['Index']), NewMarkedAsRead=0) # fc.call_action("X_AVM-DE_TAM1", "MarkMessage", NewIndex=1, NewMessageIndex=int(a['Index']), NewMarkedAsRead=0)
continue continue
continue continue
def multitam(tams):
for tam in tams.keys():
print("Check TAM {}.".format(tam))
fritzab2matrix(tam)
if __name__ == "__main__": if __name__ == "__main__":
fritzab2matrix()
multitam(env_tam)
### Monitor the FritzBox and trigger the main script whenever a call disconnects ### ### Monitor the FritzBox and trigger the main script whenever a call disconnects ###
################################################################################### ###################################################################################
endedCall(fritzab2matrix, env_ip) endedCall(multitam,env_tam, env_ip)

View File

@@ -4,7 +4,7 @@ from fritzconnection.core.fritzmonitor import FritzMonitor
### Monitor the calls of a fritzbox continously ### ### Monitor the calls of a fritzbox continously ###
################################################### ###################################################
def watch_disconnect(monitor, event_queue, func, healthcheck_interval=10): def watch_disconnect(monitor, event_queue, func, tams, healthcheck_interval=10):
while True: while True:
try: try:
event = event_queue.get(timeout=healthcheck_interval) event = event_queue.get(timeout=healthcheck_interval)
@@ -17,11 +17,11 @@ def watch_disconnect(monitor, event_queue, func, healthcheck_interval=10):
print(event) print(event)
if 'DISCONNECT' in event: if 'DISCONNECT' in event:
print("Anruf beendet. Jetzt den AB checken.\n") print("Anruf beendet. Jetzt den AB checken.\n")
func() func(tams)
def endedCall(func, fritz_ip='192.168.1.1'): def endedCall(func, tams, fritz_ip='192.168.1.1'):
""" """
Call this to trigger a given function if a call is disconnected Call this to trigger a given function if a call is disconnected
""" """
@@ -29,7 +29,7 @@ def endedCall(func, fritz_ip='192.168.1.1'):
# as a context manager FritzMonitor will shut down the monitor thread # as a context manager FritzMonitor will shut down the monitor thread
with FritzMonitor(address=fritz_ip) as monitor: with FritzMonitor(address=fritz_ip) as monitor:
event_queue = monitor.start() event_queue = monitor.start()
watch_disconnect(monitor, event_queue, func) watch_disconnect(monitor, event_queue, func, tams)
except (OSError, KeyboardInterrupt) as err: except (OSError, KeyboardInterrupt) as err:
print(err) print(err)

View File

@@ -1,5 +0,0 @@
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import fritzab2matrix

View File

@@ -1,5 +0,0 @@
from context import fritzab2matrix as fab2m