1、前记,AC86U 梅林系统 提供强大的功能的同时,发热也是很厉害的。加装的5V风扇,声音呼呼的,放在电视柜上感觉很吵,手头有个树莓派zero,遂想到用树莓派来做个温控风扇,同时也能提供一个低电压的电源给风扇。

  应该刚开始对梅林系统 不太了解,第一版勾想用selenium 无ui执行抓取页面的温度数据来达到目的。但是路由器只能有一个账号单点登陆,这个方法太过笨拙。思考一下页面有温度显示,那么系统里可能有一个临时文件或者日志来存储这个温度数据,经过研究终于在/sys/devices/virtual/thermal/thermal_zone0/temp 找到到了温度的数据。既然有原始数据了,那就好办了:

  1)树莓派捞取原始数据

   2)通过python控制GPIO

  这样就可以了。具体实现看下面的步骤....

2、因为原temp文件权限限制无法直接分享,所有编写shell脚本wd.sh读取temp温度文件,并重写到挂载的usb里面,设置10秒一次,方便其他设备使用。

 

while true;
	do
	for wd in `cat /sys/devices/virtual/thermal/thermal_zone0/temp`
		do
		echo $wd > /tmp/mnt/sda1/temp
		sleep 10	
		done
	done

  

nohup ./tmp/home/root/wd.sh &  # 后台运行wd.sh

 

3、在树莓派zero中挂载路由器smb文件夹,并且加入到开机启动中: 命令写到 /etc/rc.local

sudo mount -t cifs //10.1.1.1/sda1 /home/ac86_smb -o username=**,password=**@123,vers=1.0

 

4、编写python脚本控制gpio输出,gpio输出的电压虽然是3.3v,但是直接接风扇,风扇转不起来,可能是电流太小,所以加了一个两组3.3v触发的继电器,使用zero的3.3v针脚通过继电器常来给电。python脚本通过gpio控制继电器是否触发。

风扇3.3v供电,比usb的5v静音很多

# -*- coding: utf-8 -*-
from loguru import logger as do_log
import time,os,random
import RPi.GPIO as GPIO
base_dir = os.path.split(os.path.split(os.path.abspath(__file__))[0])[0]
LOG_FILE_PATH = os.path.join(os.path.join(os.path.join(base_dir,"pi"),"logs"),"all.log")

do_log.add(LOG_FILE_PATH,format="{time}|{level}|{message}",rotation="1 week")

GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
IN1 = 11
IN2 = 12
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
num = random.randint(0, 1)
n = 0


def two_fan():
    GPIO.output(IN2, GPIO.HIGH)
    GPIO.output(IN1, GPIO.HIGH)
def one_fan(num):
    if num ==1:
        GPIO.output(IN2, GPIO.LOW)
        GPIO.output(IN1, GPIO.HIGH)
    else:
        GPIO.output(IN2, GPIO.HIGH)
        GPIO.output(IN1, GPIO.LOW)

def close_fan():
        GPIO.output(IN2, GPIO.LOW)
        GPIO.output(IN1, GPIO.LOW)


while True:

    with open('/home/ac86_smb/temp',"r",encoding="utf-8") as f:
        wd =f.read()
    if len(wd)==0:
        continue
    else:
        wd = int(wd)/1000

    if  wd >65:
        do_log.info(f"CPU {wd}°C , open the two fan")
        two_fan()
        do_log.info(f"CPU {wd}°C , keep two fan runing")
        time.sleep(300)

    if  wd >= 55 and wd <=65:
        n+=1
        # 如果单风扇持续5分钟,经过5个周期仍然高于55度,打开双风扇运行,直到温度低于55度
        if n >= 6:
            two_fan()
            do_log.info(f"CPU >= 55°C at long time , open two fan!")
            time.sleep(300)
            if wd <= 55:
                n = 0
                # pass
            else:
                do_log.info(f"CPU >= 55°C at long time ,keep open two fan!")
                time.sleep(300)
                if wd <= 55:
                    n = 0
        else:
            if num == 1:
                do_log.info(f"CPU {wd}°C, open the one fan of 1#")
                one_fan(1)
                do_log.info(f"CPU {wd}°C , keep one fan runing")
            else:
                do_log.info(f"CPU {wd}°C, open the one fan of 2#")
                one_fan(0)
                do_log.info(f"CPU {wd}°C , keep one fan runing")
        time.sleep(300)

    elif  wd < 55:
        do_log.info(f"CPU {wd}°C , keep runing 5 min")
        time.sleep(300)

        do_log.info(f"CPU {wd}°C , close the fan")
        n = 0
        close_fan()

        #  降到55左右就降不下去了,所以小于55,就关闭风扇,等待10分钟再执行
        time.sleep(600)
        # 更换风扇运行
        if num == 1:
            num =0
        else:
            num = 0
    time.sleep(5)
GPIO.cleanup()

 

 

zabbix监控CPU主板温度 华硕主板监控温度_zabbix监控CPU主板温度

5、再写一个进程守护的shell脚本开机启动,保证python脚本始终后台运行。

while true;
do
        server=`ps aux | grep python3| grep -v wd.py`
        if [ ! "$server" ]; then
           ./home/chick_wd/run.sh
        fi
        sleep 5
done

 

打印的日志:

 

zabbix监控CPU主板温度 华硕主板监控温度_python脚本_02

路由器的温度曲线:

 

zabbix监控CPU主板温度 华硕主板监控温度_python脚本_03