👔着る服が少なくなったら通知する「sentaquiq」を作ってみたの巻🐤

記事をご覧くださりありがとうございます！
初めまして。AI/IoT分野のプロフェッショナルを目指して修行中の、のぶたんです。🐉

今回は、**服の状態を監視して、服が少なくなったらメールで通知するIoTシステムを自作してみた**ことについて書いている記事です。
この洗濯アラートサービス「SENTAQUIQ」を使うことで、早めに服を洗濯することで、「着る服がない！！」という困りごとを解消することができます(^▽^)/


#システム構成
![sentaquiq1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/55ae7717-81a7-e690-a6d4-2dc95b825a14.png)

#試作版SENTAQUIQ
![MVIMG_20200405_193320_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/5a4f1eb8-f123-c724-cc4b-0718478326bd.jpeg)
→ハンガーの服状態を監視する仕組みはシンプル、透過型フォトインタラプタでハンガーがかけているかを判別しています！
→ハンガーのかけている状態を監視して、服の乾き具合を測る方法が別案であるので、バージョン2では、改良していきます。
![MVIMG_20200405_193607_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/cd2973be-8db7-e730-fe36-92204daa5526.jpeg)
→温湿度センサをつけているので、カビが生えやすい湿度になったら、通知することもできます★
#メール通知
![mail.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580405/09ed4cdb-77b1-8163-02e2-2c36b7b676af.png)
→sigfoxのCallback機能を使ってサーバに飛んできたデータを判別してメール送信するようにしています。
#ソースコード(サーバ側)
```python:config.py
MAIL_SERVER = 'smtp.gmail.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USE_SSL = False
MAIL_USERNAME = '送り元@gmail.com'
MAIL_PASSWORD = '送り元パスワード'
MAIL_DEFAULT_SENDER = '送り元@gmail.com'
```
```python:sentaquiqsvr.py
# -*- coding: utf-8 -*-
from datetime import datetime
from flask import Flask,request
import requests
from flask_mail import Mail, Message
import config
import json

bodytemp=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S') +" \n熱中症リスクがあります。こまめな水分補給してください!!"
bodykabi=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S') +"\nカビが生えやすい湿度です。換気してください!!"
bodycloth=datetime.now().strftime('%Y-%m-%d')+datetime.now().strftime('%H:%M:%S')+" \n服が少なくなりました。洗濯してください!!"

app = Flask(__name__)
app.config.from_object('config')
mail = Mail(app)

@app.route('/post', methods=['GET', 'POST'])
def post():
  if request.method == 'POST':
        data = request.data
        print(data)
        json_dict = json.loads(data)
        status = map(int, json_dict["data"])
        if status[-3] == 1 or status[-3] == 2 or status[-3] == 3 or status[-3] == 4:
                msg = Message(recipients=['宛先@gmail.com'],body=bodytemp,subject='SENTAQUIQサービス')
                mail.send(msg)
        if status[-2] == 1:
                msg = Message(recipients=['宛先@gmail.com'],body=bodykabi,subject='SENTAQUIQサービス')
                mail.send(msg)
        if status[-1] == 1 or status[-1] == 2:
                msg = Message(recipients=['宛先@gmail.com'],body=bodycloth,subject='SENTAQUIQサービス')
                mail.send(msg)
        return ''
if __name__ == "__main__":
  app.run(host='0.0.0.0',port=8090)
```
#ソースコード(sentaquiqシステム側)
```C++:sentaquiqdatapost.ino
#include <SoftwareSerial.h>
#include "SparkFun_Si7021_Breakout_Library.h"
#include <Wire.h>

float humidity = 0;
float tempf = 0;
//Create Instance of HTU21D or SI7021 temp and humidity sensor and MPL3115A2 barrometric sensor
Weather sensor;

#define sensor1 4
#define sensor2 5
#define sensor3 6
#define sensor4 7
//#define sensor5 8
//#define sensor6 9
//#define sensor7 10
//#define sensor8 11


SoftwareSerial mySerial(3, 2); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  /*while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }*/
  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
  pinMode(sensor3,INPUT);
  pinMode(sensor4,INPUT);
//  pinMode(sensor5,INPUT);
//  pinMode(sensor6,INPUT);
//  pinMode(sensor7,INPUT);
//  pinMode(sensor8,INPUT);
  
  sensor.begin();
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() { // run over and over
    getWeather();
  int tempc = (tempf-32)/1.8;
  int data=0;
  if(tempc >= 24){
     //level1
     data = 100;
  }else if(tempc >= 28){
    //level2
     data = 200; 
  }else if(tempc >= 31){
    //level3
     data = 300;
  }else if(tempc >= 34){
    //level4
    data = 400;
  }else{
    //level0
    data= 0;
  }

  if (humidity > 65){
    //kabi
    data = 10;
  }else{
    data = 0;
  }
  int s1=digitalRead(sensor1);
  int s2=digitalRead(sensor2);
  int s3=digitalRead(sensor3);
  int s4=digitalRead(sensor4);
 // int s5=digitalRead(sensor5);
 // int s6=digitalRead(sensor6);
 // int s7=digitalRead(sensor7);
 // int s8=digitalRead(sensor8);
 // Serial.println(String(s1)+String(s2)+String(s3)+String(s4)+String(s5)+String(s6));
  data  += !s1;
  data  += !s2;
  data  += !s3;
  data  += !s4;
  //data  +=!s5;
  // data  +=!s6;
  //data  +=!s7;
  // data  +=!s8;
  String senddata = "AT$SF=";
         senddata += String(data+1000);
         senddata += "\r";
  mySerial.write(senddata.c_str());

  //2時間おきにデータがポストされます！
  delay(1000*60*60*2);

}
void getWeather()
{
  // Measure Relative Humidity from the HTU21D or Si7021
  humidity = sensor.getRH();

  // Measure Temperature from the HTU21D or Si7021
  tempf = sensor.getTempF();
  // Temperature is measured every time RH is requested.
  // It is faster, therefore, to read it from previous RH
  // measurement with getTemp() instead with readTemp()
}
```

#このSENTAQUIQをIoTサービスっぽいサイトとして作ってみた
https://rtkdoragon.jp/sentaquiq.html

#感想
Sigfoxを始めて使ってみて、2時間に一回データをPOSTする仕組みにしているので、コスト的にも他の通信規格(ポケットWI-FIなど)よりいいと思いました。
→大量にデータ通信する場合は、別の規格がよい。

この記事をご覧になった方...
今回はSigfoxを使って洗濯通知IoTシステムを構築してみました。
センサーとArduinoとSigfoxボードを組み合わせれば、
アイデア次第でいろいろ活用できると思います。
皆さんも、生活の困りごとを解消するアイデアをIoTという形で実現してみてはいかがでしょうか。
とっても面白いですよ👍
それでは✋