分类存档: Lifestyle

玩玩智能家居2:ESPEasy

1. ESP8266

ESP8266 是乐鑫推出的一款低功耗高集成度的 Wi-Fi 芯片,价格低,I2C、SPI、ADC 等接口一应具全,非常适合作为个人 DIY 的单片机使用。

2. NodeMCU

NodeMCU 是基于 ESP8266 ESP-12E 做的一个开发板,集成了 Micro USB 输入,4M Flash,开发时使用起来更方便。

NodeMCU 默认是使用 Lua 作为开发语言的,但是借助于 ESP8266 Arduino 项目,就可以拿 NodeMCU 当 Arduino 开发板来使用了,可以直接使用 Arduino IDE 或者 PlatformIO 来开发。

3. ESPEasy

ESPEasy 是 LetsControlIt.com 开发的一个开源 MCU 固件,专门用于 IoT 设备。通过 ESPEasy,可以很方便地使用 ESP8266 系列 MCU 来组成家庭传感器网络,几乎不需要编写代码就可以实现。结合一些开源 Home Automation System,就可以实现家庭设备的自动化。

3.1 多种服务器支持

ESPEasy 内置了多种开源 Home Automation System 的支持,例如常见的有:

  • Domoticz
  • ThingSpeak
  • OpenHAB

在 ESPEasy 中,只需要配置 Home Automation System 的服务器地址端口等,就可以自动将 ESPEasy 采集到的数据发送到服务器,并且可以很容易定制发送时间间隔,格式等。

3.2 插件功能

在 ESPEasy 中,对于各种传感器的支持都是通过插件的方式来实现的,在官方固件中就已经集成了相当多的传感器等元件的支持。

另外还有一个 ESPEasyPluginPlayground 中有爱好者编写的试验性的传感器插件。

对于有能力开发的人来说,碰到官方固件没有支持的传感器或元件,完全可以自行编写插件来支持。

3.3 事件规则

Rules 在 ESPEasy 中是一个试验性的功能,需要单独在 Tools > Advanced 中开启。

通过 Rules 功能,就可以方便在一个 ESPEasy 节点上实现事件处理而不需要通过中心化的 Domoticz 去处理事件联动什么的,避免因为中心服务器失效而导致类似警报功能失效的问题。

例如我做了一个厨房漏水检测,希望在检测到漏水时直接通过蜂鸣器发现警报声,而不是触发到 Domoticz 中的 Switch 值改变,再由 Domoticz 去发出警报声,就可以直接在 Rules 中编写相应的规则来实现。

on WATER#VAL=1 do
    buzzer,2,1
endon
on WATER#VAL=0 do
    buzzer,2,0
endon

3.4 设备配网

对于一个 ESPEasy 节点来说,如果在固件默认配置好的 Wi-Fi 环境中,那么它会自动连接上 Wi-Fi 网络,但是如果移动到了一个陌生的 Wi-Fi 环境中,那么如何让它连接上 Wi-Fi 网络就是一个问题了。

很方便的是,ESPEasy 本身提供了 AP 方式的配网功能。

在无法连接到 Wi-Fi 网络时,ESPEasy 会将 ESP8266 的 Wi-Fi 工作模式切换到 AP Station 方式,提供了一个名称为 ESP_0 这样形式 SSID 的 Wi-Fi 网络,连接到这个网络,访问 192.168.4.1 就可以进入 ESPEasy 的配置界面了,在这里,可以配置真正实际使用时的 Wi-Fi 网络 SSID 和密码。

4. ESPEasy Plugin

ESPEasy 的 Plugin 机制是一个很有用的东西,对于我这样的 Arduino 初学者来说,它可以解决我相当一部分开发上的问题,例如配置的保存,系统架构的设计,定时器的使用等等。

4.1 Task Pin

对于 ESPEasy Plugin 来说,它的主要职责就是去与传感器沟通,而与传感器沟通最主要的方式就是通过针脚来通信了。ESPEasy Plugin 默认支持 Single Pin,Dual Pin,I2C 等方式来与传感器通信。

当然,这个只是用来保存插件与传感器通信所用的针脚,以及用来决定在 Web 界面上配置传感器时提供什么样的形式去给用户选择,真正如何与传感器通信还是需要由插件的代码去实现。

4.2 Configuration

ESPEasy Plugin 默认提供了三种类型 int16、float 以及 long 自定义配置存储项,其中 int16 最多 8 个,float 和 long 最多 4 个。

另外,ESPEasy Plugin 还为每个插件准备了 512 字节的自定义配置存储区域,在这 512 字节中,可以根据自己的需要存储例如字符串等配置信息。在 ESPEasy 自带的 OLED 插件中,就是使用了这 512 字节来存储需要显示的字符串信息。

4.3 Timer

定时器是个好东西,但是我不会用。不过有了 ESPEasy Plugin,只需要在 PLUGIN_ONCE_A_SECOND 或 PLUGIN_TEN_PER_SECOND 写代码就行了,每秒一次还是每秒十次任君选择。想要自定义时间?加个变量累加一下触发次数就可以实现任意 100 毫秒倍数时间的定时器了。

5. PlatformIO

ESPEasy 是一个很老的项目,可能以前是用 Arduino IDE 开发的,虽然 Arduino IDE 是一个好东西,但是毕竟比较不现代,在使用过程中还是有各种不便。

而 PlatformIO IDE 就比较现代了,这是一个基于 Atom 实现的跨平台 IDE,支持多种开发平台,例如 Arduino、mbed 等。

当然 PlatformIO 对我最多的吸引力是它比较完善的项目文件列表、语法颜色以及自动补全功能。Arduino IDE 与之相比就像是在用记事本在写代码。

