Home Assistant integracja climate


Cześć,

Robię prosty sterownik na ESP32 do obsługi przerobionej pompy ciepła z klimatyzatora. Chciałbym aby dane wyświetlały się w HA, ponadto chciałbym mieć prostą możliwość sterowania, włącz / wyłącz, nastawa temperatury. ESP komunikuje się z HA przez MQTT, komunikacja działa.

Problem w tym że chyba czegoś brakuje integracji CLIMATE bo “kółeczko” jest cały czas szare, nie podświetlają się przyciski HEAT i AUTO. zaciągnąłem jakąś przykładową konfigurację do Configuration.yaml. Ktoś coś podpowie ?

Obrazki są fajne ale mało użyteczne.

  climate:
      name: ESP222_HeatPump
      unique_id: "ESP222_Climate"
      modes:
        - "off"
        - "heat"
        - "auto"
      mode_command_topic: "ESP222_HeatPump/mode_set"
      mode_state_topic: "ESP222_HeatPump/mode_state"
      mode_state_template: "{{ value_json }}"
      power_command_topic: "ESP222_HeatPump/power_set"
      power_state_topic: "ESP222_HeatPump/power_state"
      power_state_template: "{{ value_json }}"
      temperature_command_topic: "ESP222_HeatPump/temperature_set"
      temperature_state_topic: "ESP222_HeatPump/temperature_state"
      temperature_state_template: "{{ value_json }}"
      precision: 1.0

Jeśli coś zaciągasz, to wskaż źródło tego przykładu, bo możliwe że nie dotyczy Twojego przypadku użycia. Na pierwszy rzut oka, jeśli komunikacja odbywa się po MQTT brakuje tej sekcji w konfiguracji, chyba, że inkudujesz w configuration.yaml ten zapis do osobnego pliku mqtt.yaml ale o tym nic nie piszesz.

Zobacz na przykład z dokumentacji dla MQTT HVAC:

# Example configuration.yaml entry
mqtt:
  - climate:
      name: Study
      mode_command_topic: "study/ac/mode/set"

Sprawdź też czy tematy pokrywają się dokładnie z tym co masz w MQTT-Explorer z tym co zawierasz w YAML. Z doświadczenia wiem, że tu najłatwiej o błąd, zwłaszcza jeśli nie używa się kopiowania.

Dzięki za odpowiedź :slight_smile:

Powyższy fragment pochodzi z configuration.yaml. To jest fragment sekcji MQTT (nie wrzucałem całości bo mam tego sporo, wrzuciłem tylko to co dotyczy tego wątku).

Powtórzę - komunikacja MQTT działa, czyli np. kręcąc kółeczkiem - zmienia mi się temperatura zadana, odczytuje to poprawnie w ESP32. Ustawiając tryb HEAT - ESP32 także widzi że aktywowałem tryb HEAT. Wszystko jest OK, tylko to “kółeczko” nie zmienia stanu - jest cały czas szare. Podobnie z wybranym trybem HEAT - nie podświetla się.

Więc brakuje informacji zwrotnej dla HA z ESP32, ale nie podałeś żadnej informacji co wgrałeś do tego ESP32. Na ten moment można wróżyć z obrazka i kawałka kodu HA jak z Tarota, na ten moment postawiłem dwie karty i swoją wróżbę przedstawiłem. Możesz rozwijać temat po jednej kacie ale mi szkoda czasu na wyciąganie każdej informacji.


Tak, byłem na tej stronie z dokumentacją MQTT HVAC - w zasadzie kod jest 1:1 z tej właśnie strony.

include <PubSubClient.h>

// #define MSG_BUFFER_SIZE (50) // to dodałem do MQTT Sending

String strTopic; // to dodałem do MQTT Sending
WiFiClient espClient;
PubSubClient client(espClient);
char msg[50];

unsigned long MQTTLastmsg_1;

