Home Assistant : Q&A, Tips & Tricks, Your Configs

Silly question warning - Does anyone know if it's possible to hookup an ITRON (IHD102) prepaid meter to Home Assistant? Yes I know it's got stats on the meter itself, but it's bland and ugly with it's monochrome screen, would be really cool monitor it's usage with a few other goodies in the house.
 
This looks very cool! Whatsup with PV1, is it on the opposite side of the house, or just less panels in the array? Screenshot 2026-05-06 080331.jpg
 
I haven't gotten this far but had to add an automation in HA to monitor house power draw and switch off things like geysers and the pool over 9kw. On a Wednesday our nanny, domestic worker and gardener are here so there is washing, ironing, lawn cutting, etc. all taking place along with the usual things.
I just did this so thought I'd share as was having the same issue - and my neopixel light mentioned earlier still required compliance from others :cautious:

So far it's working like a bomb and had zero trips or alarms

I put the Kettle and toaster on one of these:
(had to buy one of the new type SA plugs for the toaster)

1778095460203.png

Im already using the HACS Scheduler Component (creates entities of your schedules EG: 'switch.schedule_3040af) + HACS Scheduler Card, so I got Claude, to do this for me (after a few iterations of course):
Automation 1 — Kettle/Toaster Inverter Protection (main automation)
When the kettle or toaster draws more than 200W for 2 seconds, it takes a snapshot of every geyser switch and schedule switch that is currently on, turns them all off, then waits inline for the power to drop below 50W for 3 seconds. Once that happens it turns everything back on — except the kitchen geyser switches if it's a bad weather day (This checks Solcast at 06:00 and based on the forecast it allows the Kitchen Geyser schedule to run or not) . If the kettle runs for more than 2 hours without stopping, the automation exits without restoring. Only one instance runs at a time so rapid kettle use doesn't cause conflicts.

Automation 2 — Manual Geyser Protection
If someone manually turns on a geyser while the kettle is actively drawing more than 200W, this automation immediately turns it back off. It distinguishes between a human turning it on (has a user ID) versus the scheduler turning it on automatically (no user ID) and only acts on genuine manual switches. Runs up to 3 instances in parallel in case multiple geysers are turned on simultaneously.

Code:
alias: Kettle/Toaster on, geysers (incl schedules) off & back on when kettle/toaster is off
description: >
  Temporarily disables active geyser schedules and manually-on geysers when
  the kettle/toaster plug draws power, to prevent inverter overload.
  Restores them when it stops. Respects bad weather day flag for kitchen geyser.
mode: single
max_exceeded: silent

trigger:
  - platform: numeric_state
    entity_id: sensor.kitchen_kettle_toaster_plug_power
    above: 200
    for:
      seconds: 2
    id: kettle_on

action:
  - variables:
      active_switches: >
        {% set ns = namespace(active=[]) %}
        {% set all_switches = [
          'switch.schedule_3040af',
          'switch.schedule_5063c9',
          'switch.schedule_f2199f',
          'switch.schedule_1a1626',
          'switch.schedule_10d8ce',
          'switch.schedule_0f7b8a',
          'switch.schedule_aff782',
          'switch.schedule_6b302a',
          'switch.schedule_1dc4c2',
          'switch.schedule_a44eb0',
          'switch.schedule_6d4659',
          'switch.schedule_9ea5cf',
          'switch.schedule_8a821c',
          'switch.schedule_bbf7ee',
          'switch.main_geyser',
          'switch.mns_geyser',
          'switch.kitchen_geyser'
        ] %}
        {% for s in all_switches %}
          {% if states(s) == 'on' %}
            {% set ns.active = ns.active + [s] %}
          {% endif %}
        {% endfor %}
        {{ ns.active | join(',') }}
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] Kettle/toaster ON
        ({{ states('sensor.kitchen_kettle_toaster_plug_power') }}W).
        Suspending: {{ active_switches if active_switches | length > 0 else 'NONE' }}
      level: info
  - repeat:
      for_each: "{{ active_switches.split(',') | select('ne', '') | list }}"
      sequence:
        - service: switch.turn_off
          target:
            entity_id: "{{ repeat.item }}"
  - wait_for_trigger:
      - platform: numeric_state
        entity_id: sensor.kitchen_kettle_toaster_plug_power
        below: 50
        for:
          seconds: 3
    timeout:
      hours: 2
    continue_on_timeout: false
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] Kettle/toaster OFF. Resuming:
        {{ active_switches if active_switches | length > 0 else 'NONE' }}
      level: info
  - repeat:
      for_each: "{{ active_switches.split(',') | select('ne', '') | list }}"
      sequence:
        - if:
            - condition: template
              value_template: >
                {{ repeat.item not in [
                     'switch.schedule_8a821c',
                     'switch.schedule_bbf7ee',
                     'switch.kitchen_geyser'
                   ]
                   or is_state('input_boolean.bad_weather_day', 'off') }}
          then:
            - service: system_log.write
              data:
                message: >
                  [INVERTER PROTECTION] Resuming: {{ repeat.item }}
                level: info
            - service: switch.turn_on
              target:
                entity_id: "{{ repeat.item }}"
          else:
            - service: system_log.write
              data:
                message: >
                  [INVERTER PROTECTION] Skipping {{ repeat.item }}
                  — bad weather day active.
                level: warning

