Fireangel fire/CO/heat alarm network bridge integration

We went with the FireAngel solution again in the new house, I have mains and battery units monitoring heat, smoke and CO2.

Where can I get one of the boards?

Thanks for such a great project. In case it helps someone else, here’s how I did it.

I initially soldered it all up and it didn’t work. I then had to messily unsolder everything before doing it on the breadboard to test all my componentas properly. Lesson learnt - do a proper bench test first……

I based my yaml config around this updated-format post from:

I also created a separate binary_sensor for the gateway module’s connectivity with a delay_off period of 1hr, which is then referenced in the availabilty sections of all the different alarms. This means that if the gateway module is unplugged from my HA server for <1hr, the status of all the radios remains unchanged and I don’t have to go through the faff of testing each individual radio again. There is a small assumption of course that a status update for one individual radio hasn’t occured during that time….

Anyway, I’ve posted the yaml here for all the template bits of my configuration, along with a few improvements. I’m sure there are some things which could be tightened up on still though: any suggestions gratefully received!

################################# FireAngel Template Sensors ###################

# See shell_command.yaml for shell commands and service calls etc
# See sensor.yaml for sensor.fireangel_data. This is the serial sensor from which all data travels and feeds these templaes
# 3 group helper binary_sensors which monitor for problems - binary_sensor.fireangel_fire, binary_sensor.fireangel_batteries & binary_sensor.fireangel_network_status. These feed into alerts and front dashboard 

#                                                 | Bridge Device ID (letters need to be in lower case in YAML)
# WiSafe2-to-HomeAssistant-Bridge                 | a5b813

# Downstairs Hallway Smoke Alarm      | WST-632   | ffe204
# Upstairs Landing Smoke Alarm        | WST-632   | 6c7704 
# Spare Room Hallway Smoke Alarm      | WST-632   | 78d604
# Emily’s Room Smoke Alarm            | WST-632   | 2cd604 
# Garage Smoke Alarm                  | WST-632   | efD003 
# Sitting Room CO Alarm               | W2-CO-10X | 1beb05 
# Kitchen Heat Alarm                  | WHT-630   | 6e481a



    #-------------------------
    #HeartBeat 
    #Sets state to Online / Offline, based on heartbeat messages
    #-------------------------

- binary_sensor:
    - name: "FireAngel Gateway Connectivity"
      unique_id: fireangel_heartbeat
      icon: mdi:heart-pulse
      device_class: connectivity
      state: >
        {% if states('sensor.fireangel_data') !='unknown' and (now() - states.sensor.fireangel_data.last_changed).total_seconds() < 125 %}
          on
        {% else %}
          off
        {% endif %} 

# If gateway module is unplugged or HA server switched off for short time, individual alarms' connectivity stays on line (as far as HA is concerned), as otherwise would need to do a test on each alarm to get HA status back again. Feeds availability for individual alarms 
# Compromise required, as gateway can't poll other radios/alarms to check their status when it's back online, as they only report a status change when something happens, to preserve battery life
# So small assumption is that if gateway module is unplugged then re-connected briefly (less than delay_off), there hasn't simultaneously been a change in the status of one of the other radios
# Trade off advantage is avoiding the big faff of doing a test or base unplug on every radio in the network otherwise
# Fiddle with delay here if required
    - name: "FireAngel Connectivity with Grace Period"
      unique_id: fireangel_connectivity_with_grace_period
      icon: mdi:check-network-outline
      device_class: connectivity
      delay_off:
        minutes: 60
      state: >
        {{ is_state('binary_sensor.fireangel_gateway_connectivity', 'on') and not is_state('binary_sensor.fireangel_radio', 'off') }}          
    

