・Raspi に BME280 温湿度気圧センサーを付けて alexa に 室温 を喋らせてみました。
2020/5/17現在のものです。
色々とネットで先人の方達のお知恵をお借りしてやっとできました。
ありがとうございます。プログラムなどは、自己責任でお使いください。
P1
P2
P3
P4
P5
◆I2C(BME280)関係は、下記URLを参照してセットアップします。
Raspberry Pi で温湿度気圧センサを使う
https://qiita.com/yukataoka/items/8f9046587c978e91f689
P6
◆簡易HTTPサーバーコード(~/app/alexa/server.py)
P7
◆Alexaスキルの応答コード (~/app/alexa/cgi-bin/bme280web.py)
#############################################################
P8
P9
P10
下記URLを参照し、Alexaスキルを作成します。
◆ngrokのダッシュボードで確認して、スキルのエンドポイントに設定する。
P11
おしまい
2020/5/17現在のものです。
色々とネットで先人の方達のお知恵をお借りしてやっとできました。
ありがとうございます。プログラムなどは、自己責任でお使いください。
Alexaに部屋の温度と湿度を教えてもらう
P1
P2
P3
P4
P5
◆I2C(BME280)関係は、下記URLを参照してセットアップします。
Raspberry Pi で温湿度気圧センサを使う
https://qiita.com/yukataoka/items/8f9046587c978e91f689
P6
◆簡易HTTPサーバーコード(~/app/alexa/server.py)
#############################################################
import http.server
import http.server
server_address = ("", 8000)
handler_class = http.server.CGIHTTPRequestHandler #ハンドラを設定
simple_server = http.server.HTTPServer(server_address, handler_class)
simple_server.serve_forever()
◆indexファイル(~/app/alexa/index.html)
#############################################################
<html>
<html>
<body>
Hello Raspi HTTPServer.
</body>
</html>
P7
◆Alexaスキルの応答コード (~/app/alexa/cgi-bin/bme280web.py)
#############################################################
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from smbus2 import SMBus
import time
import json
class Bme280:
def __init__(self, busNumber=1, i2cAddress=0x76):
self.bus = SMBus(busNumber)
self.i2cAddress = i2cAddress
self.digT = []
self.digP = []
self.digH = []
self.timeFine = 0.0
self.presRaw = 0.0
self.tempRaw = 0.0
self.humRaw = 0.0
osrsT = 1 #Temperature oversampling x 1
osrsP = 1 #Pressure oversampling x 1
osrsH = 1 #Humidity oversampling x 1
mode = 3 #Normal mode
tSb = 5 #Tstandby 1000ms
filter = 0 #Filter off
spi3wEn = 0 #3-wire SPI Disable
ctrlMeasReg = (osrsT << 5) | (osrsP << 2) | mode
configReg = (tSb << 5) | (filter << 2) | spi3wEn
ctrlHumReg = osrsH
self.writeReg(0xF2,ctrlHumReg)
self.writeReg(0xF4,ctrlMeasReg)
self.writeReg(0xF5,configReg)
self.getCalibParam()
self.readData()
def writeReg(self, regAddress, data):
self.bus.write_byte_data(self.i2cAddress, regAddress, data)
def getCalibParam(self):
calib = []
for i in range (0x88,0x88+24):
calib.append(self.bus.read_byte_data(self.i2cAddress,i))
calib.append(self.bus.read_byte_data(self.i2cAddress,0xA1))
for i in range (0xE1,0xE1+7):
calib.append(self.bus.read_byte_data(self.i2cAddress,i))
self.digT.append((calib[1] << 8) | calib[0])
self.digT.append((calib[3] << 8) | calib[2])
self.digT.append((calib[5] << 8) | calib[4])
self.digP.append((calib[7] << 8) | calib[6])
self.digP.append((calib[9] << 8) | calib[8])
self.digP.append((calib[11]<< 8) | calib[10])
self.digP.append((calib[13]<< 8) | calib[12])
self.digP.append((calib[15]<< 8) | calib[14])
self.digP.append((calib[17]<< 8) | calib[16])
self.digP.append((calib[19]<< 8) | calib[18])
self.digP.append((calib[21]<< 8) | calib[20])
self.digP.append((calib[23]<< 8) | calib[22])
self.digH.append( calib[24] )
self.digH.append((calib[26]<< 8) | calib[25])
self.digH.append( calib[27] )
self.digH.append((calib[28]<< 4) | (0x0F & calib[29]))
self.digH.append((calib[30]<< 4) | ((calib[29] >> 4) & 0x0F))
self.digH.append( calib[31] )
for i in range(1,2):
if self.digT[i] & 0x8000:
self.digT[i] = (-self.digT[i] ^ 0xFFFF) + 1
for i in range(1,8):
if self.digP[i] & 0x8000:
self.digP[i] = (-self.digP[i] ^ 0xFFFF) + 1
for i in range(0,6):
if self.digH[i] & 0x8000:
self.digH[i] = (-self.digH[i] ^ 0xFFFF) + 1
def readData(self):
data = []
for i in range (0xF7, 0xF7+8):
data.append(self.bus.read_byte_data(self.i2cAddress,i))
self.presRaw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
self.tempRaw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
self.humRaw = (data[6] << 8) | data[7]
def getPressure(self):
pressure = 0.0
v1 = (self.timeFine / 2.0) - 64000.0
v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * self.digP[5]
v2 = v2 + ((v1 * self.digP[4]) * 2.0)
v2 = (v2 / 4.0) + (self.digP[3] * 65536.0)
v1 = (((self.digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8) + ((self.digP[1] * v1) / 2.0)) / 262144
v1 = ((32768 + v1) * self.digP[0]) / 32768
if v1 == 0:
return 0
pressure = ((1048576 - self.presRaw) - (v2 / 4096)) * 3125
if pressure < 0x80000000:
pressure = (pressure * 2.0) / v1
else:
pressure = (pressure / v1) * 2
v1 = (self.digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
v2 = ((pressure / 4.0) * self.digP[7]) / 8192.0
pressure = pressure + ((v1 + v2 + self.digP[6]) / 16.0)
return pressure/100
def getTemperature(self):
v1 = (self.tempRaw / 16384.0 - self.digT[0] / 1024.0) * self.digT[1]
v2 = (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * (self.tempRaw / 131072.0 - self.digT[0] / 8192.0) * self.digT[2]
self.timeFine = v1 + v2
temperature = self.timeFine / 5120.0
return temperature
def getHumidity(self):
varH = self.timeFine - 76800.0
if varH != 0:
varH = (self.humRaw - (self.digH[3] * 64.0 + self.digH[4]/16384.0 * varH)) * (self.digH[1] / 65536.0 * (1.0 + self.digH[5] / 67108864.0 * varH * (1.0 + self.digH[2] / 67108864.0 * varH)))
else:
return 0
varH = varH * (1.0 - self.digH[0] * varH / 524288.0)
if varH > 100.0:
varH = 100.0
elif varH < 0.0:
varH = 0.0
return varH
temp=20
humi=20
pres=1000
sensor = Bme280()
temp=format(sensor.getTemperature(),'.1f')
humi=format(sensor.getHumidity(),'.1f')
pres=sensor.getPressure()
speak = "現在書斎の室温は{0}度。湿度は{1}パーセント。気圧は{2}ヘクトパスカルです。".format(float(temp), float(humi),int(pres))
resp = {
"version": "1.0",
"response": {
"outputSpeech": {
"ssml": "<speak>" + speak + "</speak>",
"type": "SSML"
},
"speechletResponse": {
"outputSpeech": {
"ssml": "<speak>" + speak + "</speak>"
},
"shouldEndSession": True
}
},
"sessionAttributes": {}
}
print("Content-type: application/json\n")
print(json.dumps(resp))
#############################################################
P8
◆Webサーバーの起動
$ cd /home/pi/app/alexa
$ python3 server.py
◆Linux (ARM)版をインストール
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ sudo mv ngrok /usr/local/bin/
$ ngrok version
ngrok version 2.2.8
$ ngrok authtoken (自分の認証トークン((authtoken)
◆ngrokで外部に公開します。
$ ngrok http 8000
P9
P10
下記URLを参照し、Alexaスキルを作成します。
◆ngrokのダッシュボードで確認して、スキルのエンドポイントに設定する。
Alexaに部屋の温度と湿度を教えてもらう
◆アレクサ スキル開発
◆Alexa公式 動画シリーズ「Alexa道場」
P11
おしまい
コメント