百度UNIT聊天API实现聊天对话


最终效果图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56EWw2Ki-1589776377292)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200518110659979.png)]

​ 图1.聊天情况

1.百度UNIT聊天API的使用

代码示例1

# -*- coding=utf-8 -*-
import requests


class UNIT:
    def __init__(self, api_key, api_secret):
        self.access_token = None
        self.url = None

        self.set_access_token(api_key, api_secret)

    def set_access_token(self, api_key, api_secret):
        host = 'https://aip.baidubce.com/oauth/2.0/token?' \
               'grant_type=client_credentials&' \
               'client_id={0}&' \
               'client_secret={1}'.format(api_key, api_secret)
        response = requests.post(host)
        if response:
            self.access_token = response.json()['access_token']

    def query(self, query_text):
        self.url = 'https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=' + self.access_token
        post_data = """{
                    "bot_session": "",
                    "log_id": "7758521",
                    "service_id": "S29640",	# 你的聊天机器人的ID
                    "request": {
                        "bernard_level": 1,
                        "client_session": "{\\\"client_results\\\":\\\"\\\", \\\"candidate_options\\\": []}",
                        "query": "%s",	# 要查询的文字
                        "query_info": {
                            "asr_candidates": [],
                            "source": "KEYBOARD",
                            "type": "TEXT"
                        },
                        "updates": "",
                        "user_id": "88888"
                    },
                    "session_id": "",
                    "version": "2.0"
                }""" % query_text
        post_data = post_data.encode('utf-8')
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        response = requests.post(self.url, data=post_data, headers=headers)
        if response:
            return response.json()['result']['response_list'][0]['action_list'][0]['say']

需要自己去百度UNIT获取自己的API_KEY和API_SECRET,然后调用set_access_token获取access_token来访问聊天API。

2. QT中UI线程与工作线程的双向通信

发现网上讲的基本都是工作线程向UI线程传递数据,却没有讲UI线程如何传递数据给工作线程。以下给出了一种思路。

代码示例2

UI线程点击按钮,向工作线程发送信息;工作线程处理好信息后通过信号传出。

# -*- coding=utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QThread


class WorkerThread(QThread):
    response_signal = pyqtSignal(str)	# 向UI线程发出的信号
    receive_string = None	# 用于接受来自UI线程的信息

    def __init__(self):
        super(WorkerThread, self).__init__()

    def run(self) -> None:
        # 处理UI线程传来的信息,然后发出信号
        self.response_signal[str].emit(self.receive_string + ",I got this")


class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        self.button = QPushButton("send", self)
        self.button.clicked.connect(self.on_send_message)
        
        self.worker = WorkerThread()	# 实例化子线程
        self.worker.response_signal[str].connect(self.on_response)	# 绑定子线程的信号与UI线程的槽on_response


    @pyqtSlot()		# 据PYQT官网描述,加上装饰器可以减少内存消耗
    def on_send_message(self):
        self.worker.receive_string = "你好"	# 往子线程传递信息
        self.worker.start()		# 启动子线程

    @pyqtSlot(str)
    def on_response(self, text):
        print(text)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWidget()
    window.show()
    sys.exit(app.exec_())

运行结果:

你好,I got this
你好,I got this
你好,I got this
你好,I got this

3.UI

部分个人觉得比较重要的实现:

聊天框使用QListWidget实现,每一条聊天内容使用QListWidgetItem实现。

聊天内容:图标+时间+消息。

def get_encapsulated_message(self):
    message_item = QListWidgetItem()	# 实例化一个QListWidgetItem对象
    time = QDateTime.currentDateTime().time().toString('hh:mm:ss')	# 获取当前时间
    message_item.setText(time + " " + self.input_text.text())	# 设置文本内容
    message_item.setIcon(QIcon('image/me.png'))	# 添加图标
    return message_item

有时候文本内容太长,需要设置自动换行:

self.chat_message_box.setWordWrap(True)                     # 开启长文本自动换行

chat_message_box是QListWidget类的对象。

在QListWidget中,每次内容都停留在顶部,无法自动下滑到最新的消息处:

self.chat_message_box.scrollToBottom()	# chat_message_box是QListWidget对象