# These two triggers trigger all other template sensors below
- trigger:
    - trigger: state
      entity_id: sensor.fireangel_data
      not_to: 
        - unknown
        - unavailable        
    - trigger: state
      entity_id: binary_sensor.fireangel_gateway_connectivity
      not_to: 
        - unknown
        - unavailable  
  sensor:
    - name: "FireAngel Messages"
      unique_id: fireangel_messages
      icon: mdi:message-processing
      state: >
        {% if not '{' in states('sensor.fireangel_data') %}
          {{states('sensor.fireangel_data')}}
        {% endif %}
    - # This is for display purposes, to show when there is a test
      name: "FireAngel Built in Test Function"
      unique_id: fireangel_pseudo_firmware_alarm
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='a5b813'.upper() %} 
          {{ state_attr('sensor.fireangel_data', 'event') }}
        {% endif %}
  binary_sensor:
    - name: "FireAngel Radio"
      unique_id: fireangel_radio
      device_class: connectivity
      availability: "{{ is_state('binary_sensor.fireangel_gateway_connectivity', 'on')}}"
      state: >
        {% if 'INIT OK' in states('sensor.fireangel_data') %}
          on
        {% elif 'Radio not ready - Trying to reset' in states('sensor.fireangel_data') or states('sensor.fireangel_data') == 'Initializing radio' %}
          off
        {% else %}
          {{this.state}}
        {% endif %}


    #------------------------------------
    # Downstairs Hallway | Smoke Alarm | WST-632 | ffe204 heat
    #------------------------------------
    - name: "FireAngel Smoke Alarm Downstairs Hallway Connectivity"
      unique_id: fireangel_downstairs_hallway_connectivity
      device_class: connectivity
      availability: "{{ is_state('binary_sensor.fireangel_connectivity_with_grace_period', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='ffe204'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='MISSING' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Smoke Alarm Downstairs Hallway Smoke Status"
      unique_id: fireangel_downstairs_hallway_smoke_status
      device_class: smoke
      availability: "{{ is_state('binary_sensor.fireangel_smoke_alarm_downstairs_hallway_connectivity', 'on')}}"                         
      state: >
        {% if state_attr('sensor.fireangel_data', 'event')=='SILENCE' %}
          off
        {% elif state_attr('sensor.fireangel_data', 'device')=='ffe204'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='FIRE EMERGENCY' %}
            on
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Smoke Alarm Downstairs Hallway Smoke Test"
      unique_id: fireangel_downstairs_hallway_smoke_test
      device_class: problem
      icon: mdi:thermometer
      availability: "{{ is_state('binary_sensor.fireangel_smoke_alarm_downstairs_hallway_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='ffe204'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='FIRE TEST' %}
            {% if state_attr('sensor.fireangel_data', 'result')=='PASS' %}
              off
            {% else %}
              on
            {% endif %}
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Smoke Alarm Downstairs Hallway Battery"
      unique_id: fireangel_downstairs_hallway_battery
      device_class: battery
      availability: "{{ is_state('binary_sensor.fireangel_smoke_alarm_downstairs_hallway_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='ffe204'.upper() and states.sensor.fireangel_data.attributes.battery is defined %}
          {% if state_attr('sensor.fireangel_data', 'battery')=='LOW' %}
            on
          {% else %}
            off
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Smoke Alarm Downstairs Hallway On Base"
      unique_id: fireangel_downstairs_hallway_onbase
      device_class: presence
      availability: "{{ is_state('binary_sensor.fireangel_smoke_alarm_downstairs_hallway_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='ffe204'.upper() and states.sensor.fireangel_data.attributes.base is defined %}
          {% if state_attr('sensor.fireangel_data', 'base')=='OFF' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}


    #------------------------------------
    # Sitting Room | CO Alarm | W2-CO-10X | 1beb05
    #------------------------------------
    - name: "FireAngel CO Alarm Sitting Room Connectivity"
      unique_id: fireangel_sitting_room_connectivity
      device_class: connectivity
      availability: "{{ is_state('binary_sensor.fireangel_connectivity_with_grace_period', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='1beb05'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='MISSING' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel CO Alarm Sitting Room CO Status"
      unique_id: fireangel_sitting_room_co_status
      device_class: carbon_monoxide
      availability: "{{ is_state('binary_sensor.fireangel_co_alarm_sitting_room_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'event')=='SILENCE' %}
          off
        {% elif state_attr('sensor.fireangel_data', 'device')=='1beb05'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='CARBON MONOXIDE EMERGENCY' %}
            on
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel CO Alarm Sitting Room CO Test"
      unique_id: fireangel_sitting_room_co_test
      device_class: problem
      icon: mdi:molecule-co
      availability: "{{ is_state('binary_sensor.fireangel_co_alarm_sitting_room_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='1beb05'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='CARBON MONOXIDE TEST' %}
            {% if state_attr('sensor.fireangel_data', 'result')=='PASS' %}
              off
            {% else %}
              on
            {% endif %}
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel CO Alarm Sitting Room Battery"
      unique_id: fireangel_sitting_room_battery
      device_class: battery
      availability: "{{ is_state('binary_sensor.fireangel_co_alarm_sitting_room_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='1beb05'.upper() and states.sensor.fireangel_data.attributes.battery is defined %}
          {% if state_attr('sensor.fireangel_data', 'battery')=='LOW' %}
            on
          {% else %}
            off
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel CO Alarm Sitting Room On Base"
      unique_id: fireangel_sitting_room_onbase
      device_class: presence
      availability: "{{ is_state('binary_sensor.fireangel_co_alarm_sitting_room_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='1beb05'.upper() and states.sensor.fireangel_data.attributes.base is defined %}
          {% if state_attr('sensor.fireangel_data', 'base')=='OFF' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}


    #------------------------------------
    # Kitchen | Heat Alarm | WHT-630 | 6e481a
    #------------------------------------
    - name: "FireAngel Heat Alarm Kitchen Connectivity"
      unique_id: fireangel_kitchen_connectivity
      device_class: connectivity
      availability: "{{ is_state('binary_sensor.fireangel_connectivity_with_grace_period', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='6e481a'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='MISSING' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Heat Alarm Kitchen Heat Status"
      unique_id: fireangel_kitchen_heat_status
      device_class: heat
      availability: "{{ is_state('binary_sensor.fireangel_heat_alarm_kitchen_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'event')=='SILENCE' %}
          off
        {% elif state_attr('sensor.fireangel_data', 'device')=='6e481a'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='FIRE EMERGENCY' %}
            on
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Heat Alarm Kitchen Heat Test"
      unique_id: fireangel_kitchen_heat_test
      device_class: problem
      icon: mdi:thermometer
      availability: "{{ is_state('binary_sensor.fireangel_heat_alarm_kitchen_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='6e481a'.upper() %}
          {% if state_attr('sensor.fireangel_data', 'event')=='FIRE TEST' %}
            {% if state_attr('sensor.fireangel_data', 'result')=='PASS' %}
              off
            {% else %}
              on
            {% endif %}
          {% else %}
            {{this.state}}
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Heat Alarm Kitchen Battery"
      unique_id: fireangel_kitchen_battery
      device_class: battery
      availability: "{{ is_state('binary_sensor.fireangel_heat_alarm_kitchen_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='6e481a'.upper() and states.sensor.fireangel_data.attributes.battery is defined %}
          {% if state_attr('sensor.fireangel_data', 'battery')=='LOW' %}
            on
          {% else %}
            off
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}
    - name: "FireAngel Heat Alarm Kitchen On Base"
      unique_id: fireangel_kitchen_onbase
      device_class: presence
      availability: "{{ is_state('binary_sensor.fireangel_heat_alarm_kitchen_connectivity', 'on')}}"
      state: >
        {% if state_attr('sensor.fireangel_data', 'device')=='6e481a'.upper() and states.sensor.fireangel_data.attributes.base is defined %}
          {% if state_attr('sensor.fireangel_data', 'base')=='OFF' %}
            off
          {% else %}
            on
          {% endif %}
        {% else %}
          {{this.state}}
        {% endif %}

