-
Copy
landroid.yaml
in folder.homeassistant/packages
-
In
configuration.yaml
add string:
homeassistant:
packages: !include_dir_named packages
- Restart Home Assistant
Copy landroid.yaml
in folder .homeassistant/packages
In configuration.yaml
add string:
homeassistant:
packages: !include_dir_named packages
Thanks, the above sorted me out. Ironically i’d already done all that, but going back through it noticed i’d left an uppercase P on Packages… Renamed and it’s working. Thanks for your help.
Hey @Barmalej just wanted to see if users were having issues with the latest version of Home Assistant (0.115.x)? Thanks
no one reported problems with this version
Thanks, will investigate further
Hi!
Just updated to 0.117.1 and the landroid worx package is not working anymore
Unable to prepare setup for platform landroid_cloud.sensor: Unable to set up component.
17:25:39 – setup.py (ERROR)
Error during setup of component landroid_cloud
17:25:39 – custom_components/landroid_cloud/__init__.py (ERROR)
anyone else got this problem?
Updated from 0.116.4 to 0.117.1 without a problem.
Hi!
I updated from 115.2 to 117.1 and now I got this error.
It says he is expecting some boolean variables instead of numbers (rain delay for example)
Is your mower on? I can’t check it, my mower is off
I had the same issue: after upgrading to 0.117 I get the error message “Unable to prepare setup for platform landroid_cloud.sensor: Unable to set up component.”
Thanks Barmalej, that was just the right hint. I had already stowed away my Landroid for winter. So it was switched off when I did the update. I turned it back on and restarted HA. Worked instantly.
@Barmalej:
I need an advice on starting bordercut from home.
My research so far gave me the following to achieve it.
Via MQTT there are the following available commands:
cmd:1 = START
cmd:2 = PAUSE
cmd:3 = STOP
cmd:4 = ZONE TRAINING
And to get the border-cut from home it’s the following command-order:
Start Zone Training / Wait 3 Seconds / Pause / Wait 3 seconds / Stop
I also saw you writing here about MQTT-commands:
So I need this Start Zone Training command but I have no idea how to do it.
Hello,
i had an issue with “Landroid last update” and my timezone.
Solved by modify the template by adding false in timestamp_custom
landroid_lastupdate:
friendly_name: Landroid last update
value_template: "{{ as_timestamp(strptime( state_attr('sensor.landroid_mower_status', 'last_update'), '%H:%M:%S %d/%m/%Y')) | timestamp_custom('%d.%m.%Y %H:%M:%S', False) }}"
icon_template: mdi:clock
I setup my Landroid via MQTT before this stuff really picked up, so I’ve done a lot of manual work (template sensors) that’s eclipsed by these projects. I’ll share it here anyway, in case it’s useful to anyone else. I used https://github.com/orangutanoide/landroid_mosquitto_bridge to get the MQTT setup data, and bridged it to my own mosquitto instance.
mosquitto topic config (see elsewhere for full bridge info, my MAC address redacted):
# topic to subscribe in remote (aws) server
# move under 'landroid/' namespace locally for easier ACLs
topic PRM100/XXXXXXXXXXXX/commandOut in 0 landroid/ ""
topic PRM100/XXXXXXXXXXXX/commandIn out 0 landroid/ ""
sensors (MAC address redacted here, too):
## This is the base sensor that provides all the data from MQTT; everything
## else templates off of this one via the 'cfg' and 'dat' attributes.
## Timestamp is used as the base value to force this sensor to update
## whenever a new message is published, triggering all downstream templates.
## state_topic uses the landroid/ prefix as configured in the mosquitto bridge.
- platform: mqtt
name: Landroid
state_topic: landroid/PRM100/XXXXXXXXXXXX/commandOut
value_template: >-
{{ strptime(value_json["cfg"]["dt"] + " " + value_json["cfg"]["tm"], "%d/%m/%Y %H:%M:%S") }}
json_attributes_topic: landroid/PRM100/XXXXXXXXXXXX/commandOut
json_attributes_template: "{{ value_json | tojson }}"
- platform: template
sensors:
landroid_status:
friendly_name: Landroid status
icon_template: mdi:robot-mower-outline
value_template: >-
{% set mapper = {
0: "Idle",
1: "Home",
2: "Start sequence",
3: "Leaving home",
4: "Follow wire",
5: "Searching home",
6: "Searching wire",
7: "Mowing",
8: "Lifted",
9: "Trapped",
10: "Blade blocked",
11: "Debug",
12: "Remote control",
30: "Going home",
31: "Zone training",
32: "Border Cut",
33: "Searching zone",
34: "Pause" } %}
{% set state = state_attr("sensor.landroid", "dat").ls %}
{{ mapper[state] if state in mapper else 'Unknown: ' ~ state }}
attribute_templates:
statno: "{{ state_attr('sensor.landroid', 'dat').ls | int }}"
locked: "{{ state_attr('sensor.landroid', 'dat').lk | int }}"
fw_ver: "{{ state_attr('sensor.landroid', 'dat').fw }}"
mac: "{{ state_attr('sensor.landroid', 'dat').mac }}"
sn: "{{ state_attr('sensor.landroid', 'cfg').sn }}"
pitch: "{{ state_attr('sensor.landroid', 'dat').dmp[0] }}"
roll: "{{ state_attr('sensor.landroid', 'dat').dmp[1] }}"
yaw: "{{ state_attr('sensor.landroid', 'dat').dmp[2] }}"
updated: "{{ states('sensor.landroid') }}"
landroid_error:
friendly_name: Landroid error
value_template: >-
{% set mapper = {
0: "No error",
1: "Trapped",
2: "Lifted",
3: "Wire missing",
4: "Outside wire",
5: "Rain Delay",
6: "Close door to mow",
7: "Close door to go home",
8: "Blade motor blocked",
9: "Wheel motor blocked",
10: "Trapped timeout",
11: "Upside down",
12: "Battery low",
13: "Reverse wire",
14: "Charge error",
15: "Timeout finding home",
16: "Mower locked",
17: "Battery temperature too high/low" } %}
{% set state = state_attr("sensor.landroid", "dat").le %}
{{ mapper[state] if state in mapper else 'Unknown: ' ~ state }}
attribute_templates:
errno: "{{ state_attr('sensor.landroid', 'dat').le | int }}"
landroid_battery_charge:
friendly_name: Landroid charge
unit_of_measurement: '%'
value_template: "{{ state_attr('sensor.landroid', 'dat').bt.p | int }}"
device_class: battery
landroid_battery_voltage:
friendly_name: Landroid battery voltage
unit_of_measurement: 'V'
value_template: "{{ state_attr('sensor.landroid', 'dat').bt.v | float(2) }}"
device_class: voltage
landroid_battery_temperature:
friendly_name: Landroid battery temperature
unit_of_measurement: '°C'
value_template: "{{ state_attr('sensor.landroid', 'dat').bt.t | float(0) }}"
device_class: temperature
landroid_battery_cycle:
friendly_name: Landroid battery cycle
value_template: "{{ state_attr('sensor.landroid', 'dat').bt.nr | int }}"
unit_of_measurement: 'cycles'
landroid_total_distance:
friendly_name: Landroid total distance
value_template: "{{ state_attr('sensor.landroid', 'dat').st.d }}"
unit_of_measurement: 'm'
landroid_total_work_time:
friendly_name: Landroid total work time
value_template: "{{ state_attr('sensor.landroid', 'dat').st.wt }}"
unit_of_measurement: 'min'
landroid_total_blade_time:
friendly_name: Landroid total blade time
value_template: "{{ state_attr('sensor.landroid', 'dat').st.b }}"
unit_of_measurement: 'min'
landroid_wifi_rsi:
friendly_name: Landroid WiFi RSI
unit_of_measurement: 'dBm'
value_template: "{{ state_attr('sensor.landroid', 'dat').rsi | int }}"
device_class: signal_strength
landroid_rain_delay:
friendly_name: Landroid Rain Delay
unit_of_measurement: 'min'
value_template: "{{ state_attr('sensor.landroid', 'cfg').rd | int }}"
landroid_rain_delay_countdown:
friendly_name: Landroid Rain Countdown
unit_of_measurement: 'min'
value_template: "{{ state_attr('sensor.landroid', 'dat').rain.cnt | int }}"
friendly_name: Landroid Rain estimated resume
device_class: timestamp
value_template: >-
{% if states('sensor.landroid_rain_delay_countdown')|int > 0 %}
{{ ( (as_timestamp(states('sensor.landroid'))/60)|int * 60 +
( state_attr('sensor.landroid', 'dat').rain.cnt ) * 60
) | timestamp_local }}
{% else %}
{{ states.sensor.landroid_rain_delay_countdown.last_changed }}
{% endif %}
landroid_zone_index:
friendly_name: Landroid zone index
value_template: "{{ state_attr('sensor.landroid', 'dat').lz|int }}"
landroid_current_zone:
friendly_name: Landroid current zone
value_template: >-
{% set mzv = state_attr('sensor.landroid', 'cfg').mzv %}
{% set lz = states('sensor.landroid_zone_index')|int %}
{{ mzv[lz]+1 }}
landroid_next_zone:
friendly_name: Landroid next zone
value_template: >-
{% set mzv = state_attr('sensor.landroid', 'cfg').mzv %}
{% set mzv_mod = (mzv or [0]) | length %}
{% set lz = (states('sensor.landroid_zone_index')|int + 1) % mzv_mod %}
{{ mzv[lz]+1 }}
landroid_pitch:
friendly_name: Landroid pitch
value_template: "{{ state_attr('sensor.landroid', 'dat').dmp[0] | float(1) }}"
unit_of_measurement: '°'
landroid_roll:
friendly_name: Landroid roll
value_template: "{{ state_attr('sensor.landroid', 'dat').dmp[1] | float(1)}}"
unit_of_measurement: '°'
landroid_yaw:
friendly_name: Landroid yaw
value_template: >-
{% set yaw = state_attr('sensor.landroid', 'dat').dmp[2] %}
{% if yaw > 180 %}{{ (yaw - 360)|round(1) }}{% else %}{{ yaw|round(1) }}{% endif %}
unit_of_measurement: '°'
landroid_next_start:
friendly_name: Landroid next cycle start
device_class: timestamp
value_template: >-
{%- set ns = namespace(done=false) %}
{%- set earliest_start = [as_timestamp(now()), as_timestamp(states('sensor.landroid_rain_delay_resume'))] | max %}
{%- for day_offset in range(0, 7) %}
{%- set day = now().isoweekday()+day_offset %}
{%- for sched in [state_attr('sensor.landroid', 'cfg').sc.d, state_attr('sensor.landroid', 'cfg').sc.dd] %}
{%- if sched %}
{%- set numdays = 7 %}
{%- for pass in range(0, (sched|list|length/7)|int) %}
{%- set current = sched[day % numdays + pass * 7] %}
{%- set date = ((as_timestamp(now())+86400*day_offset)|timestamp_local).split()[0] %}
{%- set start = strptime(date ~ " " ~ current[0], "%Y-%m-%d %H:%M") %}
{%- set end = (as_timestamp(start)+current[1]*60)|timestamp_local %}
{%- if not ns.done and current[1] != 0 %}
{%- set cmp_time = end %}
{%- if as_timestamp(cmp_time) > earliest_start %}
{%- set ns.done = true %}
{{ start }}
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endfor %}
{%- endfor %}
landroid_next_end:
friendly_name: Landroid next cycle end
device_class: timestamp
value_template: >-
{%- set ns = namespace(done=false) %}
{%- set earliest_start = [as_timestamp(now()), as_timestamp(states('sensor.landroid_rain_delay_resume'))] | max %}
{%- for day_offset in range(0, 7) %}
{%- set day = now().isoweekday()+day_offset %}
{%- for sched in [state_attr('sensor.landroid', 'cfg').sc.d, state_attr('sensor.landroid', 'cfg').sc.dd] %}
{%- if sched %}
{%- set numdays = 7 %}
{%- for pass in range(0, (sched|list|length/7)|int) %}
{%- set current = sched[day % numdays + pass * 7] %}
{%- set date = ((as_timestamp(now())+86400*day_offset)|timestamp_local).split()[0] %}
{%- set start = strptime(date ~ " " ~ current[0], "%Y-%m-%d %H:%M") %}
{%- set end = (as_timestamp(start)+current[1]*60)|timestamp_local %}
{%- if not ns.done and current[1] != 0 %}
{%- set cmp_time = end %}
{%- if as_timestamp(cmp_time) > earliest_start %}
{%- set ns.done = true %}
{{ end }}
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endfor %}
{%- endfor %}
landroid_next_edge:
friendly_name: Landroid next border cut
device_class: timestamp
value_template: >-
{%- set ns = namespace(done=false) %}
{%- set earliest_start = [as_timestamp(now()), as_timestamp(states('sensor.landroid_rain_delay_resume'))] | max %}
{%- for day_offset in range(0, 7) %}
{%- set day = now().isoweekday()+day_offset %}
{%- for sched in [state_attr('sensor.landroid', 'cfg').sc.d, state_attr('sensor.landroid', 'cfg').sc.dd] %}
{%- if sched %}
{%- set numdays = 7 %}
{%- for pass in range(0, (sched|list|length/7)|int) %}
{%- set current = sched[day % numdays + pass * 7] %}
{%- set date = ((as_timestamp(now())+86400*day_offset)|timestamp_local).split()[0] %}
{%- set start = strptime(date ~ " " ~ current[0], "%Y-%m-%d %H:%M") %}
{%- set end = (as_timestamp(start)+current[1]*60)|timestamp_local %}
{%- if not ns.done and current[2] > 0 %}
{%- set cmp_time = end %}
{%- if as_timestamp(cmp_time) > earliest_start %}
{%- set ns.done = true %}
{{ start }}
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- endfor %}
{%- endfor %}
binary_sensors:
- platform: template
sensors:
landroid_battery_charging:
friendly_name: Landroid battery charging
value_template: "{{ state_attr('sensor.landroid', 'dat').bt.c | int == 1 }}"
device_class: battery_charging
landroid_rain_sensed:
friendly_name: Landroid Rain sensor
value_template: "{{ state_attr('sensor.landroid', 'dat').rain.s | int > 0 }}"
device_class: moisture
edit: battery charging (dat.bt.c
) is 0 for not charging, 1 for charging, and 2 for not charging because battery temperature is out of range, so only check against 1.
Hello,
I had an issue with landoroid WR130E. “S300i”
can some body help me please? what is wrong?
Thanks a lot!
Hi,
Thanks for the amazing job done, it’s one of the neetest integrations I have in Hass, so I’m actually redisigning all my cards in order to have the same stacking efect used in halandroid.
Also I’ve translated the files to Portuguese, so if anyone interested, please reply.
I’m not a programmer, and all I do is by entuition, learning from others amazing work.
I’ve been trying to understand the schedulle function inbeded in the code, but I came into the conclusion that I need your profecional help.
Could someone explain me how can I make use of this part of the code:
# Input Boolean ###
input_boolean.landroid_0_sched_enable:
friendly_name: Sonntag
input_boolean.landroid_1_sched_enable:
friendly_name: Montag
input_boolean.landroid_2_sched_enable:
friendly_name: Dienstag
input_boolean.landroid_3_sched_enable:
friendly_name: Mittwoch
input_boolean.landroid_4_sched_enable:
friendly_name: Donnerstag
input_boolean.landroid_5_sched_enable:
friendly_name: Freitag
input_boolean.landroid_6_sched_enable:
friendly_name: Samstag
input_boolean.landroid_0_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_1_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_2_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_3_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_4_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_5_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_6_cuttoedge:
friendly_name: Cut to edge
input_boolean.landroid_sched_settings:
friendly_name: Mähplan
input_boolean.landroid_info_toggle:
friendly_name: Information
input_boolean.landroid_view_0:
friendly_name: So.
input_boolean.landroid_view_1:
friendly_name: Mo.
input_boolean.landroid_view_2:
friendly_name: Di.
input_boolean.landroid_view_3:
friendly_name: Mi.
input_boolean.landroid_view_4:
friendly_name: Do.
input_boolean.landroid_view_5:
friendly_name: Fr.
input_boolean.landroid_view_6:
friendly_name: Sa.
input_boolean.landroid_view_config:
friendly_name: Konf.
I think this should be used in some kind of Schedulle Card, but I do not have enough programing knowled to figure it out. Can someone explain me how can I add the day schedulle an edge routine to my UI?
Everithing else works great.
Also,
Is there a way to translate the inforrmation on the main screen that says the currente state of the mower “Home, Mowing,… No error…”
Thanks.
Also I’ve translated the files to Portuguese, so if anyone interested, please reply.
Thank you. Post here please
Could someone explain me how can I make use of this part of the code:
This is rest from the old Landroid integration. It supported the Scheduler
Hi I also want my landroid on my HA. my problem is I am very new to Home Assistant and do not understand much of your talk, I have spent an incredible amount of time on nothing is there anyone who has made a setup video?
has then come so far that I can see my landroid in my HA