node 控制 树莓派做的天气闹钟

在成都上班,下雨天堵车,迟到的概率会很大。

正好手上有一块树莓派 ,做了一个晴雨闹钟。

下雨天 早上 7:00叫我起床

晴天 早上 7:30叫我起床

将自己喜欢的歌曲放在一个文件夹中,随机播放,防止听腻

以下是代码

const UID = "U785B76FC9"; // 测试用 用户ID,请更换成您自己的用户ID
const KEY = "4r9bergjetiv1tsd"; // 测试用 key,请更换成您自己的 Key
let LOCATION = "双流"; // 除拼音外,还可以使用 v3 id、汉语等形式
let Api = require('./lib/api.js');
let api = new Api(UID, KEY);
let rainRegexp = /雨/;
let exec = require('child_process').exec;

let fs = require("fs");
let schedule = require("node-schedule");

function alarmClockTime(isRain) {
    let today = new Date();
    let Y = today.getFullYear();
    let M = today.getMonth();
    let D = today.getDate();
    let week = today.getDay();
    if (week === 0 || week === 6) {
        return new Date(Y, M, D, 9, 30, 0);
    }
    if (isRain) {
        return new Date(Y, M, D, 7, 0, 0);
    }
    return new Date(Y, M, D, 7, 30, 0);
}

//调用音乐
function playMusic() {
    let shellStr;
    let musicArray;
    try {
        musicArray = fs.readdirSync("/media/hd/music/alarm/");
        let fileNmae=musicArray[Math.floor(musicArray.length * Math.random())].replace(/ /g,"\\ ");
        shellStr = "mplayer /media/hd/music/alarm/" +fileNmae;
    } catch (err) {
        shellStr = "mplayer /media/hd/music/qiyue.mp3";
    }

    console.log(shellStr);

    exec(shellStr, function (err, data) {
        if (err) {
            console.log(err);
            return;
        }
        console.log("播放完成");
    })
}

function setAlarmClock(time) {
    schedule.scheduleJob(time, function () {
        playMusic();
    });
}

/**
 * 获取天气信息
 */
function getWetherInfo() {
    let getNowWeather = api.getWeather("/weather/now.json", {
        location: LOCATION
    });

    let getNextWeather = api.getWeather("/weather/daily.json", {
        location: LOCATION
    });

    Promise.all([getNowWeather, getNextWeather]).then(function (data) {
        let nowWeatherText = data[0].results[0].now.text;
        let dayWeatherText = data[1].results[0].daily[0].text_day;
        console.log(new Date() + " :" + dayWeatherText);
        if (rainRegexp.test(nowWeatherText) || rainRegexp.test(dayWeatherText)) {
            //当天有雨 提前设置闹钟
            setAlarmClock(alarmClockTime(true));
        } else {
            //没有雨 延后设置闹钟
            setAlarmClock(alarmClockTime());
        }
    }).catch(function (err) {
        console.log(err);
        //如果保存
        setAlarmClock(alarmClockTime(true));
    });
}

schedule.scheduleJob("0 50 6 * * *", function () {
    getWetherInfo();
});

在成都上班,下雨天堵车,迟到的概率会很大。

正好手上有一块树莓派 ,做了一个晴雨闹钟。

下雨天 早上 7:00叫我起床

晴天 早上 7:30叫我起床

将自己喜欢的歌曲放在一个文件夹中,随机播放,防止听腻

在成都上班,下雨天堵车,迟到的概率会很大。

正好手上有一块树莓派 ,做了一个晴雨闹钟。

下雨天 早上 7:00叫我起床

晴天 早上 7:30叫我起床

将自己喜欢的歌曲放在一个文件夹中,随机播放,防止听腻

