My Garden Irrigation

Here is the lovelace gen fix / update for ease of use, just replace it with the file below thanks to petro …

petro

lovelace gen already has the fix, here’s the code if you don’t want to wait. Replace the contents of config/custom_components/lovelace_gen/__init__.py with:

import os
import logging
import json
import io
import time
from collections import OrderedDict

import jinja2

from homeassistant.util.yaml import loader
from homeassistant.exceptions import HomeAssistantError

_LOGGER = logging.getLogger(__name__)

def fromjson(value):
    return json.loads(value)

jinja = jinja2.Environment(loader=jinja2.FileSystemLoader("/"))

jinja.filters['fromjson'] = fromjson

llgen_config = {}

def load_yaml(fname, secrets = None, args={}):
    try:
        ll_gen = False
        with open(fname, encoding="utf-8") as f:
            if f.readline().lower().startswith("# lovelace_gen"):
                ll_gen = True

        if ll_gen:
            stream = io.StringIO(jinja.get_template(fname).render({**args, "_global": llgen_config}))
            stream.name = fname
            return loader.yaml.load(stream, Loader=lambda _stream: loader.SafeLineLoader(_stream, secrets)) or OrderedDict()
        else:
            with open(fname, encoding="utf-8") as config_file:
                return loader.yaml.load(config_file, Loader=lambda stream: loader.SafeLineLoader(stream, secrets)) or OrderedDict()
    except loader.yaml.YAMLError as exc:
        _LOGGER.error(str(exc))
        raise HomeAssistantError(exc)
    except UnicodeDecodeError as exc:
        _LOGGER.error("Unable to read file %s: %s", fname, exc)
        raise HomeAssistantError(exc)


def _include_yaml(ldr, node):
    args = {}
    if isinstance(node.value, str):
        fn = node.value
    else:
        fn, args, *_ = ldr.construct_sequence(node)
    fname = os.path.abspath(os.path.join(os.path.dirname(ldr.name), fn))
    try:
        return loader._add_reference(load_yaml(fname, ldr.secrets, args=args), ldr, node)
    except FileNotFoundError as exc:
        _LOGGER.error("Unable to include file %s: %s", fname, exc);
        raise HomeAssistantError(exc)

def _uncache_file(ldr, node):
    path = node.value
    timestamp = str(time.time())
    if '?' in path:
        return f"{path}&{timestamp}"
    return f"{path}?{timestamp}"

loader.load_yaml = load_yaml
loader.SafeLineLoader.add_constructor("!include", _include_yaml)
loader.SafeLineLoader.add_constructor("!file", _uncache_file)

async def async_setup(hass, config):
    llgen_config.update(config.get("lovelace_gen"));
    return True

# Allow redefinition of node anchors
import yaml

def compose_node(self, parent, index):
    if self.check_event(yaml.events.AliasEvent):
        event = self.get_event()
        anchor = event.anchor
        if anchor not in self.anchors:
            raise yaml.composer.ComposerError(None, None, "found undefined alias %r"
                    % anchor, event.start_mark)
        return self.anchors[anchor]
    event = self.peek_event()
    anchor = event.anchor
    self.descend_resolver(parent, index)
    if self.check_event(yaml.events.ScalarEvent):
        node = self.compose_scalar_node(anchor)
    elif self.check_event(yaml.events.SequenceStartEvent):
        node = self.compose_sequence_node(anchor)
    elif self.check_event(yaml.events.MappingStartEvent):
        node = self.compose_mapping_node(anchor)
    self.ascend_resolver()
    return node

yaml.composer.Composer.compose_node = compose_node

Whenever I make a manual change to the config file, Hacs disappears. Even with this it happened.

Did you do a full restart of home assistant, if yes i’m not sure what thats all about ? as it worked for me after scratching my head to find a solution to get it to work.

I downgraded homeassistant, then changed init.py and upgraded to version 2021.4.0. Now works. Thanks andie will5.

1 Like

I installed the package from scratch, but my pop-ups are still not working. Even after the posted new version… I don’t get it, tried reinstalling everything but nothing works

Klogg, can you please tell what were breaking changes causing?
I’ve spent few more hours trying to find the problem in v1, I understood many things but I could not fix the issue anyway.
Maybe what you fixed in v2 is the same I should fix in V1.

