Compare commits

...

18 Commits

Author SHA1 Message Date
Homer S. f537edc4cb Script failed when Callers Number was empty i.e. NoneType. Put a['Number'] into str() fixed this. 2021-10-08 09:22:15 +02:00
Homer S. 63a3dee8fd Raised sleep to 10 because 5secs didn't suffice obviously. 2021-07-22 18:20:38 +02:00
Homer S. 558ed192d9 Merge branch 'master' of https://git.ismus.net/homer77/FritzAB2Matrix 2021-07-22 09:32:58 +02:00
Homer S. 2b65daff7f Fixed issue #8 by adding a 5sec delay with time.sleep(5) to multitam(). Request for messages was too fast so that the new message wasn't in it yet. 2021-07-22 09:31:59 +02:00
Homer S. 114e9c3e49 Conditional clauses: Only start script on incoming calls. 2021-07-16 21:41:49 +02:00
Homer S. 3a32e64719 Merge branch 'master' into everycall 2021-07-16 20:54:48 +02:00
Homer S. 97eb34814f Some more fixes on docker build related files. 2021-07-14 21:44:11 +02:00
Homer S. 60adf393ef Further corrections on docker build related files. 2021-07-14 21:08:24 +02:00
Homer S. d91095dcf8 olm-dev was missing in the Dockerfile to build cryptography of matrix-commander. 2021-07-14 20:30:06 +02:00
Homer S. 1949f9f84a Corrected the python-magic item (typo). Also if one doesn't upgrade the requirements matrix-nio won't work. 2021-07-14 19:29:28 +02:00
Homer S. b7fdd6e0e6 Added some condtions to prevent script from breaking if list of missed calls is empty. 2021-07-14 19:27:39 +02:00
Homer S. 6652def351 Merge branch 'docker' 2021-07-11 16:29:12 +02:00
Homer S. 31cd42b43c Merge branch 'everycall' of https://git.ismus.net/homer77/FritzAB2Matrix into everycall 2021-07-10 23:06:33 +02:00
Homer S. 01f450fca9 Some dependencies were missing to successfully build the docker image. 2021-07-10 23:00:39 +02:00
Homer S. dbc54f595e Updated README regarding missed call feature. 2021-07-10 18:52:01 +02:00
Homer S. 22af5f80eb Get branch to state of master. 2021-07-10 18:42:18 +02:00
Homer S. b2ac69d49f Added option to also notify about missed calls. 2021-07-10 13:40:19 +02:00
Homer S. 78829aadcb added a variable if there were new messages or not 2021-07-10 00:31:20 +02:00
6 changed files with 79 additions and 23 deletions

View File

@ -4,3 +4,4 @@ FRITZ_IP="192.168.178.1"
FRITZ_TMP="/tmp" FRITZ_TMP="/tmp"
FRITZ_VOICEBOX_PATH="fritz.nas/FRITZ/voicebox" FRITZ_VOICEBOX_PATH="fritz.nas/FRITZ/voicebox"
FRITZ_TAM='{"0" : "!roomhash1:matrix.org", "1" : "!roomhash2:matrix.org"}' FRITZ_TAM='{"0" : "!roomhash1:matrix.org", "1" : "!roomhash2:matrix.org"}'
FRITZ_CALL_WATCH=False

View File

@ -5,6 +5,7 @@ __FritzAB2Matrix__ reads out the answering machine (_TAM_) of a _Fritz!Box_ in y
Uses the python based cmd-line-tool [matrix-commander](https://github.com/8go/matrix-commander) so the matrix-commander.py in this repo is just a copy of that file to ease testing. Uses the python based cmd-line-tool [matrix-commander](https://github.com/8go/matrix-commander) so the matrix-commander.py in this repo is just a copy of that file to ease testing.
## Features ## Features
* Since _v0.1.1_ __Multitam__ is integrated so that you can check multiple answering machines __and__ post the messages to different matrix rooms. (Use _FRITZ\_TAM_ variable in .env file) * Since _v0.1.1_ __Multitam__ is integrated so that you can check multiple answering machines __and__ post the messages to different matrix rooms. (Use _FRITZ\_TAM_ variable in .env file)
* Set _FRITZ\_CALL\_WATCH_=True if you want to receive a message everytime you miss a call.
## Installation ## Installation
If you like to test this repository you are recommended to use one of the following two options. If you like to test this repository you are recommended to use one of the following two options.
### Necessary preparations for both cases ### Necessary preparations for both cases
@ -30,6 +31,7 @@ FRITZ_IP="192.168.178.1"
FRITZ_TMP="/tmp" FRITZ_TMP="/tmp"
# FRITZ_VOICEBOX_PATH="fritz.nas/FRITZ/voicebox" # FRITZ_VOICEBOX_PATH="fritz.nas/FRITZ/voicebox"
FRITZ_TAM='{"0" : "!roomhash1:matrix.org", "1" : "!roomhash2:matrix.org"}' FRITZ_TAM='{"0" : "!roomhash1:matrix.org", "1" : "!roomhash2:matrix.org"}'
FRITZ_CALL_WATCH=False
``` ```
__.env__ __.env__

View File

@ -16,13 +16,15 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone;
cargo \ cargo \
libffi-dev \ libffi-dev \
openssl-dev \ openssl-dev \
olm-dev \
zlib-dev \ zlib-dev \
jpeg-dev ; \ jpeg-dev ; \
apk add --no-cache ffmpeg speex; \ apk add --no-cache olm libmagic ffmpeg speex; \
pip install --no-cache-dir upgrade pip; \ pip install pip -U --no-cache-dir; \
pip install --no-cache-dir -r requirements.txt ; \ pip install --no-cache-dir -r requirements.txt ; \
apk del --no-cache .build-deps; apk del --no-cache .build-deps;
ENTRYPOINT ["python3", "-u", "fritzab2matrix.py "] # ENTRYPOINT ["python3", "-u", "fritzab2matrix.py"]
ENTRYPOINT /bin/sh -c "export UNBUFFERED=1 && python3 -u ./fritzab2matrix.py"

View File

@ -1,13 +1,14 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from fritzconnection import FritzConnection from fritzconnection import FritzConnection
from fritzconnection.lib.fritzcall import FritzCall, Call
from dotenv import load_dotenv from dotenv import load_dotenv
from pydub import AudioSegment 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, json import xmltodict, json
import sys, os import sys, os, time
import smbclient import smbclient
@ -19,8 +20,15 @@ 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_tam = json.loads(os.environ.get('FRITZ_TAM'))
env_call_watch = eval(os.environ.get('FRITZ_CALL_WATCH'))
env_tmp = os.environ.get('TEMP_DIR') env_tmp = os.environ.get('TEMP_DIR')
if env_call_watch is None:
env_call_watch = False
elif env_call_watch:
at_least_one_new_message = False
if env_voicebox is None: if env_voicebox is None:
env_voicebox = "/fritz.nas/FRITZ/voicebox/" env_voicebox = "/fritz.nas/FRITZ/voicebox/"
@ -28,12 +36,13 @@ if env_tam is None:
env_tam = { env_tam = {
"0" : "!MxRrNGhFuQwnIeEWnX:ismus.net" "0" : "!MxRrNGhFuQwnIeEWnX:ismus.net"
} }
print(env_tam) #print(env_tam)
if env_tmp is None: if env_tmp is None:
env_tmp = "/tmp" env_tmp = "/tmp"
# 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=0):
recording = "rec." + str(tam) + r"." + str(mid).zfill(3) recording = "rec." + str(tam) + r"." + str(mid).zfill(3)
@ -54,16 +63,47 @@ def get_message_list(url):
messages = xmltodict.parse(doc) messages = xmltodict.parse(doc)
return messages return messages
def get_last_call():
""" Get the last Call. """
try:
fc = FritzCall(address=env_ip,password=env_pass)
except:
print("Couldn't connect to Box")
missed_calls = fc.get_missed_calls(False,1,1)
if len(missed_calls) > 0:
return missed_calls[0]
else:
return False
def lastcall2matrix(tam,tam_no):
# Call Watch to Matrix
if env_call_watch and not at_least_one_new_message:
c = get_last_call()
if c:
c_msg = "{} - {} ({})".format(c.Date, c.Caller, c.Name)
else:
return False
# ... and send message and file to Matrix Room
## if Number of a TAM and the last call match
if tam_no == c.CalledNumber:
cmd = "python3 matrix-commander.py --room {} -m '{}'".format(env_tam[tam],c_msg)
os.system(cmd)
else:
print("Call Watch is off.")
def fritzab2matrix(tam): def fritzab2matrix(tam):
### CHECK AND GET MESSAGES FROM FRITZBOX ### ### CHECK AND GET MESSAGES FROM FRITZBOX ###
############################################ ############################################
## Connect to the FritzBox in the LAN ## 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. # 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) fc = FritzConnection(address=env_ip, user=env_user, password=env_pass, use_tls=False)
at_least_one_new_message = False
## Get info about messages from the main answering machine ## Get info about messages from the main answering machine
@ -84,7 +124,7 @@ def fritzab2matrix(tam):
for a in messages: for a in messages:
# format the information regarding the message # format the information regarding the message
msg_info = a['Date'] + " - " + a['Number'] msg_info = a['Date'] + " - " + str(a['Number'])
if a['Name']: if a['Name']:
msg_info += " (" + a['Name'] + ") " msg_info += " (" + a['Name'] + ") "
@ -95,7 +135,7 @@ def fritzab2matrix(tam):
message_new = bool(int(a['New'])) message_new = bool(int(a['New']))
if message_new == True: if message_new == True:
at_least_one_new_message = True
# 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)
@ -126,19 +166,20 @@ def fritzab2matrix(tam):
# Show that message is already read # Show that message is already read
print("__ " + msg_info) print("__ " + msg_info)
# ## For testing purposes only tam_no = a['Called']
# if a['Date'].endswith('20:53'): lastcall2matrix(tam,tam_no)
# fc.call_action("X_AVM-DE_TAM1", "MarkMessage", NewIndex=1, NewMessageIndex=int(a['Index']), NewMarkedAsRead=0)
continue
continue
def multitam(tams): def multitam(tams):
time.sleep(10)
for tam in tams.keys(): for tam in tams.keys():
print("Check TAM {}.".format(tam)) print("Check TAM {}.".format(tam))
fritzab2matrix(tam) fritzab2matrix(tam)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -15,10 +15,17 @@ def watch_disconnect(monitor, event_queue, func, tams, healthcheck_interval=10):
else: else:
# do event processing here: # do event processing here:
print(event) print(event)
if 'DISCONNECT' in event: if 'DISCONNECT;0' in event:
print("Anruf beendet. Jetzt den AB checken.\n") print("Incoming call stopped. Check the TAM.\n")
func(tams) func(tams)
elif 'DISCONNECT;1' in event:
print("Outgoing call stopped. Do nothing.\n")
else:
print("Unknown event.\n")
def endedCall(func, tams, fritz_ip='192.168.1.1'): def endedCall(func, tams, fritz_ip='192.168.1.1'):

View File

@ -1,4 +1,4 @@
requests
fritzconnection fritzconnection
python-dotenv python-dotenv
xmltodict xmltodict
@ -8,13 +8,16 @@ pydub
# for matrix-commander # for matrix-commander
aiohttp aiohttp
aiofiles aiofiles #<0.5.0,>=0.4.0
argparse argparse
asyncio asyncio
atomicwrites
cachetools
datetime datetime
markdown markdown
matrix-nio matrix-nio[e2e]>=0.18.3
peewee
Pillow Pillow
python_magic python-magic
uuid uuid