智能家居小贴士:如何将电信和移动余额集成到Home Assistant | 宁静致远

智能家居小贴士:如何将电信和移动余额集成到Home Assistant

正在加载一言...


现在的查询手机余额的方式多种多样,余额不足时也会发短信息提醒你,但是有时候就是想看看手机余额,如果只有一个运营商还好,多了的话可能查起来就比较繁琐了,所以就想把余额给监控起来,并且集成到Home Assistant中。

0.余额获取


身边有两个运营商分别时电信和移动,电信的之前是通过抓包的方式获取的余额,抓包的就不详细说了,主要说个移动的方式,因为这个会了,电信不用抓包也行的。

移动余额获取思路

  1. 写一个快捷指令,给10086发送查话费的短信
  2. 在自动化中每天定时运行这个快捷指令
  3. 当收到10086的短信时,将短信内容推送到服务器
  4. 服务器将内容通过巴法云的MQTT发送到指定的主题
  5. 家里的Node-Red订阅这个主题,将内容解析并生成传感器至Home Assistant

通过以上的步骤就能够把话费余额集成到HA中了。这边也可以简化的,可以直接把短信内容推送到Node-Red,然后解析内容生成传感器。为啥绕了这一圈呢,因为不想把Node-Red暴露到公网上,而且有现成的服务器,所以就绕了一圈。

1.具体实施


在手机上做好基本的配置,编辑好查话费的快捷指令如下:
查询话费
添加好两个自动化,一个用于发短息,一个用于推送接收到的短信内容。
自动化运行
服务器上需要一个小脚本,用来做HTTP到MQTT的转换的,脚本如下:

from bottle import Bottle, request, response
import paho.mqtt.client as mqtt
# MQTT配置
MQTT_BROKER = 'bemfa.com'
MQTT_PORT = 9501
MQTT_TOPIC = '替换主题'
# 创建MQTT客户端实例
client = mqtt.Client(client_id="替换成巴法云的")
# 定义连接成功的回调函数
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully.")
    else:
        print("Connected with result code " + str(rc))
# 定义连接丢失的回调函数
def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection.")
# 定义消息发布的回调函数
def on_publish(client, userdata, mid):
    print("Message published.")
# 连接到MQTT服务器
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish
client.connect(MQTT_BROKER, MQTT_PORT, 60)
# 启动MQTT客户端的循环,但不阻塞主线程
client.loop_start()
# Bottle应用
app = Bottle()
# 定义HTTP POST路由,用于接收数据并将其发送到MQTT
@app.post('/publish')
def publish():
    # 从请求中获取数据
    data = request.json
    topic = data.get('topic', MQTT_TOPIC)
    message = data.get('message', '')
    # 检查MQTT连接状态
    if not client.is_connected():
        print("MQTT client is not connected. Attempting to reconnect...")
        client.reconnect()
        # 等待一段时间,让重连逻辑生效
        time.sleep(5)
    # 再次检查连接状态
    if client.is_connected():
        # 发布消息到MQTT
        result = client.publish(topic, message)
        status = result[0]
        if status == 0:
            response.status = 200
            return {'status': 'message published'}
        else:
            response.status = 500
            return {'status': 'message send failed with result code ' + str(status)}
    else:
        response.status = 500
        return {'status': 'mqtt client is not connected after reconnect attempt'}
# 运行Bottle应用
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8989)

Node-Red中订阅主题后,解析收到的短信内容并生成传感器信息推送给HA的MQTT就完成了。

let message = msg.payload;
let balancePattern = /账户余额(\d+\.\d+)元/;
let match = message.match(balancePattern);
// 检查是否找到了匹配项
if (match) {
    // 提取余额
    totalMoney = match[1];
} else {
    totalMoney = "-";
}
let dxphone_fee = {
    "totalMoney": totalMoney
}
const prefix = "home/sensor/ydphone_fee"
let msg_config = []
msg_config = [
    {
        "topic": "homeassistant/sensor/ydphone_fee/config",
        "payload": {
            "~": prefix,
            "name": "ydphone_fee",
            "state_topic": "~/state",
            "unique_id": "ydphone_fee",
            "icon": "mdi:cellphone",
            "json_attributes_topic": "~/info"
        }
    },
    {
        "topic": `${prefix}/state`,
        "payload": dxphone_fee.totalMoney
    },
    {
        "topic": `${prefix}/info`,
        "payload": dxphone_fee
    }
]
return [msg_config];

2.成果展示


最后两个余额都能获取到了,看到这个,你就知道话费每天都花了多少。
电信余额

移动余额


文章作者: 彤爸比
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彤爸比 !
评论
  目录