室温湿度データをグラフ化して、RaspberryPI zeroとtwikitでX(twitter)に投稿しよう。

完成して動作しましたがまだ作業をまとめていません。しばしお待ちを。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1153182/3299cd77-ab68-3018-eed2-5355d5c1cede.png)


ソースコード

```
from matplotlib import pyplot
import os
import smbus
import time
import datetime
import csv
import RPi.GPIO as GPIO
import logging
import traceback
import random

import numpy as np
from twikit import Client

led_pin=24
max_retries = 3
Pin_TF=True
retries = 0
success = False


print("start")


GPIO.setmode(GPIO.BOARD)
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin,True)

logging.basicConfig(filename='/home/(作業フォルダ)/tempbot2/bot.log', encoding='utf-8', level=logging.DEBUG)

bus = smbus.SMBus(1)
address_sht31 = 0x44

client =Client('ja')
client.load_cookies("/home/(作業フォルダ)/tempbot2/temp_bot_cookies.json")

dt_now=datetime.datetime.now()
last_min=dt_now.minute
last_hour=dt_now.hour
last_day=dt_now.day
file_ad="/home/(作業フォルダ)/tempbot2/temp_data"+dt_now.strftime("%Y%m%d")+".csv"
temp_i=0
humi_i=0
avecount=0



text="started!!"+str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))
#client.create_tweet(text)
print(text)
logging.debug(text)





while not success and retries < max_retries:
    try:   
        while True:
            time.sleep(2)
            dt_now=datetime.datetime.now()
            Pin_TF=not Pin_TF
            GPIO.output(led_pin,Pin_TF)
            

            #print(temp)
            #print(humi)
            #print(dt_now)
            if dt_now.minute!=last_min:
            
                bus.write_byte_data(address_sht31, 0x24, 0x00)
                time.sleep(3)
                readData = bus.read_i2c_block_data(address_sht31, 0x00, 6)
                
                temp = round(0.00267 * ((readData[0] << 8) + readData[1]) -45 ,1) 
                humi = round(0.00152 * ((readData[3] << 8) + readData[4]),1)      

                temp_i+=temp
                humi_i+=humi
                avecount+=1

                #client.create_tweet(text)
                text=str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))+" temp="+str(temp)+" humi="+str(humi)+" T_ave="+str(round((temp_i / avecount),1))+" H_ave="+str(round((humi_i / avecount),1))
                print(text)
                logging.debug(text)

                last_min=dt_now.minute


            if dt_now.hour!=last_hour:
                #with open(file_ad, 'a') as f:
                #    writer = csv.writer(f)
                #    writer.writerow([last_hour,temp_i/avecount,humi_i/avecount])
                rows = []
                try:
                    with open(file_ad, 'r', newline='') as f:
                        reader = csv.reader(f)
                        rows = list(reader)
                except FileNotFoundError:
                    pass  # ファイルが存在しない場合、新しいファイルを作成する
                
                # 必要な長さまで空白行を追加
                while len(rows) <=last_hour:
                    rows.append([])

                # 指定された行にデータを上書き
                rows[last_hour] = [last_hour, round((temp_i / avecount),1), round((humi_i / avecount),1)]

                # ファイルに書き戻し
                with open(file_ad, 'w', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerows(rows)
                os.chmod(file_ad,0o777)    #ファイルを作成したら、全権限がアクセスできるように   

                text="Saved! hour="+str(last_hour)+"T_ave="+str(round((temp_i / avecount),1))+"H_ave="+str(round((humi_i / avecount),1))
                print(text)
                logging.debug(text)

                temp_i=0
                humi_i=0
                avecount=0

                last_hour=dt_now.hour
                #if dt_now.day!=last_day:
                #last_day=dt_now.day


            if dt_now.day!=last_day:
                day_data=np.loadtxt(file_ad ,encoding="utf-8_sig",delimiter=',')
                print(day_data)

                time_array= np.array(day_data[0:24,0])
                temp = np.array(day_data[0:24,1])
                situ = np.array(day_data[0:24,2])


                temp_max= np.max(temp)
                night_index=np.argmax(time_array>20)
                temp_night = np.array(day_data[night_index:24,1])
                temp_night_min=np.min(temp_night)

                print(time_array)
                text="Temp:"+str(temp)+"Humi:"+str(situ)+"tempmax:"+str(temp_max)+"night_index"+str(night_index)+"temp_nightmin:"+str(temp_night_min)
                print(text)
                logging.debug(text)
                


                fig, ax1 = pyplot.subplots()

                # Plot the temperature data with the first y-axis
                ax1.set_xlim(0, 24)
                ax1.set_ylim(0, 45)
                ax1.set_xticks([0, 6, 12, 18,24])
                ax1.set_yticks([0, 5, 10, 15, 20, 25, 30, 35, 40,45])
                ax1.set_xlabel("Time[h]")
                ax1.set_ylabel("Temp[°C]")
                ax1.plot(time_array, temp, label='Temp[°C]', color='tab:red')
                ax1.grid()

                # Create a second y-axis sharing the same x-axis
                ax2 = ax1.twinx()
                ax2.set_ylim(0, 100)
                ax2.set_yticks([0, 20,40,60,80,100])
                ax2.set_ylabel('Humi[%]')
                ax2.plot(time_array, situ, label='Humi[%]', color='tab:green')

                # Add a legend to differentiate the plots
                fig.legend(loc='upper right')

                # Save the figure
                pyplot.savefig("/home/(作業フォルダ)/tempbot2/time-temp.png")
                pyplot.close()


                media_list={client.upload_media("/home/(作業フォルダ)/tempbot2/time-temp.png")}
                text=str(dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))+"\n前日の室温、湿度の推移です。\n"
                text+="最高室温は"+str(temp_max)+"°C 夜間最低室温は"+str(temp_night_min)+"°Cでした。\n "

                if temp_max>=25:
                    text+="昨日は "
                    if temp_max>=40:
                        text+="#酷暑日"
                    elif temp_max>=35:
                        text+="#猛暑日"
                    elif temp_max>=30:
                        text+="#真夏日"
                    elif temp_max>=25:
                        text+="#夏日"   
                    if (temp_night_min>=25)&(night_index!=0):
                        text+=" また、 #熱帯夜"
                    text+="\nでした。"

                bot_block_delay=random.randrange(0, 180, 20)
                print("waiting"+str(bot_block_delay)+"second")
                logging.debug("waiting"+str(bot_block_delay)+"second")
                time.sleep(bot_block_delay)

                client.create_tweet(text, media_list)
                print(text)
                logging.debug(text)
                print("tweeted")
                file_ad="/home/(作業フォルダ)/tempbot2/temp_data"+dt_now.strftime("%Y%m%d")+".csv"

                last_day=dt_now.day
                retries = 0
        

        GPIO.cleanup() 

    except Exception as e:
        retries += 1
        error_details = traceback.format_exc()
        text = f"error happened!\nretry count: {retries}\n{error_details}"
        print(text)
        logging.debug(text)
        time.sleep(1)
        if retries==2:
            os.system('sudo reboot')
            

```