PlatformIO 是直接可以兼容 Arduino 项目代码的,因为从 Arduino IDE 切换完全没有压力,并且在打开项目时也可以保持与 Arduino 项目的兼容性,这样如果有一些特殊需求也可以直接用 Arduino IDE 来打开项目来开发。

6. Plugins

6.1 MH-Z19

MH-Z19 是一款国产的二氧化碳传感器,量程为 0~5000ppm,精度为 50ppm+5% 读数值,指标和进口 SenseAir S8 差不太多,但是价格只需要三分之一,相当实惠。

在实际使用过程中,发现 MH-Z19 的数据也还算稳定,与 SenseAir S8 并没有太大差距,与 Netatmo Weather Station 的数据也还算符合,因此用来作为看室内二氧化碳浓度变化趋势是一个不错的选择。

6.2 PMS5003

PMS5003 是攀腾科技出的一款激光 PM 2.5 颗粒物传感器,便宜又好用,使用 pms5003 这个库可以很方便的读取数据,然后发送到 Domoticz 上的 Custom Sensor 设备,可以方便的追踪家里的 PM 2.5 浓度变化,或者来检测空气净化器的净化效果。

6.3 Switch

很多一些通断性质的传感器,可以直接使用 Switch Plugin 来读取状态,并实现一些相关的联动事件处理。

例如检测漏水,可以直接在淘宝上购买雨水传感器模块,它有一个数字输出 DO,有水时就会输出低电平,检测到低电平时就可以通过蜂鸣器发出警报提示检查漏水情况了。

7. 参考资料

  1. ESPEasy Wiki
  2. ESP8266
  3. Wikipedia: ESP8266
  4. NodeMCU
  5. PlatformIO
  6. GitHub: ESPEasy
  7. GitHub: ESPEasyPluginPlayground
  8. GitHub: pms5003

未经许可,禁止转载

— EOF —

玩玩智能家居1:Domoticz

1. 什么是 Domoticz

第一次知道 Domoticz 是在 smzdm 上的一篇原创文章《开源IoT平台domoticz与百搭wifi模块esp8266 篇三:空气站 Weather Station》里,以及知道了 ESP8266 模块这个好东西。

Domoticz 支持众多 USB 以及串口设备,可以通过将 Domoticz 安装在树莓派上,直接读取和操作连接在树莓派上的设备,例如 RFLink 或者 I2C 接口的 BME280 传感器。

当然,Domoticz 还支持通过局域网控制的设备和有网络 API 的设备,例如小米网关或者 Netatmo Weather Station。

2. 主要功能

传感器

Domoticz 可以直观的展示各种传感器状态以及历史,常用的有温度、湿度、二氧化碳浓度等。

对于 Domoticz 没有内置类型的传感器,也可以使用 Custom Sensor 来展示,可以自定义单位,同样可以查看历史。

开关

对于灯、遥控器等,都可以通过 Domoticz 开关类型设备来实现控制。对于遥控器,Selector Switch 是个好选择。

事件

Domoticz 内建了事件系统,对于事件的处理,简单的方法可以使用 Blockly 图形化编程来实现各个传感器和设备间的联动,如果有复杂逻辑,可以直接使用 Lua 脚本来处理。这给用户带来更大的自由度。

3. 对比其他 Home Automation System

当然,开源 Home Automation System 有很多,但是对比使用了一下其他系统之后,觉得相对而言还是 Domoticz 更简单易用一些。

openHAB

openHAB 是一个使用 Java 编写的开源 Home Automation System。它也支持相当多的设备,很容易配置连接 Amazon Dash Button、Philips Hue 等设备,还支持连接 Kodi 这个多媒体中心。

但是在使用的时候,openHAB 添加设备并不是特别直观,也没有弄明白自己怎么样去添加一个自定义的传感器设备。另外怎么查阅传感器历史数据也没有找到入口。

Home Assistant

Home Assistant 是一个开源的,使用 Python 3 编写的 Home Automation Platform。

对于我来说,最不喜欢 Home Assistant 的一点就是,它的设备都是需要使用 YML 配置文件的方式来配置,这在使用过程中感觉不是很方便。

4. 优缺点

对于我来说,第一步需要做的是使用 ESP8266 构建家庭传感器网络,在对比了几个系统之后,最终选择 Domoticz 作为 Home Automation System。

Domoticz 的优点

  • 直接在网页界面配置设备
  • 很容易添加自定义传感器设备
  • ESPEasy 内置 Domoticz 数据传送支持
  • Lua 事件处理比较强大

Domoticz 缺点

  • 界面不够现代,虽然 elemental 主题稍微好一点
  • 官方 App 功能不够完全
  • Homebridge 插件 homebridge-eDomoticz 功能不完善

有些缺点其实也是可以克服的,官方 App 可以用网页版代替,Domoticz 的主题本身带有移动设备支持,而 homebridge-eDomoticz 插件的问题,就只能靠自己改代码来完善了。

5. 安装

Domoticz 官方提供了 Windows、macOS 以及 Linux 的二进制文件,对树莓派也提供了编译好的二进制包,所以安装起来还是很方便的。另外官方还提供了树莓派和 Ubuntu 的一键安装脚本,比使用压缩包更省事。

因为不想另外找个树莓派或者开一台虚拟机,我就在 DSM 的 Docker 中部署了 Domoticz。Domoticz 的 Image 在 Docker Hub 上很容易找到。

6. 添加设备

Domoticz 提供了很多类型的硬件,其中一些很便于扩展使用自己的设备。

虚拟设备

