Guest User

Untitled

a guest
Jul 2nd, 2025
6
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.43 KB | Source Code | 0 0
  1.     #include "esphome.h"
  2.     #include "IRremoteESP8266.h"
  3.     #include "IRsend.h"
  4.     #include "ir_Electra.h"
  5.    
  6.     const uint16_t kIrLed = 12;
  7.     IRElectraAc ac(kIrLed);
  8.    
  9.     class ElectraAC : public Component, public Climate, public CustomAPIDevice {
  10.       private:
  11.         sensor::Sensor* temp_sensor{nullptr};
  12.    
  13.       public:
  14.         void set_temp_sensor(sensor::Sensor *sensor) { this->temp_sensor = sensor; }
  15.    
  16.         void setup() override
  17.         {
  18.           register_service(&ElectraAC::set_data, "set_data", {"hvac", "temp", "fan", "swing", "light"});
  19.    
  20.           ac.begin();
  21.           ac.setMode(kElectraAcAuto);
  22.           ac.setTemp(22);
  23.           ac.setFan(kElectraAcFanAuto);
  24.           ac.setSwingV(false);
  25.    
  26.           ac.off();
  27.    
  28.           if(this->temp_sensor != nullptr){
  29.             this->temp_sensor->add_on_raw_state_callback([this](float temp) { update_temp(temp); });
  30.           }
  31.    
  32.           this->mode = CLIMATE_MODE_OFF;
  33.           this->fan_mode = CLIMATE_FAN_AUTO;
  34.           this->swing_mode = CLIMATE_SWING_OFF;
  35.           this->target_temperature = 22;
  36.           this->publish_state();
  37.         }
  38.    
  39.         void update_temp(float temp) {
  40.           if(isnan(temp)){
  41.             return;
  42.           }
  43.    
  44.           this->current_temperature = temp;
  45.           this->publish_state();
  46.         }
  47.    
  48.         climate::ClimateTraits traits()
  49.         {
  50.           auto traits = climate::ClimateTraits();
  51.    
  52.           traits.set_supports_current_temperature(true);
  53.           traits.set_supports_two_point_target_temperature(false);
  54.           traits.set_visual_min_temperature(16);
  55.           traits.set_visual_max_temperature(32);
  56.           traits.set_visual_min_humidity(30);
  57.           traits.set_visual_max_humidity(99);
  58.           traits.set_visual_temperature_step(1); //Show current temperature with degrees
  59.    
  60.    
  61.           std::set<ClimateMode> climateModes;
  62.           climateModes.insert(CLIMATE_MODE_OFF);
  63.           climateModes.insert(CLIMATE_MODE_HEAT_COOL);
  64.           climateModes.insert(CLIMATE_MODE_COOL);
  65.           climateModes.insert(CLIMATE_MODE_HEAT);
  66.           climateModes.insert(CLIMATE_MODE_DRY);
  67.           climateModes.insert(CLIMATE_MODE_FAN_ONLY);
  68.    
  69.           traits.set_supported_modes(climateModes);
  70.    
  71.    
  72.           std::set<ClimateFanMode> climateFanModes;
  73.           climateFanModes.insert(CLIMATE_FAN_AUTO);
  74.           climateFanModes.insert(CLIMATE_FAN_LOW);
  75.           climateFanModes.insert(CLIMATE_FAN_MEDIUM);
  76.           climateFanModes.insert(CLIMATE_FAN_HIGH);
  77.           climateFanModes.insert(CLIMATE_FAN_FOCUS);
  78.    
  79.           traits.set_supported_fan_modes(climateFanModes);
  80.    
  81.    
  82.           std::set<ClimateSwingMode> climateSwingModes;
  83.           climateSwingModes.insert(CLIMATE_SWING_OFF);
  84.           climateSwingModes.insert(CLIMATE_SWING_VERTICAL);
  85.    
  86.           traits.set_supported_swing_modes(climateSwingModes);
  87.    
  88.           return traits;
  89.         }
  90.    
  91.         void control(const ClimateCall &call) override
  92.         {
  93.           if (call.get_mode().has_value())
  94.           {
  95.             ClimateMode climateMode = *call.get_mode();
  96.             switch (climateMode)
  97.             {
  98.             case CLIMATE_MODE_HEAT:
  99.               ac.setMode(kElectraAcHeat);
  100.               ac.on();
  101.               break;
  102.             case CLIMATE_MODE_COOL:
  103.               ac.setMode(kElectraAcCool);
  104.               ac.on();
  105.               break;
  106.             case CLIMATE_MODE_HEAT_COOL:
  107.               ac.setMode(kElectraAcAuto);
  108.               ac.on();
  109.               break;
  110.             case CLIMATE_MODE_DRY:
  111.               ac.setMode(kElectraAcDry);
  112.               ac.on();
  113.               break;
  114.             case CLIMATE_MODE_FAN_ONLY:
  115.               ac.setMode(kElectraAcFan);
  116.               ac.on();
  117.               break;
  118.             case CLIMATE_MODE_OFF:
  119.               ac.off();
  120.               break;
  121.    
  122.             }
  123.    
  124.             this->mode = climateMode;
  125.             this->publish_state();
  126.           }
  127.    
  128.           if (call.get_target_temperature().has_value())
  129.           {
  130.             float temp = *call.get_target_temperature();
  131.             ac.setTemp(temp);
  132.    
  133.             this->target_temperature = temp;
  134.             this->publish_state();
  135.           }
  136.    
  137.           if (call.get_fan_mode().has_value())
  138.           {
  139.             ClimateFanMode fanMode = *call.get_fan_mode();
  140.             switch (fanMode)
  141.             {
  142.             case CLIMATE_FAN_AUTO:
  143.               ac.setFan(kElectraAcFanAuto);
  144.               ac.setTurbo(false);
  145.               break;
  146.             case CLIMATE_FAN_LOW:
  147.               ac.setFan(kElectraAcFanLow);
  148.               ac.setTurbo(false);
  149.               break;
  150.             case CLIMATE_FAN_MEDIUM:
  151.               ac.setFan(kElectraAcFanMed);
  152.               ac.setTurbo(false);
  153.               break;
  154.             case CLIMATE_FAN_HIGH:
  155.               ac.setFan(kElectraAcFanHigh);
  156.               ac.setTurbo(false);
  157.               break;
  158.             case CLIMATE_FAN_FOCUS:
  159.               ac.setFan(kElectraAcFanHigh);
  160.               ac.setTurbo(true);
  161.               break;
  162.             }
  163.    
  164.             this->fan_mode = fanMode;
  165.             this->publish_state();
  166.           }
  167.    
  168.           if (call.get_swing_mode().has_value())
  169.           {
  170.             ClimateSwingMode swingMode = *call.get_swing_mode();
  171.             switch (swingMode)
  172.             {
  173.             case CLIMATE_SWING_OFF:
  174.               ac.setSwingV(false);
  175.               break;
  176.             case CLIMATE_SWING_VERTICAL:
  177.               ac.setSwingV(true);
  178.               break;
  179.             }
  180.    
  181.             this->swing_mode = swingMode;
  182.             this->publish_state();
  183.           }
  184.    
  185.           ac.send();
  186.         }
  187.    
  188.         void set_data(std::string hvac, float temp, std::string fan, std::string swing, bool light)
  189.         {
  190.           auto call = this->make_call();
  191.    
  192.           if (hvac == "off")
  193.           {
  194.             call.set_mode(CLIMATE_MODE_OFF);
  195.           }
  196.           else if (hvac == "heat_cool")
  197.           {
  198.             call.set_mode(CLIMATE_MODE_HEAT_COOL);
  199.           }
  200.           else if (hvac == "heat")
  201.           {
  202.             call.set_mode(CLIMATE_MODE_HEAT);
  203.           }
  204.           else if (hvac == "cool")
  205.           {
  206.             call.set_mode(CLIMATE_MODE_COOL);
  207.           }
  208.           else if (hvac == "dry")
  209.           {
  210.             call.set_mode(CLIMATE_MODE_DRY);
  211.           }
  212.           else if (hvac == "fan_only")
  213.           {
  214.             call.set_mode(CLIMATE_MODE_FAN_ONLY);
  215.           }
  216.    
  217.           call.set_target_temperature(temp);
  218.    
  219.           if (fan == "auto")
  220.           {
  221.             call.set_fan_mode(CLIMATE_FAN_AUTO);
  222.           }
  223.           else if (fan == "low")
  224.           {
  225.             call.set_fan_mode(CLIMATE_FAN_LOW);
  226.           }
  227.           else if (fan == "medium")
  228.           {
  229.             call.set_fan_mode(CLIMATE_FAN_MEDIUM);
  230.           }
  231.           else if (fan == "high")
  232.           {
  233.             call.set_fan_mode(CLIMATE_FAN_HIGH);
  234.           }
  235.           else if (fan == "focus")
  236.           {
  237.             call.set_fan_mode(CLIMATE_FAN_FOCUS);
  238.           }
  239.    
  240.           if (swing == "off")
  241.           {
  242.             call.set_swing_mode(CLIMATE_SWING_OFF);
  243.           }
  244.           else if (swing == "vertical")
  245.           {
  246.             call.set_swing_mode(CLIMATE_SWING_VERTICAL);
  247.           }
  248.    
  249.           call.perform();
  250.         }
  251.     };
  252.  
Advertisement
Add Comment
Please, Sign In to add comment