Sorry to resurrect an old thread, but thanks to a faulty heat alarm I now have a radio.
I would like to know if there have been any breaking change to this project.
I would obviously incorporate all the yaml improvements such as that from James above.
I assume the hardware should still be ok. Thanks Geoff

Yup mine still works fine!

Thanks for the update. No more excuses. I need to did out my 50 year old soldering iron.

No excuses for me either! I originally created this topic about 5 years ago, but have never gone onto build this, following the great work of @chopwood. But I have recently acquired all the parts. So absolutley no excuses now!

Any chance time might have graced us with other new out of the box alternative products to having to open heart surgery our own?

What hardware is needed to go with a wireless unit from one of my spare alarms?

Do you think the announcement of an RF Proxy is going to improve things in this field?

I’ve just installed 4 Fireangel devices to replace my much loved Nest protect here in the UK. Stumbled across this thread as I’ve been testing the gateway and mostly been disappointed! Turned off mains to 2 of the alarms and no alerts! put it back on and disconnected one and did get an email almost straight away, but the other gave no alarms! Fireangle suggested I replace it under warranty which I did and the same issue, so have to suspect the gateway!

Does anyone have any pre-made setups I can buy? I’m hopeless with a soldering iron!

Hi James, just wondering if you would have the time to help me out
I have built the board, programmed the Nano successfully and “unlearned” the Wi2 module. When I plug the Nano into my HA server, I cannot get any button press to cause the Wi2 module to blink then stay lit for 5 seconds. I tried the Wi2module out of my CO alarm and although I could unlearn that module, when I plugged it into my PCB, I could not get it to give me the 5 second LED lit up. However, when I plugged it back into the CO alarm, it performed as expected.
I therefore have to suspect that the issue is with my PCB setup. I bought a new W2-SVP-603L and I have tried the red PCB from the base unit as well as the blue PCB (with battery) from the strobe unit. Same result with both. I bought some different level converters (sparkfun) and replaced the others I had used as some people stated they were an issue. This made no difference.
Any help would be really appreciated. In HA the sensor shows as…

