Intellifire IFT-WFM Wi-Fi Fireplace Binding

I’m currently developing this binding and will be looking for beta testers soon. This Wi-Fi module is used in Majestic, Heat & Glo, Heatilator, Quadra-Fire, Vermont Castings, Monessen and SimpliFire fireplaces with the IFT-ECM and IFT-ACM modules. The IFT-WFM Wi-Fi module will work along side of the IFT-RFM and corresponding IFT-RC400 touchscreen remote control.

Let me know if you are interested in beta testing. Thanks.

I have an intellifire Heat & Glo fireplace with the wifi module installed. I would be interested in testing this.
I played around with the Python stuff that a person developed for Home Assistant and was able to get that connected to the fireplace, but I didn’t get it incorporated into my openHAB instance.

A bit more information would be helpfull.
What does this python stuff do? How does it integrate into HA?

It allows you to connect to the fireplace and then control the flame, fan speed and light. It gets an api key from the intellifire cloud, but then it can control it locally without using the cloud connection. I’m including a couple of links that give information about it. When I first looked at it, I think there was some question about whether the api key needed to be refreshed occasionally. I don’t know how or if this was resolved.

https://github.com/jeeftor/intellifire4py

On first sight, the python script was developed to work with HA and cannot be integrated into openHAB directly.
Sorry to say but I don‘t see a quick solution.

That’s true. I thought the person who started this thread about creating an OH Binding for the intellifire products might find it useful.

Sorry, did not read the first post properly. So yes, might be helpfull then.

Great. I have a working beta version almost ready to share. My IDE just crashed. Once that I have that rebuilt and back online, I will share a JAR file for a test drive.

Sorry for the delay. Here is the initial beta release.

I set up a test OH system using OH 4.3 on an RPI 3. I dropped the intellifire jar file into my add-ons directory. After a reboot, the intellifire binding showed up and I created the intellifire bridge thing using. It then found 4 additional Intellifire things, the fan, the fireplace, the light and the remote. I would think the fan and the light would be channels in the fireplace, but that wasn’t the case.
I created items for all of the available channels. The fan and light things had one channel each. The fireplace and remote each had several channels.
Once everything was created, I was able start and stop the flame, adjust the flame height, fan speed, and light intensity. The “error” text string also shows the same messages I see in the IOS app. When first started, it gives the 3 minute fan delay message. It also gives a message if the fireplace is offline.

The thing properties list the IP address and the API Key, among other things. I was hoping that the binding would use local communication once it had the API key, but it didn’t. I tested it by disconnecting my router from the internet. With the internet disconnected, the things lost the fireplace IP address and the API key, even though it was still connected locally which verified by pinging the fireplace from my laptop. When I reconnected the router to the internet, the things eventually recovered the IP address and API key. I checked the API key to see if it had changed, but it remained the same.

Also, with the internet disconnected, the things status showed them as online. When I tried to turn on the flame, the fireplace thing status would switch to offline, and then back to online when the start switch returned to the off position.

I’ve been trying out the Fireplace binding again. I also created a custom widget for it. The widget acts a little weird when setting some the light or flame levels because of the timing between when the command gets sent and when the poll is taken to check the settings. Other than that it seems ok. With the fireplace connected to OH, now I can write rules for other items, for instance, I can turn the ceiling fan on a few minutes after the fireplace fan comes on, and turn it off a few minutes after the fireplace goes off.

I’m including the widget below. Once again, thanks to Justin G and rikoshak for all of their widget tutorials. I did create some custom icons for the flame and fan feedback that I can share if I can find a way to do it.

uid: Fire_Place_Widget_2
tags: []
props:
  parameters:
    - description: Title
      label: Title
      name: titleProp
      required: false
      type: TEXT
    - context: item
      description: Switch that indicates its hot
      label: Hot Switch
      name: hotSwitch
      required: false
      type: TEXT
    - context: item
      description: Room Temperature
      label: Room Temp
      name: roomTemp
      required: false
      type: TEXT
    - context: item
      description: Flame On / OFF switch
      label: Flame On/Off
      name: flameSwitch
      required: false
      type: TEXT
    - context: item
      description: Flame Height
      label: Flame Height
      name: flameHeight
      required: false
      type: TEXT
    - context: item
      description: Light On / Off switch
      label: Light On/Off
      name: lightSwitch
      required: false
      type: TEXT
    - context: item
      description: Light Level
      label: Light Level
      name: lightLevel
      required: false
      type: TEXT
    - context: item
      description: Fireplace Fan
      label: Fan Speed
      name: fanSpeed
      required: false
      type: TEXT
    - context: item
      description: Timer Switch
      label: Timer Switch
      name: timerOn
      required: false
      type: TEXT
    - context: item
      description: Timer Minutes
      label: Timer Minutes
      name: timerMinutes
      required: false
      type: TEXT
    - default: "1"
      label: Timer Step Number Defaults to 1
      name: timerStep
      required: false
      type: DECIMAL
    - context: item
      description: Thermostat On Off
      label: Thermostat Switch
      name: thermostatSwitch
      required: false
      type: TEXT
    - context: item
      description: Temperature
      label: Temperature
      name: tempSet
      required: false
      type: TEXT
  parameterGroups: []
