现在的查询手机余额的方式多种多样,余额不足时也会发短信息提醒你,但是有时候就是想看看手机余额,如果只有一个运营商还好,多了的话可能查起来就比较繁琐了,所以就想把余额给监控起来,并且集成到Home Assistant中。
0.余额获取
身边有两个运营商分别时电信和移动,电信的之前是通过抓包的方式获取的余额,抓包的就不详细说了,主要说个移动的方式,因为这个会了,电信不用抓包也行的。
移动余额获取思路
- 写一个快捷指令,给10086发送查话费的短信
- 在自动化中每天定时运行这个快捷指令
- 当收到10086的短信时,将短信内容推送到服务器
- 服务器将内容通过巴法云的MQTT发送到指定的主题
- 家里的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.成果展示
最后两个余额都能获取到了,看到这个,你就知道话费每天都花了多少。