Главная » Автоматика в быту
Призовой фонд
на октябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Голосовое оповещение для дома. Будильник в системе ROS

В этих статьях - 1, 2, 3, 4 я рассматривал голосовое управление приборами X10 через ROS. Системой понемногу пользуюсь (иногда приходится забирать нетбук), привыкаю, немного изменяю. Теперь возникла необходимость добавить к данной системе будильник с голосовым оповещением. Также использую систему ROS, добавив в проект необходимые узлы.

Задача ставилась следующая - для каждой записи будильника установить:

  1.  время срабатывания
  2.  количество повторений срабатывания и интервал
  3.  дни недели для данного будильника
  4.  действия по срабатыванию будильника, пока такие:
  •    голосовое оповещение
  •    запуск короткого музыкального файла (рингтона)
  •    отправка команд для управления приборами x10

Скрипт node_x10_alarm_pub.py создает узел node_x10_alarm_events, который будет ожидать время срабатывания (либо повторного оповещения) будильников. Список будильников находится в двумерном массиве alarm_events

Для каждой записи, например

["06:20",3,5,[0,1,2,3,4],{1:"rington6.mp3;17",2:"Подъём  пора на работу, вставай Виктор Александрович ",4:"12"}],

06:20 - время срабатывания

3 - количество повторений

5 мин - интервал между повторениями

дни недели (0-4 - понедельник - пятница)

действия

1 - публикация в тему x10_alarm_mediaplayer (имя звукового файла) для запуска медиапроигрывателя
2 - публикация в тему x10_alarm_festival голосовое сообщение (запуск программы festival)
3 - получение текущего времени и  публикация в тему x10_alarm_festival для голосового сообщения  (запуск программы festival)
4 - публикация в тему x10_voicetotext посылка команды для приборов x10 в тему 

Перед голосовым оповещением о текущем времени, время переводится в строковое сообщение а затем строка отправляется в тему x10_alarm_festival.

Запуск узла  node_x10_alarm_pub.py

rosrun vp_x10_voice   node_x10_alarm_pub.py

Содержимое файла  node_x10_alarm_pub.py

#!/usr/bin/env python
#-*-coding:utf-8 -*-

# 
#  Ожидание событий будильника
#  
#  и отправка команд в темы для
#  x10, festival(голос), медиаплейер(музыка),x10 (свет x10)
#

import roslib; roslib.load_manifest('vp_x10_voice')
import rospy
import subprocess
import shlex
import time
from datetime import datetime, timedelta

from std_msgs.msg import String
from std_msgs.msg import Int16


alarm_events=[
   ["06:30",2,5,[0,1,2,3,4,5,6],{1:"rington2.mp3;23",2:"Надо прогулять Графа "}],
   ["06:15",3,3,[0,1,2,3,4,5,6],{1:"rington6.mp3;17",2:"Подъём  пора на работу, вставай Виктор Александрович "},4:"12"],
   ["9:20",500,1,[0,1,2,3,4,5,6],{1:"rington6.mp3;19",3:"Время "}],
   ["18:30",2,5,[0,1,2,3,4,5,6],{1:"rington2.mp3;23",2:"Надо прогулять Графа "}],
   ["23:00",2,5,[0,1,2,3,4,5,6],{1:"rington2.mp3;23",2:"Надо прогулять Графа "}],
   ];
name_hours=[
           [{1,21},"час"],
           [{2,3,4,22,23},"часа"],
           [{5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},"часов"],
          ]
name_minutes=[
           [{1,21,31,41,51},"минута"],
           [{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54},"минуты"],
           [{5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,26,27,28,29,30,35,36,37,38,39,40,45,46,47,48,49,50,55,56,57,58,59},"минут"],
          ]