#define mqtt_server “192.168.1.204” // IP HA
#define mqtt_user “mqtt”
#define mqtt_password “mqtt”

#define MQTT_ESP222_EEV “sensor/EEV_ESP222”
#define MQTT_ESP222_FAN “sensor/FAN_ESP222”
#define MQTT_ESP222_CompressorSpeed “sensor/CompressorSpeed_ESP222”
#define MQTT_ESP222_Power “sensor/power_ESP222”
#define MQTT_ESP222_MODE_STATUS_EU “sensor/ModeStatus_ESP222”
#define MQTT_ESP222_T5_EU “sensor/T5_ESP222” // Discharge
#define MQTT_ESP222_T4_EU “sensor/T4_ESP222” // Condenser
#define MQTT_ESP222_T3_EU “sensor/T3_ESP222” // Ambient
#define MQTT_ESP222_T2_EU “sensor/T2_ESP222” // Home - DS
#define MQTT_ESP222_T1_EU “sensor/T1_ESP222” // Evaporator NTC
#define MQTT_ESP222_WaterFlow “sensor/WaterFlow”
#define MQTT_ESP222_ControlModeSET “sensor/ControlMode_ESP222” // 0 - Local / 1 - Remote LOCAL / 2 - AHU Master
#define MQTT_ESP222_ModeSET “sensor/Mode_ESP222” // 0 - idle / 1 - cooling / 2 - heating
#define MQTT_ESP222_Level “sensor/Level_ESP222” // 0-11
#define MQTT_ESP222_TempSetPoint “sensor/TempSetPoint_ESP222” // Temp SET
#define MQTT_ESP222_Increment “sensor/Increment_ESP222”
#define MQTT_ESP222_Decrement “sensor/Decrement_ESP222”
#define MQTT_ESP222_Interval “sensor/interval_ESP222” // def. 180
#define MQTT_ESP222_Hysteresis “sensor/Hysteresis_ESP222” // def. 6 (0.6)

void reconnect()
{
// Loop until we’re reconnected
if (!client.connected())
{
Serial.println(“Attempting MQTT connection…”);
if (client.connect(“ESP222_HeatPump”, mqtt_user, mqtt_password))
{
if (client.connect(“ESP222_HeatPump”))
{
Serial.println(“connected”);
}

  client.subscribe("ESP222_HeatPump/mode_set"); // Subscribey
  client.subscribe("ESP222_HeatPump/power_set");
  client.subscribe("ESP222_HeatPump/temperature_set");
}
else
{
  Serial.print("failed, rc=");
  Serial.print(client.state());
  Serial.println(" try again in 5 seconds");
}

}
}

