Intellifire (Wifi Fireplace Module) - Hearth and Home

I recently purchased the Intellifire wifi module for my fireplace so that we can sit on the couch and tell Alexa to turn on / off the fireplace. I did a little digging around and I’m unable as of yet to figure out how to capture the Auth token needed to actually control the fireplace - but after decomposing the android App - I found a rest endpoint to get data. As such I’ve put together a set of sensors from the fireplace:

The IP of the fireplace in my case is 192.168.1.80

sensor:
  - platform: rest
    name: intellifire
    resource: http://192.168.1.80/poll
    json_attributes:
        - timer
        - timeremaining
        - setpoint
        - serial
        - pilot
        - fanspeed
        - hot
        - temperature
        - fanspeed
        - thermostat
    value_template: "{% if value_json.power == 1 %}On{%- else -%}Off{%- endif -%}"
    
  - platform: template
    sensors:        
        fireplace_on_off:
            friendly_name: "On Off"
            value_template: "{{ states('sensor.intellifire') }}"
        fireplace_is_hot:
            friendly_name: "Hot"
            value_template: "{{ is_state_attr('sensor.intellifire', 'hot', 1) }}"        
        fireplace_fan_speed:
            friendly_name: "Fan Speed"
            value_template: "{{ state_attr('sensor.intellifire', 'fanspeed') }}"
        fireplace_temperature:
            friendly_name: "Temperature"
            value_template: "{% set t = state_attr('sensor.intellifire', 'temperature') | float %} {{((t) * 9/5) + 32 }}"
            unit_of_measurement: 'F'
        fireplace_temperature_c:
            friendly_name: "Temperature"
            value_template: "{{ state_attr('sensor.intellifire', 'temperature') }}"
            unit_of_measurement: 'C'
        fireplace_timer_on:
            friendly_name: "Timer Enabled"
            value_template: "{{ is_state_attr('sensor.intellifire', 'timer', 1) }}"        
        fireplace_time_remaining:
            friendly_name: "Time Remaining"
            value_template: "{{ state_attr('sensor.intellifire', 'timeremaining') }}"        

I may try to write an integration in the future - or if somebody who is more skilled wants to walk me through capturing the auth-token flow I could probably write some control logic. The vendor didn’t seem to happy to assist in any way whatsoever :slight_smile:

4 Likes

I am also interested in this. Would love to have HA ability to 1) control led lights on/off and 2) detect if flame is on.

If you look at what I’ve done you can do all the detection you need :slight_smile:
I don’t have lights so didn’t wire that up but the data is there

The timing of this couldn’t be better. I just had this installed today.

I also would love to see control functions added to this. For now, I’ll happily add these sensors.

I put together a fire sound automation as well but I’m on vacation so can’t really post it now

Was the module easy to connect? I own a Monessen fireplace, but it uses an Intellifire setup, but has no wifi currently. Where’d you get the module, Hearth and Home?

Thanks.

@Agrajag27 I just installed a new Heat & Glo fireplace insert and ordered the wifi module (IFT-WFM) to go with it. I purchased mine along with the fireplace from Fireside Hearth and Home in Minneapolis. The wifi module cost $170 and came in a separate box. The hardest part of the installation was pulling the fireplace out so I could reach the access door on the side, unscrew it, and install the wifi module. I believe other fireplace models have access from the front, but mine was on the side so I had to pull it out.

After that, it was just a matter of plugging the wifi module into the “IntelliFire Touch electronic control module” (IFT-ECM) and holding down the Pilot button for 10 seconds until it beeps twice, and then I used the Intellifire app on my phone to finish the setup process. Similar to other “smart” devices, the wifi module creates a temp wifi network to use for setup, then I used the app to connect it to my home wifi.

Here’s the wifi module and the port it plugs into:

This is awesome, @jeeftor, thanks for figuring it out and sharing! :+1: I’d love to hear if you’re able to make any additional progress on this in the future - control of the unit would be incredible.

In the meantime, I suppose I can always just send the fireplace RF commands from HA like the remote does and then read its current status with this.

By the way. I have an open pr for an integration for IntelliFire

The issue with control is I’m not sure how to hack the oauth flow. The commands are easy to issue but there is a whole challenge response process to get a code to send with it.