Code:
alias: Manual Geyser On During Kettle Use - Inverter Protection
description: >
  If a geyser is manually turned on while the kettle/toaster is running,
  turn it back off immediately to prevent inverter overload.
mode: parallel
max: 3

trigger:
  - platform: state
    entity_id:
      - switch.main_geyser
      - switch.mns_geyser
      - switch.kitchen_geyser
    to: "on"

condition:
  - condition: numeric_state
    entity_id: sensor.kitchen_kettle_toaster_plug_power
    above: 200
  - condition: template
    value_template: >
      {{ trigger.to_state.context.user_id is not none }}

action:
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] {{ trigger.entity_id }} manually turned ON
        while kettle/toaster is running
        ({{ states('sensor.kitchen_kettle_toaster_plug_power') }}W).
        Turning it back off.
      level: warning
  - service: switch.turn_off
    target:
      entity_id: "{{ trigger.entity_id }}"
 
I just did this so thought I'd share as was having the same issue - and my neopixel light mentioned earlier still required compliance from others :cautious:

So far it's working like a bomb and had zero trips or alarms

I put the Kettle and toaster on one of these:
(had to buy one of the new type SA plugs for the toaster)

View attachment 1906275

Im already using the HACS Scheduler Component (creates entities of your schedules EG: 'switch.schedule_3040af) + HACS Scheduler Card, so I got Claude, to do this for me (after a few iterations of course):
Automation 1 — Kettle/Toaster Inverter Protection (main automation)
When the kettle or toaster draws more than 200W for 2 seconds, it takes a snapshot of every geyser switch and schedule switch that is currently on, turns them all off, then waits inline for the power to drop below 50W for 3 seconds. Once that happens it turns everything back on — except the kitchen geyser switches if it's a bad weather day (This checks Solcast at 06:00 and based on the forecast it allows the Kitchen Geyser schedule to run or not) . If the kettle runs for more than 2 hours without stopping, the automation exits without restoring. Only one instance runs at a time so rapid kettle use doesn't cause conflicts.

Automation 2 — Manual Geyser Protection
If someone manually turns on a geyser while the kettle is actively drawing more than 200W, this automation immediately turns it back off. It distinguishes between a human turning it on (has a user ID) versus the scheduler turning it on automatically (no user ID) and only acts on genuine manual switches. Runs up to 3 instances in parallel in case multiple geysers are turned on simultaneously.

Code:
alias: Kettle/Toaster on, geysers (incl schedules) off & back on when kettle/toaster is off
description: >
  Temporarily disables active geyser schedules and manually-on geysers when
  the kettle/toaster plug draws power, to prevent inverter overload.
  Restores them when it stops. Respects bad weather day flag for kitchen geyser.
mode: single
max_exceeded: silent

trigger:
  - platform: numeric_state
    entity_id: sensor.kitchen_kettle_toaster_plug_power
    above: 200
    for:
      seconds: 2
    id: kettle_on

action:
  - variables:
      active_switches: >
        {% set ns = namespace(active=[]) %}
        {% set all_switches = [
          'switch.schedule_3040af',
          'switch.schedule_5063c9',
          'switch.schedule_f2199f',
          'switch.schedule_1a1626',
          'switch.schedule_10d8ce',
          'switch.schedule_0f7b8a',
          'switch.schedule_aff782',
          'switch.schedule_6b302a',
          'switch.schedule_1dc4c2',
          'switch.schedule_a44eb0',
          'switch.schedule_6d4659',
          'switch.schedule_9ea5cf',
          'switch.schedule_8a821c',
          'switch.schedule_bbf7ee',
          'switch.main_geyser',
          'switch.mns_geyser',
          'switch.kitchen_geyser'
        ] %}
        {% for s in all_switches %}
          {% if states(s) == 'on' %}
            {% set ns.active = ns.active + [s] %}
          {% endif %}
        {% endfor %}
        {{ ns.active | join(',') }}
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] Kettle/toaster ON
        ({{ states('sensor.kitchen_kettle_toaster_plug_power') }}W).
        Suspending: {{ active_switches if active_switches | length > 0 else 'NONE' }}
      level: info
  - repeat:
      for_each: "{{ active_switches.split(',') | select('ne', '') | list }}"
      sequence:
        - service: switch.turn_off
          target:
            entity_id: "{{ repeat.item }}"
  - wait_for_trigger:
      - platform: numeric_state
        entity_id: sensor.kitchen_kettle_toaster_plug_power
        below: 50
        for:
          seconds: 3
    timeout:
      hours: 2
    continue_on_timeout: false
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] Kettle/toaster OFF. Resuming:
        {{ active_switches if active_switches | length > 0 else 'NONE' }}
      level: info
  - repeat:
      for_each: "{{ active_switches.split(',') | select('ne', '') | list }}"
      sequence:
        - if:
            - condition: template
              value_template: >
                {{ repeat.item not in [
                     'switch.schedule_8a821c',
                     'switch.schedule_bbf7ee',
                     'switch.kitchen_geyser'
                   ]
                   or is_state('input_boolean.bad_weather_day', 'off') }}
          then:
            - service: system_log.write
              data:
                message: >
                  [INVERTER PROTECTION] Resuming: {{ repeat.item }}
                level: info
            - service: switch.turn_on
              target:
                entity_id: "{{ repeat.item }}"
          else:
            - service: system_log.write
              data:
                message: >
                  [INVERTER PROTECTION] Skipping {{ repeat.item }}
                  — bad weather day active.
                level: warning