node 控制 树莓派做的天气闹钟的更多相关文章

  1. android智能天气闹钟应用开发经过

    开发这个应用的初衷是这样产生滴,和我一块租房的同学每天早上都是骑单车上班,所以手机闹钟就会定一个刚好适合骑车的起床时间点.但是呢,有一天早上起床以后发现外面下挺大雨,肯定是不能骑车去上班了,于是就只好 ...

  2. 云中树莓派(3):通过 AWS IoT 控制树莓派上的 Led

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...

  3. 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器

    在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...

  4. C#控制树莓派入门

    何为树莓派 许久没有写博客了,十二月份西安疫情的影响,居家隔离了一个多月,在其期间,学习了一下树莓派,觉得硬件还是挺有意思的,刚好也看到了巨硬有提供使用c#用来开发树莓派应用的解决方案叫Net Iot ...

  5. 用备份控制文件做不完全恢复下的完全恢复(全备<老>--备份控制文件<次新>--删除表空间andy--日志文件<新>)

    为什么会使用备份的控制文件? 实际工作中主要有两种情况:第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件).第二种:当前控制文件 ...

  6. 树莓派进阶之路 (023) - Windows下用串行连接控制树莓派(转)

    转载:http://shumeipai.nxez.com/2014/05/04/under-windows-serial-connection-control-raspberry-pi.html 在没 ...

  7. python idea 利用树莓派做家庭报警系统

    1 利用树莓派做家庭报警系统idea 功能如下: 1.程序家侧人不在家(7:00-6:00) 2.树莓派搭配摄像头,对这门进行图像识别,如果变化,门开了,就报警: 3.报警的方式是给我发短信,采信,或 ...

  8. Node.js能够做什么?

    正如 JavaScript 为client而生.Node.js 为网络而生.Node.js 能做的远不止开发一个网 站那么简单,使用 Node.js,你能够轻松地开发:  具有复杂逻辑的站点:  ...

  9. 极客圈(一)树莓派3B协同Python打造个性化天气闹钟

    人生苦短,我用Python~ 一直想自己折腾些极客的东西出来,供自己使用或者是供他人使用.一则可能对自己的生活是一种帮助,二则是对自己技能的提高,三则显得高大上,一直努力,一直提高,一直Happy!~ ...

随机推荐

  1. 仿flash轮播

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  2. 黄油刀ButterKnife的使用

    1.ButterKnife是一个由JakeWharton写的开源框架,它使用注解处理将属性和方法和View绑定,以生成模板代码. 2.作用: @1通过使用@BindView 注释属性取消了findVi ...

  3. Ruby中文乱码问题

    中文乱码问题 解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*-(EMAC写法) 或者 #coding=utf-8 就行了. 源代码文件中,若包含中文编码,则需要注意两点: ...

  4. python 标准库 -- unittest

    一. unittest 单元测试 编写单元测试 示例代码 : import unittest from flask import current_app from app import create_ ...

  5. python 标准库 -- subprocess

    subprocess 主要功能室执行外部的命令和程序 一个进程可 fork 一个子进程, 并让这个子进程 exec 另外一个程序. 在 python 中, 可以通过标准库中的 subprocess 包 ...

  6. Tomcat7的热部署

    所谓热部署就是在tomcat不停机的情况下,将新的war包放上去,达到服务不中断,用户无察觉的目的,实现的原理很简单,这里做下记录,以便后期查看. 1.1 安装tomcat7 略 1.2 在tomca ...

  7. 【原创】Kafka Consumer多线程实例续篇

    在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...

  8. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

  9. 合并静态库出现 can't move temporary file错误

    静态库的制作就不说了很简单,网上也很多例子,这里主要讲下我合并通用静态库时候遇见的坑,在合并前注意.a文件一定要正确,我有一次scheme选了release但是device忘了换,结果怼着两个模拟器静 ...

  10. CSS学习笔记05 display属性

    HTML标记一般分为块标记和行内标记两种类型,它们也称块元素和行内元素. 块元素 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性,常用于网页布局和网页结构的搭建.并且块级 ...