timestamp: Feb 22, 2026, 2:38:30 PM
component: f7-card
config: {}
slots:
  header:
    - component: f7-row
      config:
        style:
          width: 100%
      slots:
        default:
          - component: f7-block
            config:
              style:
                margin-top: 0px
                text-align: left
                width: 16%
            slots:
              default:
                - component: oh-icon
                  config:
                    icon: '=(@props.hotSwitch == "ON") ? "oh:fire-on" : "oh:fire-off"'
                    height: 25px
                    style:
                      margin-left: 4px
                - component: Label
                  config:
                    text: Hot
                    style:
                      font-size: 20px
                      color: '=(@props.hotSwitch == "ON") ? "red" : "lightgray" '
          - component: Label
            config:
              text: =props.titleProp
              style:
                font-size: 20px
                margin-right: 0px
                text-align: center
                width: 62%
          - component: f7-block
            config:
              style:
                text-align: center
                font-size: 15px
                width: 22%
            slots:
              default:
                - component: Label
                  config:
                    text: Room
                - component: Content
                  config:
                    text: =@props.roomTemp
  default:
    - component: oh-list
      config:
        mediaList: true
      slots:
        default:
          - component: oh-list-item
            config:
              action: toggle
              actionItem: =props.flameSwitch
              actionCommand: ON
              actionCommandAlt: OFF
              icon: "=(@props.flameSwitch == 'ON') ? 'oh:switch-on' : 'oh:switch-off'"
              iconUseState: true
              title: "=(@props.flameSwitch == 'ON') ? 'Flame ON' : 'Flame OFF'"
              noChevron: true
          - component: oh-list-item
            config:
              title: Flame Height
              icon: "={ '0': 'oh:myfire-off', '20': 'oh:myfire-20', '40': 'oh:myfire-40', '60': 'oh:myfire-60', '80' : 'oh:myfire-80', '100' : 'oh:myfire-100' }[@props.flameHeight] || 'oh:myfire-off'"
              actionItem: =props.flameHeight
              action: options
              actionOptions: 0=Off,20=1,40=2,60=3,80=4,100=5
              style:
                margin-top: 10px
            slots:
              after:
                - component: f7-row
                  slots:
                    default:
                      - component: oh-icon
                        config:
                          icon: oh:fire-off
                          width: 30px
                          visible: =(!@props.flameHeight || @props.flameHeight == '0')
                      - component: oh-repeater
                        config:
                          for: iconNum
                          sourceType: range
                          rangeStart: 1
                          rangeStop: =Math.floor(@props.flameHeight/20)
                          fragment: true
                          filter: "@props.flameHeight > 0"
                        slots:
                          default:
                            - component: f7-col
                              config:
                                class:
                                  - text-align-center
                              slots:
                                default:
                                  - component: oh-icon
                                    config:
                                      icon: oh:fire-on
                                      width: 30px
          - component: oh-list-item
            config:
              icon: "={ '0': 'oh:light-off', '33': 'oh:light-30', '66': 'oh:light-60', '67':
                'oh:light-60', '99': 'oh:light-on' }[@props.lightLevel] ||
                'oh:light-off'"
              iconUseState: true
              title: Light
              actionItem: =props.lightLevel
              action: options
              actionOptions: 0=Off,33=Low,66=Medium,99=High
            slots:
              after:
                - component: Label
                  config:
                    text: =({0:'Off',33:'Low',66:'Medium',99:'High'})[Math.round(@props.lightLevel /
                      33) * 33] || @props.lightLevel
                    style:
                      margin-right: 10px
                      font-size: 20px
                      font-weight: bold
          - component: oh-list-item
            config:
              title: Fan
              icon: "={ '0': 'oh:myfan', '25': 'oh:myfan-25', '50': 'oh:myfan-50', '75': 'oh:myfan-75', '100' : 'oh:myfan-100' }[@props.fanSpeed] ||
                'oh:myfan-off'"
              iconUseState: true
              actionItem: =props.fanSpeed
              action: options
              actionOptions: 0=Off,25=1,50=2,75=3,100=4
            slots:
              after:
                - component: Label
                  config:
                    text: =@props.fanSpeed/25
                    style:
                      font-size: 20px
                      font-weight: bold
                      margin-right: 20px
          - component: oh-list-item
            config:
              title: Timer
              icon: '=(@props.timerOn == "ON") ? "oh:time-on" : "on:time"'
            slots:
              after:
                - component: f7-row
                  slots:
                    default:
                      - component: oh-toggle
                        config:
                          item: =props.timerOn
                          style:
                            margin-right: 20px
                      - component: oh-stepper
                        config:
                          color: black
                          item: =props.timerMinutes
                          step: =props.timerStep
                          min: 1
          - component: oh-list-item
            config:
              title: Thermostat
              icon: oh:temperature
            slots:
              after:
                - component: f7-row
                  slots:
                    default:
                      - component: oh-toggle
                        config:
                          item: =props.thermostatSwitch
                          style:
                            margin-right: 20px
                      - component: oh-stepper
                        config:
                          color: black
                          item: =props.tempSet
                          min: 55
                          max: 75
                          step: 1
your code goes here

I’m not sure I understand the timer. If I set the Timer number to 1, it sets the timer for 1 hour when I turn it on. If I set it to 0.0167 ie 1/60 it still sets the timer for one hour when I turn it on. Since the timer is actually a function in the remote, I’m tempted to use a timer in an openHAB rule instead.

Timer units are minutes. Integers only. If I set mine to 15, the remote says 15 minutes remaining.