I suspect that’s something related to getting input_number value to define duration, but I really can’t sort it out.

I’m not asking you to fix it for me, but I really need some help and tips, I’m stuck…

Edit: ok, now I’m quite sure that the problem is that concatenation part to read the duration from the input_number.

In log I see:

  • Error while executing automation automation.irrigation_run_a_cycle_manually: Error rendering data template: TypeError: can only concatenate str (not “int”) to str
  • Error while executing automation automation.irrigation_run_a_cycle_manually: Error rendering service name template: TypeError: can only concatenate str (not “int”) to str

I googled for that error and I found an old post wrote by you, related to the same error but in Dec 2019.

The error is the same, but the code already has ‘1’ as zone parameter.
I always keep HA up to date so for sure my problem is not exactly the same reported by you in '19, otherwise the program could not work till last autumn, but it must be strictly related to it.
Unfortunately I’m really not good in managing int, str, conversions, etc.

That concatenation is used in many places, so if Someone guides me in the correct way I should be able to fix it.
Current code giving error is, for example:

- condition: template
        value_template: >
            {% if is_state('input_boolean.cycle' + cycle + '_use_weather_adjustment', 'on') %}
              {% set n = states('input_number.adjusted_cycle' + cycle + '_zone' + zone + '_duration')  | int %}
            {% else %}
              {% set n = states('input_number.cycle' + cycle + '_zone' + zone + '_duration')  | int %}
            {% endif %}
            {{ n != 0 }}

The script looks called in the right way:

- service: script.irrigation_irrigate_a_zone
        data_template:
          cycle: '{{ cycle }}'
          zone: '1'

Good morning, I don’t know if it happens to you too but every morning I find this error which then disappears in the afternoon (or at least I noticed it a couple of times but I’ll check it again) returning to work perfectly. What could it be?

ButtonCardJSTemplateError: TypeError: Cannot read property 'state' of undefined in 'var statestr = (entity === undefined || entity.state === undefined) ? 'undefined' : entity.state; ...'
tap_action:
  action: fire-dom-event
  browser_mod:
    command: popup
    title: Irrigation Controller
    hide_header: true
    card:
      type: vertical-stack
      cards:
        - type: markdown
          content: >-
            Enter the name of the sensor for your irrigation controller WiFi
            signal strength.


            Leave blank to reset to default.
          style: |
            ha-card {
              font-family: {{ states('input_text.irrigation_ui_font_family') }};
              font-size: 16px;
            }
        - type: entities
          entities:
            - entity: input_text.irrigation_external_sensor_controller_wifi
              name: Sensor Name
            - entity: input_number.irrigation_controller_offline_wait
              name: Seconds To Wait When Offline
            - type: section
          style: |
            ha-card {
              font-family: {{ states('input_text.irrigation_ui_font_family') }};
            }
        - type: markdown
          content: You can disable the switches to prevent irrigation while testing.
          style: |
            ha-card {
              font-family: {{ states('input_text.irrigation_ui_font_family') }};
              font-size: 16px;
            }
        - type: entities
          entities:
            - entity: input_boolean.irrigation_disable_switches
          style: |
            ha-card {
              font-family: {{ states('input_text.irrigation_ui_font_family') }};
            }
type: 'custom:button-card'
group_expand: false
hold_action:
  action: none
double_tap_action:
  action: none
layout: vertical
size: 30%
color_type: icon
show_name: true
show_state: true
show_icon: true
show_units: true
show_label: false
show_entity_picture: false
show_live_stream: false
card_size: 3
entity: sensor.esphome_irrigation_controller_wifi_signal
name: |
  [[[
    var statestr = (entity === undefined || entity.state === undefined) ? 'undefined' : entity.state;
    var unit_om = (statestr != 'undefined' && entity.attributes.unit_of_measurement) ? entity.attributes.unit_of_measurement : '';
    return 'Irrigation Controller' + ' (' + entity.state + ' ' + unit_om + ')'
  ]]]
icon: >-
  [[[ return (entity === undefined || entity.state == 'unavailable') ?
  'mdi:wifi-off' : 'mdi:wifi'; ]]]
