ガレージにエアコンを設置したのですが、温度・湿度を見て冷房・除湿を切り替えて運転させたいなぁと考え、ラズパイで工作することに。
基本的には、格安スマートリモコンの作り方の記事を参考にすればOK。
ただ、エアコンはコマンドが長く、上記記事から更に別記事へのリンクが張ってありますが、エアコンの長い赤外線コードに対応した学習リモコンを作るの記事のPythonプログラムを利用すればOK。
で、格安スマートリモコンの作り方の記事からリンクされている、LEDドライバ回路はNch FETとPch FETの2つ使うやり方ですが、ラズパイの3.3Vから直接駆動できるNch FETもあります。
具体的には、Nch FETのデータシートでVgsの特性を見て、3.3Vで電流が流れていそうならOKです。
家にはたまたまIRLB8721PBFがあったのですが、データシートのVgsを見ると3.3VでもLEDを駆動する電流は余裕で賄えそうです。(秋月電子で探せば、他にもいくつか3.3V駆動できそうなFETが見つかります。)

実際その後、次のような回路で作ってみましたが、バッチリ動きます。(100Ωの左側が、ラズパイのGPIOになります)

そして、Pythonでこんなふうにプログラムで制御します。(前提としては、USBRHが使えることです。)最近はストロベリーLinuxで、I2C通信で温度湿度取れるセンサーも売っているので、温度湿度を取得するところは適宜アレンジしてください。
プログラムの状態遷移図

#!/usr/bin/env python
import subprocess
import sys
import time
#状態遷移定義
STS_OFF = 0
STS_COOL = 1
STS_DRY = 2
STS_BLAST = 3
#エアコンコマンド定義
CMD_OFF = 0
CMD_COOL = 1
CMD_DRY = 2
CMD_BLAST= 3
STATUS = STS_OFF
def aircontrol(cmd):
if cmd == CMD_OFF:
cmd = "python3 irrp.py -p -g17 -f codes aircon:off"
subprocess.Popen(cmd.split())
elif cmd == CMD_COOL:
cmd = "python3 irrp.py -p -g17 -f codes aircon:cool27on"
subprocess.Popen(cmd.split())
elif cmd == CMD_DRY:
cmd = "python3 irrp.py -p -g17 -f codes aircon:dry27on"
subprocess.Popen(cmd.split())
elif cmd == CMD_BLAST:
cmd = "python3 irrp.py -p -g17 -f codes aircon:blaston"
subprocess.Popen(cmd.split())
else:
cmd = "python3 irrp.py -p -g17 -f codes aircon:off"
subprocess.Popen(cmd.split())
def main():
#USBRHを実行して温度と相対湿度を取得する
result = subprocess.check_output(['/usr/local/bin/usbrh'])
#返り値は、温度、相対湿度の順番
l = result.decode().split()
#温度
temp = float(l[0])
#相対湿度
rh = float(l[1])
#飽和水蒸気圧
e = 6.1078*10**(7.5*temp/(temp+237.3))
#絶対湿度
ah = 217*e/(temp+273.15)*rh/100
global STATUS
if STATUS == STS_OFF:
if temp >= 30:
STATUS = STS_COOL
aircontrol(CMD_COOL)
elif temp >= 28.5 and rh >= 65:
STATUS = STS_DRY
aircontrol(CMD_DRY)
elif STATUS == STS_COOL:
if temp < 28.5:
STATUS = STS_DRY
aircontrol(CMD_DRY)
elif STATUS == STS_DRY:
if rh < 60:
STATUS = STS_BLAST
elif STATUS == STS_BLAST:
aircontrol(CMD_BLAST)
#1時間送風する
time.sleep(3600)
aircontrol(CMD_OFF)
else:
aircontrol(CMD_OFF)
if __name__ == '__main__':
while True:
STATUS = STS_OFF
main()
#5分おきに実行
time.sleep(300)