-
Notifications
You must be signed in to change notification settings - Fork 0
/
CiosRaspberryHat.py
141 lines (131 loc) · 4.7 KB
/
CiosRaspberryHat.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#-*- coding:utf-8 -*-
from websocket import create_connection
import sys
import json
import time
import os
from sense_hat import SenseHat
#
# CiosRaspberryHat
#
# CiosとRaspberryPI3+SenseHatを接続するクラス
# websocket, SenseHatModuleを使用
#
class CiosRaspberryHat:
#
# Constructor
#
# url string WebsocketのURL
# channel_id string CiosのチャネルID
# access_token string Ciosのアクセストークン
#
def __init__(self,url,channel_id,access_token):
self.url = url
self.channel = channel_id
self.token = access_token
self.ws = 0
self.sense = SenseHat() # SenseHat インスタンス作成
self.sense.set_imu_config(True, True, True) # 加速度センサーの有効化
self.connectCount = 0
self.screen = "top"
#
# connection
#
# WebSocketへのコネクションを貼る
#
def connection(self):
try:
ws_url = self.url + "?" + "channel_id=" + self.channel + "&access_token=" + self.token
print("--------------- WebSocket Connection ---------------")
print("ConnectionURL: "+ ws_url)
print("--------------- WebSocket Connection ---------------")
self.sense.show_letter("C",text_colour=[0,255,255])
self.ws = create_connection(ws_url)
except:
print("Websocket Connection Error...")
self.sense.show_letter("E",text_colour=[255,0,0])
self.errorReConnect()
return "error"
#
# getSensorData
#
# SenseHatからのデータを取得、JSON整形を行う
# return: Json String
#
def getSensorData(self):
try:
humidity = self.sense.get_humidity()
temp = self.sense.get_temperature()
pressure = self.sense.get_pressure()
orientation = self.sense.get_orientation_degrees()
compass = self.sense.get_compass_raw()
gyroscope = self.sense.get_gyroscope_raw()
accelerometer = self.sense.get_accelerometer_raw()
message = {
"humidity": humidity,
"temperature":temp,
"pressure": pressure,
"degrees_p": orientation["pitch"],
"degrees_r": orientation["roll"],
"degrees_y": orientation["yaw"],
"compass_x": compass["x"],
"compass_y": compass["y"],
"compass_z": compass["z"],
"gyroscope_x": gyroscope["x"],
"gyroscope_y": gyroscope["y"],
"gyroscope_z": gyroscope["z"],
"accelerometer_x":accelerometer["x"],
"accelerometer_y":accelerometer["y"],
"accelerometer_z":accelerometer["z"]
}
send_message = json.dumps(message)
return send_message
except:
print("getSensorData Error...")
self.ws.close()
self.sense.show_letter("E",text_colour=[255,0,0])
self.errorReConnect()
return "error"
#
# sendMessage
#
# message string 送信するメッセージ(Json形式)
#
def sendMessage(self,message):
try:
print("--------------- WebSocket Send Message ---------------")
print(message)
print("--------------- WebSocket Send Message ---------------")
self.ws.send(message)
except:
print("Websocket Send Error...")
self.ws.close()
self.sense.show_letter("E",text_colour=[255,0,0])
self.errorReConnect()
return "error"
#
# Error ReConnect WebSocket
#
# message string 送信するメッセージ(Json形式)
#
def errorReConnect(self):
try:
if self.connectCount > 0: # ErrorCount カウント数以上のエラーで停止
raise
self.connectCount += 1
for v in range(self.connectCount): # Error数に応じて、待機時間を追加
print("Wait ::: "+str(self.connectCount-v)+" sec")
time.sleep(1)
self.connection()
except:
print("Websocket connection Error count : "+str(self.connectCount)+" Over")
self.sense.show_letter("E",text_colour=[255,0,0])
time.sleep(0.5)
self.sense.show_letter("E",text_colour=[0,255,0])
time.sleep(0.5)
self.sense.show_letter("E",text_colour=[0,0,255])
time.sleep(0.5)
self.sense.show_letter("E",text_colour=[255,0,0])
time.sleep(2)
self.sense.clear()
exit()