homeassistant主动推送信息

homeassistant推送信息


问题背景:

前端刚启动时,会向云端发送获取硬件信息的请求,然后云端再调用homeassistant的rest api请求这些信息,再把信息发回前端。
但是这样有个问题,前端收到信息后,这些信息不会再发生变化,比如温度计的信息,可能前端获取到的温度是25度,但是过了1个小时,温度变成了27度,那么前端如果不重新启动就不能获取这个信息。
所以希望homeassistant内部或者其控制的硬件发生变化后,能够主动向云端发送这个变化信息。

解决方法:

幸运的是,homeassistant本身就提供了这个接口,它有一个notify组件能实现这个功能。
notify组件位置在(这是在我电脑上的位置)
E:\Anaconda3\Lib\site-packages\homeassistant\components\notify

在notify文件夹下增加一个文件sampleNotify.py

import requests
import logging

import voluptuous as vol

from homeassistant.components.notify import (ATTR_TARGET, ATTR_TITLE, PLATFORM_SCHEMA, BaseNotificationService)
import homeassistant.helpers.config_validation as cv

_LOGGER = logging.getLogger(__name__)
CONF_FROM_SOURCE = "from_source"


PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_FROM_SOURCE): cv.string,
})



def get_service(hass, config, discovery_info=None):
    return SmartHomeNotificationService(config[CONF_FROM_SOURCE])


class SmartHomeNotificationService(BaseNotificationService):
    def __init__(self, from_source):
        self.from_source = from_source

    def send_message(self, message="", **kwargs):
        receivers = kwargs.get(ATTR_TARGET)
        title = kwargs.get(ATTR_TITLE)
        try:
            for receiver in receivers:
                _LOGGER.info("已发送")

                data = {
                    "source": self.from_source,
                    "receiver": receiver,
                    "content": message,
                    "title": title
                }
                _LOGGER.info(data)
                requests.post(
                    // 注意这里需要修改成你服务器的api
                    "http://1.2.3.4:8989/a/b/notify",
                    data=data
                )

        except ConnectionError:
            _LOGGER.error("连接失败")

使用方式:
1.在configuration.yaml文件中加入sampleNotify

notify:
  - name: sample
    platform: sampleNotify
    from_source: '发送方身份标识'

注:sampleNotify是我们刚才在notify文件加下加入的sampleNotify.py的名字

2.在automations.yaml中加入

- alias: notify publish
  trigger:
    platform: homeassistant
    event: start
  action:
    service: notify.my_notify
    data:
      title: '题目'
      message: 'homeassistant start'
      target: '接收方身份标识'

这样在homeassistant启动后,云端就会收到homeassistant start这个信息

参考:
https://www.jianshu.com/p/1157057b97a6

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Eclipse Paho MQTT 客户端库来实现 Java MQTT 监听 HomeAssistant 推送的功能。以下是一个简单的示例代码: ``` import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttListener { public static void main(String[] args) { String broker = "tcp://localhost:1883"; String clientId = "JavaMqttListener"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient mqttClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); mqttClient.connect(connOpts); System.out.println("Connected"); String topic = "homeassistant/#"; int qos = 0; mqttClient.subscribe(topic, qos); System.out.println("Subscribed to topic: " + topic); mqttClient.setCallback(new MqttCallback() { public void connectionLost(Throwable cause) { System.out.println("Connection lost: " + cause.getMessage()); } public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println("Message received: " + new String(message.getPayload())); } public void deliveryComplete(IMqttDeliveryToken token) { System.out.println("Delivery complete"); } }); } catch (MqttException me) { System.out.println("Reason: " + me.getReasonCode()); System.out.println("Message: " + me.getMessage()); System.out.println("Loc: " + me.getLocalizedMessage()); System.out.println("Cause: " + me.getCause()); System.out.println("Excep: " + me); } } } ``` 这个代码片段使用 Eclipse Paho MQTT 客户端库来连接到本地的 MQTT 代理,并订阅了 "homeassistant/#" 主题。当有消息到达时,会打印出消息内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值