- こんなイメージ

https://qiita.com/wakatsuru/items/9f88ed95f473ef64fc01

- セットアップssh　2.4ghzにつなぐことに注意

https://my-web-note.com/raspberrypi-teraterm-ssh/

https://blog.soracom.com/ja-jp/2022/06/13/how-to-use-raspberry-pi-imager-1-7-2/

　いまさら聞けない　https://fabcross.jp/category/make/what_is_raspberrypi/20220830_windows.html

- ラズパイpip不具合

https://qiita.com/nanbuwks/items/315f4281cbad51c73510

https://www.raspberrypi.com/documentation/computers/os.html#python-on-raspberry-pi

https://uepon.hatenadiary.com/entry/2024/03/07/011738

pipxをつかう？→使わない

https://uepon.hatenadiary.com/entry/2024/03/07/011738

venvをつかう？→これ

詳しく

[https://www.denshi.club/parts/2024/01/202310-bookworm-3-](https://www.denshi.club/parts/2024/01/202310-bookworm-3-pythoni2c.html)

シンプル

[pythoni2c.html](https://www.denshi.club/parts/2024/01/202310-bookworm-3-pythoni2c.html)https://wisteriahill.sakura.ne.jp/CMS/WordPress/2022/01/29/raspberry-pi-python-venv/

- matplotlib numpy がpipでインスコできない（ハッシュエラー

https://qiita.com/ohbashunsuke/items/e233b4969e4c410ac74f　pyton3-matplotlib

→グローバル環境にインストール、 --system-site-packages で全部importできるようにする

 [https://milestone-of-se.nesuke.com/app/python/venv-switch/https://milestone-of-se.nesuke.com/app/python/venv-switch/#:~:text=付ける必要があり-,ます,-。](https://milestone-of-se.nesuke.com/app/python/venv-switch/#:~:text=%E4%BB%98%E3%81%91%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A-,%E3%81%BE%E3%81%99,-%E3%80%82)

- ip確認

http://router.asus.com/index.asp

- winscp　ファイル閲覧

https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-ssh/

vscodeと連携　https://shironoir0000.hatenablog.com/entry/2019/05/14/144159

- 温度センサ　i2c **DHT20**

https://akizukidenshi.com/catalog/g/g116732/

　 　使い方

dht20じゃ泣きけど　https://tutorial.chirimen.org/pizero/

https://raspi-school.com/dht-20/

https://wiki.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DH20/

homekit  https://diysmartmatter.com/archives/298

https://s-design-tokyo.com/use-dht20-raspberrypi/

手動実装なら　https://craft-gogo.com/raspberry-pi-dht20/

twikit

https://qiita.com/jasoncitronx/items/74b4ebcb20814729dbd0

i2cが無効になってた

https://rb-station.com/blogs/article/raspberry-pi-i2c-activation

- SHT30 を使用するとき

https://yamaccu.github.io/tils/20220916-Raspberry-I2S-sht31

ipアドレスは44

案

グラフを添付

10分に一回計測し、csvに保存→一日一回グラフを制作し、最高気温とともに投稿

pip 

twikit

- 自動起動

PyでPYを開く

- Lチカ

https://chigusa-web.com/blog/ラズパイzeroでlチカ！/

GPIO.cleanup()を忘れない

- rc local

https://yokahiyori.com/raspberry-pi_python3_auto_start/

Led_testは直接やれば動く

Envが悪そう？

https://stackoverflow.com/questions/52962032/environment-for-rc-local

envが良くなかった。