Skip to content

Commit

Permalink
Merge pull request #33 from jumping2000/beta
Browse files Browse the repository at this point in the history
New version August 2021
  • Loading branch information
jumping2000 authored Aug 28, 2021
2 parents a3bf505 + 2689851 commit e80b3cb
Show file tree
Hide file tree
Showing 7 changed files with 276 additions and 66 deletions.
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
# Changelog

## [2.2.0] - 28-08-2021

### Breacking Changes
- New parameter "image"; old parameters "url" and "file" don't work anymore

### Improvments
- Improvments in management of companion app messages: it's possible to send images, TTS messages and more

### Added
- Added management of Email, Pushover and Pushbullet messages
- Initial support of Discord messages
- Google Home: added resume stream function after TTS (experimental)
- Messages to multiple notification services

## [2.1.0] - 17-11-2020

### Breacking Changes
- Nothing

### Improvments
- Various fixes

### Added
- New TTS added: Reverso TTS e Goggle Cloud

## [2.0.0] - 30-10-2020

### Breacking Changes
Expand Down
4 changes: 2 additions & 2 deletions apps/notifier/alexa_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ def speak(self, alexa):
self.lg(f"REMOVE [NONE] VALUE: {type(alexa)} value {alexa}")
default_restore_volume = float(self.get_state(self.args.get("default_restore_volume"))) / 100
volume = float(alexa.get("volume", default_restore_volume))
message = str(alexa.get("message", alexa.get("message_tts")))
message = str(alexa.get("message", alexa.get("message_tts", "")))
alexa_player = self.player_get(alexa.get("media_player", self.get_state(self.alexa_sensor_media_player)))
alexa_type = (
str(alexa.get("type", self.get_state(self.alexa_type))).lower().replace("dropin", "dropin_notification")
Expand Down Expand Up @@ -408,7 +408,7 @@ def find_speechcon(self, value):

def player_get(self, user_player):
media_player = []
user_player = self.converti(str(user_player.lower()))
user_player = user_player if isinstance(user_player, list) else self.converti(str(user_player.lower()))
for mpu in user_player: # MediaPlayerUser
if "test" in mpu:
media_player.extend(self.player_alexa)
Expand Down
59 changes: 52 additions & 7 deletions apps/notifier/gh_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
class GH_Manager(hass.Hass):

def initialize(self)->None:
#self.gh_wait_time = globals.get_arg(self.args, "gh_wait_time")
self.gh_wait_time = self.args["gh_wait_time"]
self.gh_select_media_player = self.args["gh_select_media_player"]

self.queue = Queue(maxsize=0)
self._when_tts_done_callback_queue = Queue()
t = Thread(target=self.worker)
Expand All @@ -44,6 +46,7 @@ def check_volume(self, gh_volume):
gh = []
for entity, state in media_state.items():
friendly_name = state["attributes"].get("friendly_name")

for item in gh_volume:
if "gruppo" not in str(item).lower() and item == friendly_name:
gh.append(entity)
Expand All @@ -60,6 +63,19 @@ def volume_get(self, media_player:list, volume: float):
self.dict_volumes[i] = self.get_state(i, attribute="volume_level", default=volume)
return self.dict_volumes

def mediastate_get(self, media_player:list, volume: float):
self.dict_info_mplayer = {}
for i in media_player:
self.dict_info_mplayer[i] = {}
for i in media_player:
#self.dict_info_mplayer[i]['volume'] = self.get_state(i, attribute="volume_level", default=volume)
self.dict_info_mplayer[i]['state'] = self.get_state(i, default='idle')
self.dict_info_mplayer[i]['media_id'] = self.get_state(i, attribute="media_content_id", default='')
self.dict_info_mplayer[i]['media_type'] = self.get_state(i, attribute="media_content_type", default='')
self.dict_info_mplayer[i]['app_name'] = self.get_state(i, attribute="app_name", default='')
self.dict_info_mplayer[i]['authSig'] = self.get_state(i, attribute="authSig", default='')
return self.dict_info_mplayer

def replace_regular(self, text: str, substitutions: list):
for old,new in substitutions:
text = re.sub(old, new, str(text).strip())
Expand All @@ -72,7 +88,10 @@ def speak(self, google, gh_mode: bool, gh_notifier: str):
"""Speak the provided text through the media player"""
gh_player = self.check_mplayer(self.split_device_list(google["media_player"]))
gh_volume = self.check_volume(self.get_state(self.gh_select_media_player, attribute="options"))
#self.log("gh_player {}:".format(gh_player))
self.volume_get(gh_volume,float(self.get_state(self.args["gh_restore_volume"]))/100)
self.mediastate_get(gh_volume,float(self.get_state(self.args["gh_restore_volume"]))/100)
#float(self.get_state(globals.get_arg(self.args, "gh_restore_volume")))/100
wait_time = float(self.get_state(self.gh_wait_time))
message = self.replace_regular(google["message_tts"], SUB_TTS)
### set volume
Expand All @@ -97,6 +116,7 @@ def worker(self):
while True:
try:
data = self.queue.get()
duration = 0
gh_player = self.check_mplayer(self.split_device_list(data["gh_player"]))
### SPEAK
if data["gh_mode"].lower() == 'google assistant':
Expand All @@ -107,15 +127,13 @@ def worker(self):
else:
entity = gh_player
self.call_service(__TTS__ + data["gh_notifier"], entity_id = entity, message = data["text"])#, language = data["language"])
if type(entity) is list:
if (type(entity) is list) or entity == "all" or \
(self.get_state(entity, attribute='media_duration') is None) or \
float(self.get_state(entity, attribute='media_duration')) > 60 or \
float(self.get_state(entity, attribute='media_duration')) == -1:
duration = float(len(data["text"].split())) / 3 + data["wait_time"]
else:
if entity == "all":
duration = float(len(data["text"].split())) / 3 + data["wait_time"]
elif self.get_state(entity, attribute='media_duration') is None:
duration = float(len(data["text"].split())) / 3 + data["wait_time"]
else:
duration = self.get_state(entity, attribute='media_duration')
duration = float(self.get_state(entity, attribute='media_duration')) + data["wait_time"]
#Sleep and wait for the tts to finish
time.sleep(duration)
except Exception as ex:
Expand All @@ -125,12 +143,39 @@ def worker(self):
self.queue.task_done()

if self.queue.qsize() == 0:
#self.log("QSIZE = 0 - Worker thread exiting")
## RESTORE VOLUME
if self.dict_volumes:
for i,j in self.dict_volumes.items():
self.call_service("media_player/volume_set", entity_id = i, volume_level = j)
# Force Set state
self.set_state(i, state="", attributes = {"volume_level": j})
## RESTORE MUSIC
if self.dict_info_mplayer:
for k,v in self.dict_info_mplayer.items():
temp_media_id = ''
temp_media_type = ''
temp_app_name = ''
temp_auth_sig = ''
playing = False
for k1,v1 in v.items():
if v1 == 'playing':
playing = True
if k1 == 'media_id':
temp_media_id = v1
if k1 == 'media_type':
temp_media_type = v1
if k1 == 'app_name':
temp_app_name = v1
if k1 == 'authSig':
temp_auth_sig = v1
self.log("Costruzione del servizio: {} - {} - {} - {} - {}".format(k, temp_media_id, temp_media_type, temp_app_name,temp_auth_sig ))
if playing and (temp_auth_sig !=''):
self.call_service("media_player/play_media", entity_id = k, media_content_id = temp_media_id, media_content_type = temp_media_type, authSig = temp_auth_sig)
elif playing and temp_app_name =='Spotify':
self.call_service("spotcast/start", entity_id = k)
elif playing:
self.call_service("media_player/play_media", entity_id = k, media_content_id = temp_media_id, media_content_type = temp_media_type)
# It is empty, make callbacks
try:
while(self._when_tts_done_callback_queue.qsize() > 0):
Expand Down
Loading

0 comments on commit e80b3cb

Please sign in to comment.