void callback(char *topic, byte *message, unsigned int length)
{

// String response;
Serial.print(“Message arrived [”);
Serial.print(topic);
Serial.print("] ");
String messageTemp;
for (unsigned int i = 0; i < length; i++) // tak było: for (int i = 0; i < length; i++)
{
Serial.print((char)message[i]); // response += (char)message[i];
messageTemp += (char)message[i]; // Serial.print((char)message[i]);
}
Serial.println();

strTopic = String((char *)topic);

if (strTopic == (“ESP222_HeatPump/mode_set”))
{
Serial.print("JEst_odpowiedź mode_set ");
if (messageTemp == “heat”)
{
mode_SET = 2;
Serial.print("Mode_SET: ");
Serial.println(mode_SET);
}
}

if (strTopic == (“ESP222_HeatPump/mode_set”))
{
if (messageTemp == “off”)
{
mode_SET = 0;
Serial.print("Mode_SET: ");
Serial.println(mode_SET);
}
}

if (strTopic == (“ESP222_HeatPump/temperature_set”))
{
String zadanatemperatura = messageTemp; // ustawinie temp
Serial.println(zadanatemperatura);
int zadanatemperaturaint = zadanatemperatura.toInt ();
Serial.println(zadanatemperaturaint);
}
}

void MQTT_Publish()
{
unsigned long mqttnow1 = millis();

if (mqttnow1 - MQTTLastmsg_1 > 10000) // MQTT Modbus Sending cycle
{

char modbuseevString[8];
char modbusT5String[8];
char modbusT4String[8];
char modbusT3String[8];
char modbusT2String[8];
char modbusT1String[8];
// char modbusmodeString[8];
evaporator_temp = 24;
dtostrf(eev_ro, 1, 0, modbuseevString); // source, width, DEC places, destination
dtostrf(discharge_temp, 1, 0, modbusT5String);
dtostrf(ambient_temp, 1, 0, modbusT4String);
dtostrf(condenser_temp, 1, 0, modbusT3String);
dtostrf(indoor_temp, 1, 0, modbusT2String);
dtostrf(evaporator_temp, 1, 0, modbusT1String);
// dtostrf(mode, 1, 0, modbusmodeString);

// client.publish("sensor/EEV_ESP222", modbuseevString);
// client.publish("sensor/T5_ESP222", modbusT5String);
// client.publish("sensor/T4_ESP222", modbusT4String);
// client.publish("sensor/T3_ESP222", modbusT3String);
// client.publish("sensor/T2_ESP222", modbusT2String);
// client.publish("sensor/T1_ESP222", modbusT1String);
// client.publish("sensor/T1_ESP222", modbusT1String);
client.publish("ESP222_HeatPump/temperature_state", modbusT1String);

// if (mode == 2)
client.publish(“ESP222_HeatPump/mode_state”, “heat”);
// if (mode == 0)
//client.publish(“ESP222_HeatPump/mode_state”, “on”); // idle
client.publish(“ESP222_HeatPump/power_state”, “ON”);
//client.publish(“ESP222_HeatPump/preset_mode_set”, “on”);

// client.subscribe("ESP222_HeatPump/mode_set"); // Subscribey
// client.subscribe("ESP222_HeatPump/ac/power/set");
// client.subscribe("ESP222_HeatPump/ac/temperature_set");

MQTTLastmsg_1 = mqttnow1;

}
}

fragment sekcji obsługującej MQTT.

Programistą nie jestem więc nie będę dalej drążył, udając że się znam. Może pojawi się ktoś bardziej kompetentny, kto rozumie więcej z tego kodu. Myślałem, że korzystałeś z gotowych projektów typu Tasmota, ESPHome czy ESPEasy. Ja nie rozpoznaję czego to jest fragment.

Dlatego nie wstawiałem całego kodu - tym bardziej że jest bardzo mocno roboczy i zawiera różne próby “aktywacji” “kółeczka” w HA.

Moje podstawowe pytanie brzmi - co konkretnie trzeba wysłać z ESP32 do HA (via MQTT) - aby ten widział że moje urządzenie jest włączone, że jest aktywny tryb HEAT.

Wydaje mi się, że odpowiedni ładunek JSON w temacie “ESP222_HeatPump/power_state”, w którym HA otrzyma informację typu ON lub OFF i widać, że taki ładunek leci po MQTT w tym temacie, spróbuj użyć:
zamiast

power_state_template: "{{ value_json }}"

tego

value_template: '{{ value }}'
1 polubienie

Climate_4
W mordę Jeża!!! drgnęło!!! :slight_smile:

1 polubienie

Wielkie dzięki!

Co jak co - lubię zabawy z ESP, z HA, ale ten YAML…

a co zrobić by się wyświetlała na środku - dużą czcionką (jak mój przykład nieco wcześniej) - wartość aktualnej temperatury ?

Wrzucić tu kod karty.

type: thermostat
entity: climate.esp222_heatpump

type: thermostat
        entity: climate.klimaanlage_wohnzimmer
        name: Wohnzimmer
        card_mod:
          style:
            .: |
              .title {
                font-size: 14px !important;
                text-align: left !important;
                padding-left: 20px !important;
              }