state_display: '<elt><ha-icon icon=mdi:square-edit-outline></ha-icon></elt>'
styles:
  grid:
    - grid-template-areas: '"i n s"'
    - grid-template-columns: 15% auto 5%
    - grid-template-rows: 1fr
  card:
    - font-family: '[[[ return states[''input_text.irrigation_ui_font_family''].state ]]]'
    - font-size: 15px
    - padding: 0em 1.5em 0em 0em
    - background: none
    - box-shadow: none
  name:
    - justify-self: start
state:
  - value: unavailable
    styles:
      icon:
        - color: var(--accent-color)
        - animation: blink 2s ease infinite
      state:
        - color: var(--accent-color)
        - animation: blink 2s ease infinite
default_color: var(--primary-text-color)
color_off: var(--paper-item-icon-color)
color_on: var(--paper-item-icon-active-color)
lock:
  enabled: false
  duration: 5
  unlock: tap

Hello, I managed to install everything correctly, but I needed to customize a little thing, I need to put a pump to turn on in some areas.
Its possible have the option under switch name?
image

Regards,

Hi @Robertofz1981,
you can do that in esphome.
I’ve managed to do it turning on the pump relay every time one valve/zone is turned on.

This is my configuration using one esp32, i don’t know what kind of switches you are using, but i think you can achieve the same result with your system.
In esphome u can do like these:

switch:
  - platform: gpio
    pin: 
      number: 18
      inverted: True
    name: Valvola 1 R1
    id: valvola1_R1
    restore_mode: ALWAYS_OFF
    on_turn_on:
      then:
        - switch.turn_on: pompa_trasf
    on_turn_off:
      then:
        - switch.turn_off: pompa_trasf
  - platform: template
    name: Pompa + Trasf. 24VAC
    id: pompa_trasf
    turn_on_action:
     - then: 
       - switch.turn_on: pompa_R3
       - switch.turn_on: trasf_R4
       - switch.template.publish:
            id: pompa_trasf
            state: ON
    turn_off_action:
     - then: 
       - switch.turn_off: pompa_R3
       - switch.turn_off: trasf_R4
       - switch.template.publish:
            id: pompa_trasf
            state: OFF

with the switch pompa_trasf i’m turning on my pump and my transformer 220vac->24vac that powers electrovalves and the relay that control the 3phase water pump.

1 Like

Hello I have intention use a shelly 1pm. Thanks

ok you control your pump with shelly 1 pm, and your valves?
Do you use tasmota or esphome? have you flashed the shelly or do you use it as is?

6 valves with tasmota.

Sorry for the delay and for being so brief here (I’m not being rude, just short of time) but try changing all the plus signs (+) to tildes (~)

- condition: template
        value_template: >
            {% if is_state('input_boolean.cycle' ~ cycle ~ '_use_weather_adjustment', 'on') %}
              {% set n = states('input_number.adjusted_cycle' ~ cycle ~ '_zone' ~ zone ~ '_duration')  | int %}
            {% else %}
              {% set n = states('input_number.cycle' ~ cycle ~ '_zone' ~ zone ~ '_duration')  | int %}
            {% endif %}
            {{ n != 0 }}
1 Like

Hi klogg.
No problem, I know you are busy.
I already tried that when I saw that post, but it didn’t work :frowning_face:

Anyway, I’ll try again, just to be sure I didn’t do a mistake last time…

It looks like nothing changed:

Wait!!!
I tried to change “+” to “~” in few more places and something moved!!!
So I did it in all files (obviously only in concatenations) and it worked!!!
I just have a little problrm with cycle name missing in telegram notification, but I’ll look into it, that should be easy.

Thank you klogg, without your reply I wouldn’t have tried again this replacement. :wink:

1 Like

Hello Klogg. I still haven’t found a solution to make the programmed cycles work, it just skips to next schedule cycle. Nothing in the logs, is there some trigger i can test?

Ok, a little bit clearer.
You have 6 shellies with tasmota for your valves.
How do you control your pump?
e.g. i have a hager esn224 to activate my pump. basically it’s a relay dpdt with a 24vac coil, when it feels current on the coil, activate the 220vac for the pump.
i have attached a 24vac transformer to one relay, when one valves start, i activate the pump(transformer) relay that activates the pump.

Hello, i have 2 sonoff 4ch pro r3 with tasmota to control the valves, and want to use a shelly 1pm to control the pump, and to now the consumer of the pump.

ok, you have to work a little bit in ha config, you have to group every valve switch with the pump relay.
Have a look at groups or even better template switch