在 Hardware 中添加一个 Dummy 的硬件,然后从这个硬件就可以创建各种虚拟传感器了,在 ESPEasy 中可以很方便的更新这些虚拟传感器的数据。

HTTP/HTTPS Poller

使用 HTTPS Poller 这个设备就可以很方便的去拉取一些外部数据来显示在 Domoticz 内部了,比如去获取外部的 AQI 指数。

小米网关

在去年年底,Domoticz 加入了小米多功能网关的支持,通过 Xiaomi Gateway 这个硬件,可以自动的将小米多功能网关的子设备(例如温湿度传感器、门窗传感器、人体活动传感器以及小米智能插座)添加到 Domoticz 中。

7. 事件

借助于 Blockly 或者 Lua,可以很方便地实现家中设备的联动,例如开门时自动打开小米智能插座。

8. 参考资料

  1. 5 open source home automation tools
  2. 开源IoT平台domoticz与百搭wifi模块esp8266 篇三:空气站 Weather Station
  3. openHAB
  4. Home Assistant

未经许可,禁止转载

— EOF —

玩玩智能家居0:开始折腾

记录一下折腾智能家居的过程和东西。

Domoticz

Domoticz 是一个开源的 Home Automation System,使用 C++ 编写,相对于其他系统的好处就是占用资源少。

Domoticz 使用比较简单,界面也比较清晰,不过界面不太现代。

NodeMCU 和 ESP8266

ESP8266 是上海乐鑫出的一款自带 Wi-Fi 的 MCU,NodeMCU 是基于 ESP8266 ESP-12E 做的一个开发板,集成了 Micro USB 输入,4M Flash,开发时使用起来更方便。

NodeMCU 默认是使用 Lua 作为开发语言的,但是借助于 ESP8266 Arduino 项目,就可以拿 NodeMCU 当 Arduino 开发板来使用了,可以直接使用 Arduino IDE 或者 PlatformIO 来开发。

ESPEasy

ESPEasy 是一款可以用于 ESP8266 芯片的开源固件,使用这个固件可以很方便的把常用的一些传感器集成到 Domoticz 系统中。

并且 ESPEasy 内置 Web 配置界面,以及一整套日志、插件、数据传输系统,非常方便于我这个 Arudino 新手来使用。

BroadLink

BroadLink 是杭州的一家智能家居产品厂商,出了一系列的智能家居产品,例如门磁、红外传感器、智能插座、万能遥控等。

在刚开始玩智能家居的时候,BroadLink 是唯一一家有全套产品的品牌,于是买了一些它们家的产品。在使用 Domoticz 后也尝试将它们家的产品集成到这个 Domoticz 中。

小米多功能网关

小米在去年也推出了相当于的智能家居附件,但是一开始并没有选用小米的产品。在去年末小米多功能网关推出局域网通信协议之后,Domoticz 也迅速加入多功能网关的支持,这让我决定来尝试一下小米的产品。

在购买收货之后,发现相对于 BroadLink 来说,小米的产品在外观及体积上有相当大的优势,于是决定用小米的传感器来替代 BroadLink 的传感器产品。

Homebridge

Homebridge 是一个开源的 HomeKit 网桥实现,可以很方便的集成各种设备到 HomeKit 中,从而可以使用 Hey Siri 来控制各种设备。

使用 Homebridge-eDomoticz 插件可以很方便的将 Domoticz 中的设备导入到 Homebridge 中,这样除了使用 Web 界面来控制设备,还可以使用语言来控制了。

参考资料

  1. Domoticz
  2. ESP8266
  3. NodeMCU
  4. ESP8266 Arduino Core
  5. ESPEasy
  6. BroadLink
  7. 小米多功能网关
  8. Homebridge

未经许可禁止转载

— EOF —

使用 python-broadlink 发送 BroadLink A1 数据到 Domoticz

之前在 smzdm 上看一些物联网的文章时,看到 Domoticz 这个平台,好像还蛮符合我的需求的,文章里还介绍了使用 RMBridge 来使用 Domoticz 来控制 RM Pro。

但是 RMBridge 并不是特别方便,需要一直跑一个 Android 来作为指令中转,于是在 GitHub 上去找找看有没有其他项目来支持 BroadLink 的 RM 设备,然后就找到了 python-broadlink 这个项目。

在研究 python-broadlink 的代码过程中,发现它同时还支持 BroadLink 的 A1 空气质量监测仪,刚好我就有一个 A1 设备,于是准备试试看能不能把 A1 的数据更新到 Domoticz 平台上。

最终的效果如下图所示:

准备工作

因为我有一个 DSM,并且 Domoticz 有现成的 DSM Package,所以所有工作都是基于 DSM 完成的,需要的软件如下:

  • DSM 6
  • Domoticz v3.5876
  • python-broadlink

创建设备及虚拟传感器

安装完 Domoticz 后,需要创建虚拟设备以及虚拟传感器来接受数据。

在“设置》硬件”中创建一个虚拟设备,只用来创建虚拟传感器:

在刚刚创建的 BroadLink A1 设备上,选创建虚拟传感器,并选择“温度+湿度”:

使用同样的方式来创建两个“文本”类型的虚拟传感器,用来显示光照和声音。

创建完虚拟传感器后,可以在“设置》设备”中看到刚刚创建的虚拟传感器,这里需要记住的是“Idx”这一档,这在后面的代码中需要用到:

在 DSM 上部署更新脚本

先在 DSM 中创建一个共享文件夹 domoticz,用于存放相关的代码文件。

下载 python-broadlink 项目代码,将 broadlink 目录上传至 domoticz 共享文件夹中。

使用 DSM 文本编辑器,在 domoticz 共享文件夹中创建一个新的文件 broadlink-a1.py,内容如下:

#!/usr/bin/python
# -*- encoding: utf-8 -*-

A1_IP = '1.1.1.1' # 修改为 BroadLink A1 IP
A1_MAC = '00:00:00:00:00:00' # 修改为 BroadLink A1 MAC 地址
DOMOTICZ_IP = '1.1.1.1' # 修改为 Domoticz 服务器 IP
DOMOTICZ_PORT = 8084 # 修改为 Domoticz 服务端口

DEV_HUM_TEMP_IDX = 1 # 修改为“温度+湿度”虚拟传感器Idx
DEV_NOISE_IDX = 2 # 修改为“声音”虚拟传感器Idx
DEV_LIGHT_IDX = 3 #修改为“光照”虚拟传感器Idx

import broadlink
import requests
import urllib

a1 = broadlink.a1((A1_IP, 80), A1_MAC)
a1.auth()
data = a1.check_sensors_raw()

hum = data['humidity']
hum_stat = 0
if 45 < = hum <= 60:
  hum_stat = 1
elif hum < 40:
  hum_stat = 2
elif hum > 70:
  hum_stat = 3

# update temp and hum
url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%0.1f;%0.1f;%d" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_HUM_TEMP_IDX, data['temperature'], hum, hum_stat)
requests.get(url)

# update noise
db = '未知'
noise = data['noise']
if noise == 0:
  db = '寂静'
elif noise == 1:
  db = '正常'
elif noise == 2:
  db = '吵闹'
db = urllib.quote(db)
url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%s" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_NOISE_IDX, db)
requests.get(url)

# update light
light = data['light']
lux = '未知'
if light == 0:
  lux = '黑暗'
elif light == 1:
  lux = '昏暗'
elif light == 2:
  lux = '正常'
elif light == 3:
  lux = '明亮'
lux = urllib.quote(lux)
url = "http://%s:%d/json.htm?type=command¶m=udevice&idx=%d&nvalue=0&svalue=%s" % (DOMOTICZ_IP, DOMOTICZ_PORT, DEV_LIGHT_IDX, lux)
requests.get(url)

请注意需要修改对应 BroadLink A1 的 IP 以及 MAC 地址,以及 Domoticz 安装服务器的地址和端口,如果是以 DSM Package 的形式安装的,那么 IP 与 DSM 的 IP 同样,端口默认为 8084。

之后 domoticz 共享文件的目录应该是这样的:

添加计划任务定时更新 A1 数据

为了能定时更新 A1 数据到 Domoticz,需要在 DSM 中添加一个计划任务,按时运行 broadlink-a1.py 这个脚本。

在 DSM 的“控制面板”中找到“任务计划”,添加一个“计划的任务》用户定义的脚本”,将任务设置为每5分钟运行一次,并且任务设置中运行命令按如下设置:

为了测试脚本是否正确,可以在保存完任务后,选中刚刚创建的任务手动运行一次,如果数据正常上传到 Domoticz 的服务器,那么在 Domoticz 的“设置》设置”中可以看到对应虚拟传感器的最后通讯时间为刚刚运行任务的时间。

如果任务正确运行,也可以在 Domoticz 的温度面板中,也可以看到虚拟传感器会显示正确的温度以及湿度。

至此,所有工作已经完成,Domoticz 可以实时显示 A1 的数据并且记录曲线。

参考资料

  1. 开源IoT平台domoticz与百搭wifi模块esp8266 篇二:domoticz与broadlink的联接
  2. python-broadlink by mjg59
  3. Domoticz API/JSON URL’s

— EOF —

使用 KindleEar 定时推送《知乎日报》到 Kindle Paperwhite

入手 Kindle Paperwhite 已经有段时间了,但是一直没有充分利用起来。

HiPDA! 的 E-ink 版乱逛的时候,看到 cdhigh 开源了一个 Kindle 推送服务的代码 KindleEar,而最近又经常会去看知乎日报,于是就想能不能每天定时把知乎日报推送到 Kindle 上阅读。

在看了 KindleEar 的代码之后,发现添加一种订阅源还是比较简单的,于是直接拷贝了原来 books 中的代码,写了一个知乎日报的模块 ZhihuDaily.py

具体的代码可以前往我的 fork:,我也已经提交了 Pull Request 给原作者。

不过在测试过程中发现知乎屏蔽了来自 Google App Engine 的网页获取请求,经过 @clowwindy 说明得知有人滥用 Google App Engine 于是简单的屏蔽了 GAE 的访问。

当然这个不难解决,通过另外一个服务器中转一下知乎日报的 Feed 就行了,知乎并没有屏蔽所有外部访问⋯⋯

于是写了个 ZhihuDailyForwarder,将这个项目部署到 appfog 上,再将 ZhihuDaily.py 中原来的 API 地址替换成 appfog 上的项目首页地址,就可以正常的采集了。

完整部署的步骤:

  1. 下载 ZhihuDailyForwarder 项目代码,部署到 appfog 或其他支持 nodejs 的服务器上
  2. 下载

项目代码,参照 readme.txt 中说明,修改 app.yaml 及 config.py 中相关设置

  • 进入 KindleEar 项目文件夹,修改 books/ZhihuDaily.py,修改 http://news.at.zhihu.com/api/1.1/news/latest 为第一步中部署完毕的 ZhihuDailyForwarder 首页地址,例如 http://example-zhihu.aws.af.cm
  • 部署 KindleEar 到 Google App Engine
  • 进入部署完毕的 KindleEar 网站,设置自己的 Kindle 邮箱,并订阅知乎日报,当然别忘了在 Amazon 那边设置允许发送邮件的邮箱地址为 Google App Engine 的账号邮箱地址。
  • PS. 知乎并没有正式开放知乎日报的 API,目前使用的 API 为网友嗅探而来,随时有可能被停用,所以不能保证这个功能长期有效。

    感谢 cdhigh 带来的 KindleEar 项目。

    希望此文对 Kindle 用户和知乎日报爱好者有所帮助。

    参考资料

    1. http://www.hi-pda.com/forum/viewthread.php?tid=1213082
    2. https://gist.github.com/zellux/5844688
    3. https://github.com/ohdarling/KindleEar
    4. https://github.com/cdhigh/KindleEar
    5. 知乎日报 Feed 转发服务 nodejs 版本

    —EOF—

    在使用 Linux 系统的 NAS 上部署 Fitbit 数据同步程序

    使用 Fitbit 已经三个多月了,用它来记录每天的运动量以及睡眠质量感觉很方便。

    不过因为我用的电脑是笔记本,如果要同步 Fitbit 的数据,就需要把 Fitbit Base Station 连接在笔记本电脑上,然后 Fitbit 的数据才会同步到官网上。

    因为家里没有 24 小时开机的电脑,所以没办法直接把 Fitbit Base Station 连接在一台电脑上实现回家自动同步。

    但是家里有下载机是 24 小时运行的,于是去 Fitbit 官网看看有没有提供 Linux 下的 Fitbit 同步程序。

    很不幸的是,Fitbit 官方只提供了 Windows 和 Mac OS X 版本的同步程序,没有提供 Linux 下的 Fitbit 同步程序。

    昨天突然想到去网上找找看有没有非官方的 Linux 平台 Fitbit 同步程序,没想到还真找到了。

    在网上找到了两个项目,用来提供跨平台的 Fitbit 同步功能。

    开源的 Fitbit 同步程序

    libfitbit

    项目地址:

    libfitbit is an implementation of the data retrieval protocol for the fitbit health tracking device. It also implements a synchronization client for synchronizing data with the fitbit website on platforms not supported by Fitbit currently.

    fitbitd

    项目地址:

    fitbitd synchronises FitBit trackers with the FitBit.com service. You simply leave it running in the background and it will synchronise the tracker periodically, just like the official FitBit software does for Windows or Mac OS.

    libfitbit 是用 python 编写的,功能上可能相对简陋一些,而 fitbitd 是使用 C 编写的,功能相对于 libfitbitd 强大一点,并且提供了 Linux 桌面环境中的状态栏插件。

    不过因为我是要在 DS211j 上安装,而 DS211j 的 CPU 是 ARM 而非 x86,因此如果要安装这些程序都需要自己来编译。

    在多次尝试之后,我选择了 libfitbit 而不是 fitbitd,因为 fitbitd 要用到 dbus,在编译时会遇到很多问题。如果只是为了同步 Fitbit 数据,libfitbit 已经基本够用,并且像 daemon 模式,也可以通过 nohup 来实现。

    在 DS211j 上安装包管理程序 ipkg

    注意:文中所有在 NAS 上的操作均以 root 用户进行

    首先需要在 DS211j 的控件台里启用 SSH 服务,然后使用 SSH 连接到 NAS,安装 ipkg:

    wget http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/syno-mvkw-bootstrap_1.2-7_arm.xsh
    chmod +x syno-mvkw-bootstrap_1.2-7_arm.xsh
    ./syno-mvkw-bootstrap_1.2-7_arm.xsh
    ipkg update

    注意,如果安装完 ipkg 可能需要修改一下 .profile 文件,防止 /opt 可能没有加到 PATH 环境变量的问题,需要把:

    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
    export PATH

    修改为:

    PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
    export PATH

    安装所需软件

    编译以及运行所需软件包如下:

    • gcc
    • python27

    直接使用 ipkg 安装即可:

    ipkg install gcc python27

    编译 libusb-1.0

    DS211j 使用的软件源中的 libusb 是 0.1 版本的,而 libfitbit 需要的是 1.0。如果使用 libusb-0.1 虽然 libfitibt 可以运行,但是无法接收数据。

    先去 下载一个 libusb-1.0.9,解压到放到 NAS 上,然后进行编译安装。

    注意在编译前需要修改 libusb 的 Makefile,默认情况下编译的话,在使用时会出现“undefined reference to `clock_gettime’” 错误。

    ./configure --prefix=/opt
    vi libusb/Makefile
    # 修改 LDFLAGS= 为 LDFLAGS=-lrt
    make
    make install

    使用 libfitbit

    下载 libfitbit,解压后把 python 目录放到 NAS 的 /root 中,并且重命令为 libfitbit。

    下载 libfitbit 依赖的 pyusb 模块,解压后把 usb 目录放到 NAS 的 /root/libfitbit 目录中。

    这时需要把 Fitbit Base Station 连接到 DS211j 上。

    在 NAS 上进入 /root/libfitbit 目录,运行 python2 fitbit.py 测试安装是否正常。

    Start reset () {}
        sent: ['a4', '01', '4a', '00', 'ef']
    received: ['a4', '01', '6f', '20', 'ea']
    End reset None
    # 其他日志省略...
    End open_channel None
    Waiting for receive
    

    如果出现 Waiting for receive 就说明 fitbit.py 已经正常运行了,如果有 Fitbit Ultra Tracker 在 Fitbit Base Station 附近,那么就会继续出现其他日志。

    接下来就要让 libfitbit 在后台一直运行了。libfitbit 本身提供了每隔 15 分钟同步一次数据的功能,但没有提供后台运行的功能,不过借助于 Linux 中的 nohup 命令可以轻松实现。

    nohup python2 fitbit_client.py > /tmp/libfitbit.log &
    

    注意,这里会把 libfitbit 产生的日志输出到 /tmp/libfitbit.log 中,但是 /tmp 的容量不会很大,所以正式使用时,可以直接将日志输出到 /dev/null:

    nohup python2 fitbit_client.py > /dev/null &
    

    结语

    感谢 Kyle Machulis 带来这么棒的开源项目。

    最开始一直尝试在 My Book Live 上配置 libfitbit 和 fitbitd,但是弄到最后突然发现,My Book Live 并没有 USB 接口⋯⋯

    如果只是 Linux 用户希望在 Linux 系统下同步数据,如果又刚好是 Ubuntu 或 Mint 用户的话,那么使用 fitbitd 可能是一个更好的选择,因为作者已经提供了一个 PPA 源来直接安装 fitbitd,并且还有状态栏插件可以用。Arch 用户也可以直接用 sudo pacman -Sy fitbitd-git 来安装。

    当然,如果你也像我一样,不喜欢电脑上拖着个小尾巴,家里也刚好有个带 USB 接口并且 24 小时运行的 Linux 设备,也么也可以折腾一下。

    希望此文对爱好 量化生活 的朋友们有所帮助。

    参考资料

    1. Overview on modifying the Synology Server, bootstrap, ipkg etc
    2. What kind of CPU does my NAS have
    3. http://sourceforge.net/projects/libusb/files/libusb-1.0/
    4. undefined reference to涉及的链接问题
    5. https://github.com/qdot/libfitbit
    6. http://sourceforge.net/projects/pyusb/files/PyUSB%201.0/
    7. http://www.paulburton.eu/projects/fitbitd/
    8. http://www.fitbit.com/

    — EOF —

    高性价比 NAS+HTPC 折腾记

    最近组装了一台 NAS+HTPC 合体的机器,自认为还有比较好的性价比,在折腾了两个星期之后,终于差不多搞定所有功能。这台 HTPC 使用 XBMC 作为媒体中心,使用 OpenMediaVault 作为 NAS 系统,这篇博客主要记录 OpenMediaVault 和 XBMC 的安装过程和问题。另外,因为折腾的时候有些地方来来回回搞了好多次,记录的顺序可能并不严谨。

    通过 XBMC 可以直接索引所有电影,使用 themoviedb.org 来获取电影海报、介绍、演员等信息,使用 IMDb 来获取电影的评分。使用 OpenMediaVault 来管理存储,设置共享文件夹等。

    在设置成功 VA-API 后,XBMC 就可以使用显卡的硬件加速了,在播放 1080P 时,CPU 占用基本在 20% 左右,还算比较不错了。

    当然,在一开始我也可以选择使用 Windows 系统,XBMC 也有 Windows 版本,在 Windows 上基本也不用操心驱动程序的事情,而且 Windows 上设置 Samba 共享也是很方便的。

    注意:本篇文章都是以 AMD E350 APU 来讲安装过程的,如果你用的主板并不是 E350,或者型号与我使用的不完全一致,可能安装过程会有不同。另外,因为 OpenMediaVault 是基于 Linux 的,所以这需要你懂一些 Linux 知识。

    PS. 另外,本篇文章的操作都是直接使用 root 账户进行,如果你在安装的时候使用了非 root 账户,那么多数操作可能需要加 sudo 来运行。

    硬件

    • 机箱:万由 N400 4盘位 NAS 机箱
    • 主板:梅捷 SY-E350-U3M
    • 内存:芝奇 G.Skill DDR3 1333 4G
    • 电源:肯亿 200W 小 1U 电源
    • 系统磁盘:SSK SFD201 USB3.0 16G U盘

    因为都是在促销,或者优惠的时候购买的,不包邮费总价在 1400 元左右。

    软件

    • 基础系统:Debian Squeeze
    • NAS 系统:OpenMediaVault
    • 媒体中心:XBMC 10.1 Dharma

    安装系统

    创建 OpenMediaVault 安装盘

    因为是用的 NAS 机箱,上面是没有光驱位的,而且我也没有现成的光驱可以用,因为需要用 U 盘来引导安装系统。

    首先需要准备一个 512M 以上的 U 盘,然后从 openmediavault.org 下载最新版本的 OpenMediaVault,再使用下面的命令将镜像恢复到 U 盘上:

    sudo dd if=openmediavault_0.2.5_i386.iso of=/dev/disk1 bs=4096
    

    注意:disk1 是在我的机器上 U 盘所在的位置,另外,在 dd 恢复镜像的时候,要使用 /dev/disk1,而不是 disk1s1,disk1s1 就会将镜像恢复到某个分区而不是整个 U 盘了。

    启动盘注意事项

    因为是用的 USB 3.0 的 U 盘,我在安装系统的时候,把 U 盘插在了 USB 3.0 的接口上,但是在系统安装程序启动之后,USB 3.0 的 U 盘没有自动识别出来,因此要将 USB 3.0 的 U 盘插在 USB 2.0 的口上。

    在安装的过程中,可以将 Debian 源的地址修改为网易的源镜像,这样安装软件的速度更快一些,网易源的地址为:

    http://mirrors.163.com/debian/
    

    安装基本软件

    先安装一些基本的软件,包括 X.org,Gnome,GDM3,Vim 和 less:

    apt-get install xorg gnome-core gdm3 vim less
    

    Gnome 和 GDM3 其实到后面都不会用到,但是在运行一些需要图形界面的工具时,例如 glxinfo、fglrxinfo,就需要有 X 支持了。

    设置 debian-multimedia 源

    为了让一些包默认使用 debian-multimedia 的源,先将 debian-multimedia 的源添加到 /etc/apt/sources.list

    deb http://www.debian-multimedia.org squeeze main non-free 
    

    并将所有其他源行首添加 # 注释掉,运行 apt-get update 更新源。

    在更新完成之后,再将其他源行首的 # 删掉,再次运行 apt-get update 更新源。

    安装 debian-multimedia keyring

    apt-get install debian-multimedia-keyring
    

    设置 XBMC 用户

    添加一个用户 xbmc 用户来运行 XBMC:

    useradd -m -s /bin/bash xbmc
    passwd xbmc
    

    设置用户 openmediavault 密码

    在后面的设置过程中,可能需要管理员权限,而这个时候是用的 openmediavault 这个用户,我不清楚这个用户的默认密码是什么,所以需要先设置这个用户的密码:

    passwd openmediavault
    

    启用 SSH

    在安装完 OpenMediaVault 之后,就可以直接访问它的 Web 界面了,建议启用 SSH 以便直接在本机进行操作,省去使用键盘看着电视操作的麻烦。

    OpenMediaVault 默认的管理员用户名为 admin,密码为 openmediavault

    继续阅读 »

    一个路由器,两种网络,VPN和下载两不误

    最近在用 Titanium 写一个 Twitter 客户端,因为要用到 OAuth 认证,所以就在手机连接 VPN,但是速度比较慢。刚好想在家里的路由器上加上 OpenVPN,昨天就折腾了一下。

    在家里路由器上加上 OpenVPN 的一个主要问题是,家里的网络中还有下载机,而下载的流量是不想通过 VPN 去传输的。虽然 chnroutes 项目的路由表可以让国内的 IP 走直连,国外的 IP 走 VPN,但是 eMule 或者 BT 下载时,难免会连接到国外的用户或者服务器,这个时候也不想去浪费 VPN 的流量。

    因为这些,我的想法是在路由器上做判断,如果是从下载机过来流量,就通过直接连接,如果其他机器,例如笔记本,就根据目标 IP 来判断是通过直接连接还是 VPN 来传输。

    下载机是通过 LAN 连接到路由器的,本来想按进入流量的设备来判断是否为下载机,后来发现实现比较麻烦,就决定按流量来源 IP 来判断是否为下载机的数据。

    准备工作

    • 运行 dd-wrt 的路由器一个,要带有 OpenVPN
    • OpenVPN 服务器一个,认证方式选择证书认证
    • Linux 知识若干

    当然 dd-wrt 并不是必须的,也可以是 openwrt 或者 tomato 之类,只要带有 OpenVPN 就行,如果不带 OpenVPN,就需要在启动过程中去外部下载相关的软件,那就是另外的内容了,暂且不提。

    网络分段

    因为要按 IP 来区分流量是否要走 VPN,因此要先划分一下局域网里要用到的 IP 段。

    路由器的 IP 是 192.168.2.1,DHCP 分配范围为 192.168.2.100~149,按照需求将一个 /24 的网段分为三个部分:

    • 192.168.2.16~31,此 IP 段的设备流量均走直连
    • 192.168.2.32~63,此 IP 段的设备流量根据目标 IP 判断走直连还是走 VPN
    • 192.168.2.100~149,此 IP 段为 DHCP 分配的 IP 段,流量也根据目标 IP 来判断是否走 VPN

    因为 DHCP 分配的 IP 并不可控,所以将流量走直接的设备,例如下载机,通过静态 IP 的方式,直接分配一个在 192.168.2.16~32 中固定 IP,可以保证不会连接到有 VPN 的网络。

    路由策略表

    先创建一个用来直连的路由策略表,用来将所有指定 IP 段的流量走直连。

    # 添加一个路由策略表,此表针对 192.168.2.16/28 IP 段有效
    ip rule show | grep "lookup 10" || ip rule add from 192.168.2.16/28 ta 10
    
    # 设置策略表的默认路由
    WAN_IP=`ifconfig ppp0 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f1`
    ip route replace 192.168.2.0/24 dev br0 proto kernel scope link src 192.168.2.1 ta 10
    ip route replace 127.0.0.0/8 dev lo  scope link
    ip route replace 169.254.0.0/16 dev br0  proto kernel  scope link  src 169.254.255.1
    ip route replace default via $WAN_IP dev ppp0 ta 10
    

    将以上代码保存在 dd-wrt 的 Filewall Script 中,这样在每次 WAN IP 改变的时候,都可以更新这个路由策略表了。

    OpenVPN 配置

    OpenVPN 按默认配置即可,需要注意的是,路由器上的 tun mtu、tun mtu extra 以及 mssfix 需要与服务器一致,或者服务器与路由器上的配置一致。

    因为要用到 chnroutes,但是 dd-wrt 中的 OpenVPN 配置并不支持自定义配置,没办法添加 route 选项,因此要把这些选项放到 OpenVPN 服务端的配置文件中,使用 push 指令在连接时推送到客户端来。

    例如:

    push "route 1.0.0.0 255.255.0.0 net_gateway 5"
    

    另外一有点需要注意,如果在 dd-wrt 中同时启用了 OpenVPN Daemon,建议将 OpenVPN Daemon 的启动方式设置为“System Startup”而不是“WAN Up”,在我的路由器上,使用“WAN Up”时 OpenVPN Daemon 和 OpenVPN Client 会冲突,导致 OpenVPN Client 启动失败。

    解决 max-routes

    OpenVPN 客户端,默认最多只能添加 100 条路由记录,但是 chnroutes 正常生成的路由表,可能会在 1000 条以上,因此 100 条是远远不够的。

    这个可以通过 max-routes 配置项来解决,本来打算这个配置同样从服务端推送过来,但是 OpenVPN 现在并不支持 push “max-routes 1500” 这样的指令。

    在 dd-wrt 的 OpenVPN 配置中,也没有相应的选项,为了解决这个问题,只能采取一个比较取巧的办法来解决。dd-wrt 中的 OpenVPN 配置都是存在 nvram 中的,在 dd-wrt 启动后,会自动从 nvram 中取 OpenVPN 的相关配置,组合成一个 openvpn.conf,而这个配置除了可以在 dd-wrt 的 Web 界面中修改,还可以直接 SSH 到 dd-wrt 上,直接使用 nvram 命令修改。

    在这里要 hack 的配置是 mssfix,当然其他的属性也可以,选择 mssfix 是因这个属性比较简单,改起来方便。

    我这里设置了 mssfix 为 1400,另外服务器要推送的路由表为 1300 条左右,直接将 max-routes 设置为 1500,在路由器上运行下面这个指令:

    nvram set openvpncl_mssfix="1400
    max-routes"
    

    需要注意的是,一定要分两行来输入,否则生成的 openvpn.conf 中,mssfix 1400 和 max-routes 1500 会在同一行而导致配置失效。

    这样在生成的 OpenVPN 配置文件中,就有了 max-routes 选项,服务端也可以正常推送路由表了。

    不过这样也有一点坏处,那就是如果再修改了 OpenVPN 配置并保存,会把 mssfix 中的那个回车给去掉,再次导致连接失败。不过 OpenVPN 一旦配置完成,也不会经常改动,倒也不是很大的问题。

    配置 DNSMasq

    一般手机上连接上 WiFi 的时候,设置 DNS 等内容会比较麻烦,而如果不设置 DNS,会导致在手机上解析域名时,使用了国内的 DNS 服务器,而这也会导致一些问题,可以按照 autoddvpn 中的说明,将 DNS 设置为 Google Public DNS 和 OpenDNS:

    8.8.8.8
    8.8.4.4
    208.67.222.222
    

    打完收工

    配置完成之后,就可以方便的分配家庭局域网里设备的流量走向了,想要设备的流量走直连,只要分配到 192.168.2.16~31 这个 IP 段就可以了,至于其他的设备,可以使用静态 IP,也可以直接使用 DHCP 分配。

    嗯,这样再在真机上调试 Twitter 客户端之类的程序就方便了。

    PS. 非常感谢 @tjmao 在折腾过程中帮助。

    参考资料

    1. autoddvpn: DNSMasq
    2. OpenVPN 2.1 Manual
    3. linux 高级路由及流量控制总结
    4. ip(8)
    5. route(8)
    6. ddwrt: Hardware

    — EOF —

    My Book Live 评测

    早上到手,开箱照见 My Book Live 开箱照

    之前做过 DS211j 的性能评测,这次也主要做一些传输性能的评测,另外加一些功能介绍。

    在很早之前,就关注过西数的 My Book 系列,My Book World Edition 也是带网络接口的,不过价格相对较高,而且性能也是很强,性价比不高。前段时间在 Hi!PDA 看到别人发的 My Book Live 介绍之后就看了一下,目前的价格降到合适的位置,刚好下载机的硬盘坏了,就入手了一个 My Book Live。

    基本信息

    型号:WDBACG0010HCH-SESN

    内核:

    Linux MyBookLive 2.6.32.11-svn22400 #2 Fri Apr 15 11:08:36 PDT 2011 ppc GNU/Linux
    

    CPU 和 内存:

    MyBookLive:~# cat /proc/cpuinfo 
    processor   : 0
    cpu     : APM82181
    clock       : 800.000008MHz
    revision    : 28.129 (pvr 12c4 1c81)
    bogomips    : 1600.00
    timebase    : 800000008
    platform    : PowerPC 44x Platform
    model       : amcc,apollo3g
    Memory      : 256 MB
    

    默认数据分区格式为 ext4:

    /dev/sda4 on /DataVolume type ext4 (rw,noatime,nodelalloc)
    

    实际可用容量只有 992G,还是用 1K 的进制算的⋯⋯

    MyBookLive:~# df -H
    Filesystem             Size   Used  Avail Use% Mounted on
    tmpfs                   53M      0    53M   0% /lib/init/rw
    udev                    11M   6.9M   3.7M  65% /dev
    tmpfs                   53M      0    53M   0% /dev/shm
    rootfs                 2.1G   1.1G   865M  55% /
    tmpfs                   53M   3.4M    50M   7% /tmp
    ramlog-tmpfs            21M   2.5M    19M  12% /var/log
    /dev/sda4              992G   6.7G   986G   1% /DataVolume
    

    配置相对来说还不错,像 DS211j 也只有 128M 的内存⋯⋯

    传输速度测试

    传输性能测试环境:

    • My Book Live 1TB
    • MacBook Pro with SSD
    • Buffalo WZR-HP-G300NH
    • 网络环境:有线千兆LAN,无线 802.11n @ 130Mbps
    • 测试文件:Mac OS X Lion GM 文件,大小 3.75GB

    小文件传输基本上和文件个数有关,就不做测试了。

    LAN 上传

    速度基本上稳定在 42MB/s 左右,和

    继续阅读 »

    WD My Book Live 开箱照

    下载机的硬盘快挂了,MSS 是很老的东西,再买块硬盘挂上也不爽,刚好最近看到西数的 My Book Live,配置还不错,刚好入一个当下载机。

    不过买了之后才想到,我已经有 DS211j,也可以当下载机⋯⋯不过 My Book Live 配置还不错,可以同时挂更多任务了。

    — EOF —