【PLC语音播报】用Modbus刷微博新闻热搜-语音朗读案例演示-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器

背景

每天上班太忙碌,没有时间刷微博,新闻发展的太快,生怕错过微博热搜,看着支持Modbus的博灵语音通知终端,决定自己写一个脚本,让它给我读新闻!

少废话,先看东西

实现了以下效果

  • 90分钟刷新一次热搜
  • 依次朗读这些新闻热搜
  • 因为设备放在办公室,晚上并不会扰民,只有午休需要屏蔽,当拉取时间在12点-14点时,自动推迟一小时

终端日志截图

【PLC语音播报】用Modbus刷微博新闻热搜-语音朗读案例演示-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器_第1张图片

脚本运行截图

【PLC语音播报】用Modbus刷微博新闻热搜-语音朗读案例演示-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器_第2张图片

播报效果图

【PLC语音播报】用Modbus刷微博新闻热搜-语音朗读案例演示-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器_第3张图片

实现代码

热搜使用了聚合数据的热搜Api实现,脚本使用的Python3实现,因为想测试一下通知终端的Modbus TCP协议,所以采用了Modbus TCP协议推送,之后会放出HTTP协议的代码。
Modbus TCP协议说明文档点我查看

注意:

  • 需要使用pymodbus类库,根据版本不同,有两处需要修改的地方,代码中已标注
  • Modbus TCP一次只能传52个字,之后会编写HTTP版本的代码,更简单!
  • 午休时间在代码中体现,可根据自己需求自行修改
import struct
import time

# pymodbus(v2.0)使用pymodbus.client.sync
# pymodbus(v3.0)使用pymodbus.client
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.register_write_message import WriteMultipleRegistersRequest
import urllib3, json, datetime
import traceback

def encodeStr(s):
    raw = []
    for bit in s:
        bit = int.from_bytes(bit.encode('utf-8'), 'big')
        word = [0] * 2
        word[0] = (0xffff0000 & bit) >> 16
        word[1] = 0xffff & bit
        raw += word
    return raw

def sendModbusTCP(tts):
    data_arr = []
    led_style = 15
    led_color = [0] * 8
    led_color[0] = 0x8A
    led_color[1] = 0x2be2

    play_time = 0
    tone = 0
    tts_speed = 0
    led_flag = 0x0601
    empty = [0] * 2
    tts_str = encodeStr(tts)
    data_arr += [led_style] + led_color + [play_time] + [tone] + [tts_speed] + [led_flag] + empty + tts_str

    # print([hex(x) for x in data_arr])
    # print(len(data_arr))
    # 新版本pymodbus(v3.x)必须要传后面的1,旧版本pymodbus(v2.0)不能传
    # request = WriteMultipleRegistersRequest(100, data_arr, 1)
    request = WriteMultipleRegistersRequest(100, data_arr)
    try:
        res = client.execute(request)
        print(res)
    except Exception as e:
        with open('modbus.log', 'a') as f:
            f.write('\n' + datetime.datetime.now().__str__() + '\n')
            f.write(tts + '\n')
            traceback.print_exc(file=f)

if __name__ == '__main__':
    client = ModbusTcpClient(host='192.168.0.216', port=502)
    http = urllib3.PoolManager()
    while True:
        now = datetime.datetime.now()

        if 12 <= now.hour <= 14:
            print("午休时间")
            time.sleep(3600)
            continue
            
        
        print('拉取时间:' + now.__str__() + '\n')
        news = http.request('get', 'http://apis.juhe.cn/fapigx/networkhot/query?key=自己的key')
        news = news.data.decode('utf-8')
        with open('resou_raw.log', 'a', encoding='utf-8') as f:
            f.write('\n' + datetime.datetime.now().__str__() + '\n')
            f.write(news)
        news = json.loads(news)
        i = 1
        tts = ''
        with open('resou.log', 'a', encoding='utf-8') as f:
            f.write('\n' + datetime.datetime.now().__str__() + '\n')
            for item in news['result']['list']:
                print(str(i) + '-' + item['title'] + '\n')
                f.write(str(i) + item['title'] + '\n')
                if len(tts) + len(str(i) + '。' + item['title'] + ' ') > 51:
                    sendModbusTCP(tts)
                    tts = ''
                tts += str(i) + '。' + item['title'] + ' '
                i += 1
        sendModbusTCP(tts)
        time.sleep(5400)



你可能感兴趣的:(网络,人工智能,语音合成,声光播报,Modbus,HTTP,Api)