добавляет HALightBrightness

This commit is contained in:
2022-12-30 18:31:20 +03:00
parent 820aba5fd7
commit 5e67dc7438
12 changed files with 257 additions and 87 deletions

View File

@@ -1,32 +1,16 @@
#include <HALight.hpp>
HALight::HALight(PubSubClient &client, const char *name, const char *unique_id)
: HAControllableDevice(client, "light", name, unique_id) {}
HALight::HALight(PubSubClient &client, const char *name, const char *unique_id,
HALightController &baseLight)
: HAControllableDevice(client, "light", name, unique_id),
light(&baseLight) {}
void HALight::sendState() {
StaticJsonDocument<256> doc;
buffer[0] = '\0';
if (light->getState()) {
doc["state"] = "ON";
} else {
doc["state"] = "OFF";
}
serializeJson(doc, buffer, buffer_size);
Serial.println(state_topic);
client.publish(state_topic, buffer, true);
}
void HALight::sendConfig() {
StaticJsonDocument<256> doc;
buffer[0] = '\0';
JSON_DOCUMENT_TYPE HALight::createConfigJSON() {
JSON_DOCUMENT_TYPE doc;
doc["~"] = device_topic;
doc["name"] = name;
doc["unique_id"] = unique_id;
@@ -34,6 +18,42 @@ void HALight::sendConfig() {
doc["stat_t"] = "~/state";
doc["schema"] = "json";
return doc;
}
JSON_DOCUMENT_TYPE HALight::createStateJSON() {
JSON_DOCUMENT_TYPE doc;
if (light->getState()) {
doc["state"] = "ON";
} else {
doc["state"] = "OFF";
}
return doc;
}
void HALight::innerHanlder(JSON_DOCUMENT_TYPE &doc) {
if (strcmp(doc["state"], "ON") == 0) {
light->setState(true);
} else {
light->setState(false);
}
}
void HALight::sendState() {
JSON_DOCUMENT_TYPE doc = createStateJSON();
buffer[0] = '\0';
serializeJson(doc, buffer, buffer_size);
Serial.println(state_topic);
client.publish(state_topic, buffer, true);
}
void HALight::sendConfig() {
JSON_DOCUMENT_TYPE doc = createConfigJSON();
buffer[0] = '\0';
serializeJson(doc, buffer, buffer_size);
client.publish(config_topic, buffer, true);
}
@@ -42,14 +62,10 @@ void HALight::handle(char *topic, byte *payload, unsigned int length) {
if (strcmp(topic, command_topic) != 0)
return;
StaticJsonDocument<256> doc;
JSON_DOCUMENT_TYPE doc;
deserializeJson(doc, (const byte *)payload, length);
if (strcmp(doc["state"], "ON") == 0) {
light->setState(true);
} else {
light->setState(false);
}
innerHanlder(doc);
sendState();
}

View File

@@ -8,10 +8,17 @@ public:
virtual bool getState() = 0;
};
#define JSON_DOCUMENT_TYPE StaticJsonDocument<256>
class HALight : public HAControllableDevice {
private:
HALightController *light;
protected:
virtual JSON_DOCUMENT_TYPE createConfigJSON();
virtual JSON_DOCUMENT_TYPE createStateJSON();
virtual void innerHanlder(JSON_DOCUMENT_TYPE &doc);
HALight(PubSubClient &client, const char *name, const char *unique_id);
public:
HALight(PubSubClient &client, const char *name, const char *unique_id,
HALightController &baseLight);

View File

@@ -0,0 +1,37 @@
#include <HALightBrightness.hpp>
HALightBrightness::HALightBrightness(PubSubClient &client, const char *name, const char *unique_id,
HALightBrightnessController &baseLight)
: HALight(client, "light", name, baseLight),
light(&baseLight) {}
JSON_DOCUMENT_TYPE HALightBrightness::createConfigJSON() {
JSON_DOCUMENT_TYPE doc = HALight::createConfigJSON();
doc["brightness"] = true;
doc["brightness_scale"] = light->getBrightnessScale();
// doc["color_mode"] = true;
// doc["supported_color_modes"] =
// JSON_DOCUMENT_TYPE doc;
return doc;
}
JSON_DOCUMENT_TYPE HALightBrightness::createStateJSON() {
JSON_DOCUMENT_TYPE doc = HALight::createStateJSON();
doc["brightness"] = light->getBrightness();
// JSON_DOCUMENT_TYPE doc;
return doc;
}
void HALightBrightness::innerHanlder(JSON_DOCUMENT_TYPE &doc) {
if (doc.containsKey("brightness")) {
light->setBrightness(doc["brightness"]);
}
delay(50);
HALight::innerHanlder(doc);
}

View File

@@ -0,0 +1,25 @@
#pragma once
#include <HALight.hpp>
class HALightBrightnessController: public HALightController {
public:
virtual void setBrightness(int value) = 0;
virtual int getBrightness() = 0;
virtual int getBrightnessScale() = 0;
};
class HALightBrightness : public HALight {
private:
HALightBrightnessController *light;
protected:
JSON_DOCUMENT_TYPE createConfigJSON();
JSON_DOCUMENT_TYPE createStateJSON();
void innerHanlder(JSON_DOCUMENT_TYPE &doc);
public:
HALightBrightness(PubSubClient &client, const char *name, const char *unique_id,
HALightBrightnessController &baseLight);
};

View File

@@ -1,3 +1,4 @@
#pragma once
#include <HALight.hpp>
#include <HALight.hpp>
#include <HALightBrightness.hpp>