――Weil ich für ein Unternehmen arbeite, bin ich tagsüber oft abwesend und kann bei Regen keine Wäsche aufnehmen. Aus diesem Grund wird Wäsche grundsätzlich in Innenräumen getrocknet. ――Das Sonnenlicht im Trockenraum ist jedoch schlecht, und das Trocknen verläuft im Winter nicht wie erwartet, sodass der Zeitpunkt für die Aufnahme möglicherweise verfehlt wird und sich die Wäsche in einem Teufelskreis des Sammelns im Schneedalma-Stil befindet. ――Um diesen Teufelskreis zu durchbrechen (?), Haben wir einen Mechanismus erstellt, mit dem die Trocknungszeit der Wäsche berechnet und dem Smartphone mitgeteilt werden kann.
(1) Was ist notwendig, um die Umgebung auf der Geräteseite aufzubauen? Es kann bei Akizuki Electronics erworben werden. http://akizukidenshi.com/catalog/top.aspx
(2) Notwendig zum Aufbau der Umgebung auf der Serverseite. Sie benötigen ein AWS- und Slack-Konto. AWS: https://aws.amazon.com/jp/ Slack: https://slack.com/intl/ja-jp/
Produktname | Menge | Verwenden |
---|---|---|
① RaspberryPi ZeroWH | 1 | Mikrocomputer steuern |
① Brotbrett | 1 | Für den Schaltungsaufbau |
① DHT11 | 1 | Temperatur- und Feuchtigkeitssensor |
① Widerstand (4.7kΩ) | 2 | |
① Widerstand (1 kΩ) | 1 | |
① Taktschalter | 1 | Start / Stopp-Schalter |
① LED | 1 | Leuchtet beim Start auf (zur visuellen Bestätigung) |
② AWS IoT Core | Beenden Sie die Kommunikation mit dem Terminal. Die Rolle des MQTT-Brokers. | |
② AWS Lambda | IoT Core Backend. Vermittlung der Kommunikation mit Slack. | |
② Slack | Wird zur Benachrichtigung von Smartphones verwendet |
RaspberryPi --- AWS IoT Core --- AWS Lambda --- Slack --- Smartphone
AWS IoT Core
Erstellen Sie das X.509-Zertifikat, das zur Authentifizierung der Verbindung mit AWS IoT Core erforderlich ist. Erstellen Sie als Erstellungsverfahren zunächst eine Richtlinie (Berechtigungsinformationen für AWS-Ressourcen) im Voraus und hängen Sie die Richtlinie dann an das Zertifikat an.
--Wählen Sie den AWS IoT Core-Service in der AWS Management Console aus und erstellen Sie eine Richtlinie unter "Sicherheit" -> "Richtlinien". Legen Sie einen beliebigen Wert für den Richtliniennamen fest. Erstellen Sie eine Richtlinie mit einem beliebigen Namen mit der Aktion "iot: " und der Ressourcen-ARN "".
--Erstellen Sie ein Zertifikat unter "Sicherheit" -> "Zertifikat". 1-Klicken Sie im Menü zum Erstellen von Zertifikaten auf Zertifikat erstellen und laden Sie "Zertifikat dieses Dings" und "Privater Schlüssel" auf Ihren PC herunter. Sie benötigen dieses Zertifikat und diesen privaten Schlüssel später in der AWS IoT SDK-Konfiguration. Das erforderliche Zertifikat für die Stammzertifizierungsstelle finden Sie unter hier unter RSA 2048. Speichern Sie den Inhalt des Bitschlüssels in einem Texteditor, um ihn zu erstellen.
Registrieren Sie das Gerät, das eine Verbindung zu AWS IoT Core herstellt.
--Wählen Sie den AWS IoT Core-Dienst in der AWS Management Console aus, wählen Sie "Management" -> "Dinge" -> "Erstellen" -> "Einzelne Sache erstellen" und befolgen Sie die Anweisungen auf dem Bildschirm, um das Gerät (Ding) zu registrieren. .. Sie werden aufgefordert, ein neues Zertifikat zu erstellen. Da Sie jedoch das zuvor erstellte Zertifikat verwenden, wählen Sie "Objekt ohne Zertifikat erstellen". --Klicken Sie im Untermenü oben rechts auf der zuvor unter "Sicherheit" erstellten Zertifikatkarte auf "Objekt anhängen" -> "Zertifikat", um das zuvor erstellte Gerät (Objekt) an das Zertifikat anzuhängen.
Damit sind die Einstellungen abgeschlossen, die für die Verbindung mit AWS IoT Core erforderlich sind.
Konfigurieren Sie als Nächstes die Einstellungen für die Übertragung der von AWS IoT Core empfangenen Daten an AWS Lambda.
--Wählen Sie den AWS IoT Core-Dienst in der AWS Management Console aus, wählen Sie "ACT" -> "Regeln" -> "Regel erstellen" und befolgen Sie die Anweisungen auf dem Bildschirm, um eine Übertragungsregel zu erstellen.
AWS Lambda Wählen Sie in der AWS Management Console den Lambda-Service aus und definieren Sie die Lambda-Funktion, die von AWS IoT Core aufgerufen wird. Benachrichtigungen an Slack erstellen Textdaten im Format "payload =" + json.dumps (send_data)) und senden sie an die URL des eingehenden Webhooks.
import json
import urllib.request
def lambda_handler(event, context):
d = json.dumps(event)
post_slack(event)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
def post_slack(event):
t = event["remaining_time"]
#Nachrichtenzusammensetzung
if t < 0:
message = "Die Wäsche ist trocken!"
else:
message = "nach%-Die Wäsche trocknet in 2i Minuten." % t
send_data = {
"username" : "dry_notice",
"text" : message,
}
send_text = "payload=" + json.dumps(send_data)
#Benachrichtigung zum Nachlassen
request = urllib.request.Request(
"URL von Slack's Incomming Webhook",
data=send_text.encode('utf-8'),
method="POST"
)
with urllib.request.urlopen(request) as response:
response_body = response.read().decode('utf-8')
Slack Erstellen Sie ein Konto in Slack und fügen Sie einen beliebigen Kanal hinzu. Registrieren Sie danach den Incoming Webhook für den hinzugefügten Kanal.
Damit ist der Umgebungsaufbau auf der Serverseite abgeschlossen.
--Verwenden Sie ein Steckbrett, um den Raspberry Pi und jeden Teil von ① zu verkabeln. Für das Pin-Layout von RaspberryPi ist hier als Referenz leicht verständlich organisiert.
Der Gesamtverarbeitungsablauf ist wie folgt.
#!/usr/bin/python3
# coding: UTF-8
# Import SDK packages
import RPi.GPIO as GPIO
import dht11 #・ ・ ・ 1
import time
import datetime
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient,AWSIoTMQTTClient
from AWSIoTPythonSDK.exception import AWSIoTExceptions
import json
import logging
# Init logging
logging.basicConfig(filename="Protokolldateipfad",level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Init AWSIoTMQTTClient #・ ・ ・ 2
myAWSIoTMQTTClient = None
myAWSIoTMQTTClient = AWSIoTMQTTClient("AWS IoT Core-Name")
myAWSIoTMQTTClient.configureEndpoint("AWS IoT Core-Endpunkt-URL", 8883)
myAWSIoTMQTTClient.configureCredentials("Stammzertifikatspfad", "Privater Schlüsselpfad", "Pfad des Client-Zertifikats")
# AWSIoTMQTTClient connection configuration
myAWSIoTMQTTClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
myAWSIoTMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz
myAWSIoTMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec
myAWSIoTMQTTClient.configureMQTTOperationTimeout(5) # 5 sec
# Connect to AWS IoT
myAWSIoTMQTTClient.connect()
logging.info('connect to AWS IoT')
# MQTT topic #· · · 3
topic_1 = "condition"
topic_2 = "monitermode"
# Variable
modeState = False # Operating state(True:ON False:OFF)
v = 3000 # Laundry weight
delta_v = 0 # Delta of Laundry weight
notice = 0 # Notification to Slack
flg_1 = True
flg_2 = True
starttime = datetime.datetime.now()
lasttime = starttime
# Init GPIO
LED = 23
SWITCH = 24
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
GPIO.setup(SWITCH,GPIO.IN)
# Read data using pin 14
instance = dht11.DHT11(pin=14)
# Action when switch is pressed
def switch_on(self):
# When it is running
if modeState:
GPIO.output(LED,0)
modeState = False
logging.info("Stop drying monitor")
payload = { "mode": 0}
# When stopped
else:
GPIO.output(LED,1)
modeState = True
v = 3000
delta_v = 0
notice = 0
flg_1 = True
flg_2 = True
starttime = datetime.datetime.now()
lasttime = starttime
logging.info("Start drying monitor")
payload = { "mode": 1}
myAWSIoTMQTTClient.publish(topic_2, json.dumps(payload), 1)
# GPIO event setting #・ ・ ・ 4
GPIO.add_event_detect(SWITCH,GPIO.RISING,callback=switch_on,bouncetime=200)
while True:
try:
# When it is running
if modeState:
result = instance.read()
if result.is_valid():
logging.info("Temperature: %-3.1f C" % result.temperature)
logging.info("Humidity: %-3.1f %%" % result.humidity)
now = datetime.datetime.now()
delta = now - lasttime
logging.info("delta_time: %-2i sec" % delta.seconds)
lasttime = now
#・ ・ ・ 5
ps = 6.11 * 10 ** (7.5 * result.temperature / (result.temperature + 237.3))
delta_v += (-0.45 * ps * (1-result.humidity / 100) + 0.25) * delta.seconds / 60
logging.info("delta_v: %-3i g" % int(delta_v))
elapsed_time = lasttime - starttime
estimate_time = elapsed_time.seconds * v / (-1 * delta_v) / 60
remaining_time = elapsed_time.seconds * (v / (-1 * delta_v) - 1) / 60
logging.info("estimate_time: %-3.1f minutes" % estimate_time)
logging.info("remaining_time: %-3.1f minutes" % remaining_time)
#・ ・ ・ 6
if remaining_time < 10:
if flg_1:
notice = 1
flg_1 = False
else:
notice = 0
if remaining_time < 0:
if flg_2:
notice = 1
flg_2 = False
modeState = False
else:
notice = 0
payload = { "time":str(datetime.datetime.now()),\
"temperature":round(result.temperature,1),\
"humidity":round(result.humidity,1),\
"estimate_time":round(estimate_time,1),\
"remaining_time":round(remaining_time,1),\
"notice":notice}
myAWSIoTMQTTClient.publish(topic_1, json.dumps(payload), 1)
# When stopped
else:
GPIO.output(LED,0)
time.sleep(6)
except KeyboardInterrupt:
break
except:
pass
logging.warning("Exception detected. Finish application.")
GPIO.cleanup()
myAWSIoTMQTTClient.disconnect()
dht11 ist eine Bibliothek, die Temperatur- und Feuchtigkeitswerte von Sensoren erfasst. Es ist bei [GitHub] erhältlich (https://github.com/szazo/DHT11_Python).
Konfigurieren des MQTT-Clients für die Verbindung mit AWS IoT Core. Legen Sie in jedem Fall den Inhalt fest, auf den im AWS Iot Core-Menü verwiesen wird. --Artikelname: Gerätename, registriert unter "Management" → "Item"
Artikelname | Inhalt |
---|---|
time | Aktuelle Uhrzeit |
temperature | Temperatur (℃) |
humidity | Feuchtigkeit (%) |
estimate_time | Zeitaufwand für die Trocknung (Minuten) |
remaining_time | Verbleibende Zeit (Minuten) |
notice | Benachrichtigungsflag für Slack (1:0 benachrichtigen:Nicht benachrichtigen) |
Wenn ich Zeit habe, möchte ich eine Funktion zur Steuerung des Lüfters hinzufügen, um die Trocknungszeit als Verlängerungsfunktion zu verkürzen.
Recommended Posts