Code:
alias: Manual Geyser On During Kettle Use - Inverter Protection
description: >
  If a geyser is manually turned on while the kettle/toaster is running,
  turn it back off immediately to prevent inverter overload.
mode: parallel
max: 3

trigger:
  - platform: state
    entity_id:
      - switch.main_geyser
      - switch.mns_geyser
      - switch.kitchen_geyser
    to: "on"

condition:
  - condition: numeric_state
    entity_id: sensor.kitchen_kettle_toaster_plug_power
    above: 200
  - condition: template
    value_template: >
      {{ trigger.to_state.context.user_id is not none }}

action:
  - service: system_log.write
    data:
      message: >
        [INVERTER PROTECTION] {{ trigger.entity_id }} manually turned ON
        while kettle/toaster is running
        ({{ states('sensor.kitchen_kettle_toaster_plug_power') }}W).
        Turning it back off.
      level: warning
  - service: switch.turn_off
    target:
      entity_id: "{{ trigger.entity_id }}"
"If the kettle runs for more than 2 hours without stopping"

What are you doing with that kettle man ?!! Hehe
 
"If the kettle runs for more than 2 hours without stopping"

What are you doing with that kettle man ?!! Hehe
Haha - was also like WTF Claude but I figured that it’ll never happen so I’ll just leave it :X3:
 
Cool PV Card - saw on Reddit


Original Post:
This is cool - for some reason I can't get my house in 3d - but it shows the surrounding buildings :ROFL:
 
Is anyone using the CBI Astute with the ESP8266 chips and ESPHome? I recently discovered that ALL of them are terrible with Wifi - they're off network about 85% of the time.

The one is back to back through a wall from the AP - I think the max distance is 1m - but it barely gets signal.

Wasn't really an issue in the past, because they're always on - but I noticed my power usage wasnt accurate.
 
Is anyone using the CBI Astute with the ESP8266 chips and ESPHome? I recently discovered that ALL of them are terrible with Wifi - they're off network about 85% of the time.

The one is back to back through a wall from the AP - I think the max distance is 1m - but it barely gets signal.

Wasn't really an issue in the past, because they're always on - but I noticed my power usage wasnt accurate.
I've got 3 in the DB and there's 2 x AP that they can connect to (U6+ and Nano HD (this has terrible 2.4Ghz performance)) and 1 in the pool pump box which is about 15m from my U6+

(U6+ = Lounge AP; Nano HD = The Mini Beast AP)

1779272904273.png
 
I've got 3 in the DB and there's 2 x AP that they can connect to (U6+ and Nano HD (this has terrible 2.4Ghz performance)) and 1 in the pool pump box which is about 15m from my U6+

(U6+ = Lounge AP; Nano HD = The Mini Beast AP)

View attachment 1909403

This is the worst one, you can see the history for the day:
Screenshot 2026-05-20 141105.png

And this is how far the AP is (also Ubiquiti)

20260520_141126.jpg

Looking at the history in Influxdb - its been like this since day 1.
 
Am I missing something? You replaced the WiFi chip in the Astute with ESP ?

FWIW, I have stock standard Astutes in the roof, outside, kitchen and all of them 100% reliable with strength, signal on with my WiFi5 (AP-PROs) 2.4/5Ghz dedicated WLAN
 
Am I missing something? You replaced the WiFi chip in the Astute with ESP ?

FWIW, I have stock standard Astutes in the roof, outside, kitchen and all of them 100% reliable with strength, signal on with my WiFi5 (AP-PROs) 2.4/5Ghz dedicated WLAN
Me 2, I have a ASI in the roof with no problems.
 
Has anyone else used the community ha-mcp?

https://github.com/homeassistant-ai/ha-mcp

Its a really neat way to give claude/codex etc access to your HA. This has helped me a ton with fixing recurring issues etc.
I asked it to scan through and do an audit on issues, and it came back with some really solid finds and also how to fix them.

It has also helped me to create automations, helpers, utilities, dashboards (YMMV here, can be fickle) etc and overall been a huge help.

Obviously, make sure you are doing backups etc, which should already be the case.

Here is just a simple "Give me the state of my home"

1779283764387.png
 
Top
Sign up to the MyBroadband newsletter
X