def my_alarm():
    pub1 = rospy.Publisher('x10_alarm_mediaplayer',String)
    pub2 = rospy.Publisher('x10_alarm_festival', String)
    rospy.init_node('node_x10_alarm_events')

    d=datetime.today()        
    dh=d.hour;dm=d.minute;
    while not rospy.is_shutdown():
      d=datetime.today()
      if(d.hour!=dh or d.minute!=dm):
        for element in alarm_events:
          for dt in range(element[1]):  # кол-во повторений element[1]
            alarm_time=element[0]
            dminutes=dt*element[2]      # промежуток повторения 
            dd=timedelta(minutes=dminutes)
            d1=d-dd
            if(d.hour<10):
               this_time="0"+str(d.hour)
            else:
               this_time=str(d.hour)
            if(d.minute<10):
               this_time+=":0"+str(d.minute)
            else:
               this_time+=":"+str(d.minute)
            #this_time=str(d.hour)+":"+str(d.minute)
            cor_this_time=str(d1.hour)+":"+str(d1.minute)
            #rospy.loginfo(this_time)
            try:
              element[3].index(d.weekday()) 
              if (alarm_time==cor_this_time):
                rospy.loginfo("!!!!!!!!!!!!==="+alarm_time+"---"+this_time)
                for key in element[4]:
                   if key==1:
                     rington_file=element[4][key].split(";")[0];
                     pub1.publish(rington_file)
                     time.sleep(int(element[4][key].split(";")[1]))
                     rospy.loginfo("program 1 ")
                   elif key==2:
                     pub2.publish(element[4][key])
                     time.sleep(5)
                     rospy.loginfo("program 2 ")
                   elif key==3:
                     for ho in name_hours:
                       if d.hour in ho[0]:
                         strtime1= str(d.hour)+" "+ho[1]
                         break
                     if d.minute>0:
                       for mi in name_minutes:
                         if d.minute in mi[0]:
                            strtime2=" "+str(d.minute)+" "+mi[1]
                            break
                     strtime2=strtime2.replace("01","одна")
                     strtime2=strtime2.replace("21","двадцать одна")
                     strtime2=strtime2.replace("31","тридцать одна")
                     strtime2=strtime2.replace("41","сорок одна")
                     strtime2=strtime2.replace("51","пятьдесят одна")
                     strtime2=strtime2.replace("02","две")
                     strtime2=strtime2.replace("22","двадцать две")
                     strtime2=strtime2.replace("32","тридцать две")
                     strtime2=strtime2.replace("42","сорок две")
                     strtime2=strtime2.replace("52","пятьдесят две")
                     pub2.publish(element[4][key]+strtime1+strtime2)
                     time.sleep(5)
                     rospy.loginfo("program 3 ")
                   elif key==4:
                     pub4.publish(int(element[4][key]))
                     time.sleep(1)
                     rospy.loginfo("program 4 ")
                   else:
                     pass
            except ValueError:
              pass
        dh=d.hour;dm=d.minute;
      else:
        time.sleep(10)
              
      
if __name__ == '__main__':
    try:
        my_alarm()
    except rospy.ROSInterruptException: pass

Теперь создаем два узла subscriber - получателей сообщений из тем x10_alarm_festival и x10_alarm_mediaplayer.

Узел node_x10_alarm_mediaplayer получает сообщение String из темы nx10_alarm_mediaplayer и запускает программу проигрывания звуковых файлов. Я запускаю программу smplayer, можно любой проигрыватель.

Содержимое файла node_x10_mediaplayer_sub.py

#!/usr/bin/env python
#-*-coding:utf-8 -*-

# 
#  Слушатель x10_mediaplayer
#  
#  и запуск медиапроигрывателя
#  
#

import roslib; roslib.load_manifest('vp_x10_voice')
import rospy
import subprocess
import shlex

from std_msgs.msg import String

PATH_RINGTONS="ros_pkgs/vp_x10_voice/nodes/ringtons/"

def controller(data):

    rington_file = data.data
    command1='smplayer "'
    command1+=PATH_RINGTONS+rington_file+'"'
    subprocess.Popen(command1,shell=True).communicate()
    rospy.loginfo(command1)
    
      
def listener():
   rospy.init_node('node_x10_alarm_mediaplayer')
   sub = rospy.Subscriber("x10_alarm_mediaplayer",String,controller)
   rospy.spin()
 
if __name__ == '__main__':
   listener()
   

Узел node_x10_alarm_festival получает сообщение String из темы x10_alarm_festival и запускает программу festival. 

Содержимое файла node_x10_festival_sub.py

#!/usr/bin/env python
#-*-coding:utf-8 -*-

# 
#  Слушатель x10_festival
#  
#  и произношение голосом
#  

import roslib; roslib.load_manifest('vp_x10_voice')
import rospy
import subprocess
import shlex

from std_msgs.msg import String

def controller(data):

    fraza = data.data
    #command1="festival -b '(begin (SayText "
    #command1+='"'+fraza+'"'
    #command1+="))'"
    command1='echo "'
    command1+=fraza+'"'
    command1+=" | festival --language russian --tts"
    subprocess.Popen(command1,shell=True).communicate()
    rospy.loginfo(command1)

      
def listener():
   rospy.init_node('node_x10_alarm_festival')
   sub = rospy.Subscriber("x10_alarm_festival",String,controller)
   rospy.spin()
 
if __name__ == '__main__':
   listener()

Для управления приборами X10 запускаем узел node_x10_texttocommand

rosrun vp_x10_voice node_x10_texttocommand.py

и посылаем в него номер сценария из массива arr_commands файла node_x10_texttocommand.py (см. проект здесь)

Составляем список пробных будильников

Запускаем

1 терминал

roscore

2 терминал

rosrun vp_x10_voice   node_x10_alarm_pub.py

3 терминал

rosrun vp_x10_voice node_x10_festival_sub.py

4 терминал

rosrun vp_x10_voice node_x10_mediaplayer_sub.py

5 терминал

rosrun vp_x10_voice node_x10_texttocommand.py

Файлы проекта можно скачать в репозитории - скачать

Прикрепленные файлы:

Теги:

Опубликована: 26.03.2013 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Радиореле 220В
Радиореле 220В
Паяльник с регулировкой температуры Тестер ESR, полупроводников, резисторов, индуктивностей
вверх