…Radio not ready - Trying to reset

Here is my setup. I had to take a photo to remind myself! It’s been a while. I had the same problem. From what I can remember, it was down to the level converters (first batch I bought didn’t work) and the soldering. You can’t see from the photo but the soldering on the back of the board isn’t that great in places. I had to redo it a few times before I got it perfect. So I would guess that either of those two problems is the most likely culprit. Good luck!

Hi, I have all the parts. Soldering is a virtually new thing for me. Not done it since School! And i’m ancient now. Should I try it on a breadboard first? Thing is there is no schematic. Should one use the pcb diagram as a schematic. Or am I missing something?

Or will it be easier just to go for it straight on the pcb!?

Thank you :blush:

Ignore me. I think I need to just look at the EasyEDA diagram of course. I’ll give that a go… Thanks!

I think in general it is a good idea to try it on a bread board first, because then you know that all of your components will work together as expected. If you go for solder first time round you might get lucky, but if you aren’t then you end up having to unsolder everything which is a right PITA.

Thanks James.

I shall give it a go on the breadboard first. Trying to avoid a pita mainly! :slightly_smiling_face:

Will, how did it go in the end? I soldered it all up first and its not working. Luckily I have multiples of everything so I will try again from the breadboard up to see if I can get success that way. I haven’t soldered for about 45 years so I did check all adjacent pins for shorts and verified that all the PCB connections were good between the pins that should be connected but still no luck.

Hi Moray. That’s bad luck. I’m sure it’s something simple… I think the breadboard is the way forward and will give you some flexibility during testing.
I seem to be in the same situation apart from not getting as far as you yet. Last time soldering was in GCSE Design & Technology many, many years ago!
I started to set it up at the weekend and found that I need a couple more breadboards so I can do it side by side and copy the layout exactly. The less to think about means less chances of error. Only issue is that I need to wait a couple of weeks for the Velleman breadboards to come back into stock at CPC! So onwards at that stage and I will post some updates here with some helpful photos (assuming I actually get it to work). Would be good to see how you get on too. :slight_smile:

Not to derail this thread about the Wi-Safe2 alarms but I see that Fireangel have a new connected set of alarms coming soon, “Fireangel One”, this time using BLE. Anyone else seen these? Explore Our Fire & CO Safety Products | FireAngel

Pre-order and showing a release date of 20th.

Pricing info for if it changes:

  • FA8620BW-R (Smoke): £27.50, £23.30
  • FA8720BW-R (Heat): £28, pre order: £23.80
  • FA8922BW-R (Heat/Smoke): £35, £29.70
  • FA8080BW-R (BLE Gateway): £24, £20.40
  • FA8827BW-R (CO): £35, £29.70

I wonder if they’ll integrate with Home Assistant easily enough?

After having the Connected Pro alarms for a good while, I never got around to getting a board and integrating them

Will, Finally got it working. I had 1 of my 4 converters working and when I used that and the jumper across the two pins of the other converter slot it worked. I’m pretty pissed that 3 out of the 4 were inoperable but for the price, I’m not going to bitch too much. All works now, in a case and mounted next to my Pi5 without issue. Now I just have to find out how I can stop the dashboard showing all alarms as disconnected when I reboot the server. Its a pan, and noisy, having to run a test on all the alarms each time this happens.