玩玩智能家居5:DIY水浸传感器

之前总是担心厨房水槽下水管会漏水,所以直接用雨水传感器做了一个水浸传感器,这样在漏水的时候,就可以直接收到通知,从而及时去检查并修复下水管漏水问题。

要 DIY 一个水浸传感器还是很简单的,只需要一个雨水传感器和一个 NodeMCU 就可以了。

雨水传感器

给 NodeMCU 刷上 ESPEasy,配置一个 Switch 设备,将 GPIO 设置为 NodeMCU 与雨水传感器 DO 针脚连接的 IO 就可以了。

然后再在 Domoticz 中配置好一个 Virtual Sensor,类型改为 Switch 就可以了。

报警声音

有些时候推送通知会比较慢,又或者手机不在身边,那么是否可以直接在 NodeMCU 这一端直接使用声音报警呢?这很简单,加个蜂鸣器模块,再写点代码就好了。

先给 ESPEasy 写个蜂鸣器插件,关键代码就是使用 Arduino 的 tone 函数了:

#define Plugin158_Do 262
#define Plugin158_Re 294
#define Plugin158_Mi 330
#define Plugin158_Fa 


阅读全文 »

玩玩智能家居4:InfluxDB & Grafana

在接入了很多传感器到 Domoticz 之后,终于可以全面监控家里的各种环境参数了,例如温度、湿度、PM 2.5、二氧化碳浓度等等。

Domoticz 虽然已经自带了传感器数据日志,但是一来详细数据最多只能保存七天,二来只能单独查看每个传感器的数据,而不能将多个传感器数据放在一起对比查看,所以就需要使用其他方式去保存和展示传感器历史数据。

InfluxDB

InfluxDB 是一个时序数据库,很方便用来保存时间序列数据,而各种传感器数据其实就是一个时间序列化数据,InfluxDB 的介绍页面也说了很适合于 IoT Sensors 数据的保存。

使用 InfluxDB 最方便的方式就是用 Docker 了,直接在 DSM 的 Docker 中添加 influxdb 镜像,然后启动一个容器就可以了。

当然这里要记得添加一下端口映射,后面在配置 Domoticz Data Push 的时候需要用到。

Domoticz Data Push

部署好了 InfluxDB,就可以在 Domoticz 里面配置把接收到的传感器数据同时推送到 InfluxDB 中保存了。

Domoticz 提供了两种方式可以用来将传感器数据推送到 InfluxDB 中,一种使用 HTTP 调用 InfluxDB 的 HTTP API,还有一种是直接使用 Domoticz 内建的 …

阅读全文 »

玩玩智能家居3:PlatformIO

ESPEasy 虽然方便,但是毕竟很久没有维护了,里面对硬件的支持也不是很完全,并且在使用有些模块时,与 Domoticz 对接可能会有一些问题,例如 CO2 传感器在发送数据到 Domoticz 时,发送的数据字段就不正确。

在这个时候就需要自己来修改 ESPEasy 代码,重新编译并烧录到 NodeMCU 中,而修改代码就需要用到 IDE 了。ESPEasy 是一个 Arduino 项目,自然用 Arduino IDE 来开发是最直接的。

但是 Arduino IDE 是一个相当古老的程序了,虽然版本号更新到了 1.8,但是在使用的时候有很多功能都不够完善,例如代码自动补全、符号定位、语法着色等。

这个时候就在网上找到了 PlatformIO 这个项目,它提供了基于 Atom 或者 Visual Studio Code 的 IDE 项目 PlatforIO IDE。

PlatformIO IDE

要安装 PlatformIO IDE 很简单,在 Atom 的设置中打开 Packages,直接搜索 platformio ,安装platformio-ide …

阅读全文 »

玩玩智能家居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 …

阅读全文 »

玩玩智能家居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 …

阅读全文 »

玩玩智能家居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 系统中。…

阅读全文 »

使用 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


阅读全文 »

使用 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

阅读全文 »

[笔记] Objective-C 中模拟泛型及 Xcode 格式化代码插件

记录一些 iOS & OS X 开发过程中学到或有趣的东西。

Objective-C 中模拟泛型

今天看到的一个辅助代码,可以在 Objective-C 代码中添加泛型的支持:

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部份,那些部份在使用前必須作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。(via )

泛型一般出现在 .NET、Java 或 C++ 的代码里面。

在 Objective-C 里面,像数组之类的容器,在取单个元素时,返回类型都是 id,这个时候如果要使用返回对象的一些属性,就需要先转换一下类型,或者使用 getter 方法来获取。

如果用了泛型之后,就很方便了,可以直接以 arr.lastObject.prop 的方式来访问。

使用了上面这个代码使 Objective-C 支持泛型后,就可以像下面这样写代码了:

generics example

这个辅助代码是一个大宏,给 Objective-C 添加泛型支持是以以下几个方面来做到的,例如给 MyClass 添加泛型支持来说明:

  1. 定义一个 MyClass 的 Protocol
  2. 给各个容器类(例如 NSArray、NSMutableArray、NSSet)添加 Category,重新定义各个容器操作方法的返回值和参数类型
    1. 获取单个元素的方法返回值类型修改为 MyClass *
    2. 返回容器的方法返回值类型修改为 NSArray<myclass> *
    3. 参数类型同样处理


阅读全文 »

在 Sandboxed Mac App 中嵌入第三方可执行文件

之前开源了 一个 gitstats 的 GUI 应用 GitStatX,在提交到 GitHub (GitStatX) 之后,又准备提交到 Mac App Store。

在提交到 Mac App Store 之后,出现了一些问题,程序中包含的第三方可执行文件没有签名,导致苹果拒绝了提交的程序包:

App sandbox not enabled - The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list. Refer to the App Sandbox page for



阅读全文 »