查看: 3691|回复: 6

把树莓派当做Google日历闹钟

[复制链接]
  • TA的每日心情
    奋斗
    2019-6-29 11:53
  • 签到天数: 368 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-8-7 08:09:05 | 显示全部楼层 |阅读模式
    分享到:
    本文由 极客范 - 陈舸 翻译自 esologic。转载请参见文章末尾处的要求。

    我是个嗜睡者,我希望有一个闹钟能够很方便的进行设定,然后随机播放一首歌曲来叫醒我。

    一段时间以来,我都在用这个程序,但是这个程序需要很多令人心烦的用户输入。这对于一个嗜睡的人来说实在不是什么理想的解决方案(我就忍受不了,所以才会有这篇博文)。但是,这个程序的“fire()”命令工作的倒是非常好。要使用这个程序你需要AP scheduler以及MPG321(sudo apt-get install mpg321)

    但是,这种方案对我来说还是行不通。我希望能有一种方式可以改变我每天都在使用的闹钟的用途(在这种方式下我不需要修改我的工作流程)。我登录了Google Calender(Google日历),因为每天我几乎都可以使用任何设备来为我的日程添加事件。搜索了一下我发现使用Google日历的Python API来实现我心中所想的方式一点都不难。

    下面开始吧,你需要下载并安装Google Data Library。我使用的是这个版本。从顶层目录解压缩.tar.gz文件,通过setup.py来安装。然后运行tests/run_data_tests.py来检查是否一切都安装成功。我这边都是正常的,如果你那边没法工作,请参阅由Google官方撰写的指南,那上面会指引你如何安装和运行。

    这个程序主要的部分可以归结为一条单独的布尔语句。但是首先,我们需要先设定一些库和API。Google日历的Python API产生的是rfc3339时间,对于这个应用来说有很多信息都是不相关的。

    为了转换时间格式,我在StackOverflow上找到了一些有用的信息

    下面的视频是这个系统的实际工作展示,以及有关设定的一个基本概览。


    最后贴一下代码:
    #These are the imports google said to include
    import gdata.calendar.service
    import gdata.service
    import atom.service
    import gdata.calendar
    import gdata.calendar
    import atom
    import getopt
    import sys
    import string
    import time
    import xe #for the time comparator
    from feed.date.rfc3339 import tf_from_timestamp #also for the comparator
    from datetime import datetime #for the time on the rpi end
    from apscheduler.scheduler import Scheduler #this will let us check the calender on a regular interval
    import os, random #to play the mp3 later
    #this is more stuff google told me to do, but essentially it handles the login credentials
    calendar_service = gdata.calendar.service.CalendarService()
    calendar_service.email = 'youremail@yourdomain' #your email
    calendar_service.password = 'yourgcalpassword' #your password
    calendar_service.source = 'Google-Calendar_Python_Sample-1.0'
    calendar_service.ProgrammaticLogin()
    def FullTextQuery(calendar_service, text_query='wake'):
    print 'Full text query for events on Primary Calendar: \'%s\'' % ( text_query,)
    query = gdata.calendar.service.CalendarEventQuery('default', 'private', 'full', text_query)
    feed = calendar_service.CalendarQuery(query)
    for i, an_event in enumerate(feed.entry):
    for a_when in an_event.when:
    print "---"
    print an_event.title.text ,"Number:",i,"Event Time:",time.strftime('%d-%m-%Y %H:%M',time.localtime(tf_from_timestamp(a_when.start_time))),"Current Time:",time.strftime('%d-%m-%Y %H:%M')
    if time.strftime('%d-%m-%Y %H:%M',time.localtime(tf_from_timestamp(a_when.start_time))) == time.strftime('%d-%m-%Y %H:%M'):
    print "Comparison: Pass"
    print "---"
    songfile = random.choice(os.listdir("/home/pi/alarmclock/test_MP3s/")) #chooses the .mp3 file
    print "File Selected:", songfile
    command ="mpg321" + " " + "/home/pi/alarmclock/test_MP3s/" + "'"+songfile+"'"+ " -g 100" #plays the MP3 in it's entierty. As long as the song is longer than a minute then will only trigger once in the minute that start of the "wake" event
    print command
    os.system(command) #runs the bash command
    else:
    print "Comparison:Fail" #the "wake" event's start time != the system's current time
    def callable_func():
    os.system("clear") #this is more for my benefit and is in no way necesarry
    print "------------start-----------"
    FullTextQuery(calendar_service)
    print "-------------end------------"
    scheduler = Scheduler(standalone=True)
    scheduler.add_interval_job(callable_func,seconds=5)
    scheduler.start() #runs the program indefinatly on an interval of 5 seconds
    感谢各位的阅读,如果你有什么问题或建议,请在评论栏中给我留言吧。



    原文链接: esologic 翻译: 极客范- 陈舸

    译文链接: http://www.geekfan.net/2561/

    [ 转载请保留原文出处、译者和译文链接。

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-29 11:53
  • 签到天数: 368 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-7 08:09:38 | 显示全部楼层
    试一下,试一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-8-7 08:29:02 | 显示全部楼层
    王子好早。占个座儿的。不过王子今儿的每日一书呢?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-29 11:53
  • 签到天数: 368 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-7 08:41:38 | 显示全部楼层
    GY@艳 发表于 2013-8-7 08:29
    王子好早。占个座儿的。不过王子今儿的每日一书呢?

    凌晨的时候已经发好了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-8-7 08:47:51 | 显示全部楼层
    kira王子 发表于 2013-8-7 08:41
    凌晨的时候已经发好了

    早上没看到,抱歉啦。找找去
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-8-7 08:49:38 | 显示全部楼层
    kira王子 发表于 2013-8-7 08:41
    凌晨的时候已经发好了

    早上没看到,抱歉啦。找找去           
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-29 11:53
  • 签到天数: 368 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-8-7 08:59:55 | 显示全部楼层
    GY@艳 发表于 2013-8-7 08:49
    。早上没看到,抱歉啦。找找去

    不好意思,是我忘记把链接转到总帖里了。。。多谢捧场
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 10:25 , Processed in 0.161973 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.