在往QListWidget中添加QListWidgetItem后,调用QListWidget.scrollToBottom()即可。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我会尽力解答您的问题。 首先,BAT3U模块是一款用于电池管理的模块,而TDS检测器则是一种用于检测水质中总溶解固体(TDS)含量的设备。ESP32则是一种常用的微控制器,而ESPHOME则是一款用于编写ESP32固件的工具。 根据您的要求,我会提供一个基于ESPHOME的配置文件,以实现DIY TDS检测器的功能,并且可以与Home Assistant平台集成。以下是配置文件示例: ```yaml esphome: name: tds_detector platform: ESP32 board: esp32dev wifi: ssid: "your_wifi_ssid" password: "your_wifi_password" # 如果您的路由器是隐藏SSID,请取消注释下面这一行,并修改您的SSID和密码 # manual_ip: # static_ip: 192.168.1.100 # gateway: 192.168.1.1 # subnet: 255.255.255.0 # dns1: 192.168.1.1 # ssid: "your_wifi_ssid" # password: "your_wifi_password" logger: api: ota: sensor: - platform: adc pin: GPIO34 name: "TDS Sensor" accuracy_decimals: 2 # TDS Sensor使用的是模拟信号,将连接到ESP32的GPIO34引脚 text_sensor: - platform: homeassistant name: "TDS Sensor State" internal: true id: tds_sensor_state mqtt: broker: 'mqtt_broker_ip' username: 'mqtt_username' password: 'mqtt_password' discovery: true discovery_prefix: homeassistant # 如果您的mqtt_broker不支持自动发现,您可以使用下面这段代码手动配置MQTT传感器 # sensor: # - platform: mqtt # name: "TDS Sensor" # state_topic: "homeassistant/sensor/tds_sensor/state" # unit_of_measurement: "ppm" # availability_topic: "homeassistant/sensor/tds_sensor/state" # payload_available: "online" # payload_not_available: "offline" # value_template: "{{ value_json.tds }}" homeassistant: customize: sensor.tds_sensor: icon: mdi:water-percent ``` 这个配置文件中,我们使用了ESP32的ADC(模拟-数字转换器)来读取TDS检测器的模拟信号,将其转换为数字信号。然后,我们将这个数字信号作为一个传感器(sensor)的数值,通过MQTT传输到Home Assistant平台上。 在Home Assistant平台上,您可以通过MQTT集成组件,将这个传感器与您的其他设备进行集成。在上面的配置文件中,我们使用了Home Assistant的自动发现功能,它会自动创建一个传感器,并将其添加到您的设备列表中 ### 回答2: 首先,感谢您选择使用比特原子的BAT3U模块和ESPHome配置文件。下面是一个基于ESP32的DIY TDS检测器的ESPHOME配置文件示例: ```yaml esphome: name: tds_detector platform: ESP32 board: esp32dev wifi: ssid: "Your WiFi SSID" password: "Your WiFi Password" # Enable logging logger: # Enable Home Assistant API api: ota: # Define the TDS sensor with the BAT3U module sensor: - platform: custom lambda: |- auto BAT3U = new BAT3U(TwoWire(1)); // 使用I2C 1 App.register_component(BAT3U); App.setup_component(BAT3U); return {BAT3U->tds_sensor}; # An example of how to expose the TDS sensor to Home Assistant # Feel free to customize it as needed homeassistant: include: - sensor.tds_sensor # Example of customizing the TDS sensor's name in Home Assistant # Feel free to modify as needed substitutions: friendly_name: "TDS Sensor" ``` 如上所示,配置文件中的各个部分有详细的注释以帮助您理解其作用。接下来,我们需要将该配置文件上传到您的ESP32设备上,可以使用ESPhome Dashboard或者ESPhome命令行工具进行上传。 在接入Home Assistant方面,您需要确保您的Home Assistant已经安装并配置了与ESPhome的集成。以下是一些基本步骤: 1. 在您的Home Assistant中,导航到配置文件(configuration.yaml)并添加以下内容: ```yaml esphome: name: tds_detector platform: ESP32 ... ``` 2. 启动或重新加载Home Assistant。 3. 在Home Assistant的UI中,导航到“集成”页面(Configuration -> Integrations)。 4. 单击“+ ADD INTEGRATION”按钮。 5. 在搜索栏中输入“esphome”,并选择ESPhome集成。 6. 按照屏幕上的指示完成集成过程,您可能需要提供设备的IP地址和密码等信息。 一旦完成上述步骤,您应该能够在Home Assistant中看到TDS传感器,并将其添加到您的UI中以监视当前的TDS值。 希望以上内容能够帮助到您,让您顺利配置和接入您的ESP32 DIY TDS检测器到Home Assistant中。 ### 回答3: 首先,感谢使用比特原子的BAT3U模块,为您的ESP32 DIY TDS检测器配置ESPHOME配置文件,并向您解释如何将其接入Home Assistant。 首先,我们需要安装ESPHome和Home Assistant的相关软件。请确保您已经安装了Python,并且在命令行中可以使用pip命令。 1. 安装ESPHome:在命令行中运行以下命令: ``` pip install esphome ``` 2. 创建一个新的ESPHome配置文件:在命令行中运行以下命令: ``` esphome config.yaml wizard ``` 这将创建一个名为config.yaml的文件,并进入配置向导。 3. 在配置向导中,您需要回答一些问题来生成适合您的设备的配置。以下是您需要提供的信息和示例回答: - 设备名称(例如:tds_detector) - 设备的操作系统(选择ESP32) - Wi-Fi网络的名称和密码 - 选择一种兼容的串行通信方式(您的BAT3U模块使用什么通信方式?) 4. 配置传感器:在配置向导中,您需要添加一个传感器来读取TDS数据。以下是示例配置代码,您可以将其添加到config.yaml文件中: ```yaml ... sensor: - platform: tds name: "TDS Sensor" pin: GPIO1 unit_of_measurement: "ppm" ``` 根据您的BAT3U模块规格,您需要调整配置文件中的引脚号(pin),以及其他可能的参数。 5. 生成固件:完成配置后,退出配置向导并生成固件。在命令行中运行以下命令: ``` esphome config.yaml compile ``` 此命令将生成一个.bin文件,您需要将其上传到ESP32。 6. 将ESP32连接到Home Assistant:为了将ESP32连接到Home Assistant,您需要在configuration.yaml文件中添加一个ESPHome集成。以下是示例配置代码: ```yaml ... esphome: name: tds_detector platform: ESP32 host: IP_ADDRESS_OF_ESP32 password: !secret esphome_password ``` 请将 "IP_ADDRESS_OF_ESP32" 替换为您的ESP32的IP地址,并确保它与您的Home Assistant在同一网络中。 7. 启动Home Assistant并检查:启动Home Assistant后,它将自动检测到您的ESP32设备,并将传感器数据显示在界面上。您可以在Home Assistant中对其进行配置和自定义。 这就是配置ESP32 DIY TDS检测器的ESPHOME配置文件并将其接入到Home Assistant的基本步骤。希望这些说明对您有所帮助。需要注意的是,根据您的具体硬件和配置要求,还可能需要进行额外的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值