mirror of
https://github.com/alexhopeoconnor/arduino-home-assistant.git
synced 2026-10-04 02:48:13 +10:00
HASwitch: subscribe to command topic
This commit is contained in:
@@ -1 +1,15 @@
|
|||||||
# arduino-home-assistant
|
# Arduino Home Assistant
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
## Compatible boards
|
||||||
|
|
||||||
|
## Compatible Arduino Shields
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
- [ ] Add support for "Lights" device's type
|
||||||
|
- [ ] Add support for "Sensor" device's type
|
||||||
|
- [ ] Add support for "Tag scanner" device's type
|
||||||
|
- [ ] Add support for "Lock" device's type
|
||||||
|
- [ ] Add support for "Binary sensor" device's type
|
||||||
|
|||||||
+17
-1
@@ -20,6 +20,11 @@
|
|||||||
|
|
||||||
const char* HAMqtt::DefaultDiscoveryPrefix = "homeassistant";
|
const char* HAMqtt::DefaultDiscoveryPrefix = "homeassistant";
|
||||||
|
|
||||||
|
void onMessageReceived(char* topic, char* message, uint32_t length)
|
||||||
|
{
|
||||||
|
// todo: process message
|
||||||
|
}
|
||||||
|
|
||||||
HAMqtt::HAMqtt(const char* clientId, Client& netClient) :
|
HAMqtt::HAMqtt(const char* clientId, Client& netClient) :
|
||||||
_clientId(clientId),
|
_clientId(clientId),
|
||||||
_netClient(netClient),
|
_netClient(netClient),
|
||||||
@@ -70,7 +75,7 @@ bool HAMqtt::begin(
|
|||||||
_initialized = true;
|
_initialized = true;
|
||||||
|
|
||||||
_mqtt->setServer(*_serverIp, _serverPort);
|
_mqtt->setServer(*_serverIp, _serverPort);
|
||||||
// _mqtt->setCallback(...);
|
_mqtt->setCallback(onMessageReceived);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -160,6 +165,17 @@ bool HAMqtt::endPublish()
|
|||||||
return _mqtt->endPublish();
|
return _mqtt->endPublish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HAMqtt::subscribe(const char* topic)
|
||||||
|
{
|
||||||
|
#if defined(ARDUINOHA_DEBUG)
|
||||||
|
Serial.print(F("Subscribing topic: "));
|
||||||
|
Serial.print(topic);
|
||||||
|
Serial.println();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return _mqtt->subscribe(topic);
|
||||||
|
}
|
||||||
|
|
||||||
void HAMqtt::connectToServer()
|
void HAMqtt::connectToServer()
|
||||||
{
|
{
|
||||||
if (_lastConnectionAttemptAt > 0 &&
|
if (_lastConnectionAttemptAt > 0 &&
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ public:
|
|||||||
bool writePayload(const char* data, uint16_t length);
|
bool writePayload(const char* data, uint16_t length);
|
||||||
bool writePayload_P(const char* src);
|
bool writePayload_P(const char* src);
|
||||||
bool endPublish();
|
bool endPublish();
|
||||||
|
bool subscribe(const char* topic);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -28,7 +28,12 @@ HASwitch::~HASwitch()
|
|||||||
|
|
||||||
void HASwitch::onMqttConnected()
|
void HASwitch::onMqttConnected()
|
||||||
{
|
{
|
||||||
|
if (strlen(_name) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
publishConfig();
|
publishConfig();
|
||||||
|
subscribeCommandTopic();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HASwitch::setState(bool state)
|
void HASwitch::setState(bool state)
|
||||||
@@ -74,10 +79,6 @@ void HASwitch::triggerCallback(bool state)
|
|||||||
|
|
||||||
void HASwitch::publishConfig()
|
void HASwitch::publishConfig()
|
||||||
{
|
{
|
||||||
if (strlen(_name) == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const HADevice* device = mqtt()->getDevice();
|
const HADevice* device = mqtt()->getDevice();
|
||||||
uint16_t deviceLength = (device == nullptr ? 0 : device->calculateSerializedLength());
|
uint16_t deviceLength = (device == nullptr ? 0 : device->calculateSerializedLength());
|
||||||
char serializedDevice[deviceLength];
|
char serializedDevice[deviceLength];
|
||||||
@@ -120,6 +121,24 @@ void HASwitch::publishCurrentState()
|
|||||||
mqtt()->publish(topic, (_currentState ? StateOn : StateOff));
|
mqtt()->publish(topic, (_currentState ? StateOn : StateOff));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HASwitch::subscribeCommandTopic()
|
||||||
|
{
|
||||||
|
const uint16_t& topicSize = calculateTopicLength(
|
||||||
|
HAComponentName,
|
||||||
|
_name,
|
||||||
|
CommandTopic
|
||||||
|
);
|
||||||
|
char topic[topicSize];
|
||||||
|
generateTopic(
|
||||||
|
topic,
|
||||||
|
HAComponentName,
|
||||||
|
_name,
|
||||||
|
CommandTopic
|
||||||
|
);
|
||||||
|
|
||||||
|
mqtt()->subscribe(topic);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t HASwitch::calculateSerializedLength(const char* serializedDevice) const
|
uint16_t HASwitch::calculateSerializedLength(const char* serializedDevice) const
|
||||||
{
|
{
|
||||||
const uint16_t& cmdTopicLength = calculateTopicLength(
|
const uint16_t& cmdTopicLength = calculateTopicLength(
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ private:
|
|||||||
void triggerCallback(bool state);
|
void triggerCallback(bool state);
|
||||||
void publishConfig();
|
void publishConfig();
|
||||||
void publishCurrentState();
|
void publishCurrentState();
|
||||||
|
void subscribeCommandTopic();
|
||||||
uint16_t calculateSerializedLength(const char* serializedDevice) const;
|
uint16_t calculateSerializedLength(const char* serializedDevice) const;
|
||||||
bool writeSerializedTrigger(const char* serializedDevice) const;
|
bool writeSerializedTrigger(const char* serializedDevice) const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user