Intellifire Users … could you do me a favor:

I want to consider auto-discovery of IntelliFire but I’d need to see if the modules have some sort of common identifier:

I think I can search for Technicolor CH USA on the network - but I’d love somebody else to verify if their module also has this string in it.

Thanks!

My router lists the device as “ZentriOS-AC8.” Is your Intellifire wifi module model IFT-WFM?

My fireplace is unhooked right now while I finish the installation, so I haven’t tested your sensor config yet, but I have it added to HA ready to test when I plug the fireplace back into power.

EDIT: Fireplace is now up and running and this is pulling the data correctly.

It def is an IFT-WFM

I can’t figure out what the T is… IntelliFire T - Wireless Fireplace Module

Earlier I installed Charles proxy on my iPhone and spied the traffic which is how I found the /poll end point. There is a get_challenge I believe endpoint and then it sends a post call to the device with a code generated from the get_challenge

If I could figure out how to intercept/fake the oAuth code it wouldn’t prob be too hard to control stuff … I just don’t have that knowledge/time at the moment.

Here is the python lib I wrote…

that the integration will use.

If there isn’t an easy/common name I was considering hitting each device on the subnet and checking the /poll or /get_serial end point to see if it matches but I’m not sure that’s allowed with HA

That’s over my head, but your work so far is very much appreciated. If there’s anything I can do/test on my end, I’m happy to help. Otherwise, I’ll follow along here for any updates or contributions. :+1: :+1:

1 Like

Well the Intellifire integration is now live:

2 Likes

I’ve written out some control logic that seems to be working directly in python. If anybody feels like testing it: https://github.com/jeeftor/intellifire4py

I’m slowly working on updating my integration to allow for control but I need to figure out how to do that :slight_smile:

2 Likes

Thanks for your work on this. I have the same module in my fireplace and have working code as well (albeit in C#).

I was looking through your repo and saw where it looked like you had some questions in send_local_command. The response body can be form url encoded, in C# it looks like this…

var formContent = new FormUrlEncodedContent(
                new Dictionary<string, string>
                {
                    { "command", command },
                    { "value", value },
                    { "user", _usernameHash },
                    { "response", challengeResponse }
                });

In the above “command” is one of “fan_speed”, “flame_height”, “light”, “pilot”, “power”, “thermostat_setpoint”, or “time_remaining”

“value” is the argument for the command.

“user” is the SHA256 hash of the username as a hex string.

“response” is the tricky part, but to construct it you can do this…

  1. get the byte array of the user’s api key
  2. retrieve the challenge from the get_challenge api and convert it to a byte array
  3. build a string for the payload from “post:command={command}&value={value}” and convert it to a byte array
  4. concatenate apiKeyBytes, challengeBytes, and payloadBytes into a single byte array
  5. result = SHA256(combinedBytes)
  6. prepend the apiKeyBytes to result (yes, again)
  7. result = SHA256(result)
  8. convert result to a lowercase hex string

C# code for all those steps looks like this…

        private string CalculateChallengeResponse(string command, string value, string challenge)
        {
            var apiKeyBytes = Convert.FromHexString(_apiKey);
            var challengeBytes = Convert.FromHexString(challenge);
            var payloadBytes = Encoding.UTF8.GetBytes($"post:command={command}&value={value}");

            var combinedBytes = apiKeyBytes.Concat(challengeBytes).Concat(payloadBytes).ToArray();

            using var sha256 = SHA256.Create();
            var result = sha256.ComputeHash(combinedBytes);

            result = apiKeyBytes.Concat(result).ToArray();
            result = sha256.ComputeHash(result);
            return Convert.ToHexString(result).ToLower();
        }

Hope this proves helpful!

2 Likes

It sounds like you’re both making progress! Not sure if it’s relevant at this point, but I opened up the WiFi module to see what’s inside. Here’s a photo of the front and back of the board, in case that provides any insight.

This is useful - I haven’t played around yet much with python to figure out of I have to do this as string, hex, or bytes … so I’ll just port your code and test it against what my app is sending via Charles proxy (where I can see the outgoing /post request).

At the very least cloud based control is working :slight_smile: