Generic_thermostat for Humidity

Thanks for your hints!

I created an input_number with the name schieber_steckdose1 and put the following code into my automations.yaml, restarted hass.io, but nothing happens when I move the input_number… any ideas?

Btw, I created two rules - one for “ON”, the other for “OFF” - is it possible to combine these rules into one rule?

Thank you!

Easier to read: https://pastebin.com/uCQ36ruu

  • id: steckdose1_luftfeuchtigkeit_on
    alias: ‘Steckdose 1 Luftfeuchtigkeit on’
    initial_state: true

    trigger:
    platform: template
    value_template: “{{ (states(‘input_number.schieber_steckdose1’) + 2.5) | float <= states(‘sensor.sensor.steckdose1_am2301_humidity’) | float }}”

    action:

    • service: switch.turn_on
      entity_id: switch.steckdose1
  • id: steckdose1_luftfeuchtigkeit_off
    alias: ‘Steckdose 1 Luftfeuchtigkeit off’
    initial_state: true

    trigger:
    platform: template
    value_template: “{{ (states(‘input_number.schieber_steckdose1’) - 2.5) | float >= states(‘sensor.sensor.steckdose1_am2301_humidity’) | float }}”

    action:

    • service: switch.turn_off
      entity_id: switch.steckdose1

The word sensor is duplicated. Change it to sensor.steckdose1_am2301_humidity

Thanks - but still not working…

Have you tested the value_template in Home Assistant’s Template Editor?

Paste these lines into Template Editor and observe the results.

Steckdose: {{states('input_number.schieber_steckdose1')}}

Steckdose Adjusted: {{states('input_number.schieber_steckdose1') + 2.5) | float}}

Humidity: {{states('sensor.steckdose1_am2301_humidity') | float}}

True or False: {{ (states('input_number.schieber_steckdose1') + 2.5) | float <= states('sensor.steckdose1_am2301_humidity') | float }}

For this, I get a result:

{{ states(‘input_number.schieber_steckdose1’)| float}}

Result: 54

For this part, I am getting an “Unknown error rendering template” Error:

{{(states(‘input_number.schieber_steckdose1’) + 2.5) | float}}

This was the solution:

value_template: “{{((states.input_number.schieber_steckdose1.state | float) + 2.5) <= states(‘sensor.steckdose1_am2301_humidity’) | float }}”

Now I only need to combine these two automations into one - is this possible?

  • id: steckdose1_luftfeuchtigkeit_on
    alias: “Steckdose 1 Luftfeuchtigkeit on“
    initial_state: true

    trigger:
    platform: template
    value_template: “{{((states.input_number.schieber_steckdose1.state | float) + 2.5) <= states(‘sensor.steckdose1_am2301_humidity’) | float }}”

    action:
    service: switch.turn_on
    entity_id: switch.steckdose1

  • id: steckdose1_luftfeuchtigkeit_off
    alias: “Steckdose 1 Luftfeuchtigkeit off“
    initial_state: true

    trigger:
    platform: template
    value_template: “{{((states.input_number.schieber_steckdose1.state | float) + 2.5) >= states(‘sensor.steckdose1_am2301_humidity’) | float }}”

    action:
    service: switch.turn_off
    entity_id: switch.steckdose1

Good! Glad to hear using the Template Editor helped you solve the problem.

Going forward, you should learn how to format your code for presentation on this forum. YAML indenting is critical and, in the way your code is shown, it is difficult to interpret it correctly.

Simply enter three consecutive backquotes ``` on a separate line before your code and then another set of three backquotes, on their own line, after your code. This will instruct the forum’s software to display your code in a formatted appearance (and make it easier for others to read it).

Yes, it’s possible to combine the two automations into one.

Sure, you are right, thanks for this hint!

Can you help me to put this together? I’ve tried a few different ways, but none of them worked…

Thank you for your help!

- id: steckdose1_luftfeuchtigkeit_on
  alias: “Steckdose 1 Luftfeuchtigkeit on“
  initial_state: true

  trigger:
    platform: template
    value_template: "{{states('sensor.steckdose1_am2301_humidity') | float > ((states.input_number.schieber_steckdose1.state | float) + 2.5)  }}"

  action:
    service: switch.turn_on
    entity_id: switch.steckdose1



- id: steckdose1_luftfeuchtigkeit_off
  alias: “Steckdose 1 Luftfeuchtigkeit off“
  initial_state: true

  trigger:
    platform: template
    value_template: "{{states('sensor.steckdose1_am2301_humidity') | float < ((states.input_number.schieber_steckdose1.state | float) - 2.5)  }}"

  action:
    service: switch.turn_off
    entity_id: switch.steckdose1

Try this. It’s untested but it should be approximately correct. :slight_smile:

I created two temporary variables in the value_template just to make it easier to read the last line of the template.

- id: steckdose1_luftfeuchtigkeit
  alias: 'Steckdose 1 Luftfeuchtigkeit'
  trigger:
    platform: state
    entity_id: input_number.schieber_steckdose1, sensor.steckdose1_am2301_humidity
  action:
    service_template: >-
      {% set target = (states('input_number.schieber_steckdose1') | float) + 2.5 %}
      {% set humidity = states('sensor.steckdose1_am2301_humidity') | float %}
      switch.turn_{{'on' if target <= humidity else 'off'}}
    entity_id: switch.steckdose1

Thanks, but it only works with the “tolerance” of + 2.5, but not with - 2.5 :wink:

As I wrot in my first post: The machine should e.g. turn on when the humidity is over 60%, and turn off when it has reached 50% (mean value is 55%) --> so the input_number.schieber_steckdose1 would be 55 in this example

I followed what you posted in your second example which uses +2.5 for both turning the switch on and off.

I now see that in your first example, you used +2.5 for on and -2.5 for off.

Do you want help to fix the automation or do you feel ready to handle it yourself?

BTW, I’m confused by the example you provided. Doesn’t it represent a range of +/- 5? If you set the target to 55 it turns the dehumidifier on at 60 (target+5) and turns it off at 50 (target-5). The humidity can then rise up to 60 again until the dehumidifer is turned on.

Sorry for confusing you - I was also a little confused at the beginning, but finally found the right automation which is described in this comment.

The rule behind it: If I set the target to 55%, the dehumidifer turns on when humidity gets over 57.5% and turns off when it reaches 52.5%

In OpenHAB, I was able to just put two if-conditions into one rule, which would look like somthing familiar to the following automation in HomeAssistant, but this doesn’t work:

- id: steckdose1_luftfeuchtigkeit_both
  alias: “Steckdose 1 Luftfeuchtigkeit both“
  initial_state: true

  trigger:
    platform: template
    value_template: "{{states('sensor.steckdose1_am2301_humidity') | float > ((states.input_number.schieber_steckdose1.state | float) + 2.5)  }}"

  action:
    service: switch.turn_on
    entity_id: switch.steckdose1

  trigger:
    platform: template
    value_template: "{{states('sensor.steckdose1_am2301_humidity') | float < ((states.input_number.schieber_steckdose1.state | float) - 2.5)  }}"

  action:
    service: switch.turn_off
    entity_id: switch.steckdose1

Is there a way to simply put these two automations into one?
I know you already gave me an example, but I don’t really understand that.

Thank you for your help and your time!

Here is how I understand this system works:

  • D = Desired humidity
  • LO = Low humidity threshold (D - 2.5)
  • HI = High humidity threshold (D + 2.5)
           LO    D     HI
-----------|-----|-----|------------
    OFF    |  CURRENT  |     ON
OFF>>>>>>>>>>>>>>>>>>>>|
           |<<<<<<<<<<<<<<<<<<<<<<ON

There are three operating states:

  • OFF: Ambient humidity is less than LO so the dehumidifier is set to off.
  • ON: Ambient humidity is greater than HI so the dehumidifier is set to on.
  • CURRENT: Ambient humidity is within the range set by LO and HI. The off and on states overlap within the range (it can be either on or off within this range). It depends on whether the dehumidifier is currently on and decreasing the humidity from HI to LO, or if the dehumidifier is off and allowing humidity to rise from LO to HI.

Here’s an example:

  • Desired humidity is 55 so LO=53.5 and HI=57.5
  • Ambient humidity is 57.
  • Dehumidifier is off.
  • Humidity rises to 58 and triggers the automation.
  • Humidity now exceeds HI so the dehumidifier will be set to on.
  • Humidity falls to 57 and triggers the automation. Humidity is less than HI but more than LO. The dehumidifier is set to its CURRENT state which is on (the automation is obliged to assign a value to service_template) .
  • Humidity falls to 56 and triggers the automation. It is still within range and the humidifier is set to its CURRENT state. This pattern repeats until the humidity reaches the LO threshold.
  • Humidity falls to 53 and triggers the automation. It is now less than LO so the dehumidifier is set to off.
  • Humidity rises to 54 and triggers the automation. It is now higher than LO but less then HI. The dehumidifier is set to its CURRENT state which is off. This behavior continues until humidity exceeds HI and then the dehumidifier is set to on.

The following automation implements the behavior I just described. It is triggered either by changes to the sensor or to the input_number. It computes LO and HI thresholds and then determines if the humidity is below, within, or above the range. Depending on the result, it will call the correct service.

  • If humidity < LO then call switch.turn_off
  • If humidity > HI then call switch.turn_on
  • If humidity is between LO and HI then call the service corresponding to the dehumidifier’s CURRENT state.
- id: steckdose1_luftfeuchtigkeit
  alias: 'Steckdose 1 Luftfeuchtigkeit'
  trigger:
    platform: state
    entity_id:
      - input_number.schieber_steckdose1
      - sensor.steckdose1_am2301_humidity
  action:
    service_template: >-
      {% set hi = (states('input_number.schieber_steckdose1') | float) + 2.5 %}
      {% set lo = hi - 5 %}
      {% set humidity = states('sensor.steckdose1_am2301_humidity') | float %}
      {% if humidity > hi %}
        switch.turn_on
      {% elif humidity < lo %}
        switch.turn_off
      {% else %}
        switch.turn_{{states('switch.steckdose1') | lower}}
      {% endif %}
    entity_id: switch.steckdose1
2 Likes

perfect, this is exactly what I was looking for (also an example for setting variables so I can continue to try some different automations)

THANK YOU very much!

You’re most welcome!

You may wish to consider tagging the post as ‘solution’ so others can find it more easily.

I used openHAB for about a half-year then looked into Home Assistant to see how it differs. I found it more to my liking (but both are equally competent products with helpful communities).

You’ll find Home Assistant’s automations, with their YAML structure and Jinja2 templating, to be quite different from openHAB’s Rules DSL. I encourage you to review the examples in the Cookbook to become more comfortable with this different style of creating automation logic. There are more complex examples found throughout this forum as well as in the Github repos shared by Home Assistant users.

If you find Home Assistant’s automations and scripts to be limiting, you have the option to use python_scripts or AppDaemon or Node-Red.

You are right, it’s really different.
For me personally, the rules in OpenHAB were just easier to understand and implement, but seriously, this is the only thing that I am missing about OpenHAB when I compare it with Home Assistant.

Thanks again!

1 Like

Can you reshare the automations?

https://pastebin.com/6R49H1hz

@123
This is a very nice solution. I plan on taking what you have done here and use it for a video where I’m taking a Sonoff SV and building a humidifier control. IE I’m going to flip the ON and OFF command so the device powers when the humidity is low and make new names, but your elegant code will remain.
I’ll credit you and put a link to it here in this post.
Thanks for supporting the more programming-addled among us!

1 Like

https://youtu.be/2bRu4H6qo84
Here is the link to my YouTube video where I use this automation to sucessfully make my Humidistat solution to work!