TL;DR --Switchbot thermo-hygrometer data acquired with Raspberry Pi --Publish the acquired data as API with Node-RED
It has nothing to do with work.
For my home hack, I decided to start recording temperature and humidity again. In the past, I used to attach BME280 to the Rapberry Pi to measure temperature and humidity. After all, it looks bad if it is made by myself, and there was a problem that it could not be installed in the place you want to install due to the power supply of Raspberry Pi.
Therefore, I searched for a "cheap", "good-looking", and "battery-powered" thermo-hygrometer that can communicate with Bluetooth, Wifi, etc.
https://www.switchbot.jp/meter
The SwitchBot thermo-hygrometer allows you to easily check the temperature and humidity of your home. It is a convenient smart thermo-hygrometer that allows you to check alarms and history with the app. (Quote: https://www.switchbot.jp/meter)
As you can see from the page of the head family, it looks like a liquid crystal type thermo-hygrometer. Despite the price of about 2000 yen, it is compatible with Bluetooth, and you can visualize temperature and humidity information using iOS and Android apps.
But ... ** I was completely lacking in my research **, I wrote that it works with cloud services, but it means that you need to purchase Hub separately ... It seems that there is no API for acquiring temperature and humidity information even if they are linked, so I decided to create an API myself.
It is necessary to obtain temperature and humidity information for both rabbits and horns. This time, I used a Raspberry Pi that has been left unused in any home.
--Case: Raspberry Pi 3 Model B
Get a list of devices using python and bluepy.
import bluepy
scanner = bluepy.btle.Scanner(0)
devices = scanner.scan(5)
for device in devices:
print('address : %s' % device.addr)
Execution result
address : 6d:a3:xx:0a:f5:ae
address : e1:bb:xx:2a:fb:e0
address : 2c:26:xx:16:24:38
address : b8:78:xx:3d:3d:e5
address : 5e:93:xx:39:80:39
address : c8:84:xx:53:9a:52
address : 5d:e3:xx:2a:cc:76
address : d3:f2:xx:ac:97:42
address : 52:75:xx:4c:38:b5
address : 72:5f:xx:cd:b0:8d
address : 47:db:xx:64:cd:78
address : c8:84:xx:4f:71:3e
address : 4f:a5:xx:85:3a:97
address : 42:e0:xx:b9:61:5d
address : 5f:53:xx:ed:71:4b
address : 53:c6:xx:62:e5:ce
address : 68:ea:xx:4e:14:1d
address : 6b:22:xx:12:24:d1
address : 60:09:xx:37:11:f3
When I checked from the SwitchBot iOS app this time, e1: bb: xx: 2a: fb: e0 is the MAC address of the Switchbot thermo-hygrometer. Since the MAC address also exists in the acquisition result on the Raspberry Pi, it was found that the device can be recognized on the Raspberry Pi as well.
Extract temperature and humidity data from BLE of SwitchBot. I was enthusiastic about packet analysis, but some people have already implemented BLE packet analysis and output, so I used it as a reference. Read SwitchBot thermo-hygrometer readings directly from BLE Advertisement packets
This time, the following changes were made to create the API for the SwitchBot thermo-hygrometer.
--Receive MAC address as an argument --Set output format to json
Execution result
# python3 switchbot-meter.py e1:bb:xx:2a:fb:e0
{
"isHumidityLowAlert": "False",
"isTemperatureUnitF": "False",
"isDualStateMode": "False",
"isHumidityHighAlert": "False",
"isTemperatureLowAlert": "False",
"isEncrypted": "False",
"isStatusOff": "False",
"temperature": "26.0",
"isTemperatureHighAlert": "False",
"humidity": "29",
"battery": "100"
}
Use Node-RED to create the API part. Node-RED is a tool that can express and program the flow of data input / output and processing using GUI.
Node-RED is a flow-based programming tool, originally developed by the IBM Emerging Technology Services team and is now part of the JS Foundation.
When creating the API part, it can be implemented using Flask etc., but it is realized by Node-RED.
The nodes used this time are as follows.
http in http://ip/sensors/macaddressをGETする方法 How to POST {"mac": "mac address"} with json to http: // ip / sensors /
The former works, but since the MAC address contains a colon :, it is necessary to confirm the RFC to be exact. Others are as follows
--function: Store the object received by http in in msg.payload. --exec: Executing a local python script --http response: Returns json of script execution result to client --debug: for when an error occurs
Try hitting the API created by Node-RED from your client machine.
~ » curl -X POST -H 'Content-Type:application/json' -d '{"mac":"e1:bb:xx:2a:fb:e0"}' http://192.168.11.41:1880/sensors/ onodes@Casper3
{
"isTemperatureLowAlert": "False",
"isHumidityHighAlert": "False",
"isDualStateMode": "False",
"isTemperatureHighAlert": "False",
"isEncrypted": "False",
"battery": "100",
"isTemperatureUnitF": "False",
"humidity": "26",
"isHumidityLowAlert": "False",
"isStatusOff": "False",
"temperature": "29.1"
}
Apparently it worked fine.
This time, I used Node-RED to create an API for the Switchbot thermo-hygrometer. For those without WebAPI, you can easily have WebAPI by inserting a tool such as Node-RED. However, since you are hitting the script directly, you need to be careful about security.
Recommended Posts